SQL Server触发器 - 执行顺序

HAd*_*des 30 sql t-sql sql-server sql-server-2005

有谁知道SQL Server如何确定执行顺序触发器(相同类型,即触发器之前).有没有办法改变这一点,以便我可以指定我想要的顺序.如果没有,为什么不呢.

谢谢.

Jos*_*ons 18

使用SetTriggerOrder很好,但如果您的代码依赖于特定的执行顺序,为什么不将所有触发器包装到存储过程中,并让第一个调用第二个,第二个调用第三个,等等.

然后你只需要在触发器中执行第一个.

将来有人会感激他们不必在系统表中挖掘来确定自定义执行顺序.

  • 通常我们不这样做,因为我们无法轻松访问存储过程中的Inserted和Deleted伪表. (8认同)

Ror*_*ory 14

您可以使用sp_settriggerorder来定义表上每个触发器的顺序.

但是,我认为你只需要一个可以完成多项任务的触发器就会好得多.如果订单很重要,则尤其如此,因为如果您有多个触发器,那么重要性将不会非常明显.想象一下有人试图在数月/数年内支持数据库.当然,有可能存在需要多个触发器的情况,或者它确实是更好的设计,但我开始假设您应该有一个并从那里开始工作.


Cru*_*han 11

如果你担心触发订单,那么你真的应该倒退一步,考虑你想要做什么,以及是否有更好的方法.这不是一件容易改变的事情应该告诉你一些事情.

触发器总是看起来像一个真正的整洁解决方案,并在正确的地方,它们是非常有价值的,价格高,很容易与他们创建调试噩梦.过去我试图调试一些不起眼的数据库行为只是为了找到原因被忽略的触发器中丢失了几个小时.


Luk*_*ett 5

sp_settriggerorder仅适用于AFTER触发器.


小智 3

顺序由 sql server 设置,您唯一可以做的就是使用系统 sp (sp_settriggerorder) 来设置哪个触发器将首先触发,哪个将最后触发。

除了设置要触发的第一个和最后一个触发器之外,您无法修改或告知 sql server 将使用哪个顺序。因此,您需要构建触发器,以便它们不依赖于触发顺序。即使你今天确定了它们的射击顺序,明天也可能会改变。

此信息基于 Sql Server 2000,但我不认为 2005/2008 在这方面的行为有所不同。