2008-10-16 125 views
23

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

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

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

回答

19

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

我刚刚测试了插入和更新触发器,事实上,它们被认为是sql server插入的一部分。该过程将不会完成,直到触发器结束。

+1

感谢您提到这一点。我忘记了这一点,并且做了与我将要部署的触发器类似的情况下我不应该做的事情。我只是重新编写它来处理插入的整个插入集而不是最新的ID。伊克!可能是一个helluva错误。 ;) – 2008-10-16 20:26:06

+0

嗨,高兴我可以帮忙! – 2008-10-16 20:28:05

1

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

看看查询计划,看看它是如何工作的。您会看到触发器中的语句将被调用,以便每次调用该过程。

6

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

触发器必须注意的一个重要的事情是触发器会为每个事务触发一次(在SQl服务器中最低限度,您应该检查其他dbs,但即使它将逐行处理,通常一个可怜的想法),所以如果你插入6000条记录,触发器将触发一次6000次。许多人都不知道这一点,并写入触发器,就好像它们将一次处理多条记录插入一条记录一样。这是不正确的,你的触发器必须考虑处理多个记录插入。

+1

这取决于触发器定义。在Oracle中,例如我们可以用FOR EACH ROW子句来要求每行的触发器执行。 http://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm#431 – 2013-01-23 14:21:33

1

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

-1

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

相关问题