【发布时间】:2008-10-16 20:12:12
【问题描述】:
我有一个表,上面有一个插入触发器。如果我在存储过程的一个插入语句中向该表中插入 6000 条记录,存储过程会在插入触发器完成之前返回吗?
为了确保我的想法正确,触发器应该只被调用一次(我知道“调用”不是正确的词),因为只有 1 个插入语句,对吧?
我的主要问题是:即使触发器尚未完成,存储过程也会完成吗?
【问题讨论】:
标签: sql stored-procedures triggers timing
我有一个表,上面有一个插入触发器。如果我在存储过程的一个插入语句中向该表中插入 6000 条记录,存储过程会在插入触发器完成之前返回吗?
为了确保我的想法正确,触发器应该只被调用一次(我知道“调用”不是正确的词),因为只有 1 个插入语句,对吧?
我的主要问题是:即使触发器尚未完成,存储过程也会完成吗?
【问题讨论】:
标签: sql stored-procedures triggers timing
您的插入触发器将针对整个插入语句运行一次。这就是为什么使用inserted 临时表来查看实际插入的内容很重要,而不仅仅是选择最近的单个记录或类似的东西。
我刚刚测试了一个插入和更新触发器,事实上,它们被 sql server 视为插入的一部分。在触发器完成之前,该过程不会完成。
【讨论】:
触发器是调用它们的事务的一部分。
您必须注意的关于触发器的重要一点是触发器为每个事务触发一次(至少在 SQL Server 中,您应该检查其他数据库,但即使它会逐行处理,这通常是糟糕的主意),所以如果你插入 6000 条记录,触发器会触发一次而不是 6000 次。许多人没有意识到这一点并编写触发器,就好像他们将处理多个记录一次插入一条记录一样。这不是真的,您的触发器必须考虑处理多条记录插入。
【讨论】:
触发器调用不是异步的。对您的插入过程的每次调用都会触发触发器,并且在触发器完成之前该过程不会返回。
查看查询计划以了解其工作原理。您会看到,每次调用过程都会调用触发器中的语句。
【讨论】:
问题是,每次满足 TRIGGER 条件时,TRIGGER 都会触发。它在批处理或事务中触发一次。在 TRIGGER 上查看我的lesson 101
【讨论】:
您应该在插入语句中使用游标来处理触发行。 因为 SQL Server 中的触发器每条语句触发一次,而不是每行一次。
【讨论】: