过着简单,真实的生活,喜欢收藏变形金刚(TFE,G1,SL系列),研究金融股市,KOF98,篮球,学习研究Oracle技术,我并不是一个全职的Oracle DBA,但是对于Oracle技术的热爱和研究,是一个不争的事实,愿意结交广大Oracle技术爱好者!MSN:oracle_kof_tf@hotmail.com

Oracle中的自治事务(Autonomous Transaction)

上一篇 / 下一篇  2008-01-09 22:42:44 / 个人分类:Oracle数据库技术-SQL

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> connhujinpei/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


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar