【发布时间】:2012-12-12 18:28:44
【问题描述】:
我有一个更新语句,嵌套在更新触发器中:
CREATE TRIGGER "BAD_RECURSIVE_TRIGGER"
AFTER UPDATE ON "MYTABLE"
REFERENCING NEW AS NEW_ROW
FOR EACH ROW
WHEN (NEW_ROW.ORDER IS NOT NULL)
BEGIN ATOMIC
IF <SOMECONDITION> THEN
UPDATE "MYTABLE" SET ORDER=ORDER+1 // This "update" fires the recursion.
WHERE <OTHERCONDITION>
END IF;
END;
我想阻止触发器的递归执行,这是在 DB2 (v9.7) 上,我已经看到 SQL-Server 和 ORACLE 数据库的类似问题:
Prevent recursive trigger in PostgreSQL
How do I prevent a database trigger from recursing?
但我找不到通过 DB2 防止这种情况发生的方法。有没有办法防止 DB2 上的递归触发器调用?
【问题讨论】:
-
必须是
AFTER UPDATE吗?如果触发器发生在实际更新之前,并在此时修改ORDER,会发生什么情况?而且我会假设您只想更新“当前”行,但该语句将更新 整个 表...或者,仅在ORDERhasn' 时更新t 从它的当前值更改(如果新值与旧的表内值相同)。 -
@Clockwork-Muse,期望的行为是:如果“这条记录被更新”,那么“更新其他记录”(来自同一个表)。问题是,在第一个“更新触发器”上,它会进行另一次更新,再次触发触发器。而且似乎没有办法知道是否是第一个电话,这可以解决我的问题。我已经为此发布了另一个问题:stackoverflow.com/questions/13845776/…,但我仍然愿意接受任何其他好的选择。
-
... 为什么要更新表中的其他记录?您要解决的实际问题是什么?该语句将成为一个巨大的瓶颈,因为您最终将获得对表的串行访问。
-
我将尝试总结原始要求:在表上有一个“ORDER”列,以允许用户根据需要修改项目的“顺序”,该顺序应保留在数据库中因为将基于它进行查询。必须保持顺序(作为连续的数字列表)。如此小的“列表”将保存在数据库中。例如:有一个订单的记录列表:1、2、3、4。如果用户插入一条订单 = 2 的新记录,记录 3 和 4 将更新为“订单 = 订单 + 1”。删除记录时的类似行为(“上”记录的顺序将更新为“order = order - 1”)。