我的一個同事正在開發一套存儲過程,以及改變輸入參數,其中的一個檢查引用。的SQL Server:當改變功能/程序簽名
這將打破調用一個任何程序,所以我們需要找到所有這些程序。現在,我們手動調用一個依賴查找程序腳本,該腳本在系統表中查找引用我們更改的過程的過程。
我想這可能是冷靜地把觸發器在系統表 - 當我們改變一個存儲過程,我們會自動重新編譯所有引用它的程序,所以我們當他們中的一個突破知道。
2K8可能嗎?
我的一個同事正在開發一套存儲過程,以及改變輸入參數,其中的一個檢查引用。的SQL Server:當改變功能/程序簽名
這將打破調用一個任何程序,所以我們需要找到所有這些程序。現在,我們手動調用一個依賴查找程序腳本,該腳本在系統表中查找引用我們更改的過程的過程。
我想這可能是冷靜地把觸發器在系統表 - 當我們改變一個存儲過程,我們會自動重新編譯所有引用它的程序,所以我們當他們中的一個突破知道。
2K8可能嗎?
你不能添加一個觸發器到系統表,但您可以創建一個DDL觸發器,將火在ALTER PROC語句 - 例如:
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
我不確定如何獲取之前的參數列表,或者甚至可能 - 是否有人知道?
我將與查爾斯的建議,以使新參數可選,如果可能的同意 - 現有的代碼不會打破,你只需要找到引用如果你必須參數添加到該呼叫。
腳本化數據庫看起來很漫長。一個簡單的查詢,如下面應該找到你的PROC所有引用(數據庫內):
SELECT so.name, so.type_desc
FROM sys.all_objects so
JOIN sys.all_sql_modules sm ON so.[object_id] = sm.[object_id]
WHERE sm.[definition] LIKE '%<proc name>%'
這是同樣的事情,但也將在SQL Server的早期版本工作:
SELECT so.name, so.type
FROM syscomments sc
JOIN sysobjects so ON sc.id = so.id
where text like '%<proc name>%'
希望這有助於
MDD
最簡單的事情是腳本化數據庫,然後進行搜索。
一旦腳本創建後,您可以使用自己喜歡的工具來搜索腳本。您甚至可以使用「在文件中查找」命令在SSMS中使用正則表達式。
另一個選項(如果這將是確定您的要求)是改變現有的程序,使舊的現有參數是可選的(剛加入「= NULL」結尾)添加新參數作爲可選的爲好,並重寫sProc sp,它將使用一個或另一個,具體取決於哪一個通過...然後舊的代碼調用它的舊參數將繼續運行,因爲它用於...
當時你還有什麼需要澄清的回答你的問題? – 2009-08-14 13:58:19
看起來不錯。下面我添加了一個問題。 – Chris 2009-08-18 14:40:54