2010-10-08 43 views
1

我有一個情況,我有兩個表,我可以在其中插入,更新,刪除。我引入了一個表audit_trail來維護這兩個表的更改日誌。現在在audit_trail表中輸入值我在任何一個表上的任何更新,刪除或插入後寫入了插入語句。現在,如果在其中一個表上發生了修改,並且應用程序崩潰了,那麼根據我的方法,審計表插入將不會發生。所以我想知道,如果在插入,更新或刪除表格後,在條件上寫入觸發條件,那麼即使應用程序崩潰,這也會導致插入審計.DBMS是Oracle即使應用程序崩潰,觸發器是否保持原子性

+0

你的問題意味着你*不*要保持原子。原子性意味着無論是整個交易都承諾還是沒有。聽起來你想'audit_trail'記錄所有*嘗試*到I/U/D,而不僅僅是成功的。 – 2010-10-09 08:46:02

+0

不,如果在其他兩個表上插入,刪除,更新成功,那麼即使應用程序崩潰審覈跟蹤以獲取該條目,也是如此。 – gizgok 2010-10-10 06:22:11

回答

3

這是爲數不多的,可能是唯一的,有效的the AUTONOMOUS_TRANSACTION pragma用途之一。這使我們能夠在離散事務中發出SQL,這意味着這些事情在不影響更廣泛的事務的情況下被提交。因此,即使數據庫在用戶發出顯式提交(或其他)之前崩潰,您的審計消息也會被提交。

很顯然,我不知道你希望記錄的數據,而是寫了一個程序是這樣,並從觸發器調用它:

procedure write_audit 
    (p_table_name in audit_table.table_name%type 
     , p_action in audit_table.action%type) 
is 
    pragma autonomous_transaction; 
begin 
    insert into audit_table 
     (id, table_name, ts, action) 
    values 
     (audit_id.nextval, p_table_name, systimestamp, p_action); 
    commit; 
end write_audit;