如何在sqlite3中轻松检测触发深度?

时间:2012-06-25 23:57:14

标签: sqlite triggers

我有两个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中的触发器深度?

1 个答案:

答案 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 ... 

保护你的触发动作