2014-09-02 74 views
0

我不明白SQLite 3.8.6中的触发器递归。PRAGMA recursive_triggers不会禁用递归触发器

从我的理解设置PRAGMA recursive_triggers0应该防止触发器触发另一个触发器。

但这里是实际发生的事情对我来说一个例子:

sqlite> PRAGMA recursive_triggers; 
0 
sqlite> CREATE TABLE t1(a TEXT, b TEXT, c TEXT); 
sqlite> CREATE TRIGGER on_insert AFTER INSERT ON t1 
    ...> BEGIN 
    ...>  UPDATE t1 SET b="c" WHERE rowid=NEW.rowid; 
    ...> END; 
sqlite> CREATE TRIGGER on_update_b AFTER UPDATE OF b ON t1 
    ...> BEGIN 
    ...>  SELECT RAISE(fail,"triggered update b!"); 
    ...> END; 
sqlite> INSERT INTO t1 VALUES("a","b","c"); 
Error: triggered update b! 

我可能误解了什么......

是否有可能阻止on_update_b触发器被触发?

回答

1

这些触发器不是递归的。

如果触发器自身(直接或间接)触发,则它是递归的。 如果on_update_b将执行UPDATE或INSERT,则会出现这种情况。

+0

好的,谢谢。我可以防止触发'on_insert'来触发'on_update_b'(我希望这个触发器只能由用户触发)? – jkd 2014-09-02 13:40:10

+1

触发器可以从数据库中读取数据(这对您没有帮助),并检查NEW.xxx值。在某些专栏中您需要一些特殊的价值。 – 2014-09-02 13:42:20