oracle触发器使用:after insert 与before insert的简单使用注意

建立触发器时,触发器类型为after insert ,函数

在begin中事务

Select fieldA into v_a from tableA;it

执行到此句时,会出错:io

--弹出错误信息提示  table

   --ORA-04091:表tr_table发生了变化触发器/函数不能读它  扩展

   --ORA-06512: 在iu_table line 2  date

--ORA-04088: 触发器iu_table 执行过程当中出错  数据

 

问题分析:异常

在Oracle中执行DML语句的时候是须要显示进行提交操做的。当咱们进行插入的时候,会触发触发器执行对触发器做用表和扩展表的种种操做,可是这个时候触发器和插入语句是在同一个事务管理中的,所以在插入语句没有被提交的状况下,咱们没法对触发器做用表进行其余额外的操做。若是执行其余额外的操做则会抛出如上异常信息。tab

 

解决方案:

出错的缘由是由于触发器和DML语句在同一事务管理中,因此方案一即是将触发器和DML语句分红两个单独的事务处理。这里可使用Pragma autonomous_transaction; 告诉Oracle触发器是自定义事务处理。

Declare

pragma autonomous_transaction;  

begin

-------

--这里须要显示提交事务

Commit;

End;

 

同时,触发器不能更新触发条件所在的行。

例如:

Create or replace trigger tri_A

After  insert on tableA

For each row

Declare

pragma autonomous_transaction;  

begin

update tableA set fieldA=1 where id=:new.id;

end;

当你插入数据时,会发现,这个update语句有执行,却不生效。

而后想改成:new.fieldA= 1,执行后,报错:

ORA-04084:没法更改此触发器类型的new值

这时候,要更换策略了,不过,也得根据我的需求了,

恰好个人需求能够经过更新触发器类型after insert 为before insert
相关文章
相关标签/搜索