Sql触发器是同步还是异步?

问题描述 投票:25回答:5

我有一个表上有一个插入触发器。如果我在存储过程的一个insert语句中将6000条记录插入到此表中,那么存储过程是否会在插入触发器完成之前返回?

为了确保我正确思考,触发器应该只被调用(我知道'被称为'不是正确的词),因为只有一个插入语句,对吧?

我的主要问题是:即使触发器没有完成,sproc会完成吗?

sql stored-procedures triggers timing
5个回答
24
投票

您的插入触发器将对整个insert语句运行一次。这就是为什么使用inserted临时表来查看实际插入的内容非常重要的原因,而不仅仅是选择最近的单个记录,或类似的内容。

我刚刚测试了一个插入和更新触发器,实际上,它们被认为是sql server插入的一部分。在触发器完成之前,该过程将无法完成。


7
投票

触发器是调用它们的事务的一部分。

关于触发器的一个重要事项是你必须注意的是触发器为每个事务触发一次(至少在SQL服务器中,你应该检查其他dbs,但即使它将逐行处理,这通常是一个糟糕的想法) ,因此,如果您插入6000条记录,则触发器会触发一次而不是6000次。许多人都没有意识到这一点并且编写触发器,好像他们将一次处理多个记录插入一条记录。这不是真的,您的触发器必须考虑处理多个记录插入。


2
投票

触发器调用不是异步的。对插入过程的每次调用都将导致触发器被触发,并且在触发器完成之前,过程将不会返回。

查看查询计划以了解它的工作原理。您将看到每次调用该过程时都会调用触发器中的语句。


1
投票

问题是,每次达到TRIGGER标准时,TRIGGER都会触发。它在批处理或交易中触发一次。在TRIGGER上查看我的lesson 101


-1
投票

您应该在insert语句中使用cursor来处理触发器行。因为SQL Server中的触发器每个语句触发一次,而不是每行一次。

© www.soinside.com 2019 - 2024. All rights reserved.