DDL 트리거는 UPDATE, DELETE, INSERT 등과 같은 명령문에 작동하는 DML 트리거와 달리 테이블이나 뷰에 대한 CREATE, ALTER 및 DROP 또는 사용자 계정이나 로그인 설정, 프로 시저 생성 및 변경, 파티션 생성 및 변경 등과 같은 DDL문에 대하여 동작하는 트리거입니다.
- 데이터베이스 스키마에 대한 특정 변경 작업을 방지하려는 경우
- 데이터 스키마가 변경될 때 데이터베이스에서 특정 작업이 수행되도록 하려는 경우
- 데이터베이스 스키마의 변경 내용이나 이벤트를 기록하려는 경우
DDL 트리거는 SQL 문이 완료된 후에 실행이 되며, INSTEAD OF 트리거로 사용될 수는 없습니다. 또한 DML 트리거와 같이 inserted, deleted 테이블을 생성하지는 않습니다. DDL 트리거는 서버에 대해서 설정할 수도 있고 특정 데이터베이스에서만 수행되도록 설정할 수도 있습니다. 데이터베이스, 사용자, 끝점, 로그인 관련 이벤트는 서버 범위의 이벤트 그룹이며, 테이블, 뷰, 인덱스 등과 같은 데이터베이스 개체 관련 이벤트는 데이터베이스 범위의 이벤트 그룹입니다.
- DDL 트리거를 디자인하기 전에 다음 사항이 필요합니다.
- DDL 트리거 영역에 대하여 이해해야 합니다.
- 어떤 Transact-SQL문(들)에 대하여 트리거를 발생시킬 것인지를 결정해야 합니다.
DDL 트리거 생성
[구문] CREATE TRIGGER trigger_name
ON { ALL SERVER | DATABASE }
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type | event_group } [ ,...n ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }
[따라하기] 테이블의 DROP 및 ALTER 작업에 대하여 DDL 트리거 생성하기
USE AdventureWorks;
GO
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name =
'safety')
DROP TRIGGER safety ON DATABASE;
GO
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT '테이블을 변경/삭제하려면“safety”트리거를 비활성화 하세요.'
ROLLBACK;
GO
-- safety라는 DDL 트리거를 비활성화합니다.
DISABLE TRIGGER safety ON DATABASE;
GO
-- safety라는 DDL 트리거를 활성화합니다.
ENABLE TRIGGER safety ON DATABASE;
GO
[따라하기] AdventureWorks 데이터베이스 내의 모든 DDL 문에 대하여, 사용 기록 남기기
USE AdventureWorks;
GO
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event
nvarchar(100), TSQL nvarchar(2000));
GO
CREATE TRIGGER log
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
SET @data = EVENTDATA( )
INSERT ddl_log (PostTime, DB_User, Event, TSQL) VALUES
(GETDATE( ),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO
--생성한 트리거 테스트
CREATE TABLE TestTable (a int); --임시 테이블을 생성
DROP TABLE TestTable ; --생성한 임시 테이블 삭제
GO
--DDL 로그 확인
SELECT * FROM ddl_log ;
GO
--트리거 삭제
DROP TRIGGER log ON DATABASE;
GO
--ddl_log 테이블 삭제
DROP TABLE ddl_log;
GO
DDL 트리거 정보 확인
[따라하기] 데이터베이스 수준의 DDL 트리거 목록 확인하기
SELECT * FROM sys.triggers WHERE parent_class = 0;
GO
[따라하기] 서버 수준의 DDL 트리거 목록 확인하기
SELECT * FROM sys.triggers WHERE parent_class = 0;
GO
[따라하기] 트리거 정의 확인하기
SELECT tr.name, sm.definition
FROM sys.triggers tr JOIN sys.sql_modules sm ON tr.object_id = sm.object_id
WHERE tr.parent_class = 0;
GO
출처 : DBGuide.net
728x90
댓글