2012-06-05 63 views
0

我正在寫ddl觸發器來創建和更改存儲過程。如何在ddl觸發器觸發時獲取存儲過程的腳本?

對於創建存儲過程觸發器,我想獲取create語句的腳本。對於更改存儲過程觸發器,我想獲取新的「創建存儲過程」語句而不是alter語句。

有沒有辦法做到這一點?對於第一個,我知道eventdata()可以做到。但對於第二個,我不確定。

+0

什麼你可以使用哪些技術? TSQL? CLR?其他.NET? – JNK

+0

所以你不喜歡DDL觸發器捕獲ALTER命令?你不能使用'STUFF(cmd,1,5,'CREATE')'將它轉換爲CREATE命令嗎? –

+0

@JNK它是TSQL。 –

回答

3

在DDL觸發器,可以在程序的映像「之後」使用可以獲得:

DECLARE @EventData XML = EVENTDATA(); 

SELECT OBJECT_DEFINITION(OBJECT_ID(
    @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]', 'NVARCHAR(255)') 
    + '.' + 
    @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(255)') 
)); 

所以,你可以分配輸出到一個變量,並讓它成爲你插入的部分(我假設你是將其記錄到某種DDL審計表中)。正如我在評論所說,你也可以這樣做:

DECLARE @EventData XML = EVENTDATA(); 

SELECT STUFF(@EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'), 
    1, 5, 'CREATE'); 

(這些都成爲您的DDL觸發器僅限於ALTER_PROCEDURE - 否則,你要檢查的事件類型在執行這些操作之前)。

+0

只需注意以下兩點:(1)假設您在代碼有機會調用回滾(如果您試圖通過DDL觸發器執行任何策略)之前捕獲「after」圖像。 (2)STUFF方法取決於前5個字符是'ALTER'。如果你在CREATE/ALTER語句之前做了非標準的事情,比如在CREATE/ALTER語句之前放置註釋,或者在CREATE/ALTER之前放置了回車符或其他空格,那麼你必須做相應的調整。第一種方法在這方面更安全。 –