问题标签 [ora-04091]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
24371 浏览

oracle - ORA-04091: 表 [blah] 正在变异,触发器/函数可能看不到它

我最近开始研究一个大型复杂的应用程序,由于这个错误,我刚刚被分配了一个错误:

有问题的触发器看起来像

该表有一个主键“ t1_pk”、一个“约会事件 id” t1_appnt_evnt_id和另一列“ t1_prnt_t1_pk”,它可能包含也可能不包含另一行的t1_pk.

看来触发器正在尝试确保没有其他具有相同内容的人t1_appnt_evnt_id引用同一行,如果该行引用另一行,则该行引用另一行的引用。

DBA 对错误报告的评论说“删除触发器,并在代码中执行检查”,但不幸的是,他们在 Hibernate 之上有一个专有的代码生成框架,所以我什至无法弄清楚它实际上在哪里被写出来,所以我希望有办法让这个触发器工作。有没有?

0 投票
2 回答
2080 浏览

oracle - 自动更新数据库中的字段

我想用另一列的聚合自动更新数据库列。涉及三个表:

T_RIDERT_PONY通过 建立n:m关系T_RIDER_PONYT_RIDERT_PONY有更多的列,但只有TMP_PONYLISTPONY_NAME这里相关。

TMP_PONYLIST是一个分号分隔的列表PONY_NAMES,想象一下"Twisty Tail;Candy Cane;Lucky Leaf"。无论T_RIDER_PONYT_PONY.

我的第一个想法是在T_RIDER_PONY和上设置触发器T_PONY。问题是似乎不可能T_RIDER_PONY在触发器内读取,我总是得到ORA-04091. 我发现了一些关于使用三个触发器和包变量的提示,但这听起来太复杂了。

也许您认为我最好更改架构或完全摆脱TMP_PONYLIST。这些是选项,但不是这个问题的主题。目前我只对不需要对我的应用程序进行任何更改的答案感兴趣(没有应用程序直接与表一起使用,只有视图,因此允许对视图进行欺骗)。

那么,我怎样才能TMP_PONYLIST自动更新呢?如何连接字符串是一个有趣的子问题,我还没有找到一个优雅的解决方案。

我正在使用 Oracle 数据库 10g 企业版版本 10.2.0.4.0 - 64bi。

更新

我喜欢使用物化视图的想法。我所拥有的是:

string_agg没有显示,因为它很长而且我认为它不相关。

它不会编译ON COMMIT,我明白了ORA-12054。据我了解,文档聚合仅禁止使用 REFRESH FAST,那么这里有什么问题?

更新 文森特和托尼的答案不同,但都有帮助。我接受了托尼,但也请务必阅读文森特的回答。

0 投票
4 回答
6019 浏览

oracle - ORA-04091 关于在 xxx 上插入更新之前创建或替换触发器 xxx

有人可以帮我纠正下面的触发器吗?我被分配了这个问题,但我的技术能力有限。

我的脚本遇到以下错误(ORA 4091):

处理标准 PO 编号:27179

...................................................

更新采购订单状态..

完成审批处理。

dist id 611294gl 金额 10000.88 bill_del_amount 0 l_amount 10000.88

发生了一些异常 **ORA-04091: 表 PO.PO_DISTRIBUTIONS_ALL 正在变异,

触发器/函数可能看不到它**

ORA-06512: 在 "APPS.XXAET_PO_DELIVER_TO_TRG",

第 22 行

ORA-01403: 未找到数据

ORA-04088: 执行触发器期间出错

'APPS.XXAET_PO_DELIVER

PL/SQL 过程成功完成。

SQL>

我设法在客户端机器中找到了自定义触发器,但经过研究,我无法确定 sql 有什么问题。请帮忙!

太感谢了!肯尼斯。

0 投票
8 回答
5406 浏览

oracle - Oracle 触发器 - 变异表的问题

我的桌子:

所以 TableC 中的项是 TableB 的子项,TableB 中的项是 TableA 的子项。反之亦然 - TableA 中的项是 TableB 的父项,TableB 中的项是 TableC 的父项。

我想控制父项的状态......例如,我们有这些数据:

父状态应该始终是他的孩子的最小状态。因此,如果我们现在像这样更新 TableC:

我的触发器应该自动更新 TableB(设置状态 = 50,其中 id = 1),然后也更新 TableA(设置状态 = 50,其中 id = 1)

