다음을 통해 공유


DDL 트리거

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

DDL 트리거는 다양한 DDL(데이터 정의 언어) 이벤트에 대한 응답으로 발생합니다. 이러한 이벤트는 주로 CREATE, ALTER, DROP, GRANT, DENY, REVOKE, 또는 UPDATE STATISTICS 키워드로 시작하는 Transact-SQL 문에 해당합니다. DDL과 같은 작업을 수행하는 특정 시스템 저장 프로시저에서도 DDL 트리거가 발생할 수 있습니다.

다음 작업을 수행하려는 경우 DDL 트리거를 사용합니다.

  • 데이터베이스 스키마에 대한 특정 변경 내용을 방지합니다.
  • 데이터베이스 스키마의 변경에 대한 응답으로 데이터베이스에서 문제가 발생합니다.
  • 데이터베이스 스키마의 변경 내용 또는 이벤트를 기록합니다.

Important

DDL 트리거를 테스트하여 실행되는 시스템 저장 프로시저에 대한 트리거의 응답을 확인합니다. 예를 들어 CREATE TYPE 문과 sp_addtype 저장 프로시저는 모두 CREATE_TYPE 이벤트에서 생성된 DDL 트리거를 실행합니다.

DDL 트리거 유형

Transact-SQL 트리거

서버 범위 또는 데이터베이스 범위 이벤트에 대한 응답으로 하나 이상의 Transact-SQL 문을 실행하는 특수한 유형의 Transact-SQL 저장 프로시저입니다. 예를 들어 DDL 트리거는 명령문이 ALTER SERVER CONFIGURATION 실행되거나 테이블이 DROP TABLE을 사용하여 삭제된 경우 발생할 수 있습니다.

CLR 트리거

Transact-SQL 저장 프로시저를 실행하는 대신 CLR(공용 언어 런타임) 트리거는 .NET Framework에서 만들어지고 SQL Server에 업로드된 어셈블리의 멤버인 관리 코드로 작성된 하나 이상의 메서드를 실행합니다.

DDL 트리거는 트리거를 트리거하는 DDL 문이 실행된 후에만 실행됩니다. DDL 트리거는 INSTEAD OF 트리거로 사용할 수 없습니다. DDL 트리거는 로컬 또는 전역 임시 테이블과 저장 프로시저에 영향을 주는 이벤트에 대한 응답으로 실행되지 않습니다.

DDL 트리거는 특수 inserteddeleted 테이블을 만들지 않습니다.

DDL 트리거를 발생시키는 이벤트 및 트리거로 인한 후속 변경 내용에 대한 정보는 함수를 사용하여 EVENTDATA 캡처됩니다.

각 DDL 이벤트에 대해 여러 트리거를 생성할 수 있습니다.

DML(데이터 조작 언어) 트리거와 달리 DDL 트리거는 스키마로 범위가 지정되지 않습니다. 따라서 , OBJECT_NAMEOBJECTPROPERTY등의 함수OBJECT_IDOBJECTPROPERTYEX DDL 트리거에 대한 메타데이터를 쿼리하는 데 사용할 수 없습니다. 대신 카탈로그 뷰를 사용하세요.

서버 범위 DDL 트리거는 SQL Server Management Studio 개체 탐색기의 트리거 폴더에 나타납니다. 이 폴더는 서버 개체 폴더 아래에 있습니다. 데이터베이스 범위 DDL 트리거는 Database Triggers 폴더에 표시됩니다. 이 폴더는 해당 데이터베이스의 프로그래밍 기능 폴더 아래에 있습니다.

Important

사용 권한 수준을 높이고 트리거를 실행하더라도 트리거 내의 악성 코드가 실행될 수 있습니다. 이 위협을 줄이는 방법에 대한 자세한 내용은 트리거 보안 관리를 참조하세요.

DDL 트리거 범위

DDL 트리거는 현재 데이터베이스 또는 현재 서버에서 처리된 Transact-SQL 이벤트에 대한 응답으로 실행될 수 있습니다. 트리거의 범위는 이벤트에 따라 달라집니다. 예를 들어 이벤트에 대한 응답으로 CREATE_TABLE 발생하도록 생성된 DDL 트리거는 데이터베이스 또는 서버 인스턴스에서 CREATE_TABLE 이벤트가 발생할 때마다 실행될 수 있습니다. CREATE_LOGIN 이벤트에 대응하여 생성된 DDL 트리거는 CREATE_LOGIN 이벤트가 서버 인스턴스에서 발생할 때만 작동할 수 있습니다.

다음 예제에서는 데이터베이스에서 DROP_TABLE 또는 ALTER_TABLE 이벤트가 발생할 때마다 DDL 트리거 safety가 실행됩니다.

CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS PRINT 'You must disable trigger "safety" to drop or alter tables!';
    ROLLBACK;

