更新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




