2010-10-07 124 views
0

我在我的数据库中有两个表。这可以在以后增加。我想添加另一个表审计来跟踪对现有两个表的更改。我想跟踪做这些表 审计表结构的任何变化都
ID
TABLE_NAME
FIELD_NAME
OLD_VALUE
NEW_VALUE
Modified_By
Date_of_Modification
如何创建一个触发器来记录插入,更新,删除多个表的更改

所以现在我想要一个触发器,这两个表都可以在插入时触发,更新或删除到我的表中。 当这个触发器被触发时,我想在Audit中插入值。当我更新时,我想要旧值和新值。插入时,我希望将旧值作为Nothing和新值作为Inserted。当删除时,我希望将旧值作为旧的现有价值和新的价值被删除。

回答

1

我不太清楚你的问题是什么。触发器可以使用:OLD和:新的关键字是这样的:

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最好的做法是把程序到一个包。

+0

将尝试此方法并返回。谢谢 – gizgok 2010-10-07 13:37:15

+0

等待 - 请注意DATE列:我将更新我的答案... – 2010-10-07 13:42:43

相关问题