SQL Server触发器-执行顺序
有谁知道SQL Server如何确定执行顺序触发器(相同类型,即在触发器之前)。并且有什么方法可以更改此设置,以便我可以指定所需的顺序。如果没有,为什么不呢?
谢谢。
解决方案
该顺序由sql server设置,我们唯一可以做的就是使用系统sp(sp_settriggerorder)设置哪个触发器将首先触发,哪个触发器将最后触发。
除了设置要触发的第一个和最后一个触发器之外,我们无法修改或者确定sql server将使用的顺序。因此,我们将需要构建触发器,以使其不依赖于其触发顺序。即使我们确定他们今天发出的命令,明天也可能改变。
此信息基于Sql Server 2000,但是我认为2005/2008在这方面的行为不会有所不同。
使用" sp_Settriggerorder"存储过程,可以定义触发器的执行顺序。
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’ , [ @order = ] ‘value’ , [ @stmttype = ] ’statement_type’ [ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
第二个参数order可以采用三个值,这意味着它可以考虑多达三个触发器。
- 首先触发第一个触发器
- 最后-触发器最后触发
- 无以随机顺序触发触发器。
使用此系统存储过程:
sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'
sp_settriggerorder仅适用于AFTER触发器。
我们可以使用sp_settriggerorder保证首先触发哪个触发器,最后触发哪个触发器,哪个触发在中间。如果需要同步三个以上,则在SQL Server 2005中似乎无法同步。
这是从此处获取的样本(链接的文章提供了更多信息)。
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’ , [ @order = ] ‘value’ , [ @stmttype = ] ’statement_type’ [ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
如果我们担心触发订单,那么我们确实应该退后一步,考虑要尝试的操作以及是否有更好的方法。这不是一件容易改变的事实,应该告诉我们一些事情。
触发器总是看起来像一个真正的整洁的解决方案,并且在正确的位置它们具有很高的价值,但是价格很高,使用它们创建调试噩梦真的很容易。过去我花了很多时间尝试调试一些晦涩难懂的数据库行为,却发现原因被忽略了。
使用SetTriggerOrder很好,但是如果代码取决于特定的执行顺序,为什么不将所有触发器包装到存储过程中,而让第一个调用第二个,第二个调用第三个,依此类推。
然后,我们只需在触发器中执行第一个命令即可。
将来有人会很感激他们不必在系统表中四处寻找来确定自定义执行顺序。
可以使用sp_settriggerorder定义表上每个触发器的顺序。
但是,我认为我们最好使用一个触发器来完成多项任务。如果顺序很重要,那么尤其如此,因为如果我们有多个触发器,那么重要性就不会很明显。想象一下,有人试图在未来几个月/几年内为数据库提供支持。当然,在某些情况下,我们可能需要多个触发器,或者确实是更好的设计,但是我开始假设我们应该有一个触发器并从那里开始工作。