我的数据库中有两个表。这可以在以后增加。我想添加另一个表Audit以跟踪对现有两个表的更改。我想跟踪对这些表中的任何一个所做的任何更改
AUdit表结构为
ID
TABLE_NAME
FIELD_NAME
OLD_VALUE
NEW_VALUE
Modified_By
Date_of_Modification
现在我想为两个表创建一个触发器,可以在插入,更新或删除任何一个表时触发。 触发此触发器时,我想在Audit中插入值。当我正在更新时,我想要旧值和新值。插入时我希望旧值为空,新值为Inserted.When正在删除我希望旧值为旧现有值和新值已删除。
答案 0 :(得分:1)
我不太确定你的问题是什么。触发器可以使用:OLD和:NEW关键字,如下所示:
create trigger table1_trg
after insert or update or delete on table1
for each row
begin
if :old.col1 is null and :new.col1 is not null
or :old.col1 is not null and :new.col1 is null
or :old.col1 != :new.col1
then
insert into audit_table ...
end if;
-- Ditto for col2, col3, ...
end;
没有通用的方法,您必须为每列提供代码。但是,您可以像这样封装逻辑:
procedure log_col_change
( p_table_name varchar2
, p_column_name varchar2
, p_old_val varchar2
, p_new_val varchar2
)
is
begin
if p_old_val is null and p_new_val is not null
or p_old_val is not null and p_new_val is null
or p_old_val != p_new_val
then
insert into audit_table ...
end if;
end;
-- Overloaded version to handles DATE columns without losing time component
procedure log_col_change
( p_table_name varchar2
, p_column_name varchar2
, p_old_val date
, p_new_val date
)
is
begin
log_col_change (p_table_name, p_column_name
, to_char(p_old_val,'YYYY-MM-DD HH24:MI:SS')
, to_char(p_new_val,'YYYY-MM-DD HH24:MI:SS')
);
end;
然后触发:
create trigger table1_trg
after insert or update or delete on table1
for each row
begin
log_col_change ('MYTABLE', 'COL1', :old.col1, :new.col1);
log_col_change ('MYTABLE', 'COL2', :old.col2, :new.col2);
... etc.
end;
NB最佳做法是将程序放入包中。