DDL 트리거 디자인

업데이트: 2006년 12월 12일

DDL 트리거를 디자인하려면 다음 조건을 만족해야 합니다.

  • DDL 트리거 범위를 이해해야 합니다.
  • 트리거를 시작하는 Transact-SQL 문 또는 문 그룹을 결정해야 합니다.
ms186406.security(ko-kr,SQL.90).gif보안 정보:
에스컬레이션된 권한으로 트리거 내부의 악의적인 코드가 실행될 수 있습니다. 이러한 위협을 완화하는 방법은 트리거 보안 관리를 참조하십시오.

트리거 범위 이해

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 이벤트가 발생할 경우 DLL 트리거가 메시지를 출력합니다. 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;
GO

Transact-SQL 문을 지정 가능한 범위에 매핑하는 목록은 이 항목의 뒷부분에 나오는 "DDL 트리거를 시작하기 위한 특정 DDL 문 선택" 섹션에 제공된 링크를 통해 볼 수 있습니다.

데이터베이스 범위 DDL 트리거는 해당 트리거를 만든 데이터베이스에 개체로 저장됩니다. master 데이터베이스에서 DDL 트리거를 만들 수 있으며 이러한 DDL 트리거는 사용자 지정 데이터베이스에서 만든 DDL 트리거와 똑같이 동작합니다. DDL 트리거에 대한 정보는 해당 트리거를 만든 데이터베이스 컨텍스트 내의 sys.triggers 카탈로그 뷰에 있습니다. master.sys.triggers와 같이 데이터베이스 이름을 식별자로 지정하여 정보를 볼 수도 있습니다.

서버 범위 DDL 트리거는 master 데이터베이스에 개체로 저장됩니다. 그러나 서버 범위 DDL 트리거에 대한 정보는 어느 데이터베이스 컨텍스트의 sys.server_triggers 카탈로그 뷰에서나 볼 수 있습니다.

DDL 트리거의 메타데이터를 검색하는 방법은 DDL 트리거에 대한 정보 가져오기를 참조하십시오.

DDL 트리거는 로컬 또는 전역 임시 테이블과 저장 프로시저에 영향을 주는 이벤트에 대한 응답으로 시작되지 않습니다.

Transact-SQL 문 또는 문 그룹 지정

DDL 트리거가 다음 이벤트에 대한 응답으로 시작되도록 만들 수 있습니다.

  • 하나 이상의 특정 DDL 문
  • 미리 정의된 DDL 문 그룹

DDL 트리거를 시작하기 위한 특정 DDL 문 선택

하나 이상의 특정 Transact-SQL 문이 실행된 이후에 DDL 트리거가 시작되도록 만들 수 있습니다. 이전 예에서는 DROP TABLE 또는 ALTER TABLE 이벤트 후에 트리거 safety가 시작됩니다.

DDL 트리거를 실행하는 데 모든 DDL 이벤트를 사용할 수 있는 것은 아닙니다. 일부 이벤트는 비동기적이고 트랜잭션이 아닌 문에만 사용할 수 있습니다. 예를 들어 DDL 트리거를 실행하는 데 ADD_ROLE_MEMBER 이벤트를 사용할 수 없습니다. 이러한 이벤트에는 이벤트 알림을 사용해야 합니다. 이벤트 알림에 대한 자세한 내용은 이벤트 알림(데이터베이스 엔진)을 참조하십시오.

DDL 트리거용 DDL 이벤트 항목에는 DDL 트리거를 시작하도록 지정할 수 있는 Transact-SQL 문과 해당 문이 시작할 수 있는 범위가 나열되어 있습니다.

DDL 트리거를 시작하기 위한 미리 정의된 DDL 문 그룹 선택

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

DDL 트리거용 이벤트 그룹 항목에는 DDL 트리거에 사용할 수 있는 미리 정의된 DDL 문 그룹, 적용되는 특정 문, 이러한 이벤트 그룹을 프로그래밍할 수 있는 범위 등이 나열되어 있습니다.

참고 항목

개념

EVENTDATA 함수 사용
DDL 트리거 이해
DDL 트리거 구현

도움말 및 정보

SQL Server 2005 지원 받기

변경 내역

릴리스 내역

2006년 12월 12일

변경된 내용
  • DDL 트리거를 실행하는 데 CREATE_DATABASE 이벤트를 사용할 수 없다는 잘못된 정보를 수정했습니다. 이 이벤트를 DDL 트리거가 아닌 이벤트 알림을 실행하는 데 사용할 수 있는 이벤트 예인 ADD_ROLE_MEMBER로 바꿨습니다.

2006년 7월 17일

변경된 내용
  • "트리거 범위 이해"의 두 번째 예를 업데이트했습니다.