问题标签 [mutating-table]

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 投票
2 回答
3609 浏览

oracle - ORACLE 变异表错误在一个触发器中,但不是另一个;为什么?

好的,我有两个表 - ORDERS 和 ORDERLINES - 它们具有基本相同的问题,每个表都有触发器来解决问题。问题是除了具有表级唯一性的 PK 之外,在一个名为 RECID 的字段上,还有另一个字段 RECNO,它需要与另一个字段的关系是唯一的。

这些表与 FK 相关,如下所示:

ORDERS.WAREHOUSEID > WAREHOUSES.CUSTOMERID > CUSTOMERS

ORDERSLINES.ORDERID > ORDERS

OnORDERS并且ORDERSLINES我有BEFORE INSERT触发器来分配特定于领域的唯一RECNO
ORDERS中,RECNO需要在记录范围内是唯一的CUSTOMERS
ORDERLINES中,RECNO需要在记录范围内是唯一的ORDERS

触发器ORDERS工作得很好。插入新订单时,会为其所属的客户 分配下一个唯一的RECNO 。

ORDERLINES另一方面,应该在它所属的顺序内分配下一个唯一RECNO的触发器会抛出可怕的{ORA-04091: table ORDERLINES is mutating, trigger/function may not see it}异常。

这是有效的触发器:

这是不起作用的触发器

有人可以解释为什么第一个有效,而第二个无效?有什么方法可以重写第二个以使其工作吗?

0 投票
1 回答
476 浏览

oracle - 我怎样才能从一个触发器的过程中修复这个变异表

此触发器会将插入的值传递给将这些值插入另一个表的过程。我收到一个变异表错误。我怎样才能解决这个问题?

0 投票
1 回答
205 浏览

oracle - 在更新触发器上获取更新条目的 ID - 变异表错误

我正在尝试创建一个更新触发器,但我一直遇到“变异表”错误。主要思想是一个带有用户评分的买卖数据库。基本上我想,每次更新 PRODUTOS 表上的评级时,重新计算卖家的评级。我正在尝试以下触发器(及其版本),但它无处可寻..

有人可以给我一个提示,我怎样才能只选择 ID_USER 值等于更新条目的 ID_USER 的条目?..提前致谢!

0 投票
1 回答
312 浏览

oracle - Oracle 触发器创建 - 表正在变异;触发器可能无法读取或修改它

由于表正在变异,因此以下触发器不起作用,因为我认为触发器中的 SQL 语句无法针对变异表执行,但是由于我不在 11g 上,因此我无法创建复合触发器。我已经尝试PRAGMA AUTONOMOUS TRANSACTION;在声明部分包含在内,但是这不会编译。谁能给我最好的解决方案?

NB 简单来说,此触发器旨在阻止用户设置长度小于 3 个字符且不等于变量“format_name_”(如果长度小于 21 个字符)的用户 ID。

0 投票
1 回答
134 浏览

sql - Oracle SQL 触发器在实现时发生变异

此触发器在执行插入或更新操作时遇到问题。但是,触发器的创建没有错误。目的是检查 invoice_total 是否大于 payment_total + credit_total 的总和。任何帮助将非常感激:

0 投票
3 回答
7552 浏览

oracle - ORA-04091: 表 SCMA.XX 正在变异,触发器/函数可能看不到它

我有两个表 -XX并且YY它们的触发器在更新的情况下相互调用。

XX 上的触发器是这样的:

YY上的触发器是这样的:

我知道SELECT触发器中的语句YY_RBIU给出了这个错误。如何对触发器进行编码以避免它?

我试图将SELECT语句包装YY_RBIU在一个IF INSERTING THEN块中,但这不适用于任何更新。SELECT如果从触发器调用更新,如何跳过此语句XX_RBIU

我也尝试过PRAGMA AUTONOMOUS_TRANSACTIONXX_RBIU但它导致了僵局。

我也尝试参考this , this , thisthis但找不到解决方案。

任何帮助深表感谢。

0 投票
1 回答
108 浏览

sql - 移除变异触发器

我正在尝试创建一个触发器来计算服务日期和分支 ID。触发器的目的是计算分支机构 ID 的数量以及服务日期。如果计数大于 3,则触发器应该生效。然而,我遇到的问题是,oracle 已确定它是一个变异触发器,并且不允许插入带有错误消息的数据:

0 投票
2 回答
147 浏览

oracle - 变异触发预言机

我有两张桌子mainhist. main每当其日期时间列被修改为hist并将修改后的列重置mainnull除一列时,我想从表中复制一行。但是我得到了变异触发错误。请帮忙。下面是两个触发器,

0 投票
2 回答
116 浏览

oracle - 使用同一张表进行验证

我的桌子:

因此,对于每个父级,子表中都有三个固定记录。而且,我需要放置一个验证块来限制用户更新子表中三个大于 100% 的子表中的任何一个的分配(对于任何给定的 parent_id)。

我添加了一个触发器来检查给定 parent_id 的分配总和,如果它大于 100%,则引发异常。然而,这导致了一个变异问题。克服此问题的任何设计改进/建议或实现此问题的任何替代方案。

样本数据

PS:应用拦截oracle异常,并在应用中翻译成红条错误信息;因此必须使用 RAISE_APPLICATION_ERROR 来显示错误消息。

编辑 1:
这里的问题是应用层,它允许在列表屏幕上进行编辑。可以一次更新多个记录,因此子表上的触发器将被多次触发。在每个触发器实例中,我们还需要检查其他孩子的分配,这会导致变异问题。

0 投票
2 回答
1506 浏览

sql - 触发避免变异表和更新:new.values

我有一张像这样的小桌子

而且我需要创建触发器(或触发器),这将允许以下规则起作用:
- 1 如果组中有超过 10 个名称,如果有人试图为该组插入下一个人,我需要引发错误
- 2 如果 INSERT 带有字段的 NULL 值,我需要将其分配给计数小于 10 的组。 - 3 如果所有
中有 10 个名称,我需要生成下一个号。 - 4 我需要避免变异表错误。

这是我到目前为止所做的:

上面的代码有效,但是当我从镜像表中选择插入时,例如
INSERT INTO people(name) select concat(name,'_next') from people_mirror; 结果是它超过了组的给定限制 (10)。我也知道使用PRAGMA AUTONOMOUS_TRANSACTION不是避免变异表错误的最佳方法,而且我知道如果我将行触发器拆分为语句触发器,我可以实现此功能,但我只是不知道如何获得它。

那么有人吗?;)

提前致谢。

- - - - - - - - - -编辑 - - - - - - - - - - - -

这些是有效的触发器,但我仍然对它们有疑问,因为它们都是 BEFORE 和行类型。

因为太长了,我无法将其粘贴为@TonyAndrews 答案的评论。