首页 文章

如何创建触发器以记录多个表的插入,更新,删除更改

提问于
浏览
0

我的数据库中有两个表 . 这可以在以后增加 . 我想添加另一个表Audit来跟踪对现有两个表的更改 . 我想跟踪对这些表中的任何一个所做的任何更改AUdit表结构是
ID
TABLE_NAME
FIELD_NAME
OLD_VALUE
NEW_VALUE
Modified_By
Date_of_Modification

所以现在我想为两个表都设置一个触发器,可以在插入,更新或删除任何一个表时触发 . 触发此触发器时,我想在Audit中插入值 . 当我正在更新时,我想要旧值和新值 . 插入时我希望旧值为空,新值为Inserted.When正在删除我希望旧值为旧已删除的现有值和新值 .

1 回答

  • 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最佳做法是将程序放入一个包中 .

相关问题