PL/SQL为employee表创建插入触发器计算10%薪资时出现表突变问题
触发器突变表错误解决方案
错误原因
突变表(mutating table)是Oracle数据库针对行级触发器的限制规则:当行级触发器被触发时,触发该触发器的基表正处于修改状态,此时不允许对该表执行额外的增删改操作。你当前编写的AFTER INSERT行级触发器内部执行了UPDATE employee的同表修改操作,正好触发了该限制。
最优解决方案
你不需要在触发器内额外执行UPDATE语句,直接将触发器改为BEFORE INSERT类型,直接修改待插入行的NEW伪列值即可:
create or replace trigger calculation before insert on employee for each row begin if :new.updated_sal is null then -- 直接给即将插入的行的updated_sal字段赋值,无需额外更新表 :new.updated_sal := :new.salary * 0.1; end if; end; /
该方案完全规避了对基表的二次DML操作,不会触发突变表错误,执行效率也远高于原写法。
备选方案(仅适用于必须使用AFTER触发的特殊场景)
如果你的业务逻辑必须在INSERT操作完成后再执行计算,可以使用Oracle 11g及以上版本支持的复合触发器,拆分触发时机,在行级阶段缓存待处理的行ID,在语句级阶段统一执行更新操作,该场景下不推荐使用,仅作为拓展参考。
内容的提问来源于stack exchange,提问作者user17448656
相关产品推荐
相关产品推荐

