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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12361284/viewspace-132317/