SQL Server:我可以在ALTERing存储过程中设置触发器吗?

时间:2009-11-10 18:49:27

标签: sql-server sql-server-2008 stored-procedures triggers

每次存储过程都是ALTER或CREATEd时,我想在触发器中捕获它以后再做一些事情。

我可以在SQL Server 2008中执行此操作吗?

谢谢。 --Beemer

2 个答案:

答案 0 :(得分: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对象的文档。

希望它有所帮助。

答案 1 :(得分:2)

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

如果你想在 ALTER / CREATE / DROP之后做一些,在一个单独的事务中,并且可以自由地做一些冗长的处理而不减慢原始的DDL,那么你应该调查一下Event Notifications

请注意,事件通知实际上可以远程传递,因此您可以将整个公司组中的所有DDL事件捕获到一个中央存储库中。