33

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

谢谢。

4

10 回答 10

18

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

然后,您只需在触发器中执行第一个。

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

于 2008-09-18T16:56:56.050 回答
16

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

但是,我认为最好使用一个触发器来执行多项操作。如果顺序很重要,则尤其如此,因为如果您有多个触发器,则该重要性不会很明显。想象一下有人试图在数月/数年内支持数据库。当然,在某些情况下,您可能需要多个触发器,或者它确实是更好的设计,但我会开始假设您应该拥有一个并从那里开始工作。

于 2008-09-18T18:04:05.703 回答
12

如果您正在担心触发订单,那么您真的应该退后一步,考虑您正在尝试做什么以及是否有更好的方法来做到这一点。这不是一件容易改变的事情,这一事​​实应该告诉你一些事情。

触发器总是看起来像一个非常巧妙的解决方案,并且在正确的地方它们非常有价值,价格很高,而且很容易用它们制造调试噩梦。过去,我在尝试调试一些晦涩的数据库行为时浪费了很多时间,却发现原因被一个被忽视的触发器隐藏了。

于 2008-09-18T16:49:10.390 回答
6

sp_settriggerorder 仅适用于 AFTER 触发器。

于 2008-09-18T16:33:44.903 回答
4

使用sp_Settriggerorder存储过程,可以定义触发器的执行顺序。

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]

第二个参数“order”可以取三个值,这意味着它最多可以考虑三个触发器。

  1. First – 触发器首先被触发
  2. Last - 触发器最后触发
  3. 无 - 触发器以随机顺序触发。
于 2008-09-18T16:28:29.690 回答
4

您可以使用 sp_settriggerorder 保证哪个触发器最先触发、哪个触发器最后触发以及哪些触发器在中间触发。如果您需要同步三个以上,则在 SQL Server 2005 中似乎是不可能的。

这是从此处获取的示例(链接的文章有更多信息)。

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
于 2008-09-18T16:34:52.327 回答
2

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

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

此信息基于 Sql Server 2000,但我不认为 2005/2008 在这方面表现不同。

于 2008-09-18T16:28:20.580 回答
2

用这个 :

例如 :

USE AdventureWorks;
GO
EXEC sys.sp_settriggerorder @triggername = N'', -- nvarchar(517)
    @order = '', -- varchar(10)
    @stmttype = '', -- varchar(50)
    @namespace = '' -- varchar(10)

第一个和最后一个触发器必须是两个不同的触发器。

First :首先触发触发器。

Last :触发器最后触发。

无:触发器以未定义的顺序触发。

并查看此链接的价值@stmttypeDDL 事件

对于@namespace = { 'DATABASE' | '服务器' | NULL },更多信息请参见:DDL 触发器

于 2013-09-06T12:50:14.087 回答
1

在这种情况下一百万美元的声明-

sp_settriggerorder:指定最先或最后触发的 AFTER 触发器。在第一个和最后一个触发器之间触发的 AFTER 触发器以未定义的顺序执行。

资料来源:MSDN

于 2013-04-06T23:31:21.177 回答
1

使用此系统存储过程:

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'
于 2008-09-18T16:28:44.027 回答