2010-10-07 42 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

相關問題