我想使用触发器(在 TableA、TableB、TableC 上的 AFTER UPDATE、INSERT、DELETE )来执行此操作,以便在每个操作之后执行此步骤:

  1. 获取父母ID
  2. 从当前父母的所有孩子中找到最小的状态
  3. 如果所有子节点的最小状态大于父节点的状态,则更新父节点

如何避免“变异表错误”?在这个例子中使用自治事务是否节省?我看到了一些意见,变异表错误表明应用程序的逻辑存在缺陷 - 这是真的吗?如何更改我的逻辑以防止出现此错误?

谢谢


编辑:感谢所有伟大的答案!

最后,我使用了触发器(感谢 Vincent Malgrat,他指出了 Tom Kyte 的文章)。


编辑:在真正的结局中,我使用了存储过程并删除了触发器:)

0 投票
1 回答
2237 浏览

sql - 删除与 LIKE 匹配的子字符串的行?

如何从表中删除行,其中列包含子字符串,但该列的类型为“Long”。(是的,我知道我不应该使用 Long,但我在维护别人的烂摊子)。

我的第一次尝试是:

(从这个答案开始。)

这将返回:

SQL 错误:ORA-04091:表 blah.longtable 正在变异,触发器/函数可能看不到它

0 投票
2 回答
9104 浏览

sql - 变异,触发器/函数可能看不到它 - 执行触发器期间出错

我已经制作了这个触发器,并在表中插入行时 - TEST_TRNCOMPVISIT 它给出了以下错误 -

发生以下错误:

ORA-04091:表 TEST.TEST_TRNCOMPVISIT 正在变异,触发器/函数可能看不到它
ORA-06512:在“TEST.UPDATE_TEST_280510”,第 4 行
ORA-06512:在“TEST.UPDATE_TEST_280510”,第 10 行
ORA-04088:在执行触发器'TEST.UPDATE_TEST_280510'

0 投票
4 回答
1522 浏览

sql - oracle中的触发器问题

问题是这样的:我在名为 CLAN_AFFILIATI 的表上实现了一个触发器,它增加(如果 inseriemento)并减少(如果取消)另一个名为 CLAN 的表的属性 (NUMAFFILIATI)。我要做的是阻止用户对 Clan 的更新 NUMAFFILIATI 并考虑在 CLAN 上再触发一次:

触发 CLAN_AFFILIATI(CLAN VARCHAR,AFFILIATO VARCHAR,RUOLO VARCHAR)

触发 CLAN (NAME VARCHAR ,NUMAFFILIATI INTEGER)

但我正在做的是报告一个错误:

我怎么解决这个问题 ....

0 投票
2 回答
6130 浏览

oracle - 简单的预言机触发器

简单的一个。我是一个 PLSql 的新手,oracle 的错误消息永远不会太有帮助。

我想做一个简单的触发器来用当前日期更新列,即表的“修改日期”列。虽然得到一个奇怪的错误。

这个想法很简单

这会弹出错误:

有人能快速解决这个问题吗?

干杯,

F。

0 投票
3 回答
1028 浏览

sql - ORA-04091 - 如何更改触发器触发的表?

所以我有表foo,我想foo在触发器触发时删除其他行t_foo

我将如何在不获取ORA-04091:表名的情况下执行此操作正在发生变化,触发器/函数可能看不到它。这甚至可能吗?

0 投票
2 回答
8663 浏览

oracle - 删除触发器后的 Oracle...如何避免变异表 (ORA-04091)?

假设我们有以下表结构:

可能很明显,但值得一提的是,文档的当前状态是最后输入的状态历史记录。

该系统的性能缓慢但肯定会下降,我建议将上述结构更改为:

这样,我们就可以将文档的当前状态放在应有的位置。

由于遗留应用程序的构建方式,我无法更改遗留应用程序上的代码来更新文档表上的当前状态。

在这种情况下,我不得不为我的规则打开一个例外,以不惜一切代价避免触发器,仅仅是因为我无权访问遗留应用程序代码。

我创建了一个触发器,每次将新状态添加到状态历史记录时,它都会更新文档的当前状态,它就像一个魅力。

然而,在一个晦涩且很少使用的情况下,需要删除最后的状态历史,而不是简单地添加一个新的。因此,我创建了以下触发器:

这就是我得到臭名昭著的错误的地方ORA-04091

我了解为什么会收到此错误,即使我将触发器配置为AFTER触发器。

问题是我看不到解决此错误的方法。我在网上搜索了一段时间,到目前为止找不到任何有用的东西。

随着时间的推移,我们正在使用 Oracle 9i。