真的,我很少使用触发器。所以我第一次遇到一个问题。我有很多带有触发器的表(每个表2个或更多)。我想知道并更改每个表的触发触发器的顺序。是否可以获取此信息?
添加:
这是我发现的有关mssqltips的一篇不错的文章。
真的,我很少使用触发器。所以我第一次遇到一个问题。我有很多带有触发器的表(每个表2个或更多)。我想知道并更改每个表的触发触发器的顺序。是否可以获取此信息?
添加:
这是我发现的有关mssqltips的一篇不错的文章。
Answers:
您可以使用以下语句列出每个表中的所有触发器。
EXEC sp_MSForEachTable 'PRINT ''?''
EXEC sp_helptrigger ''?'''
一旦找到所有触发器。您可以使用sp_settriggerorder手动更改顺序
对于任何给定数量的触发器,IIRC您都不能完全保证针对表的给定操作触发的触发顺序(具有相同的定义以及对什么时候做出反应)。
但是,如果有三个或更少,则可以使用sp_settriggerorder将第一个设置为第一个,最后一个设置为最后一个,而中间的一个设置为“未定义”。
如果触发器对执行的顺序敏感,这通常表明您的设计变得比实际需要的复杂(通常是由于自然增长),并且可能会受益于某些重构。
-- List tables with triggers and their firing order. By Jackson Jarvis.
SELECT [tbl].[name] AS 'Table'
,[trg].[name] AS 'Trigger'
,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstInsertTrigger')
WHEN 0 THEN ''
ELSE 'X'
END AS 'Insert First'
,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastInsertTrigger')
WHEN 0 THEN ''
ELSE 'X'
END AS 'Insert Last'
,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstUpdateTrigger')
WHEN 0 THEN ''
ELSE 'X'
END AS 'Update First'
,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastUpdateTrigger')
WHEN 0 THEN ''
ELSE 'X'
END AS 'Update Last'
,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsFirstDeleteTrigger')
WHEN 0 THEN ''
ELSE 'X'
END AS 'Delete First'
,CASE OBJECTPROPERTY([trg].[id] ,'ExecIsLastDeleteTrigger')
WHEN 0 THEN ''
ELSE 'X'
END AS 'Delete Last'
FROM [sysobjects] AS [trg] WITH (NOLOCK)
INNER JOIN [sysobjects] AS [tbl] WITH (NOLOCK)
ON [trg].[parent_obj] = [tbl].[id]
WHERE [trg].[TYPE] IN (N'TR')
ORDER BY
[tbl].[name] ASC
,[trg].[name] ASC
;
exec sp_settriggerorder @triggername = 'tr_xxx' , @order = 'Last' , @stmttype= 'DELETE'
我们可以在Jackson的查询结果中看到结果('X')。谢谢,杰克逊。