2

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

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 数据库的类似问题:

防止 PostgreSQL 中的递归触发器

如何防止数据库触发器递归?

但是我找不到通过 DB2 防止这种情况发生的方法。有没有办法防止对 DB2 的递归触发器调用?

4

2 回答 2

0

更新前创建触发无级联...

于 2012-12-13T06:18:52.883 回答
0

您不想将整数类型的列用于这样的事情,因为它需要(最终)重新排序给定“组”中的所有其他条目。

当您希望允许重新定位条目时,请改用浮动类型。这将允许通过简单地修改所需条目来更改顺序。
有这样的声明:

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 开始值;怀疑您是否需要对数据进行标准化。

于 2012-12-15T01:09:01.793 回答