Sql 如何创建触发器来记录多个表的Insert、Update和Delete更改

Sql 如何创建触发器来记录多个表的Insert、Update和Delete更改,sql,database,oracle10g,triggers,Sql,Database,Oracle10g,Triggers,我的数据库中有两个表。以后可能会增加。我想添加另一个表审核以跟踪对现有两个表的更改。我想跟踪对其中任何一个表所做的任何更改 审核表结构为 ID 表\u名称 字段名称 旧值 新的\u值 由 修改日期 因此,现在我希望两个表都有一个触发器,它可以在插入、更新或删除任何一个表时触发。 触发此触发器时,我希望在Audit中插入值。更新时,我希望旧值和新值。插入时,我希望旧值为nothing,新值为Inserted。删除时,我希望旧值为old existing value,新值为deleted。我不太确定

我的数据库中有两个表。以后可能会增加。我想添加另一个表审核以跟踪对现有两个表的更改。我想跟踪对其中任何一个表所做的任何更改 审核表结构为
ID
表\u名称
字段名称
旧值
新的\u值

修改日期

因此,现在我希望两个表都有一个触发器,它可以在插入、更新或删除任何一个表时触发。
触发此触发器时,我希望在Audit中插入值。更新时,我希望旧值和新值。插入时,我希望旧值为nothing,新值为Inserted。删除时,我希望旧值为old existing value,新值为deleted。

我不太确定您的问题是什么。触发器可以使用: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
   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最佳做法是将程序放入一个包中。

将尝试此方法并返回。谢谢