有谁知道 SQL Server 如何确定执行顺序触发器(相同类型,即在触发器之前)。有什么方法可以改变它,以便我可以指定我想要的顺序。如果没有,为什么不呢。
谢谢。
有谁知道 SQL Server 如何确定执行顺序触发器(相同类型,即在触发器之前)。有什么方法可以改变它,以便我可以指定我想要的顺序。如果没有,为什么不呢。
谢谢。
使用 SetTriggerOrder 很好,但如果您的代码依赖于特定的执行顺序,为什么不将所有触发器包装到存储过程中,让第一个调用第二个,第二个调用第三个,等等。
然后,您只需在触发器中执行第一个。
将来有人会感激他们不必在系统表中挖掘来确定自定义执行顺序。
您可以使用sp_settriggerorder定义表上每个触发器的顺序。
但是,我认为最好使用一个触发器来执行多项操作。如果顺序很重要,则尤其如此,因为如果您有多个触发器,则该重要性不会很明显。想象一下有人试图在数月/数年内支持数据库。当然,在某些情况下,您可能需要多个触发器,或者它确实是更好的设计,但我会开始假设您应该拥有一个并从那里开始工作。
如果您正在担心触发订单,那么您真的应该退后一步,考虑您正在尝试做什么以及是否有更好的方法来做到这一点。这不是一件容易改变的事情,这一事实应该告诉你一些事情。
触发器总是看起来像一个非常巧妙的解决方案,并且在正确的地方它们非常有价值,但价格很高,而且很容易用它们制造调试噩梦。过去,我在尝试调试一些晦涩的数据库行为时浪费了很多时间,却发现原因被一个被忽视的触发器隐藏了。
sp_settriggerorder 仅适用于 AFTER 触发器。
使用sp_Settriggerorder
存储过程,可以定义触发器的执行顺序。
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
第二个参数“order”可以取三个值,这意味着它最多可以考虑三个触发器。
您可以使用 sp_settriggerorder 保证哪个触发器最先触发、哪个触发器最后触发以及哪些触发器在中间触发。如果您需要同步三个以上,则在 SQL Server 2005 中似乎是不可能的。
这是从此处获取的示例(链接的文章有更多信息)。
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
顺序由 sql server 设置,您唯一能做的就是使用系统 sp (sp_settriggerorder) 来设置哪个触发器首先触发,哪个触发器最后触发。
除了将第一个和最后一个触发器设置为触发之外,您无法修改或告诉 sql server 将使用哪个顺序。因此,您将希望构建您的触发器,以便它们不依赖于它们被触发的顺序。即使您确定了他们今天开火的顺序,明天也可能会改变。
此信息基于 Sql Server 2000,但我不认为 2005/2008 在这方面表现不同。
用这个 :
例如 :
USE AdventureWorks;
GO
EXEC sys.sp_settriggerorder @triggername = N'', -- nvarchar(517)
@order = '', -- varchar(10)
@stmttype = '', -- varchar(50)
@namespace = '' -- varchar(10)
第一个和最后一个触发器必须是两个不同的触发器。
First :首先触发触发器。
Last :触发器最后触发。
无:触发器以未定义的顺序触发。
并查看此链接的价值@stmttype
:DDL 事件
对于@namespace = { 'DATABASE' | '服务器' | NULL },更多信息请参见:DDL 触发器
在这种情况下一百万美元的声明-
sp_settriggerorder:指定最先或最后触发的 AFTER 触发器。在第一个和最后一个触发器之间触发的 AFTER 触发器以未定义的顺序执行。
资料来源:MSDN
使用此系统存储过程:
sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'