/*drop the stored procedures running */
use fall97_331
drop table PROJECTIONS
drop table P_Audit
drop view VIEW_PROJECTIONS
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,
	Operation       char(1), 
        PRIMARY KEY  (PROJECTION_ID, When_Changed)
)
go

/*create a DELETE trigger after using images consistently*/
CREATE TRIGGER Delete_PROJECTIONS
ON PROJECTIONS
FOR DELETE
AS
INSERT P_Audit 
SELECT *,getdate(),'I'
FROM  deleted  
go

/*create a UPDATE trigger after using images consistently corresponding CF9.11*/
CREATE TRIGGER Update_PROJECTIONS
ON PROJECTIONS
FOR UPDATE
AS
INSERT P_Audit
SELECT*,getdate(),'I'
FROM inserted
go

/*create a INSERT trigger after using images consistently corresponding CF9.11*/
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' 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',Operation='D',PROJECTION_TYPE=0,                      PROJECTION_NAME=0,SPHEROID_CODE=0, PROJECTION_UOM=0,                           ZONE_CODE=0 
               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'
               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',PROJECTION_NAME=0,                     PROJECTION_TYPE=0, SPHEROID_CODE=0, PROJECTION_UOM=0,                          ZONE_CODE=0 
               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)


print""
/*query for PROJECTIONS table*/
print"PROJECTIONS table with after images" 	
select PROJECTION_ID,PROJECTION_TYPE  
from PROJECTIONS
order by PROJECTION_ID

print""
/*query for P_Audit table*/
print"P_Audit table with after images"
select PROJECTION_ID,PROJECTION_TYPE,When_Changed=convert(char,When_Changed,101), Operation	
from P_Audit
order by When_Changed
go

print""
/*query for reconstructed table*/ 
print"CF 9.12"
print"Recnstructed PROJECTIONS table with after images"
SELECT A.PROJECTION_ID,A.PROJECTION_TYPE
FROM P_Audit A
WHERE A.When_Changed=(SELECT MAX(A2.When_Changed)
			FROM P_Audit A2
 			WHERE A.PROJECTION_ID=A2.PROJECTION_ID
			  AND A2.When_Changed<'1996-04-01')
		  AND A.Operation<>'D'	
go	

print""
print"CF 9.13"
print"Convert PROJECTIONS to a transaction state table, using after images"
SELECT A.PROJECTION_ID,A.PROJECTION_TYPE, START_DATE=convert(char,A.When_Changed,101), STOP_DATE=convert(char,A2.When_Changed,101)
FROM P_Audit A, P_Audit A2
WHERE A.PROJECTION_ID=A2.PROJECTION_ID
      AND A.When_Changed<(A2.When_Changed)
      AND A.Operation<>'D'
      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)
UNION
SELECT A.PROJECTION_ID,A.PROJECTION_TYPE, START_DATE=convert(char,A.When_Changed,101), STOP_DATE=convert(char,GETDATE(),101)
FROM P_Audit A
WHERE A.Operation<>'D'
      AND NOT EXISTS(SELECT *
		     FROM P_Audit A3
		     WHERE A.PROJECTION_ID=A3.PROJECTION_ID
		       AND A.When_Changed<A3.When_Changed)
ORDER BY STOP_DATE
go

print""
/*query for current table*/
print"CF 9.14"
print"Reconstructing the current version"
SELECT A.PROJECTION_ID, A.PROJECTION_TYPE
FROM P_Audit A
WHERE A.When_Changed=(SELECT MAX(A2.When_Changed)
 		      FROM P_Audit A2
	              WHERE A.PROJECTION_ID=A2.PROJECTION_ID)
      AND A.Operation <> 'D'	
go

print""
/*query for a VIEW_PROJECTIONS*/
print"CF 9.15"
print"Defining PROJECTIONS as a view on P_Audit"
CREATE VIEW VIEW_PROJECTIONS(PROJECTION_ID, PROJECTION_TYPE) 
AS(SELECT A.PROJECTION_ID, A.PROJECTION_TYPE
FROM P_Audit A
WHERE A.When_Changed=(SELECT MAX(A2.When_Changed)
 		      FROM P_Audit A2
	              WHERE A.PROJECTION_ID=A2.PROJECTION_ID)
      AND A.Operation <> 'D' )
go    

select *
from VIEW_PROJECTIONS
go


drop trigger Delete_PROJECTIONS		
drop trigger Update_PROJECTIONS
drop trigger Insert_PROJECTIONS
go
