每次存储的过程都是ALTERed或CREATEd,我想在触发器中捕获它以做一些事情。SQL Server:我可以在更改存储过程时设置触发器吗?
我可以在SQL Server 2008中做到这一点吗?
谢谢。 --Beemer
每次存储的过程都是ALTERed或CREATEd,我想在触发器中捕获它以做一些事情。SQL Server:我可以在更改存储过程时设置触发器吗?
我可以在SQL Server 2008中做到这一点吗?
谢谢。 --Beemer
如果你想用ALTER/CREATE/DROP上下文(即在同一事务中)做什么,甚至防止ALTER/CREATE/DROP,那么你应该看看DDL Triggers。
如果你想后做一些的ALTER/CREATE/DROP,在一个单独的事务,有自由做一些冗长处理的同时不会拖慢原来的DDL,那么你应该看看Event Notifications。
请注意,事件通知实际上可以远程传送,因此您可以将整个公司组的所有DDL事件捕获到一个中央存储库中。
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对象的文档),如果你没有现在这样做。
希望它有帮助。