sql-server-2017 - 如果表有多个 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 触发器中默认运行,XACT_ABORT ON
这意味着如果触发器中发生错误,整个事务将立即回滚。
所以你的问题的答案是,如果任何一个触发器发生错误,整个事务都会回滚。
但是,您可以SET XACT_ABORT OFF
在事务代码中执行 a,在这种情况下,回滚只会影响您在触发器中执行的任何操作。那是除非您的调用代码启动事务,并且您ROLLBACK
在触发器中明确执行。
以上就是为什么您首先应该非常小心使用触发器的原因。
推荐阅读
- sql - 语法错误问题
- android - 当我尝试创建另一个对话框时,我的应用程序崩溃了
- java - DataProvider 并行文本输入 - 多线程问题
- javascript - 任意“名称:金额”字符串的正则表达式
- yocto - Yocto:ROOTFS_POSTPROCESS_COMMAND 和 do_rootfs
- lua - ROBLOX Studio:如何运行这个 Lua 字节码虚拟机?
- java - 在 Jersey GET 响应中使用外部对象
- java - 是否可以以编程方式启动外部 spring-boot 应用程序
- html - 表单方法=发布和操作=index.php?page=somepage
- python-3.x - 如何处理此类错误?