我不太清楚你的問題是什麼。觸發器可以使用: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最好的做法是把程序到一個包。
將嘗試此方法並返回。謝謝 – gizgok 2010-10-07 13:37:15
等待 - 請注意DATE列:我將更新我的答案... – 2010-10-07 13:42:43