自治事务:它是被一个事务调用的事务,但它独立于它的父事务提交或回滚。一般会被用于:
a 匿名块
b 本地、对立或打包的函数或过程
c 对象类型的方法
d 触发器
实验注意:
 
所有操作都使用非SYS用户(DBA或普通用户)。
在SYS用户下做,会报:
 第 1 行出现错误:
 ORA-04089: 无法对 SYS 拥有的对象创建触发器
 建表:
 18:42:13 SQL> create table test(id int,name varchar2(20),num int,cost int);
 Table created
 18:43:46 SQL> 
写触发器,
 update on test 会触发写审计信息。
 18:44:11 SQL> create or replace trigger tib_test
 after update on test for each row
 declare
 pragma autonomous_transaction;
 tib_id number;
 tib_name varchar2(20);
 tib_remain_num number;
 tib_cost number;
 begin
 tib_id :=old.id;
 tib_name :=:new.name;
 tib_remain_num :=:new.num;
 tib_cost :=:new.cost;
 insert into test_audit values (tib_id,tib_name,tib_remain_num,tib_cost);
 commit;
 end;
  /
 Trigger created
插入数据:
 18:45:54 SQL> insert into test values(4,'apple-4',40,4000);
 1 row inserted
 18:46:47 SQL> insert into test values(4,'apple-4',40,4000);
 1 row inserted
 18:47:08 SQL> insert into test values(3,'apple-3',30,3000);
 1 row inserted
 18:47:25 SQL> update test set num=38,cost=999 where id=3;
 1 row updated
 18:47:36 SQL> update test set num=38,cost=999 where id=4;
 2 rows updated
 18:47:38 SQL> select * from test;
         ID NAME                        NUM       COST
 ---------- -------------------- ---------- ----------
          4 apple-4                      38        999
          4 apple-4                      38        999
          3 apple-3                      38        999
可以查看到,更新时产生的审计信息,插入操作时没有产生。
 18:47:43 SQL> select * from test_audit;
         ID NAME                                              REMAIN_NUM       COST
 ---------- -------------------- --------------------------------------- ----------
          3 apple-3                                                   38        999
          4 apple-4                                                   38        999
          4 apple-4                                                   38        999
回滚事务,触发器中写入审计的信息已经提交,不受影响。
 18:47:53 SQL> rollback;
 Rollback complete
 18:48:05 SQL> select * from test;
         ID NAME                        NUM       COST
 ---------- -------------------- ---------- ----------
 18:48:08 SQL> select * from
 test_audit;
         ID NAME                                              REMAIN_NUM       COST
 ---------- -------------------- --------------------------------------- ----------
          3 apple-3                                                   38        999
          4 apple-4                                                   38        999
          4 apple-4                                                   38        999










