Summary
This article describes a classic method of capturing table changes (insert, updates, deletes). Table changes are stored in another table along with user information who did the change.
Create table <Base Table Name> and the table for history changes <History Table Name EX:- Table_Name_H>
CREATE TABLE <Base Table Name>
AS SELECT * FROM (Another Table Name);
CREATE TABLE <History Table Name EX:- Table_Name_H>
AS SELECT * FROM <Base Table Name>
WHERE 1=2;
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (USERNAME VARCHAR2(30));
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (OSUSER VARCHAR2(30));
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (MACHINE VARCHAR2(64));
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (PROGRAM VARCHAR2(48));
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (LOGON_TIME DATE);
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (CHANGE_TIME DATE);
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (CHANGE_TYPE VARCHAR2(10));
TRIGGER CREATION PROCESS:-
====================================
/* Formatted on 9/2/2015 9:12:30 AM (QP5 v5.240.12305.39446) */
CREATE OR REPLACE TRIGGER [Trigger name]
BEFORE INSERT OR DELETE OR UPDATE
ON <Base Table Name>
FOR EACH ROW
DECLARE
username1 VARCHAR2 (30);
osuser1 VARCHAR2 (30);
machine1 VARCHAR2 (64);
program1 VARCHAR2 (48);
logon_time1 DATE;
BEGIN
SELECT USERNAME,
OSUSER,
MACHINE,
PROGRAM,
LOGON_TIME
INTO USERNAME1,
OSUSER1,
MACHINE1,
PROGRAM1,
LOGON_TIME1
FROM v$session
WHERE audsid = (SELECT USERENV ('SESSIONID') FROM DUAL);
IF INSERTING
THEN
INSERT INTO <History Table Name EX:- Table_Name_H>
(OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS,
TEMPORARY,
GENERATED,
SECONDARY,
USERNAME,
OSUSER,
MACHINE,
PROGRAM,
LOGON_TIME,
CHANGE_TIME,
CHANGE_TYPE)
VALUES (:NEW.OWNER,
:NEW.OBJECT_NAME,
:NEW.SUBOBJECT_NAME,
:NEW.OBJECT_ID,
:NEW.DATA_OBJECT_ID,
:NEW.OBJECT_TYPE,
:NEW.CREATED,
:NEW.LAST_DDL_TIME,
:NEW.TIMESTAMP,
:NEW.STATUS,
:NEW.TEMPORARY,
:NEW.GENERATED,
:NEW.SECONDARY,
USERNAME1,
OSUSER1,
MACHINE1,
PROGRAM1,
LOGON_TIME1,
SYSDATE,
'INS');
ELSIF DELETING
THEN
INSERT INTO<History Table Name EX:- Table_Name_H>
(OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS,
TEMPORARY,
GENERATED,
SECONDARY,
USERNAME,
OSUSER,
MACHINE,
PROGRAM,
LOGON_TIME,
CHANGE_TIME,
CHANGE_TYPE)
VALUES (:OLD.OWNER,
:OLD.OBJECT_NAME,
:OLD.SUBOBJECT_NAME,
:OLD.OBJECT_ID,
:OLD.DATA_OBJECT_ID,
:OLD.OBJECT_TYPE,
:OLD.CREATED,
:OLD.LAST_DDL_TIME,
:OLD.TIMESTAMP,
:OLD.STATUS,
:OLD.TEMPORARY,
:OLD.GENERATED,
:OLD.SECONDARY,
USERNAME1,
OSUSER1,
MACHINE1,
PROGRAM1,
LOGON_TIME1,
SYSDATE,
'DEL');
ELSIF UPDATING
THEN
INSERT INTO <History Table Name EX:- Table_Name_H>
(OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS,
TEMPORARY,
GENERATED,
SECONDARY,
USERNAME,
OSUSER,
MACHINE,
PROGRAM,
LOGON_TIME,
CHANGE_TIME,
CHANGE_TYPE)
VALUES (:OLD.OWNER,
:OLD.OBJECT_NAME,
:OLD.SUBOBJECT_NAME,
:OLD.OBJECT_ID,
:OLD.DATA_OBJECT_ID,
:OLD.OBJECT_TYPE,
:OLD.CREATED,
:OLD.LAST_DDL_TIME,
:OLD.TIMESTAMP,
:OLD.STATUS,
:OLD.TEMPORARY,
:OLD.GENERATED,
:OLD.SECONDARY,
USERNAME1,
OSUSER1,
MACHINE1,
PROGRAM1,
LOGON_TIME1,
SYSDATE,
'UPD');
END IF;
END;
/
This article describes a classic method of capturing table changes (insert, updates, deletes). Table changes are stored in another table along with user information who did the change.
Create table <Base Table Name> and the table for history changes <History Table Name EX:- Table_Name_H>
CREATE TABLE <Base Table Name>
AS SELECT * FROM (Another Table Name);
CREATE TABLE <History Table Name EX:- Table_Name_H>
AS SELECT * FROM <Base Table Name>
WHERE 1=2;
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (USERNAME VARCHAR2(30));
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (OSUSER VARCHAR2(30));
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (MACHINE VARCHAR2(64));
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (PROGRAM VARCHAR2(48));
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (LOGON_TIME DATE);
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (CHANGE_TIME DATE);
ALTER TABLE <History Table Name EX:- Table_Name_H> ADD (CHANGE_TYPE VARCHAR2(10));
TRIGGER CREATION PROCESS:-
====================================
/* Formatted on 9/2/2015 9:12:30 AM (QP5 v5.240.12305.39446) */
CREATE OR REPLACE TRIGGER [Trigger name]
BEFORE INSERT OR DELETE OR UPDATE
ON <Base Table Name>
FOR EACH ROW
DECLARE
username1 VARCHAR2 (30);
osuser1 VARCHAR2 (30);
machine1 VARCHAR2 (64);
program1 VARCHAR2 (48);
logon_time1 DATE;
BEGIN
SELECT USERNAME,
OSUSER,
MACHINE,
PROGRAM,
LOGON_TIME
INTO USERNAME1,
OSUSER1,
MACHINE1,
PROGRAM1,
LOGON_TIME1
FROM v$session
WHERE audsid = (SELECT USERENV ('SESSIONID') FROM DUAL);
IF INSERTING
THEN
INSERT INTO <History Table Name EX:- Table_Name_H>
(OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS,
TEMPORARY,
GENERATED,
SECONDARY,
USERNAME,
OSUSER,
MACHINE,
PROGRAM,
LOGON_TIME,
CHANGE_TIME,
CHANGE_TYPE)
VALUES (:NEW.OWNER,
:NEW.OBJECT_NAME,
:NEW.SUBOBJECT_NAME,
:NEW.OBJECT_ID,
:NEW.DATA_OBJECT_ID,
:NEW.OBJECT_TYPE,
:NEW.CREATED,
:NEW.LAST_DDL_TIME,
:NEW.TIMESTAMP,
:NEW.STATUS,
:NEW.TEMPORARY,
:NEW.GENERATED,
:NEW.SECONDARY,
USERNAME1,
OSUSER1,
MACHINE1,
PROGRAM1,
LOGON_TIME1,
SYSDATE,
'INS');
ELSIF DELETING
THEN
INSERT INTO<History Table Name EX:- Table_Name_H>
(OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS,
TEMPORARY,
GENERATED,
SECONDARY,
USERNAME,
OSUSER,
MACHINE,
PROGRAM,
LOGON_TIME,
CHANGE_TIME,
CHANGE_TYPE)
VALUES (:OLD.OWNER,
:OLD.OBJECT_NAME,
:OLD.SUBOBJECT_NAME,
:OLD.OBJECT_ID,
:OLD.DATA_OBJECT_ID,
:OLD.OBJECT_TYPE,
:OLD.CREATED,
:OLD.LAST_DDL_TIME,
:OLD.TIMESTAMP,
:OLD.STATUS,
:OLD.TEMPORARY,
:OLD.GENERATED,
:OLD.SECONDARY,
USERNAME1,
OSUSER1,
MACHINE1,
PROGRAM1,
LOGON_TIME1,
SYSDATE,
'DEL');
ELSIF UPDATING
THEN
INSERT INTO <History Table Name EX:- Table_Name_H>
(OWNER,
OBJECT_NAME,
SUBOBJECT_NAME,
OBJECT_ID,
DATA_OBJECT_ID,
OBJECT_TYPE,
CREATED,
LAST_DDL_TIME,
TIMESTAMP,
STATUS,
TEMPORARY,
GENERATED,
SECONDARY,
USERNAME,
OSUSER,
MACHINE,
PROGRAM,
LOGON_TIME,
CHANGE_TIME,
CHANGE_TYPE)
VALUES (:OLD.OWNER,
:OLD.OBJECT_NAME,
:OLD.SUBOBJECT_NAME,
:OLD.OBJECT_ID,
:OLD.DATA_OBJECT_ID,
:OLD.OBJECT_TYPE,
:OLD.CREATED,
:OLD.LAST_DDL_TIME,
:OLD.TIMESTAMP,
:OLD.STATUS,
:OLD.TEMPORARY,
:OLD.GENERATED,
:OLD.SECONDARY,
USERNAME1,
OSUSER1,
MACHINE1,
PROGRAM1,
LOGON_TIME1,
SYSDATE,
'UPD');
END IF;
END;
/
No comments:
Post a Comment