问题标签 [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.
oracle - ORA-04091: 表 [blah] 正在变异,触发器/函数可能看不到它
我最近开始研究一个大型复杂的应用程序,由于这个错误,我刚刚被分配了一个错误:
有问题的触发器看起来像
该表有一个主键“ t1_pk
”、一个“约会事件 id”
t1_appnt_evnt_id
和另一列“ t1_prnt_t1_pk
”,它可能包含也可能不包含另一行的t1_pk
.
看来触发器正在尝试确保没有其他具有相同内容的人t1_appnt_evnt_id
引用同一行,如果该行引用另一行,则该行引用另一行的引用。
DBA 对错误报告的评论说“删除触发器,并在代码中执行检查”,但不幸的是,他们在 Hibernate 之上有一个专有的代码生成框架,所以我什至无法弄清楚它实际上在哪里被写出来,所以我希望有办法让这个触发器工作。有没有?
oracle - 自动更新数据库中的字段
我想用另一列的聚合自动更新数据库列。涉及三个表:
T_RIDER
并T_PONY
通过 建立n:m关系T_RIDER_PONY
。
T_RIDER
并T_PONY
有更多的列,但只有TMP_PONYLIST
在PONY_NAME
这里相关。
TMP_PONYLIST
是一个分号分隔的列表PONY_NAMES
,想象一下"Twisty Tail;Candy Cane;Lucky Leaf"
。无论T_RIDER_PONY
或T_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
,那么这里有什么问题?
更新 文森特和托尼的答案不同,但都有帮助。我接受了托尼,但也请务必阅读文森特的回答。
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 有什么问题。请帮忙!
太感谢了!肯尼斯。
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 )来执行此操作,以便在每个操作之后执行此步骤:
- 获取父母ID
- 从当前父母的所有孩子中找到最小的状态
- 如果所有子节点的最小状态大于父节点的状态,则更新父节点
如何避免“变异表错误”?在这个例子中使用自治事务是否节省?我看到了一些意见,变异表错误表明应用程序的逻辑存在缺陷 - 这是真的吗?如何更改我的逻辑以防止出现此错误?
谢谢
编辑:感谢所有伟大的答案!
最后,我使用了触发器(感谢 Vincent Malgrat,他指出了 Tom Kyte 的文章)。
编辑:在真正的结局中,我使用了存储过程并删除了触发器:)
sql - 删除与 LIKE 匹配的子字符串的行?
如何从表中删除行,其中列包含子字符串,但该列的类型为“Long”。(是的,我知道我不应该使用 Long,但我在维护别人的烂摊子)。
我的第一次尝试是:
(从这个答案开始。)
这将返回:
SQL 错误:ORA-04091:表 blah.longtable 正在变异,触发器/函数可能看不到它
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'
sql - oracle中的触发器问题
问题是这样的:我在名为 CLAN_AFFILIATI 的表上实现了一个触发器,它增加(如果 inseriemento)并减少(如果取消)另一个名为 CLAN 的表的属性 (NUMAFFILIATI)。我要做的是阻止用户对 Clan 的更新 NUMAFFILIATI 并考虑在 CLAN 上再触发一次:
触发 CLAN_AFFILIATI(CLAN VARCHAR,AFFILIATO VARCHAR,RUOLO VARCHAR)
触发 CLAN (NAME VARCHAR ,NUMAFFILIATI INTEGER)
但我正在做的是报告一个错误:
我怎么解决这个问题 ....
oracle - 简单的预言机触发器
简单的一个。我是一个 PLSql 的新手,oracle 的错误消息永远不会太有帮助。
我想做一个简单的触发器来用当前日期更新列,即表的“修改日期”列。虽然得到一个奇怪的错误。
这个想法很简单
这会弹出错误:
有人能快速解决这个问题吗?
干杯,
F。
sql - ORA-04091 - 如何更改触发器触发的表?
所以我有表foo
,我想foo
在触发器触发时删除其他行t_foo
:
我将如何在不获取ORA-04091:
表名的情况下执行此操作正在发生变化,触发器/函数可能看不到它。这甚至可能吗?
oracle - 删除触发器后的 Oracle...如何避免变异表 (ORA-04091)?
假设我们有以下表结构:
可能很明显,但值得一提的是,文档的当前状态是最后输入的状态历史记录。
该系统的性能缓慢但肯定会下降,我建议将上述结构更改为:
这样,我们就可以将文档的当前状态放在应有的位置。
由于遗留应用程序的构建方式,我无法更改遗留应用程序上的代码来更新文档表上的当前状态。
在这种情况下,我不得不为我的规则打开一个例外,以不惜一切代价避免触发器,仅仅是因为我无权访问遗留应用程序代码。
我创建了一个触发器,每次将新状态添加到状态历史记录时,它都会更新文档的当前状态,它就像一个魅力。
然而,在一个晦涩且很少使用的情况下,需要删除最后的状态历史,而不是简单地添加一个新的。因此,我创建了以下触发器:
这就是我得到臭名昭著的错误的地方ORA-04091
。
我了解为什么会收到此错误,即使我将触发器配置为AFTER触发器。
问题是我看不到解决此错误的方法。我在网上搜索了一段时间,到目前为止找不到任何有用的东西。
随着时间的推移,我们正在使用 Oracle 9i。