You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 12c中更新table_1后插入table_2的触发器报错修复

修复Oracle 12c触发器的ORA-04091错误

问题分析

你的触发器存在两个核心问题:

  1. 触发条件不符合业务需求:原触发器的when (old.EMAIL_SENT = 'Y')是当旧值为'Y'时触发,但你需要的是EMAIL_SENT被更新为'Y'(即旧值非'Y'、新值为'Y')的场景。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:57:07