为了审核对表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成功的操作,并不记录发生rollback的update操作,同时还可以看出,普通的触发器中不能使用commit。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-700047/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10972173/viewspace-700047/