我认为您正在考虑审计表,请找到对插入、更新和删除进行审计的触发器
编辑:phantom
建议您需要在插入审计表之前检查每一列的新旧值。这样您可以实现哪些列值发生变化。但是为此,如果多列已更新,您需要将多行插入审计表相同的记录。
我的想法是在更新/删除/插入审计表之前创建同一记录的副本。当你想要更改时,根据 source_action/source_rowid 与审计表中的先前记录进行比较
CREATE TABLE table_for_audit
(
col1 NUMBER,
col2 NUMBER,
col3 NUMBER,
cre_date DATE,
cre_user VARCHAR2 (200)
);
CREATE TABLE audit_table
(
col1 NUMBER,
col2 NUMBER,
col3 NUMBER,
cre_date DATE,
cre_user VARCHAR2 (200),
source_action VARCHAR2 (1),
source_rowid
);
CREATE OR REPLACE TRIGGER trg_table_audit
BEFORE INSERT OR UPDATE OR DELETE
ON table_for_audit
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
v_source_action VARCHAR2 (1);
BEGIN
IF INSERTING
THEN
v_source_action := 'I';
v_source_rowid := :NEW.ROWID;
ELSIF UPDATING
THEN
v_source_action := 'U';
v_source_rowid := :OLD.ROWID;
ELSIF DELETING
THEN
v_source_action := 'D';
v_source_rowid := :OLD.ROWID;
END IF;
IF INSERTING OR UPDATING
THEN
INSERT INTO audit_table (col1,
col2,
col3,
cre_date,
cre_user,
source_action,
source_rowid)
VALUES (:NEW.col1,
:NEW.col2,
:NEW.col3,
SYSDATE,
SYS_CONTEXT ('USERENV', 'CURRENT_USER'),
v_source_action,
v_source_rowid);
ELSIF DELETING
THEN
INSERT INTO audit_table (col1,
col2,
col3,
cre_date,
cre_user,
source_action,
source_rowid)
VALUES (:OLD.col1,
:OLD.col2,
:OLD.col3,
SYSDATE,
SYS_CONTEXT ('USERENV', 'CURRENT_USER'),
v_source_action,
v_source_rowid);
END IF;
END;
/
如果我的理解有误,请纠正。谢谢