变异表

来源:互联网 发布:苏州睿途网络 编辑:程序博客网 时间:2024/04/29 14:18

变异表就是当前被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


SQLinsert 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