DDL 트리거DDL Triggers

DDL 트리거는 다양한 DDL(데이터 정의 언어) 이벤트에 대한 응답으로 실행됩니다.DDL triggers fire in response to a variety of Data Definition Language (DDL) events. 이러한 이벤트는 주로 CREATE, ALTER, DROP, GRANT, DENY, REVOKE 또는 UPDATE STATISTICS 키워드로 시작하는 Transact-SQLTransact-SQL 문에 해당합니다.These events primarily correspond to Transact-SQLTransact-SQL statements that start with the keywords CREATE, ALTER, DROP, GRANT, DENY, REVOKE or UPDATE STATISTICS. DDL과 같은 작업을 수행하는 특정 시스템 저장 프로시저에서 DDL 트리거가 발생할 수도 있습니다.Certain system stored procedures that perform DDL-like operations can also fire DDL triggers.

다음과 같은 경우 DDL 트리거를 사용합니다.Use DDL triggers when you want to do the following:

  • 데이터베이스 스키마에 대한 특정 변경 작업을 방지하려는 경우Prevent certain changes to your database schema.

  • 데이터 스키마가 변경될 때 데이터베이스에서 특정 작업이 수행되게 하려는 경우Have something occur in the database in response to a change in your database schema.

  • 데이터베이스 스키마의 변경 내용이나 이벤트를 기록하려는 경우Record changes or events in the database schema.

중요

DDL 트리거를 테스트하여 실행된 시스템 저장 프로시저에 대한 응답을 확인합니다.Test your DDL triggers to determine their responses to system stored procedures that are run. 예를 들어 CREATE TYPE 문과 sp_addtype 저장 프로시저는 모두 CREATE_TYPE 이벤트에서 생성되는 DDL 트리거를 발생시킵니다.For example, the CREATE TYPE statement and the sp_addtype stored procedure will both fire a DDL trigger that is created on a CREATE_TYPE event.

DDL 트리거 유형Types of DDL Triggers

Transact-SQL DDL 트리거Transact-SQL DDL Trigger
서버 범위 또는 데이터베이스 범위 이벤트에 대한 응답으로 하나 이상의 Transact-SQLTransact-SQL 문을 실행하는 특수 유형의 Transact-SQLTransact-SQL 저장 프로시저입니다.A special type of Transact-SQLTransact-SQL stored procedure that executes one more more Transact-SQLTransact-SQL statements in response to a server-scoped or database-scoped event. 예를 들어 ALTER SERVER CONFIGURATION과 같은 문을 실행하거나 DROP TABLE을 사용하여 테이블을 삭제하면 DDL 트리거가 실행될 수 있습니다.For example, a DDL Trigger may fire if a statement such as ALTER SERVER CONFIGURATION is executed or if a table is deleted by using DROP TABLE.

CLR DDL 트리거CLR DDL Trigger
CLR 트리거는 Transact-SQLTransact-SQL 저장 프로시저를 실행하는 대신 .NET Framework에서 생성되고 SQL ServerSQL Server에서 업로드되는 어셈블리 멤버인 관리 코드로 작성된 하나 이상의 메서드를 실행합니다.Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

DDL 트리거를 시작하는 DDL 문이 실행된 후에만 DDL 트리거가 시작됩니다.DDL triggers fire only after the DDL statements that trigger them are run. DDL 트리거는 INSTEAD OF 트리거로 사용될 수 없습니다.DDL triggers cannot be used as INSTEAD OF triggers. DDL 트리거는 로컬 또는 전역 임시 테이블과 저장 프로시저에 영향을 주는 이벤트에 대한 응답으로 실행되지 않습니다.DDL triggers do not fire in response to events that affect local or global temporary tables and stored procedures.

DDL 트리거는 특수 inserteddeleted 테이블을 만들 수 없습니다.DDL triggers do not create the special inserted and deleted tables.

DDL 트리거를 실행하는 이벤트에 대한 정보 및 트리거로 변경되는 내용은 EVENTDATA 함수를 사용하여 확인할 수 있습니다.The information about an event that fires a DDL trigger, and the subsequent changes caused by the trigger, is captured by using the EVENTDATA function.

각 DDL 이벤트에 대해 만들 다중 트리거입니다.Multiple triggers to be created for each DDL event.

DDL 트리거는 DML 트리거와 달리 스키마로 범위가 한정되지 않습니다.Unlike DML triggers, DDL triggers are not scoped to schemas. DDL 트리거에 대한 메타데이터를 쿼리하는 데 OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY 및 OBJECTPROPERTYEX와 같은 함수는 사용할 수 없습니다.Therefore, functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX cannot be used for querying metadata about DDL triggers. 대신 카탈로그 뷰를 사용하세요.Use the catalog views instead.