다음 예시에서는 현재 서버 인스턴스에서 CREATE_DATABASE 이벤트가 발생하면 DDL 트리거가 메시지를 출력합니다. 이 예시에서는 EVENTDATA 함수를 사용하여 해당 Transact-SQL 문의 텍스트를 검색합니다. DDL 트리거와 함께 사용하는 EVENTDATA 방법에 대한 자세한 내용은 EVENTDATA 함수 사용을 참조하세요.

IF EXISTS (SELECT *
    FROM sys.server_triggers
    WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
    ON ALL SERVER;
GO

CREATE TRIGGER ddl_trig_database
ON ALL SERVER
FOR CREATE_DATABASE
AS PRINT 'Database Created.';
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)');
GO

DROP TRIGGER ddl_trig_database
    ON ALL SERVER;

Transact-SQL 문을 지정할 수 있는 범위에 매핑하는 목록은 이 문서의 뒷부분에 있는 DDL 트리거를 발생시키는 특정 DDL 문 선택 섹션에 제공된 링크를 통해 사용할 수 있습니다.

데이터베이스 범위에 한정된 DDL 트리거는 생성된 데이터베이스 내에서 객체로 저장됩니다. DDL 트리거는 데이터베이스에서 master 만들 수 있으며 사용자가 디자인한 데이터베이스에서 만든 트리거처럼 동작합니다. 카탈로그 뷰를 쿼리하여 sys.triggers DDL 트리거에 대한 정보를 얻을 수 있습니다. 트리거가 생성된 데이터베이스 컨텍스트 내에서 또는 데이터베이스 이름을 식별자로 master.sys.triggers로 지정하여 sys.triggers을/를 쿼리할 수 있습니다.

서버 범위 DDL 트리거는 데이터베이스에 master 개체로 저장됩니다. 그러나 데이터베이스 컨텍스트에서 카탈로그 뷰를 쿼리하여 서버 범위의 DDL 트리거 정보를 얻을 수 있습니다.

Transact-SQL 문 또는 문 그룹을 지정하십시오

특정 DDL 문을 선택하여 DDL 트리거를 실행합니다.

DDL 트리거는 하나 이상의 특정 Transact-SQL 문이 실행된 후에 실행되도록 설계할 수 있습니다. 앞의 예시에서 safety 트리거는 DROP_TABLE 또는 ALTER_TABLE 이벤트 후에 실행됩니다. DDL 트리거를 실행하도록 지정할 수 있는 Transact-SQL 문 목록과 트리거가 실행될 수 있는 범위는 DDL 이벤트를 참조하세요.

미리 정의된 DDL 문 그룹을 선택하여 DDL 트리거를 실행합니다.

DDL 트리거는 미리 정의된 유사한 이벤트 그룹에 속하는 모든 Transact-SQL 이벤트가 실행된 후에 실행될 수 있습니다. 예를 들어, CREATE TABLE, ALTER TABLE, 또는 DROP TABLE 문이 실행된 후 DDL 트리거가 실행되도록 하려면 CREATE TRIGGER 문에서 FOR DDL_TABLE_EVENTS을 지정할 수 있습니다. 실행 후 CREATE TRIGGER 이벤트 그룹에서 다루는 이벤트가 카탈로그 뷰에 sys.trigger_events 추가됩니다.

SQL Server 2005(9.x)에서 트리거가 이벤트 그룹에 만들어지는 경우 이벤트 그룹에 sys.trigger_events 대한 정보가 포함되지 않으며 해당 sys.trigger_events 그룹에서 다루는 개별 이벤트에 대한 정보만 포함됩니다. sys.trigger_events 는 트리거가 생성되는 이벤트 그룹 및 이벤트 그룹에서 다루는 개별 이벤트에 대한 메타데이터를 유지합니다. 따라서 이벤트 그룹에서 다루는 이벤트의 변경 내용은 SQL Server 2005(9.x)의 해당 이벤트 그룹에 생성된 최신 버전의 SQL Server의 DDL 트리거에는 적용되지 않습니다.

DDL 트리거에 사용할 수 있는 미리 정의된 DDL 문 그룹 목록, 이벤트 그룹이 포함하는 특정 문 및 이러한 이벤트 그룹을 프로그래밍할 수 있는 범위에 대해서는 DDL 이벤트 그룹을 참조하세요.

Task 조항
DDL 트리거를 생성, 수정, 삭제 또는 사용하지 않도록 설정하는 방법을 설명합니다. DDL 트리거 구현
CLR DDL 트리거를 만드는 방법을 설명합니다. CLR 트리거 만들기
DDL 트리거에 대한 정보를 반환하는 방법을 설명합니다. DDL 트리거에 대한 정보 가져오기
함수를 사용하여 DDL 트리거를 발생시키는 이벤트에 대한 정보를 반환하는 EVENTDATA 방법을 설명합니다. EVENTDATA 함수 사용
트리거 보안을 관리하는 방법에 대해 설명합니다. 트리거 보안 관리