sp_settriggerorder(Transact-SQL)

첫 번째 또는 마지막으로 실행되는 AFTER 트리거를 지정합니다. 첫 번째와 마지막 트리거 사이에 실행되는 AFTER 트리거는 정의되지 않은 순서로 실행됩니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

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

인수

  • [ @triggername= ] '[ triggerschema**.] triggername'**
    트리거 및 트리거가 속한 스키마의 이름입니다. 해당되는 경우 이 순서가 설정 또는 변경됩니다. [triggerschema**.**]triggername은 sysname입니다. 이름이 트리거와 일치하지 않거나 INSTEAD OF 트리거와 일치하는 경우에는 프로시저가 오류를 반환합니다. DDL 또는 LOGON 트리거에 대해서는 triggerschema를 지정할 수 없습니다.

  • [ @order= ] 'value'
    트리거의 새 순서 설정입니다. value는 varchar(10)이며 다음 값 중 하나를 사용할 수 있습니다.

    중요 정보중요

    First 트리거와 Last 트리거는 서로 달라야 합니다.

    설명

    First

    트리거가 첫 번째로 실행됩니다.

    Last

    트리거가 마지막으로 실행됩니다.

    없음

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

  • [ @stmttype= ] 'statement_type'
    트리거를 실행시키는 SQL 문을 지정합니다. statement_type은 varchar(50)이며 INSERT, UPDATE, DELETE, LOGON 또는 DDL 이벤트에 나열된 모든 Transact-SQL 문이 될 수 있습니다. 이벤트 그룹은 지정할 수 없습니다.

    트리거를 특정 문 유형의 First 또는 Last 트리거로 지정하려면 먼저 해당 트리거를 해당 문 유형의 트리거로 정의해야 합니다. 예를 들어 TR1이 INSERT 트리거로 정의되면 TR1 트리거를 T1 테이블에서 INSERT의 First 트리거로 지정할 수 있습니다. 데이터베이스 엔진은 INSERT 트리거로만 정의된 TR1이 UPDATE 문의 First 또는 Last 트리거로 설정되는 경우 오류를 반환합니다. 자세한 내용은 주의 섹션을 참조하십시오.

  • @namespace= { 'DATABASE' | 'SERVER' | NULL }
    triggername이 DDL 트리거인 경우 triggername이 데이터베이스 범위 또는 서버 범위에서 생성되었는지 여부를 지정합니다. triggername이 로그온 트리거인 경우 SERVER를 지정해야 합니다. DDL 트리거 범위에 대한 자세한 내용은 DDL 트리거 디자인을 참조하십시오. 지정하지 않거나 NULL을 지정한 경우 triggername은 DML 트리거입니다.

반환 코드 값

0(성공) 및 1(실패)

주의

DML 트리거

한 테이블에는 각 문당 FirstLast 트리거가 하나씩만 허용됩니다.

테이블, 데이터베이스 또는 서버에서 First 트리거가 이미 정의된 경우 같은 테이블, 데이터베이스 또는 서버에서 같은 statement_type에 대해 새 트리거를 First로 지정할 수 없습니다. 이 제한은 Last 트리거에도 적용됩니다.

복제 시 즉시 업데이트 구독이나 지연 업데이트 구독에 포함된 테이블에 대해 첫 번째 트리거가 자동으로 생성됩니다. 복제의 트리거는 첫 번째 트리거여야 합니다. 첫 번째 트리거가 있는 테이블을 즉시 업데이트 구독이나 지연 업데이트 구독에 포함시키면 복제 시 오류가 발생합니다. 테이블이 구독에 포함된 다음 트리거를 첫 번째 트리거로 만들면 sp_settriggerorder에서 오류를 반환합니다. 복제 트리거에서 ALTER TRIGGER를 사용하거나 sp_settriggerorder를 사용하여 복제 트리거를 Last 트리거나 None 트리거로 변경하면 구독이 제대로 작동하지 않습니다.

DDL 트리거

데이터베이스 범위의 DDL 트리거와 서버 범위의 DDL 트리거가 같은 이벤트에 있는 경우 두 트리거를 First 트리거 또는 Last 트리거로 지정할 수 있습니다. 그러나 서버 범위 트리거가 항상 먼저 실행됩니다. 일반적으로 같은 이벤트에 있는 DDL 트리거의 실행 순서는 다음과 같습니다.

  1. First로 표시된 서버 수준 트리거

  2. 다른 서버 수준 트리거

  3. Last로 표시된 서버 수준 트리거

  4. First로 표시된 데이터베이스 수준 트리거

  5. 다른 데이터베이스 수준 트리거

  6. Last로 표시된 데이터베이스 수준 트리거

일반적인 트리거 고려 사항

ALTER TRIGGER 문이 첫 번째 또는 마지막 트리거를 변경할 경우 원래 트리거에 설정되었던 First 또는 Last 특성은 삭제되고 값이 None으로 대체됩니다. 순서 값은 sp_settriggerorder로 다시 설정해야 합니다.

같은 트리거를 둘 이상의 문 유형에서 첫 번째 또는 마지막 순서로 지정해야 하는 경우 각 문 유형에 대해 sp_settriggerorder를 실행해야 합니다. 또한 트리거를 먼저 문 유형에 대해 정의해야만 해당 문 유형에 대해 First 또는 Last 트리거로 실행하도록 지정할 수 있습니다.

사용 권한

서버 범위(ON ALL SERVER)의 DDL 트리거 또는 로그온 트리거의 순서를 설정하려면 CONTROL SERVER 권한이 필요합니다.

데이터베이스 범위(ON DATABASE)의 DDL 트리거 순서를 설정하려면 ALTER ANY DATABASE DDL TRIGGER 권한이 필요합니다.

DML 트리거의 순서를 설정하려면 트리거가 정의된 테이블 또는 뷰에 대한 ALTER 권한이 필요합니다.

1. DML 트리거의 실행 순서 설정

다음 예에서는 uSalesOrderHeader 트리거를 Sales.SalesOrderHeader 테이블에서 UPDATE 작업이 발생한 후 실행되는 첫 번째 트리거로 지정합니다.

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

2. DDL 트리거의 실행 순서 설정

다음 예에서는 ddlDatabaseTriggerLog 트리거를 AdventureWorks2008R2 데이터베이스에서 ALTER_TABLE 이벤트가 발생한 후 실행되는 첫 번째 트리거로 지정합니다.

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