트리거의 발사 순서를 변경하는 방법?


12

정말 트리거를 거의 사용하지 않습니다. 그래서 처음에 문제가 발생했습니다. 트리거가있는 많은 테이블이 있습니다 (모든 테이블에 대해 2 이상). 모든 테이블의 발사 트리거 순서를 알고 변경하고 싶습니다. 이 정보를 얻을 수 있습니까?

추가 :

여기 내가 찾은 mssqltips에 대한 좋은 기사 가 있습니다.

답변:


12

다음 명령문을 사용하여 각 테이블의 모든 트리거를 나열 할 수 있습니다 .

EXEC sp_MSForEachTable 'PRINT ''?'' 
EXEC sp_helptrigger ''?'''

모든 트리거를 찾으면 sp_settriggerorder를 사용하여 수동으로 순서를 변경할 수 있습니다

대체 텍스트


2
"이후"는 트리거가 동일한 유형의 둘 이상의 트리거의 실행 순서에 대해 지시하는 것이 아니라 <STEAL OF OF <action> 대신 AFTER <action>으로 정의되었다는 것을 나타내지 않습니까?
David Spillett

@ 데이빗-예! 당신이 맞아
CoderHawk

12

IIRC는 주어진 트리거 수에 대해 테이블에 대해 지정된 조치에 대해 트리거 (무엇에 반응하고 언제 반응해야하는지 동일한 정의로) 트리거 순서를 정확하게 보장 할 수 없습니다.

그러나 세 개 이하인 경우 sp_settriggerorder 를 사용하여 첫 번째를 첫 번째로, 마지막을 마지막으로, 중간에있는 것을 "정의되지 않은"순서로 설정할 수 있습니다.

트리거가 여기에서 실행되는 순서에 민감한 경우 종종 설계가 필요 이상으로 복잡해지고 (일반적으로 유기적 성장으로 인해) 일부 리팩토링의 이점을 얻을 수 있음을 나타냅니다.


+1 당신 말이 맞습니다.이 코드를 리팩터링해야합니다 (복잡하고 교차 링크가 있습니다 ...), 나는 첫 단계에 있습니다-조사.
garik

5
-- 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
  ;

1
꽤 매끈 해 보입니다. @garik, 이것이 당신의 환경에서 작동합니까? (BTW, 시작 SQL의 코멘트는 코드 블록의 일부가되어야합니다.)
닉 Chammas

1
@ 닉 당신이 맞아요. 몇 분 동안 둘러보고 있습니다.
garik

@Nick 기본적으로 이러한 속성은 비어 있습니다. 예를 들어 exec sp_settriggerorder @triggername = 'tr_xxx' , @order = 'Last' , @stmttype= 'DELETE'Jackson의 쿼리 결과에서 결과 ( 'X')를 볼 수 있습니다. 고마워 잭슨
garik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.