Oracle 12c中更新table_1后插入table_2的触发器报错修复
修复Oracle 12c触发器的ORA-04091错误
问题分析
你的触发器存在两个核心问题:
- 触发条件不符合业务需求:原触发器的
when (old.EMAIL_SENT = 'Y')是当旧值为'Y'时触发,但你需要的是EMAIL_SENT被更新为'Y'(即旧值非'Y'、新值为'Y')的场景。 - ORA-04091错误原因:虽然你的触发器没有显式查询
table_1,但如果table_2存在关联table_1的触发器(比如对table_1进行查询/修改),会形成循环触发,导致Oracle判定触发表处于"突变"状态;另外原条件的写法也可能引发隐含的表访问。
修复方案
1. 修正触发器逻辑
将触发条件调整为仅当EMAIL_SENT从非'Y'变为'Y'时触发,同时确保仅使用:new/:old伪记录(不直接访问触发表):
create or replace trigger CUSTOMER_INSERT after update of EMAIL_SENT on table_1 for each row when (:new.EMAIL_SENT = 'Y' and :old.EMAIL_SENT <> 'Y') begin insert into table_2 (WF_ID, SRVC_ID, CUSTOMER_ID, EMAIL_SENT) values (:new.WF_ID, :new.SRVC_ID, :new.CUSTOMER_ID, :new.EMAIL_SENT); end; /
2. 检查关联触发器
如果修正后仍出现ORA-04091,需检查table_2上是否存在触发器,该触发器若对table_1进行了查询或修改操作,会形成循环依赖,需要调整该触发器的逻辑,避免访问正在触发的table_1。
内容的提问来源于stack exchange,提问作者Ina
相关产品推荐
相关产品推荐

