如果 table 有多个 FOR INSERT 触发器并且其中一个写入审计 table 而另一个执行回滚是审计回滚
If the table has more than one FOR INSERT trigger and one of them writes to an audit table and the other does a rollback is the audit rolled back
假设 table 有一个强制执行某些业务逻辑的验证触发器:
TRG_MYTABLE_INSERT_UPDATE_VALIDATION
FOR INSERT, UPDATE on MYTABLE
以及将所有插入和更新写入另一个 table 的审计触发器。
TRG_MYTABLE_INSERT_UPDATE_AUDIT
FOR INSERT, UPDATE on MYTABLE
并且不能保证它们将按特定顺序执行,验证触发器中的回滚是否会回滚对审计的写入 table?
是否所有触发器都在同一个事务中登记"behind the scenes"?
回答有关触发器和事务的问题:是的,触发器与执行使触发器触发的语句的代码在同一个显式或隐式事务中登记。
此外,在 SQL 服务器触发器默认在 XACT_ABORT ON
下运行,这意味着如果触发器发生错误,WHOLE 事务将被滚动马上回来。
所以你的问题的答案是,如果任何一个触发器发生错误,整个事务都会回滚。
但是您可以在事务代码中执行 SET XACT_ABORT OFF
,在这种情况下,回滚只会影响您在触发器中执行的操作。也就是说 UNLESS 您的调用代码启动了一个事务,并且您在触发器中明确地执行了 ROLLBACK
。
以上就是为什么您首先应该非常小心地使用触发器。
假设 table 有一个强制执行某些业务逻辑的验证触发器:
TRG_MYTABLE_INSERT_UPDATE_VALIDATION
FOR INSERT, UPDATE on MYTABLE
以及将所有插入和更新写入另一个 table 的审计触发器。
TRG_MYTABLE_INSERT_UPDATE_AUDIT
FOR INSERT, UPDATE on MYTABLE
并且不能保证它们将按特定顺序执行,验证触发器中的回滚是否会回滚对审计的写入 table?
是否所有触发器都在同一个事务中登记"behind the scenes"?
回答有关触发器和事务的问题:是的,触发器与执行使触发器触发的语句的代码在同一个显式或隐式事务中登记。
此外,在 SQL 服务器触发器默认在 XACT_ABORT ON
下运行,这意味着如果触发器发生错误,WHOLE 事务将被滚动马上回来。
所以你的问题的答案是,如果任何一个触发器发生错误,整个事务都会回滚。
但是您可以在事务代码中执行 SET XACT_ABORT OFF
,在这种情况下,回滚只会影响您在触发器中执行的操作。也就是说 UNLESS 您的调用代码启动了一个事务,并且您在触发器中明确地执行了 ROLLBACK
。
以上就是为什么您首先应该非常小心地使用触发器。