Oracle中的自治事務(Autonomous Transaction)

oracle_ace發表於2008-01-09

Autonomous Transaction就是在Oracle允許建立一個事務中的事務,也就是說這種事務的提交或者是回滾不會影響到外層的事務的狀態,但是自治事務在應用的方面用到的不多,這裡僅僅列出最最常用的一種功能就是定製audit:

具例來說:

C:\Documents and Settings\Administrator>sqlplus /nolog

SQL*Plus: Release 10.2.0.3.0 - Production on 星期三 1月 9 22:32:17 2008

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.

SQL> conn hujinpei/passw0rd@irmdb
已連線。

我們首先建立一張事務表
----------------------------------

SQL> create table mytest
  2  as
  3  select * from sys.treeview;

表已建立。

建立一張記錄audit資訊的表
-----------------------------------------

SQL> create table audit_tab
  2  (name varchar2(20) default user,
  3   timestamp date default sysdate,
  4   msg varchar2(500));

表已建立。

 建立一個帶有自治事務的觸發器
-----------------------------------------------

SQL> create or replace trigger mytest_audit
  2  before update on mytest
  3  for each row
  4  declare
  5     pragma autonomous_transaction;
  6     l_cnt number;
  7  begin
  8     select count(*) into l_cnt
  9     from dual
 10     where exists
 11     (  select null from mytest where child=:new.child
 12        start with parent = 'c'
 13        connect by prior child=parent );
 14  if (l_cnt=0)
 15  then
 16     insert into audit_tab (msg) values ('Attempt to update '|| :new.child);
 17     commit;
 18     raise_application_error (-20001,'Access Denied');
 19  end if;
 20  end;
 21  /

觸發器已建立

raise_application_error會導致提示插入失敗,但是我所insert的row因為在自治事務中的commit,而不會得到回滾。

如果我們現在更新一個不屬於parent='c'的child,那麼就會報錯.
SQL> update mytest set child='b3' where child='b2';
update mytest set child='b3' where child='b2'
       *
第 1 行出現錯誤:
ORA-20001: Access Denied
ORA-06512: 在 "HUJINPEI.MYTEST_AUDIT", line 15
ORA-04088: 觸發器 'HUJINPEI.MYTEST_AUDIT' 執行過程中出錯

可以在audit_tab中看到詳細的資訊
SQL> select * from audit_tab;

NAME                 TIMESTAMP
-------------------- --------------
MSG
--------------------------------------------------------------------------------
HUJINPEI             09-1月 -08
Attempt to update b3

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-132317/,如需轉載,請註明出處,否則將追究法律責任。

相關文章