问题标签 [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 投票
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 投票
2 回答
6130 浏览

oracle - 简单的预言机触发器

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

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

这个想法很简单

这会弹出错误:

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

干杯,

F。

0 投票
1 回答
12908 浏览

sql - ORACLE After update trigger: 解决 ORA-04091 mutating table 错误

我正在尝试创建一个触发器:

在更新/插入表格时自动填写几个非必填字段。

这需要我使用从 table2 和 table1(触发器的主题)中选择的游标。

有没有办法在不使用临时表来存储值或自主事务的情况下避免变异表错误?

0 投票
2 回答
3525 浏览

sql - 如何在每次插入后触发触发器 - Oracle(批量插入)

我希望触发器在插入的每条记录之后运行。

如果我有这样的简单插入,则此验证工作正常:

但是,当它像这样的批量插入时:

触发器突变。我希望验证在作为批量插入完成时也可以工作。

导致此问题的查询是

问题是这个查询是在同一个表“g_piece”上应用的触发器中调用的。当我继续进行简单的插入(插入 g_piece 值(...))时,我没有这个问题。

我怎样才能避免这个问题?谢谢。

0 投票
2 回答
305 浏览

sql - 如何防止派生值 (SUM) 被手动更新为不正确的值

我正在为大学课程学习 SQL 和 DB 设计。给我们的一项任务是创建一个具有派生属性的表,该派生属性是一些子属性的总和。例如:

现在,我什至不确定这是一个好习惯。从我在网上阅读的一些内容来看,派生值不应存储,而应由用户应用程序计算。我可以理解这种观点,但在这种情况下,我的任务是存储派生值,更重要的是通过触发器保持它们的完整性,这对我来说相对较新,所以我喜欢使用它们。我还想象在一些更复杂的情况下,存储派生值确实值得节省处理时间。以下是我采取的没有给我带来问题的保障措施:

插入新子项时更新父项 /orderTotal 的触发器。

删除子项时更新父项 /orderTotal 的触发器。

当子 itemTotal 被修改时更新父 /orderTotal 的触发器。

但是,我想要另一种保障措施,但我不知道如何完成。由于父属性 /orderTotal 是派生的,因此永远不应手动修改它。如果有人确实尝试手动修改它(到一个实际上不是正确 SUM 的错误值),我想(a)阻止他们这样做或(b)一旦他们完成就将其恢复为旧值.

哪种方法更好,哪种方法可行(以及如何)?我不确定如何完成前者,我试图通过触发器或约束来完成后者,但似乎都不合适。触发器方法不断给我 ORA-04091 错误,因为我试图改变触发触发器的表。我认为约束方法也不合适,因为我不确定如何在约束检查中做这样的特定事情。

顺便说一句,我在 SQL Developer 中使用 Oracle SQL。

谢谢!

0 投票
3 回答
23538 浏览

oracle - 用于在同一个表中插入记录的 INSERT 触发器

我有一个在表中插入新记录时触发的触发器,因为我想在同一个表中插入新记录。
我的触发器是:

它给出一个错误,比如

ORA-04091: table TEST_TABLE is mutating, trigger/function may not see it

我认为它阻止我插入同一张桌子。
那么如何将这条新记录插入到同一张表中。

注意:- 我使用Oracle 作为数据库

0 投票
3 回答
175 浏览

oracle - 冲突触发器 - 变异表

我对 Oracle 中的变异表有疑问。我有两张桌子,CustomerPerson。我必须在修改行期间更新ChangeDateCustomer所以Person我创建了一个触发器。不幸的是,在某些情况下有一个Customer更新的触发器,这导致了变异表问题。幸运的是,如果此更改是由更改引起的,则在更新时Person我不必更新。Customer.ChangeDatePersonCustomer

所以这是我的问题:我如何识别Person触发器是由Customer触发器触发的?

0 投票
2 回答
868 浏览

oracle - 语句级触发器会导致变异表吗

还是说只有行级触发器会导致这种突变?

我改写我的问题:

哪些触发器类型会受到变异表带来的约束因素的影响?

0 投票
1 回答
33567 浏览

oracle - Oracle Form FRM-40735:ON-ERROR 触发器引发未处理的异常 ORA-06502

我有一个如下表触发器:

我有一个由上面的触发器调用的包,包的代码如下:

包体如下:

每次 Oracle Forms 更新 DOB 数据时,我都会收到如下错误:

Oracle Form FRM-40735:ON-ERROR 触发器引发未处理的异常 ORA-06502

但是,当我像下面这样硬编码时:

代替下面的这段代码,表单可以正常工作。


我确实替换p_pat_id为实际值,它会弹出一个触发错误

那么,如何修复这个错误呢?我不能硬编码日期值

0 投票
1 回答
2349 浏览

oracle - 如何避免触发器中的 ORA-04091 错误

我在表 A 上有一个更新后触发器(触发器 A),它可以对表 B 进行更改。

我在表 B 上还有一个更新后触发器(触发器 B),它没有进行任何更改,但查询表 A 以对非规范化进行一些健全性检查。

所以触发器 B 可以触发以下两种方式之一:

  1. 如果我直接更新表 B,或者
  2. 如果我更新表 A 并且触发器 A 触发,导致表 B 更新。

在案例 2 中,我得到一个 ORA-04091: table name is mutating, trigger/function may not see it error。这似乎是正确的。

我想在触发器 B 中检查表 A 是否“处于错误状态”并提前退出(在这种情况下不需要运行健全性检查)。

在我的触发器中测试它的最佳方法是什么?只需添加一个吞下异常的异常处理程序?还有比这更优雅的吗?