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

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

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

有帮助吗?

解决方案

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

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

其他提示

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

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

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

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

事实是,每次达到TRIGGER标准时,TRIGGER都会发射。它在批处理或交易中触发一次。请参阅我的第101课 TRIGGER

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top