다음을 통해 공유


sp_settriggerorder(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

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

Transact-SQL 구문 표기 규칙

구문

sp_settriggerorder
    [ @triggername = ] N'triggername'
    , [ @order = ] 'order'
    , [ @stmttype = ] 'stmttype'
    [ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]

인수

[ @triggername = ] N'triggername'

트리거의 이름 및 트리거가 속한 스키마(해당하는 경우) 순서를 설정하거나 변경할 스키마입니다. @triggername 기본값이 없는 nvarchar(517)이며 [ trigger_schema . ] trigger_name 형식입니다. 이름이 트리거에 해당하지 않거나 이름이 트리거에 INSTEAD OF 해당하는 경우 프로시저는 오류를 반환합니다. DDL 또는 로그온 트리거에 대해 스키마를 지정할 수 없습니다.

[ @order = ] 'order'

트리거의 새 순서에 대한 설정입니다. @order varchar(10)이며 다음 값 중 하나일 수 있습니다.

설명
First 트리거가 먼저 발생합니다.
Last 트리거가 마지막으로 실행됩니다.
None 트리거는 정의되지 않은 순서로 발생합니다.

Important

트리거와 Last 트리거는 First 두 개의 서로 다른 트리거여야 합니다.

[ @stmttype = ] 'stmttype'

트리거를 발생시키는 Transact-SQL 문을 지정합니다. @stmttype varchar(50)이며 DDL UPDATELOGONDELETE이벤트에 나열된 모든 T-SQL 문 이벤트가 될 INSERT수 있습니다. 이벤트 그룹을 지정할 수 없습니다.

해당 트리거가 해당 문 형식에 First 대한 트리거로 정의된 후에만 트리거를 문 형식의 트리거 또는 Last 트리거로 지정할 수 있습니다. 예를 들어 트리거 TR1First 정의된 경우 TR1 테이블에 T1 대해 INSERT 트리거를 INSERT 지정할 수 있습니다. 데이터베이스 엔진 트리거로 INSERT 만 정의된 명령문에 대한 UPDATE 트리거 또는 Last 트리거로 First 설정된 경우 TR1오류를 반환합니다. 자세한 내용은 설명 섹션을 참조하세요.

@namespace = { 'DATABASE' | 'SERVER' | NULL }

@triggername DDL 트리거인 경우 @namespace 데이터베이스 범위 또는 서버 범위로 @triggername 만들어졌는지 여부를 지정합니다. @triggername 로그온 트리거인 SERVER 경우 지정해야 합니다. DDL 트리거 범위에 대한 자세한 내용은 DDL 트리거를 참조 하세요. 지정하지 않았거나 지정된 경우 NULL @triggername DML 트리거입니다.

반환 코드 값

0 (성공) 및 1 (실패).

설명

이 섹션에서는 DML(데이터 조작 언어) 및 DDL(데이터 정의 언어) 트리거에 대한 고려 사항을 설명합니다.

DML 트리거

단일 테이블에는 각 문에 대해 트리거가 하나 First Last 만 있을 수 있습니다.

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

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

DDL 트리거

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

  1. 표시된 서버 수준 트리거 First
  2. 기타 서버 수준 트리거
  3. 표시된 서버 수준 트리거 Last
  4. 표시된 데이터베이스 수준 트리거 First
  5. 기타 데이터베이스 수준 트리거
  6. 표시된 데이터베이스 수준 트리거 Last

일반 트리거 고려 사항

ALTER TRIGGER 문이 첫 번째 또는 마지막 트리거를 변경하면 원래 트리거 First 에 설정된 특성이 Last 삭제되고 값이 대체됩니다None. 주문 값은 .를 사용하여 sp_settriggerorder다시 설정해야 합니다.

동일한 트리거를 둘 이상의 문 형식에 대한 첫 번째 또는 마지막 순서로 지정해야 하는 경우 각 문 형식 sp_settriggerorder 에 대해 실행해야 합니다. 또한 해당 문 형식에 대해 트리거를 발생시키는 트리거 또는 Last 트리거로 First 지정하려면 먼저 문 형식에 대해 트리거를 정의해야 합니다.

사용 권한

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

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

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

예제

A. DML 트리거에 대한 실행 순서 설정

다음 예제에서는 트리거 uSalesOrderHeader 가 테이블에서 작업이 발생한 후 발생하는 첫 번째 트리거임을 UPDATE 지정합니다 Sales.SalesOrderHeader .

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
    @order = 'First',
    @stmttype = 'UPDATE';

B. DDL 트리거에 대한 실행 순서 설정

다음 예제에서는 트리거 ddlDatabaseTriggerLog 가 데이터베이스에서 AdventureWorks2022 이벤트가 발생한 후 발생하는 첫 번째 트리거임을 ALTER_TABLE 지정합니다.

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
    @order = 'First',
    @stmttype = 'ALTER_TABLE',
    @namespace = 'DATABASE';