Oracle中的自治事务(Autonomous Transaction)

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值