정말 트리거를 거의 사용하지 않습니다. 그래서 처음에 문제가 발생했습니다. 트리거가있는 많은 테이블이 있습니다 (모든 테이블에 대해 2 이상). 모든 테이블의 발사 트리거 순서를 알고 변경하고 싶습니다. 이 정보를 얻을 수 있습니까?
추가 :
여기 내가 찾은 mssqltips에 대한 좋은 기사 가 있습니다.
정말 트리거를 거의 사용하지 않습니다. 그래서 처음에 문제가 발생했습니다. 트리거가있는 많은 테이블이 있습니다 (모든 테이블에 대해 2 이상). 모든 테이블의 발사 트리거 순서를 알고 변경하고 싶습니다. 이 정보를 얻을 수 있습니까?
추가 :
여기 내가 찾은 mssqltips에 대한 좋은 기사 가 있습니다.
답변:
다음 명령문을 사용하여 각 테이블의 모든 트리거를 나열 할 수 있습니다 .
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')를 볼 수 있습니다. 고마워 잭슨