Recursion 如何防止DB2中的递归触发器调用

Recursion 如何防止DB2中的递归触发器调用,recursion,triggers,db2,Recursion,Triggers,Db2,我有一个update语句,嵌套在update触发器中: 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" SE

我有一个update语句,嵌套在update触发器中:

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;
创建触发器“错误的递归触发器”
更新“MYTABLE”后
将“新建”引用为“新建”行
每行
当(新行顺序不为空)
开始原子化
若然
UPDATE“MYTABLE”SET ORDER=ORDER+1//此“更新”触发递归。
哪里
如果结束;
结束;
我想防止触发器的递归执行,这是在DB2(v9.7)上,我看到了SQL Server和ORACLE数据库的类似问题:


但我找不到一种方法通过DB2防止这种情况。有没有一种方法可以防止通过DB2进行递归触发器调用?

在更新之前创建触发器NO CASCADE

您不希望使用整型列来处理类似的事情,因为它需要(最终)对给定“组”中的所有其他项重新排序

当您希望允许条目重新定位时,请改用浮动类型。这将允许只需修改所需条目即可更改顺序。
用这样一句话:

UPDATE Example SET ordering = (((SELECT COALESCE(ordering, FLOAT_MAX_VALUE)
                                FROM Example 
                                WHERE id = @entry_above_insertion_point)
                               -
                               (SELECT COALESCE(ordering, FLOAT_MIN_VALUE)
                                FROM Example 
                                WHERE id = @entry_below_insertion_point))
                               / 2)
                              + (SELECT COALESCE(ordering, FLOAT_MIN_VALUE)
                                   FROM Example 
                                   WHERE id = @entry_below_insertion_point)
WHERE id = @entry

这将使条目位于两个当前条目之间的“中间”。由于浮点数的工作方式,您希望将值从0开始;您是否需要对数据进行规范化是值得怀疑的。

更新后是否必须进行规范化?如果触发器发生在实际更新之前,并在该点修改
顺序,会发生什么情况?我假设您只想更新“当前”行,但该语句将更新整个表。。。或者,仅当
顺序
未改变其当前值(如果新值与表中旧值相同)时才更新。@Clockwork Muse,所需行为是:如果“此记录更新”,则“更新其他记录”(来自同一表)。问题是,在第一个“更新触发器”上,它执行另一个更新,然后再次触发触发器。而且似乎没有办法知道是否是第一个电话,这将解决我的问题。我还为此发布了另一个问题:,但我仍然愿意接受任何其他好的替代方案。。。。为什么要更新表中的其他记录?你想解决的实际问题是什么?这句话将成为一个巨大的瓶颈,因为您最终将获得对表的串行访问。我将尝试总结一下最初的要求:在表上有一列“ORDER”,以允许用户根据需要修改项目的“ORDER”,该顺序应该保留在数据库中,因为查询将基于它进行。必须维护顺序(作为连续的数字列表)。因此,小“列表”将保留在数据库中。例如:拥有顺序为1、2、3、4的记录列表。如果用户插入订单为2的新记录,则记录3和4将更新为“订单=订单+1”。删除记录时的类似行为(“上一级”记录的顺序将更新为“顺序=顺序-1”)。不幸的是,不可能创建内部带有“update”语句的“更新前”触发器,并且创建内部带有“update”语句的“后触发器”不允许使用“NO CASCADE”语句(),这是令人遗憾的,因为他们似乎特别想避免我所寻找的行为=(