2009-11-10 37 views

回答

2

如果你想用ALTER/CREATE/DROP上下文(即在同一事务中)做什么,甚至防止ALTER/CREATE/DROP,那么你应该看看DDL Triggers

如果你想后做一些的ALTER/CREATE/DROP,在一个单独的事务,有自由做一些冗长处理的同时不会拖慢原来的DDL,那么你应该看看Event Notifications

请注意,事件通知实际上可以远程传送,因此您可以将整个公司组的所有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对象的文档),如果你没有现在这样做。

希望它有帮助。

相关问题