簡體   English   中英

SQL Server:是否可以在更改存儲的過程時設置觸發器?

[英]SQL Server: Can I set a trigger on ALTERing a stored proc?

每次更改或創建存儲的proc時,我都想在觸發器中捕獲它,然后再做一些事情。

我可以在SQL Server 2008中這樣做嗎?

謝謝。 --Beemer

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對象的文檔,如果您現在還沒有這樣做的話。

希望能幫助到你。

如果您想對ALTER / CREATE / DROP上下文(即在同一事務內)做一些事情,甚至阻止ALTER / CREATE / DROP,那么您應該研究DDL觸發器

如果你想在ALTER / CREATE / DROP 做什么,在一個單獨的事務,有自由做一些冗長處理的同時不會拖慢原來的DDL,那么你應該看看事件通知

請注意,事件通知實際上可以遠程傳遞,因此您可以將整個公司組中的所有DDL事件捕獲到一個中央存儲庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM