2009-08-19 74 views
2

another question有關的DDL觸發器出現了一個問題。如果我有一個DDL觸發器,比如下面的DDL觸發器,它是爲了在參數列表發生變化時發出警告或回滾更改,是否有辦法獲取(例如)參數列表的前一個狀態?正如你所看到的,觸發器已經引用了新的參數列表,但是有沒有一種方法可以與ALTER語句之前的參數列表進行比較?DDL觸發器是否能看到以前的狀態?

ALTER TRIGGER DDL_PROC 
ON DATABASE 
FOR ALTER_PROCEDURE 
AS 
DECLARE @data XML, @ObjectName sysname, @ParamCount int 
SET @data = EVENTDATA() 
SET @ObjectName = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname') 

PRINT 'You have changed procedure: ' + @ObjectName 
SELECT @ParamCount = COUNT(*) FROM sys.parameters 
WHERE object_id = OBJECT_ID(@ObjectName) 
RAISERROR('This procedure now has %i parameter(s)',0,0,@ParamCount) 
GO 

回答

1

我不認爲這是可能的,因爲在事件發生後的觸發器觸發已發生(的INSTEAD OF觸發器將desireable但不適用於DDL觸發器)等的變化已經實現。

也許信息包含在EVENTDATA()XML對象中。這是指向完整模式引用的鏈接。

http://schemas.microsoft.com/sqlserver/2006/11/eventdata/

+1

架構定義是有幫助的,但它並不像以前的任何狀態信息是存在的。 DML觸發器也發生在事件(更新)發生之後,但是可以看到前一個狀態爲「已刪除」的結構 - 顯然沒有這種情況,但我認爲必須有一些*重建至少一些以前狀態的元素的方法... – 2009-08-19 15:40:05

+0

是的,因爲這一點已經發生了變化,所以您無法從INFORMATION_SCHEMA.ROUTINES視圖中查找原始定義語句。 – 2009-08-19 16:00:24