我有两个SQLite3表,A和B.当更新列A.X时,我想修改B.Y,当B.Y更新时,我想修改A.X。
我可以使用两个触发器:
CREATE TRIGGER AtoB AFTER UPDATE OF X ON A BEGIN UPDATE B SET Y = ...
和
CREATE TRIGGER BtoA AFTER UPDATE OF Y ON B BEGIN UPDATE A SET X = ...
但似乎两个触发器都被调用一次,无论我修改哪个表,即一个总是调用另一个。
我只想要其中一个执行,因为更新在A到B的方向上是有损的。我不希望反向B的损失到A,但如果两个触发器都触发,那么它就会成功两个方向都有损失。
一个简单的解决方案是实现三个UDF“increment_trigger_depth”,“decrement_trigger_depth”和“get_trigger_depth”,然后在update语句中使用“WHEN trigger_depth == 1”。但是,有没有更简单的方法来确定SQLite3中的触发器深度?
答案 0 :(得分:1)
使用新表来保存触发深度。
CREATE TABLE trigger_depth (depth);
INSERT INTO trigger_depth VALUES (0);
然后使用increment_trigger_depth
UPDATE trigger_depth SET depth = depth + 1;
等
使用
... WHEN (SELECT depth FROM trigger_depth) <= 0 BEGIN ...
保护你的触发动作