서버 범위 DDL 트리거는 SQL Server Management Studio 개체 탐색기의 트리거 폴더에 나타납니다.Server-scoped DDL triggers appear in the SQL Server Management Studio Object Explorer in the Triggers folder. 이 폴더는 서버 개체 폴더 아래에 있습니다.This folder is located under the Server Objects folder. 데이터베이스 범위 DDL 트리거는 데이터베이스 트리거 폴더에 나타납니다.Database-scoped DDL triggers appear in the Database Triggers folder. 이 폴더는 해당 데이터베이스의 프로그래밍 기능 폴더 아래에 있습니다.This folder is located under the Programmability folder of the corresponding database.

중요

사용 권한 수준을 높이고 트리거를 실행하더라도 트리거 내의 악성 코드가 실행될 수 있습니다.Malicious code inside triggers can run under escalated privileges. 이 위협을 완화하는 방법은 트리거 보안 관리를 참조하세요.For more information about how to help reduce this threat, see Manage Trigger Security.

DDL 트리거 범위DDL Trigger Scope

DDL 트리거는 현재 데이터베이스나 서버에서 처리되는 Transact-SQLTransact-SQL 이벤트에 응답하여 시작될 수 있습니다.DDL triggers can fire in response to a Transact-SQLTransact-SQL event processed in the current database, or on the current server. 트리거의 범위는 이벤트에 따라 달라집니다.The scope of the trigger depends on the event. 예를 들어 CREATE_TABLE 이벤트에 대한 응답으로 시작되도록 만들어진 DDL 트리거는 데이터베이스 또는 서버 인스턴스에서 CREATE_TABLE 이벤트가 발생할 때마다 시작될 수 있습니다.For example, a DDL trigger created to fire in response to a CREATE_TABLE event can do so whenever a CREATE_TABLE event occurs in the database, or on the server instance. CREATE_LOGIN 이벤트에 대한 응답으로 시작되도록 만들어진 DDL 트리거는 서버 인스턴스에서 CREATE_LOGIN 이벤트가 발생할 경우에만 시작될 수 있습니다.A DDL trigger created to fire in response to a CREATE_LOGIN event can do so only when a CREATE_LOGIN event occurs in the server instance.

다음 예에서는 데이터베이스에서 safety 또는 DROP_TABLE 이벤트가 발생할 때마다 DDL 트리거 ALTER_TABLE 가 시작됩니다.In the following example, DDL trigger safety will fire whenever a DROP_TABLE or ALTER_TABLE event occurs in the database.

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 이벤트가 발생할 경우 DLL 트리거가 메시지를 출력합니다.In the following example, a DDL trigger prints a message if any CREATE_DATABASE event occurs on the current server instance. 또한 EVENTDATA 함수를 사용하여 해당 Transact-SQLTransact-SQL 문의 텍스트를 검색합니다.The example uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. DDL 트리거와 함께 EVENTDATA를 사용하는 방법은 EVENTDATA 함수 사용을 참조하세요.For more information about how to use EVENTDATA with DDL triggers, see Use the EVENTDATA Function.

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

Transact-SQLTransact-SQL 문을 지정 가능한 범위에 매핑하는 목록은 이 항목의 뒷부분에 나오는 "DDL 트리거를 시작하기 위한 특정 DDL 문 선택" 섹션에 제공된 링크를 통해 볼 수 있습니다.The lists that map the Transact-SQLTransact-SQL statements to the scopes that can be specified for them are available through the links provided in the section "Selecting a Particular DDL Statement to Fire a DDL Trigger," later in this topic.

데이터베이스 범위 DDL 트리거는 해당 트리거를 만든 데이터베이스에 개체로 저장됩니다.Database-scoped DDL triggers are stored as objects in the database in which they are created. master 데이터베이스에서 DDL 트리거를 만들 수 있으며 이러한 DDL 트리거는 사용자가 디자인한 데이터베이스에서 만든 DDL 트리거와 똑같이 동작합니다.DDL triggers can be created in the master database and behave just like those created in user-designed databases. DDL 트리거에 대한 정보는 sys.triggers 카탈로그 뷰를 쿼리하여 얻을 수 있습니다.You can obtain information about DDL triggers by querying the sys.triggers catalog view. sys.triggers 는 트리거가 만들어진 데이터베이스 컨텍스트 내에서 또는 master.sys.triggers와 같이 데이터베이스 이름을 식별자로 지정하여 쿼리할 수 있습니다.You can query sys.triggers within the database context in which the triggers are created or by specifying the database name as an identifier, such as master.sys.triggers.

서버 범위 DDL 트리거는 master 데이터베이스에 개체로 저장됩니다.Server-scoped DDL triggers are stored as objects in the master database. 그러나 서버 범위 DDL 트리거에 대한 정보는 임의의 데이터베이스 컨텍스트에서 sys.server_triggers 카탈로그 뷰를 쿼리하여 얻을 수 있습니다.However, you can obtain information about server-scoped DDL triggers by querying the sys.server_triggers catalog view in any database context.

Transact-SQL 문 또는 문 그룹 지정Specifying a Transact-SQL Statement or Group of Statements

DDL 트리거를 시작하기 위한 특정 DDL 문 선택Selecting a Particular DDL Statement to Fire a DDL Trigger

