반응형
반응형

동적 관리 뷰를 이용하여 트리거 정보를 확인합니다.

 

데이터베이스 수준의 DDL 트리거 목록 확인하기

SELECT * FROM sys.triggers WHERE parent_class = 0;

GO

 

서버 수준의 DDL 트리거 목록 확인하기

SELECT * FROM sys.server_triggers;

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

 

반응형
반응형

DDL 트리거는 다양한 형태로 작성될 수 있습니다.

 

테이블의 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

 

반응형
반응형

DBA라면 DDL 트리거의 지원을 많이 기다렸을 겁니다.
DDL
트리거는 UPDATE, DELETE, INSERT 등과 같은 명령문에 작동하는 DML 트리거와 달리 테이블이나 뷰에 대한 CREATE, ALTER DROP 또는 사용자 계정이나 로그인 설정, 프로시저 생성 변경, 파티션 생성 변경 등과 같은 DDL문에 대하여 동작하는 트리거입니다.

다음과 같은 경우에 DDL 트리거를 활용할 있습니다.

?         데이터베이스 스키마에 대한 특정 변경 작업을 방지하려는 경우

?         데이터 스키마가 변경될 데이터베이스에서 특정 작업이 수행되도록 하려는 경우

?         데이터베이스 스키마의 변경 내용이나 이벤트를 기록하려는 경우

 

DDL 트리거는 SQL 문이 완료된 후에 실행이 되며, INSTEAD OF 트리거로 사용될 수는 없습니다. 또한 DML 트리거와 같이 inserted, deleted 테이블을 생성하지는 않습니다. DDL 트리거는 서버에 대해서 설정할 수도 있고 특정 데이터베이스에서만 수행되도록 설정할 수도 있습니다. 데이터베이스, 사용자, 끝점, 로그인 관련 이벤트는 서버 범위의 이벤트 그룹이며, 테이블, , 인덱스 등과 같은 데이터베이스 개체 관련 이벤트는 데이터베이스 범위의 이벤트 그룹입니다.

 

DDL 트리거를 디자인하기 전에 다음 사항이 필요합니다.

?         DDL 트리거 영역에 대하여 이해해야 합니다.

?         어떤 Transact-SQL() 대하여 트리거를 발생시킬 것인지를 결정해야 합니다.

반응형

+ Recent posts

반응형