use fall97_331
drop table PROJECTIONS
drop table P_Audit
go

/*create PROJECTIONS table*/
use fall97_331
CREATE TABLE PROJECTIONS 
(    PROJECTION_ID   INT,
     PROJECTION_NAME INT,
     PROJECTION_TYPE INT,                                          
     SPHEROID_CODE   INT,
     PROJECTION_UOM  INT,
     ZONE_CODE       INT,
)	
go

/*create P_Audit table with Backlog*/
use fall97_331
CREATE TABLE P_Audit (
	PROJECTION_ID   INT,
        PROJECTION_NAME INT,
        PROJECTION_TYPE INT,
        SPHEROID_CODE   INT,
        PROJECTION_UOM  INT,
        ZONE_CODE       INT,
        When_Changed    DATETIME,
	Operation       char(1), 
        PRIMARY KEY  (PROJECTION_ID, When_Changed)
)
go

/*create DELETE trigger with Backlog*/
CREATE TRIGGER Delete_PROJECTIONS
ON PROJECTIONS
FOR DELETE
AS
INSERT P_Audit
SELECT*,getdate(),'I'
FROM deleted
go

/*create UPDATE trigger with Backlog*/
CREATE TRIGGER Update_PROJECTIONS
ON PROJECTIONS
FOR UPDATE
AS
INSERT P_Audit
SELECT*,getdate(),'I'
FROM deleted
go

/*create INSERT trigger with Backlog*/
CREATE TRIGGER Insert_PROJECTIONS
ON PROJECTIONS
FOR INSERT
AS
INSERT P_Audit
SELECT*,getdate(),'I'
FROM inserted 
go

/*insert, delete and update data*/
INSERT INTO PROJECTIONS VALUES(1, 1,12, 1, 1, 1)
UPDATE P_Audit SET When_Changed='01/01/1996',Operation='I' WHERE PROJECTION_ID=1

INSERT INTO PROJECTIONS VALUES(2, 1,10, 1, 1, 1)
UPDATE P_Audit SET When_Changed='01/01/1996',Operation='I' WHERE PROJECTION_ID=2

INSERT INTO PROJECTIONS VALUES(3, 1,15, 1, 1, 1)
UPDATE P_Audit SET When_Changed='01/01/1996',Operation='I' WHERE PROJECTION_ID=3

INSERT INTO PROJECTIONS VALUES(4, 1,17, 1, 1, 1)
UPDATE P_Audit SET When_Changed='01/01/1996',Operation='I' WHERE PROJECTION_ID=4

INSERT INTO PROJECTIONS VALUES(5, 1,18, 1, 1, 1)
UPDATE P_Audit SET When_Changed='01/01/1996',Operation='I' WHERE PROJECTION_ID=5

DELETE FROM PROJECTIONS WHERE PROJECTION_ID=5 
UPDATE P_Audit SET When_Changed='02/3/1996',Operation='D' 
WHERE PROJECTION_ID=5 AND
	(When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=5))

UPDATE PROJECTIONS SET PROJECTION_TYPE=13 WHERE PROJECTION_ID=2
UPDATE P_Audit SET When_Changed='3/20/1996',Operation='U' WHERE PROJECTION_ID=2
AND (When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=2))

UPDATE PROJECTIONS SET PROJECTION_TYPE=11 WHERE PROJECTION_ID=3
UPDATE P_Audit SET When_Changed='5/28/1996',Operation='U' WHERE PROJECTION_ID=3 AND
(When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=3))

UPDATE PROJECTIONS SET PROJECTION_TYPE=14 WHERE PROJECTION_ID=2
UPDATE P_Audit SET When_Changed='6/17/1996',Operation='U' 
WHERE PROJECTION_ID=2 AND
(When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=2))

INSERT INTO PROJECTIONS VALUES(5, 1, 19, 1, 1, 1)
UPDATE P_Audit SET When_Changed='04/09/1996',Operation='I' WHERE PROJECTION_ID=5 AND
(When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=5))

DELETE FROM PROJECTIONS WHERE PROJECTION_ID=4 
UPDATE P_Audit SET When_Changed='07/12/1996',Operation='D' WHERE PROJECTION_ID=4 AND
(When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=4))

INSERT INTO PROJECTIONS VALUES(4, 1, 18, 1, 1, 1)
UPDATE P_Audit SET When_Changed='08/30/1996',Operation='I' WHERE PROJECTION_ID=4 AND
(When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=4))


/*query PROJECTIONS table with Backlog*/
print""
print"PROJECTIONS table with backlog" 	
SELECT PROJECTION_ID,PROJECTION_TYPE  
FROM PROJECTIONS
ORDER BY PROJECTION_ID

/*query P_Audit table with Backlog*/
print""
print"P_Audit table with backlog"
SELECT PROJECTION_ID,PROJECTION_TYPE,When_Changed=convert(char,When_Changed,101), Operation	
FROM P_Audit
ORDER BY When_Changed


/*query reconstructed table as of April 1, 1996 with Backlog*/
print""
print"CF 9.10"
print"Reconstructed PROJECTIONS table with algorithm 3"
SELECT P.PROJECTION_ID,P.PROJECTION_TYPE
FROM PROJECTIONS P
WHERE '1996-04-01'>(SELECT MAX(When_Changed)
			FROM P_Audit A
			WHERE P.PROJECTION_ID=A.PROJECTION_ID)
UNION
SELECT A2.PROJECTION_ID,A2.PROJECTION_TYPE
FROM P_Audit A, P_Audit A2
WHERE A.When_Changed<A2.When_Changed
      AND A.PROJECTION_ID=A2.PROJECTION_ID
      AND NOT EXISTS(SELECT *
		FROM P_Audit A3
		WHERE A.PROJECTION_ID=A3.PROJECTION_ID
  		  AND A.When_Changed<A3.When_Changed
		  AND A3.When_Changed<A2.When_Changed)
      AND A.When_Changed<'1996-04-01'
      AND '1996-04-01'<A2.When_Changed    	
      AND A.Operation<>'D'		

go

drop trigger Delete_PROJECTIONS
drop trigger Update_PROJECTIONS
drop trigger Insert_PROJECTIONS
go
