/*drop the tables*/
use fall97_331
drop table PROJECTIONS
drop table P_Audit
go

/*create a 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 a P_Audit table*/
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, 
        PRIMARY KEY  (PROJECTION_ID, When_Changed)
)
go

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

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

/*create a INSERT trigger with permitting insertions*/
CREATE TRIGGER Insert_PROJECTIONS
ON PROJECTIONS
FOR INSERT
AS
INSERT P_Audit
SELECT*,getdate()
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' WHERE PROJECTION_ID=1

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

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

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

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

DELETE FROM PROJECTIONS WHERE PROJECTION_ID=5 
UPDATE P_Audit SET When_Changed='02/3/1996' 
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' 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' 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' 
WHERE PROJECTION_ID=2 AND
(When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=2))

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

INSERT INTO PROJECTIONS VALUES(6, 1, 20, 1, 1, 1)
UPDATE P_Audit SET When_Changed='06/29/1996' WHERE PROJECTION_ID=6 AND
(When_Changed=(SELECT MAX(When_Changed) FROM P_Audit WHERE PROJECTION_ID=6))

/*query a PROJECTIONS table with permitting insertions*/
print""
print"CF 9.8"
print"PROJECTIONS table with permitting insertions"
SELECT PROJECTION_ID,PROJECTION_TYPE  
FROM PROJECTIONS

/*query a P_Audit table with permitting insertions*/
print""
print"P_Audit table with permitting insertions" 
SELECT PROJECTION_ID,PROJECTION_TYPE,When_Changed=convert(char,When_Changed,101)
FROM P_Audit
ORDER BY When_Changed

/*query a reconstructed table with permitting insertions*/
print""
print"CF 9.9"
print"Reconstruction table with algorithm 2"
SELECT A.PROJECTION_ID,A.PROJECTION_TYPE
FROM P_Audit  A
WHERE NOT EXISTS(SELECT *
		  FROM P_Audit  A2
		  WHERE A.PROJECTION_ID=A2.PROJECTION_ID
		       AND '1996-04-01'<A2.When_Changed
		       AND A2.When_Changed<A.When_Changed)
	AND EXISTS (SELECT *
		    FROM P_Audit  A3
		    WHERE A.PROJECTION_ID=A3.PROJECTION_ID	
		      AND A3.When_Changed<='1996-04-01')	
	 AND '1996-04-01'<A.When_Changed
UNION
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)

go

/*drop all the triggers*/
drop TRIGGER Delete_PROJECTIONS
drop TRIGGER Update_PROJECTIONS
drop TRIGGER Insert_PROJECTIONS
go
