SQL Server中触发器内执行DELETE操作为何未触发无限循环?
为什么After Delete触发器内删除同表不会触发无限循环?
这是因为主流关系型数据库默认都禁用了触发器递归触发的行为,具体原因分这几点:
- 递归触发器的默认开关:以SQL Server为例,数据库默认的
recursive triggers配置项是关闭的(值为0)。这种情况下,当触发器内部执行的操作试图再次触发同一个触发器时,数据库会直接阻止这个递归调用,不会让触发器重复执行。 - 区分“递归”和“嵌套”:你担心的无限循环属于递归触发(同一个触发器因自身操作再次触发自己),而如果是触发器A触发另一个表的触发器B,B再触发A,这属于嵌套触发。嵌套触发默认可能开启(比如SQL Server默认允许最多32层嵌套),但递归触发默认是关闭的,所以你的场景里不会出现循环。
- 其他数据库的类似机制:比如MySQL,触发器同样默认不会递归触发,哪怕你在触发器里操作同表,也不会再次调用自身触发器;PostgreSQL则需要显式使用
CREATE TRIGGER ... RECURSIVE才能开启递归,默认也是关闭的。
如果想要验证,可以手动开启递归触发器(比如在SQL Server里执行sp_configure 'recursive triggers', 1; RECONFIGURE;),这时候再执行你的操作就会触发无限循环,直到达到数据库的嵌套层数上限(比如32层)后报错终止。
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

