变异表就是当前被DML语句修改的表,对trigger来说,变异表就是trigger在其上
定义的表。需要明确的是trigger中SQL语句不能进行如下操作:
1)读或修改触发语句的任何变异表,其中包括触发表本身
2)读或修改触发表的约束表中的主关键字,唯一关键字和外部关键字列。除此之外的其他列都可以修改。
以上2条限制适合所有的行级trigger.
注意:如果insert 语句只影响一句的话,则在改行的before和after 触发器将不把触发表当作变异表对待。
这是在行级trigger可能载入或修改触发表时的唯一案例。而对于象insert into table_name select * from ...
总是把触发表当作变异表,即使子查询返回一行也是一样的。
下面以一个具体的实例来说明这一点
PHP code:
SQL> create table toms(area number(3),
2 name varchar2(32));
表已创建。
SQL> insert into toms values(10,'BJ');
已创建 1 行。
SQL> commit;
提交完成。
SQL> create or replace trigger trig_bi_toms
2 before insert on toms
3 for each row
4 begin
5 if :new.area=531 then
6 update toms set name='调整' where area=531;
7 end if;
8 end;
9 /
触发器已创建
SQL> insert into toms values(20,'TJ');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into toms values(531,'JN');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from toms;
10 BJ
20 TJ
531 JN
SQL> insert into toms values(531,'JN');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from toms;
10 BJ
20 TJ
531 调整
531 JN
SQL>
SQL> insert into toms select 531,'DH' from tabs;
insert into toms select 531,'DH' from tabs
*
第 1 行出现错误:
ORA-04091: 表 STUDY.TOMS 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "STUDY.TRIG_BI_TOMS", line 3
ORA-04088: 触发器 'STUDY.TRIG_BI_TOMS' 执行过程中出错
SQL> insert into toms select 531,'DH' from tabs where rownum=1;
insert into toms select 531,'DH' from tabs where rownum=1
*
第 1 行出现错误:
ORA-04091: 表 STUDY.TOMS 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "STUDY.TRIG_BI_TOMS", line 3
ORA-04088: 触发器 'STUDY.TRIG_BI_TOMS' 执行过程中出错
SQL>
摘自:http://www.itpub.net/525513.html