【问题标题】:How to create a trigger to record changes for Insert,Update,Delete for multiple tables如何创建触发器来记录多个表的插入、更新、删除的更改
【发布时间】:2011-04-22 08:57:39
【问题描述】:

我的数据库中有两个表。以后可能会增加。我想添加另一个表 Audit 以跟踪对现有两个表的更改。我想跟踪对这些表中的任何一个所做的任何更改 AUdit 表结构是
身份证
表名
字段名称
旧值
新值
Modified_By
修改日期

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

【问题讨论】:

    标签: sql database oracle10g triggers


    【解决方案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 最佳做法是将程序放入一个包中。

    【讨论】:

    • 会尝试这种方法并返回。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2014-02-09
    • 2012-03-27
    相关资源
    最近更新 更多