oracle自治事务的写法_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> 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值