我能在同一张表上创建两个不同的插入触发器吗?

18

看起来它们是被允许的,因为我可以看到我的两个插入触发器以不同的名称列在表下面。这是常见做法还是一个糟糕的实践?我正在使用SQL Server 2005。


触发器有什么作用?INSERTED表没有索引,因此出于性能考虑,最好将它们合并。 - Martin Smith
2个回答

27

是的,您绝对可以为每个操作设置多个触发器,例如 AFTER INSERTAFTER UPDATE 等。将单独的关注点分解成单独的、小型且可管理的代码块确实有意义。

唯一不能依赖的是它们将按照某种顺序执行,即触发器的执行顺序也不必稳定,即每次都相同。


5
根据不同的关系型数据库而异。Postgres保证按名称字母顺序调用多个触发器。他们声称SQL标准(很少遵循)是按创建顺序排序的。 - Andrew Lazarus
1
@AndrewLazarus:我指的是SQL Server(因为OP问到了它),而SQL Server没有这样的能力。感谢您指出这一点! - marc_s
当然。我经常添加这样的注释,因为我想到很多人会从谷歌上找到这里。 - Andrew Lazarus
5
虽然你可以使用 sp_settriggerorder 来设置第一个和最后一个触发器。 - Martin Smith

2

这是一种好的实践,因为你可以将你的变更分解成小的(敏捷)块,并独立地添加或删除它们。


顺便问一下,如果我一次插入2行或更多行(基本上是导入一堆记录),是否有办法引用每个插入,还是触发器会自动执行每个单独的插入? - TheTechGuy
1
@hmd 触发器将自动执行每个单独的插入,直到您使用批量插入为止,在这种情况下,触发器将为每个批量插入命令执行一次。 - Niraj
知道这是一个老问题!在您的触发器中,您可以始终引用一个名为“inserted”的表,其中包含您刚刚插入的所有行(在插入触发器上是一行或多行)。通过创建游标,您可以循环遍历每一行并对它们进行操作(如果需要的话)。 - olf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接