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

时间:2012-12-12 18:28:45

标签: recursion triggers db2

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

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的递归触发器调用?

2 个答案:

答案 0 :(得分:0)

创建TRIGGER NO CASCADE 之前更新...

答案 1 :(得分: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;你需要对数据进行标准化是值得怀疑的。