SQL Server多顺序触发器末尾报错回滚时前置操作是否会同步回滚
问题解答
结论
之前已经执行完成的所有触发器操作,以及触发本次触发器的原始INSERT操作,都会被同步回滚。
核心原因
- SQL Server中所有DML触发器和触发它的DML语句,默认归属同一个事务上下文。不管你是通过
sp_settriggerorder指定了INSERT触发器的执行顺序,还是触发器为顺序执行而非嵌套执行的模式,这个事务绑定规则都不会变。 - 事务本身具备原子性:同一个事务内的所有操作要么全部生效,要么全部撤销。当最后一个触发器抛出错误、或者显式调用
ROLLBACK TRANSACTION时,回滚操作针对的是整个事务的所有变更,不会只回滚最后一个触发器的逻辑。 - 你可以自行做简单测试验证:新建测试表后配置两个顺序执行的
INSERT触发器,第一个触发器负责向独立的日志表插入操作记录,第二个触发器设为最后执行,内部直接触发回滚。完成测试插入操作后查询日志表,不会找到第一个触发器插入的记录,即可验证回滚覆盖了之前所有触发器的操作。
内容的提问来源于stack exchange,提问作者Brian Adams
相关产品推荐
相关产品推荐

