每次存储过程都是ALTER或CREATEd时,我想在触发器中捕获它以后再做一些事情。
我可以在SQL Server 2008中执行此操作吗?
谢谢。 --Beemer
答案 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事件捕获到一个中央存储库中。