하나 이상의 특정 Transact-SQLTransact-SQL 문이 실행된 이후에 DDL 트리거가 시작되도록 만들 수 있습니다.DDL triggers can be designed to fire after one or more particular Transact-SQLTransact-SQL statements are run. 이전 예에서 safety 트리거는 DROP_TABLE 또는 ALTER_TABLE 이벤트가 발생한 이후에 시작됩니다.In the previous example, trigger safety fires after any DROP_TABLE or ALTER_TABLE event. DDL 트리거를 시작하도록 지정할 수 있는 Transact-SQLTransact-SQL 문 목록과 트리거 시작 범위는 DDL 이벤트를 참조하세요.For lists of the Transact-SQLTransact-SQL statements that can be specified to fire a DDL trigger, and the scope at which the trigger can fire, see DDL Events.

DDL 트리거를 시작하기 위한 미리 정의된 DDL 문 그룹 선택Selecting a Predefined Group of DDL Statements to Fire a DDL Trigger

DDL 트리거는 미리 정의된 유사 이벤트 그룹에 속한 Transact-SQLTransact-SQL 이벤트가 실행된 이후에 시작될 수 있습니다.A DDL trigger can fire after execution of any Transact-SQLTransact-SQL event that belongs to a predefined grouping of similar events. 예를 들어 CREATE TABLE, ALTER TABLE 또는 DROP TABLE 문이 실행된 이후에 DDL 트리거가 시작되도록 하려면 CREATE TRIGGER 문에 FOR DDL_TABLE_EVENTS를 지정하면 됩니다.For example, if you want a DDL trigger to fire after any CREATE TABLE, ALTER TABLE, or DROP TABLE statement is run, you can specify FOR DDL_TABLE_EVENTS in the CREATE TRIGGER statement. CREATE TRIGGER가 실행되면 이벤트 그룹에 속하는 이벤트가 sys.trigger_events 카탈로그 뷰에 추가됩니다.After CREATE TRIGGER is run, the events that are covered by an event group are added to the sys.trigger_events catalog view.

SQL Server 2005SQL Server 2005에서 트리거가 이벤트 그룹에 만들어지는 경우 sys.trigger_events 에는 이벤트 그룹에 대한 정보가 포함되지 않고 sys.trigger_events 에는 이벤트 그룹에 속한 개별 이벤트에 대한 정보만 포함됩니다.In SQL Server 2005SQL Server 2005, if a trigger is created on an event group, sys.trigger_events does not include information about the event group, sys.trigger_events includes information only about the individual events covered by that group. SQL Server 2008SQL Server 2008 이상 버전에서 sys.trigger_events 는 트리거가 만들어진 이벤트 그룹에 대한 메타데이터와 이벤트 그룹에 속한 개별 이벤트에 대한 메타데이터를 보존합니다.In SQL Server 2008SQL Server 2008 and higher, sys.trigger_events persists metadata about the event group on which the triggers is created, and also about the individual events that the event group covers. 따라서 SQL Server 2008SQL Server 2008 이상 버전의 이벤트 그룹에 속한 이벤트에 대한 변경 사항은 SQL Server 2005SQL Server 2005의 이벤트 그룹에 만들어진 DDL 트리거에 적용되지 않습니다.Therefore, changes to the events that are covered by event groups in SQL Server 2008SQL Server 2008 and higher do not apply to DDL triggers that are created on those event groups in SQL Server 2005SQL Server 2005.

DDL 트리거에 사용할 수 있는 미리 정의된 DDL 문 그룹 목록, 이벤트 그룹에 포함된 특정 문 및 이러한 이벤트 그룹을 프로그래밍할 수 있는 범위는 DDL Event Groups을 참조하십시오.For a list of the predefined groups of DDL statements that are available for DDL triggers, the particular statements the event groups cover, and the scopes at which these event groups can be programmed, see DDL Event Groups.

태스크Task 항목Topic
DDL 트리거 생성, 수정 또는 삭제하거나 사용하지 않도록 설정하는 방법에 대해 설명합니다.Describes how to create, modify, delete or disable DDL triggers. DDL 트리거 구현Implement DDL Triggers
CLR DDL 트리거를 만드는 방법에 대해 설명합니다.Describes how to create a CLR DDL trigger. CLR 트리거 만들기Create CLR Triggers
DDL 트리거에 대한 정보를 반환하는 방법에 대해 설명합니다.Describes how to return information about DDL triggers. DDL 트리거에 대한 정보 가져오기Get Information About DDL Triggers
EVENTDATA 함수를 사용하여 DDL 트리거를 발생하는 이벤트에 대한 정보를 반환하는 방법에 대해 설명합니다.Describes how to return information about an event that fires a DDL trigger by using the EVENTDATA function. EVENTDATA 함수 사용Use the EVENTDATA Function
트리거 보안을 관리하는 방법에 대해 설명합니다.Describes how to manage trigger security. 트리거 보안 관리Manage Trigger Security

참고 항목See Also

DML 트리거 DML Triggers
LOGON 트리거 Logon Triggers
CREATE TRIGGER(Transact-SQL) CREATE TRIGGER (Transact-SQL)