2009-11-10 2 views

답변

2

당신은 ALTER/CREATE/DROP을 ALTER/CREATE/DROP 컨텍스트 withing에 뭔가를 할 (예. 같은 트랜잭션 내부), 심지어 방지하려면 다음 DDL Triggers에 보일 것입니다.

당신이 후 뭔가 을 수행 할 경우, ALTER/별도의 트랜잭션에서/DROP를 생성 한 다음 Event Notifications에 보일 것입니다, 원래의 DDL을 저하없이 약간의 긴 처리를 할 수있는 자유를 가지고있다.

실제로 이벤트 알림을 원격으로 전달할 수 있으므로 전체 회사 그룹의 모든 DDL 이벤트를 하나의 중앙 저장소로 캡처 할 수 있습니다.

3
 
CREATE TRIGGER tddl_storedprocevents ON DATABASE 
FOR 
CREATE_PROCEDURE,ALTER_PROCEDURE,DROP_PROCEDURE 
AS 
INSERT INTO AUDIT_TABLE(EventType, SQLCommand, etc) 
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(512)') 
     , EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)') 
      , etc 

/* 
EVENTDATA() 

SELECT EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(512)') 
    , EVENTDATA().value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime') 
    , EVENTDATA().value('(/EVENT_INSTANCE/SPID)[1]', 'nvarchar(4)') 
    , EVENTDATA().value('(/EVENT_INSTANCE/ServerName)[1]', 'nvarchar(512)') 
    , EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(512)') 
    , EVENTDATA().value('(/EVENT_INSTANCE/LoginType)[1]', 'nvarchar(512)') 
    , EVENTDATA().value('(/EVENT_INSTANCE/SID)[1]', 'nvarchar(512)') 
    , EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'nvarchar(512)') 
    , EVENTDATA().value('(/EVENT_INSTANCE/IsPooled)[1]', 'nvarchar(1)') 
etc 
*/ 

DROP TRIGGER tddl_storedprocevents ON DATABASE 

지금까지하지 않은 경우 EVENTDATA()가 반환 한 xml 개체에 대한 설명서를 읽는 것이 좋습니다.

희망이 있습니다.