2009-11-10 4 views

Répondre

2

Si vous voulez faire quelque chose ALTER sont acceptés dans/CREATE/contexte DROP (ie. L'intérieur de la même transaction) et même empêcher la ALTER/CREATE/DROP alors vous devriez regarder dans DDL Triggers.

Si vous voulez faire quelque chose après ALTER/CREATE/DROP, dans une transaction séparée, et ont la liberté de faire un peu de traitement prolongé sans ralentir l'origine DDL, alors vous devriez regarder dans Event Notifications.

Notez que les notifications d'événements peuvent réellement être transmises à distance afin que vous puissiez capturer tous les événements DDL d'un groupe d'entreprise entier dans un référentiel central unique.

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 

Je vous recommande de lire la documentation sur l'objet XML retourné par EVENTDATA(), si vous ne l'avez pas déjà fait.

Espérons que ça aide.

Questions connexes