我们如何确定一个表的多个触发器的优先级?

时间:2020-03-06 14:22:36  来源:igfitidea点击:

我在表上有几个触发器,希望将它们分开,并想对它们进行优先排序。

我可能只有一个触发器并在那里执行逻辑,但是我想知道是否有一种更容易/逻辑的方式来实现此功能,使其以预定的顺序进行?

解决方案

使用sp_settriggerorder。我们可以根据操作指定要触发的第一个和最后一个触发器。

MSDN上的sp_settriggerorder

从上面的链接:
A.设置DML触发器的触发顺序
下面的示例指定触发器uSalesOrderHeader是在Sales.SalesOrderHeader表上执行UPDATE操作之后首先触发的触发器。

USE AdventureWorks;
GO
sp_settriggerorder 
    @triggername= 'Sales.uSalesOrderHeader', 
    @order='First', 
    @stmttype = 'UPDATE';

B.设置DDL触发器的触发顺序
下面的示例指定触发器ddlDatabaseTriggerLog是AdventureWorks数据库中发生ALTER_TABLE事件之后触发的第一个触发器。

USE AdventureWorks;
GO
sp_settriggerorder 
    @triggername= 'ddlDatabaseTriggerLog', 
    @order='First', 
    @stmttype = 'ALTER_TABLE', 
    @namespace = 'DATABASE';

看这里。

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

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

请记住,如果我们更改触发顺序,稍后可能会有其他人过来重新安排。以及我们将在何处记录触发顺序应该是什么,以便维护开发人员知道不要弄乱该触发顺序,否则事情会破裂?如果绝对必须以特定顺序执行两个触发任务,则唯一安全的方法是将它们放在同一触发中。