sql-server - 在触发器内返回,安全吗?

标签 sql-server tsql database-trigger

我正在尝试查找有关 RETURN 在触发器内的影响的信息。我能找到的唯一文档是它“释放”了触发器。

https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017#optimizing-dml-triggers

我问的原因是最近添加的触发器导致了一些死锁问题,即使触发器是空的。

这些示例非常荒谬(为什么要检索刚刚插入的数据),但这就是它的工作方式。生成这些语句的代码非常古老。

“空”触发器的主体

BEGIN
    SET NOCOUNT ON;
END

在表 1 上启用了空触发器

BEGIN TRANSACTION
    INSERT INTO Table1....                 -- Table1 becomes locked until transaction is committed

    SELECT * FROM Table1 WHERE ID = X...   -- deadlock

    INSERT INTO Table2...
COMMIT TRANSACTION

禁用空触发器

BEGIN TRANSACTION
    INSERT INTO Table1....                 -- Table1 DOES NOT BECOME LOCKED

    SELECT * FROM Table1 WHERE ID = X...

    INSERT INTO Table2...
COMMIT TRANSACTION

在触发器末尾添加 RETURN 释放锁,防止死锁。

这样安全吗?我唯一能想到的是,如果触发器修改了它所在的表,释放锁可能会导致脏读。

最佳答案

要回答您的问题,是的,在触发器内使用 RETURN 是绝对安全的。它通常用在复杂触发器的开始处,如果没有要处理的行则立即退出。像这样;

IF (@@ROWCOUNT_BIG = 0)
RETURN;

但是,必须有其他原因导致死锁。请参阅 Gail Shaw 的优秀博客 SQL Server Deadlocks by Example并查看死锁图,看看它是否为您提供了更多关于问题可能出在哪里的线索。

关于sql-server - 在触发器内返回,安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50502612/

相关文章:

sql - 为什么我的 POSTGRESQL 触发器函数在使用 NEW 参数时找不到我的列?

postgresql - SQL 函数不能返回类型触发器

sql-server - sql 作业中的 Xml 解析问题

c# - Winforms/SQL Server 应用程序的会计系统

sql-server - 如何从 SSIS 执行存储过程以将其输出到文本文件

sql-server - 统计group by返回的记录数

sql - 获取日期 -1 或 2

sql - 如何创建使用 INSERT 、 DELETE 、 UPDATE 事件的触发器

sql-server - SQL CROSS APPLY 与 SQLCLR 表值函数 (TVF)

sql-server - 是否可能以及如何使用 Entity Framework Core 创建触发器