2008-09-18 3 views
25

SQL Server가 (동일한 유형, 즉 트리거 이전의) 순서 트리거를 결정하는 방법을 아는 사람은 누구입니까? 그리고 이것을 바꿀 수있는 방법이있어서 원하는 순서를 지정할 수 있습니다. 그렇지 않은 경우 왜 아닙니다.SQL 서버 트리거 - 실행 순서

감사합니다.

답변

2

순서는 SQL 서버에 의해 설정되어, 당신이 할 수있는 유일한 방법은 먼저 발사하고 마지막을하는 발사되는 트리거를 설정하는 시스템 SP (sp_settriggerorder)를 사용합니다. 화재로 첫 번째와 마지막 트리거를 설정 너머

수정하거나 SQL 서버가 사용되는 순서 말할 수 없다. 따라서 트리거를 빌드하여 트리거되는 순서에 의존하지 않도록 할 수 있습니다. 오늘 발사되는 순서를 결정하더라도 내일은 바뀔 수 있습니다.

이 정보는 SQL Server 2000을 기반으로, 그러나 나는이 점에서 다른 2005/2008 행위를 믿지 않는다.

4

사용 sp_Settriggerorder 저장 프로 시저, 당신은 트리거의 실행 순서를 정의 할 수 있습니다.

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’ 
, [ @order = ] ‘value’ 
, [ @stmttype = ] ’statement_type’ 
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ] 

두 번째 매개 변수 인 "order"에는 최대 3 개의 트리거를 고려할 수있는 3 개의 값이 사용될 수 있습니다.

  1. 먼저

    - 트리거가 먼저 해고
  2. 마지막 - 트리거가 마지막
  3. 없음 트리거되지 않습니다 - 트리거는 임의의 순서로 발생합니다.
1

사용이 시스템 저장 프로 시저 :

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type' 
5

sp_settriggerorder는 트리거 이후에만 적용됩니다.

4

당신은 sp_settriggerorder를 사용하여 중간에 사람 불을 마지막으로 발사되는 트리거 먼저 해고되는되는 트리거를 보장 할 수 있습니다. 네 개 이상을 동기화해야하는 경우 SQL Server 2005에 표시되지 않습니다.

여기에 here에서 가져온 샘플입니다 (링크 된 기사는 훨씬 더 많은 정보가 있습니다).

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’ 
, [ @order = ] ‘value’ 
, [ @stmttype = ] ’statement_type’ 
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ] 
10

경우 다음 당신은 정말 거꾸로 조치를 취할하고 그 일을 더 나은 방법이있을 경우 당신이 뭘 하려는지 고려한다 트리거 주문에 대한 걱정의 시점에서. 이것이 쉬운 일이 아니라는 사실은 당신에게 뭔가를 말해 주어야합니다.

트리거는 항상 실제 솔루션처럼 보이며 적절한 위치에서 매우 가치가 있습니다. 이지만은 가격이 높기 때문에 디버깅 악몽을 만드는 것이 쉽습니다. 나는 과거에 많은 시간을 잃어 버렸습니다. 단지 애매한 데이터베이스 동작을 디버그하려고 할 때만 간과 된 트리거에서 그 원인을 발견했습니다.

17

사용 SetTriggerOrder 괜찮지 만, 코드가 실행의 특정 순서에 의존하는 경우, 왜

등, 저장 프로 시저에 모든 트리거를 포장하고, 첫 번째 전화를 두 번째, 두 번째는 세 번째 전화를 가지고 있지

그러면 트리거에서 첫 번째 실행 만하면됩니다.

향후 사용자 정의 실행 순서를 결정하기 위해 시스템 테이블에서 주위를 파고 들지 않아도 될 누군가가 감사 할 것입니다.

+7

일반적으로 저장 프로 시저의 삽입 및 삭제 된 가상 테이블에 쉽게 액세스 할 수 없기 때문에이 작업을 수행하지 않습니다. – mwigdahl

+0

실행 순서가 종속성없이 재미있을 수 있습니다 ... – Paul

14

sp_settriggerorder을 사용하여 테이블의 각 트리거 순서를 정의 할 수 있습니다.

그러나 나는 여러 가지 일을하는 단일 트리거를 사용하는 것이 훨씬 낫다고 주장합니다. 이것은 이고 특히이므로 순서가 중요하다면 트리거가 여러 개있는 경우 그 중요성이 그다지 분명하지 않기 때문입니다. 트랙을 따라 몇 달이나 몇 년 동안 데이터베이스를 지원하려는 사람을 상상해보십시오. 물론 여러 개의 트리거가 필요한 경우가있을 수 있습니다. 또는 실제로 디자인이 더 좋을 수도 있지만, 그 중 하나를 가지고 작업해야한다고 가정하기 시작합니다.

1

이러한 맥락에서 백만 달러 문 -

sp_settriggerorder는 : 첫 번째 또는 마지막 해고 트리거 후 지정합니다. 첫 번째 및 마지막 트리거 사이에 발생하는 AFTER 트리거는 정의되지 않은 순서로 실행됩니다.

출처 : MSDN

2

사용이 : 예를 들어

: 첫 번째와 마지막 트리거가 두 개의 서로 다른 트리거해야

USE AdventureWorks; 
GO 
EXEC sys.sp_settriggerorder @triggername = N'', -- nvarchar(517) 
    @order = '', -- varchar(10) 
    @stmttype = '', -- varchar(50) 
    @namespace = '' -- varchar(10) 

.

첫 번째 : 먼저 트리거가 시작됩니다.

마지막 : 트리거가 마지막에 실행되었습니다.

없음 : 트리거가 정의되지 않은 순서로 실행됩니다.

그리고이 @stmttype의 값에 대한 링크를 참조하십시오 DDL Events

그리고 @namespace = { 'DATABASE'에 대한 일 | '서버'| NULL} 및 자세한 내용은 DDL Triggers