我有一个更新语句,嵌套在更新触发器中:
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的递归触发器调用?
答案 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;你需要对数据进行标准化是值得怀疑的。