27

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

只是为了确保我的想法正确,触发器应该只被调用一次(我知道“调用”不是正确的词),因为只有 1 个插入语句,对吗?

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

4

5 回答 5

26

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

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

于 2008-10-16T20:15:43.753 回答
7

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

您必须注意的关于触发器的一件重要事情是触发器为每个事务触发一次(至少在 SQL Server 中,您应该检查其他数据库,但即使它会逐行处理,这通常是一个坏主意) ,因此如果您插入 6000 条记录,触发器会触发一次而不是 6000 次。许多人没有意识到这一点并编写触发器,就好像他们将处理多条记录一次插入一条记录一样。这不是真的,您的触发器必须考虑处理多记录插入。

于 2008-10-16T20:24:21.300 回答
1

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

查看查询计划以了解它是如何工作的。您将看到触发器中的语句将在每次调用过程时被调用。

于 2008-10-16T20:20:25.193 回答
1

问题是,每次满足 TRIGGER 标准时,TRIGGER 都会触发。它在批处理或事务中触发一次。请参阅我在 TRIGGER 上的第101 课

于 2008-10-16T20:29:19.107 回答
-1

您应该在插入语句中使用游标来处理触发行。因为 SQL Server 中的触发器每条语句触发一次,而不是每行触发一次。

于 2013-04-09T11:02:35.177 回答