ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 自治事务---触发器

自治事务---触发器

原创 Linux操作系统 作者:lsq_008 时间:2011-06-16 15:05:43 0 删除 编辑

为了审核对表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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: Semi join 与anti join
下一篇: 自治事务---函数
请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1255035