首页 > 解决方案 > 如果表有多个 FOR INSERT 触发器,其中一个写入审计表,另一个执行回滚,则审计回滚

问题描述

假设一个表有一个执行某些业务逻辑的验证触发器:

TRG_MYTABLE_INSERT_UPDATE_VALIDATION
FOR INSERT, UPDATE on MYTABLE

以及将所有插入和更新写入另一个表的审计触发器。

TRG_MYTABLE_INSERT_UPDATE_AUDIT
FOR INSERT, UPDATE on MYTABLE

并且不能保证它们将按特定顺序执行,VALIDATION 触发器中的回滚是否会回滚对审计表的写入?

是否所有触发器都在“幕后”参与到同一个事务中?

标签: sql-server-2017

解决方案


要回答有关触发器和事务的问题:是的,触发器与执行使触发器触发的语句的代码被列入相同的显式或隐式事务中。

此外,在 SQL Server 触发器中默认运行,XACT_ABORT ON这意味着如果触发器中发生错误,整个事务将立即回滚。

所以你的问题的答案是,如果任何一个触发器发生错误,整个事务都会回滚。

但是,您可以SET XACT_ABORT OFF在事务代码中执行 a,在这种情况下,回滚只会影响您在触发器中执行的任何操作。那是除非您的调用代码启动事务,并且您ROLLBACK在触发器中明确执行。

以上就是为什么您首先应该非常小心使用触发器的原因。


推荐阅读