You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

更新TABLE_A时触发Mutating Trigger错误,求解决方案

解决Oracle触发器的变异表(Mutating Trigger)错误

首先咱们得先揪出你这个错误的根源:你写的行级触发器里,居然又执行了一条针对TABLE_A(我猜你代码里的TABLE是笔误,应该是TABLE_A)的UPDATE语句——Oracle的行级触发器是不允许操作触发它的那张表的,因为此时表正在被修改,处于"变异"状态,数据库无法保证数据一致性,所以直接抛出了这个错误。

而且啊,你的需求其实完全没必要绕这么大弯!既然是BEFORE UPDATE触发器,你直接在触发器里给:new.LAST_UPDATE_DATE赋值就行,根本不用额外执行UPDATE语句。

修正后的触发器代码

create or replace trigger LASTUPDATE_TRIG 
BEFORE update on TABLE_A 
referencing OLD as old NEW as new 
for each row 
WHEN (new.colB <> old.COLB) 
begin
  :new.LAST_UPDATE_DATE := sysdate;
end;

为什么这个方案可行?

  • BEFORE UPDATE触发器在实际更新行之前触发,此时你可以直接修改:new对象里的字段值,这个修改会被自动应用到即将更新的行上,不需要再手动执行UPDATE操作。
  • 这种方式完全避开了操作触发表的行为,自然也就不会出现变异表错误了。

你之前尝试复合触发器其实是没必要的,因为你的需求用简单的行级触发器就能完美解决。只有当你需要在语句级(比如触发器触发前后对整个表做操作)和行级逻辑结合时,才需要用到复合触发器,这里完全用不上。

内容的提问来源于stack exchange,提问作者user3280677

火山引擎 最新活动