SQL Server触发器 - 执行顺序

时间:2008-09-18 16:21:22

标签: sql sql-server sql-server-2005 tsql

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

感谢。

10 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:14)

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

但是,我认为你做一个能做多件事的触发器会好得多。这是特别是所以如果订单很重要,因为如果您有多个触发器,那么重要性将不会非常明显。想象一下有人试图在数月/数年内支持数据库。当然,可能存在需要多个触发器的情况,或者它确实是更好的设计,但我开始假设您应该有一个并从那里开始工作。

答案 2 :(得分:11)

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

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

答案 3 :(得分:5)

sp_settriggerorder仅适用于AFTER触发器。

答案 4 :(得分:4)

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

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

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

  1. 首先 - 首先触发触发器
  2. 最后 - 最后触发触发器
  3. 无 - 以随机顺序触发触发器。

答案 5 :(得分:4)

您可以保证首先触发哪个触发器,最后触发哪个触发器以及使用sp_settriggerorder触发哪个触发器。如果需要同步三个以上,则在SQL Server 2005中似乎无法实现。

以下是摘自here的示例(链接文章提供了更多信息)。

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

答案 6 :(得分:2)

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

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

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

答案 7 :(得分:2)

使用此:

例如:

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

First和Last触发器必须是两个不同的触发器。

首先:首先触发触发器。

Last:最后触发了触发器。

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

请参阅此链接了解@stmttypeDDL Events

的价值

对于@namespace = {'DATABASE'| '服务器'| NULL}有关详细信息,请参阅:DDL Triggers

答案 8 :(得分:1)

使用此系统存储过程:

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'

答案 9 :(得分:1)

在此背景下的百万美元声明 -

  

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

来源:MSDN