自治事务---触发器

为了审核对表emp的修改的记录,分别创建自治事务触发器和普通的触发器,对比二者的异同点:

 

首先看自治事务触发器:

 

SQL> CREATE TABLE emp_audit ( emp_audit_id NUMBER(6), up_date DATE,

  2                           new_sal NUMBER(8,2), old_sal NUMBER(8,2) );

 

表已创建。

 

SQL> l

  1  create or replace trigger audit_sal

  2    before update of sal on emp for each row

  3  declare

  4  pragma autonomous_transaction;

  5  begin

  6  insert into emp_audit values(:old.empno,sysdate,:new.sal,:old.sal);

  7  commit;

  8* end;

SQL> /

 

触发器已创建

 

SQL> insert into emp values(9999,'lsq','CLERK',7902,sysdate,9000,1000,20);

 

已创建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> update emp set sal=sal*1.1 where empno=9999;

 

已更新 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> update emp set sal=sal*1.1 where empno=9999;

 

已更新 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> select * from emp_audit;

 

EMP_AUDIT_ID UP_DATE              NEW_SAL    OLD_SAL

------------ ----------------- ---------- ----------

        9999 20110616 11:20:33       9900       9000

        9999 20110616 11:20:56      10890       9900

 

可见,不管update操作成功与否,自治事务触发器均会将update之前的值和update之后的值记录到emp_audit表中。

 

再看一下普通的触发器:

 

SQL> create or replace trigger audit_sal

  2    before update of sal on emp for each row

  3  --declare

  4  --pragma autonomous_transaction;

  5  begin

  6  insert into emp_audit values(:old.empno,sysdate,:new.sal,:old.sal);

  7  commit;

  8  end;

  9  /

 

触发器已创建

 

SQL> truncate table emp_audit;

 

表被截断。

 

SQL> update emp set sal=sal*1.1 where empno=9999;

update emp set sal=sal*1.1 where empno=9999

       *

第 1 行出现错误:

ORA-04092: COMMIT 不能在触发器中

ORA-06512: 在 "SCOTT.AUDIT_SAL", line 3

ORA-04088: 触发器 'SCOTT.AUDIT_SAL' 执行过程中出错

 

 

SQL> create or replace trigger audit_sal

  2    before update of sal on emp for each row

  3  --declare

  4  --pragma autonomous_transaction;

  5  begin

  6  insert into emp_audit values(:old.empno,sysdate,:new.sal,:old.sal);

  7  --commit;

  8  end;

  9  /

 

触发器已创建

 

SQL> update emp set sal=sal*1.1 where empno=9999;

 

已更新 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> update emp set sal=sal*1.1 where empno=9999;

 

已更新 1 行。

 

SQL> roll

回退已完成。

SQL> select * from emp_audit;

 

EMP_AUDIT_ID UP_DATE              NEW_SAL    OLD_SAL

------------ ----------------- ---------- ----------

        9999 20110616 11:25:35      11979      10890

 

可见,对于普通触发器,只记录update成功的操作,并不记录发生rollbackupdate操作,同时还可以看出,普通的触发器中不能使用commit

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-700047/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10972173/viewspace-700047/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值