0

我有两个SQLite3表,A和B。当AX列更新时,我想修改BY,当BY更新时,我想修改AX

我可以使用两个触发器:

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”,然后在更新语句中使用“WHEN trigger_depth == 1”。但是,有没有更简单的方法来确定 SQLite3 中的触发深度?

4

1 回答 1

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

保护你的触发动作

于 2012-06-26T02:57:41.067 回答