2009-08-04 27 views
0

我的一個同事正在開發一套存儲過程,以及改變輸入參數,其中的一個檢查引用。的SQL Server:當改變功能/程序簽名

這將打破調用一個任何程序,所以我們需要找到所有這些程序。現在,我們手動調用一個依賴查找程序腳本,該腳本在系統表中查找引用我們更改的過程的過程。

我想這可能是冷靜地把觸發器在系統表 - 當我們改變一個存儲過程,我們會自動重新編譯所有引用它的程序,所以我們當他們中的一個突破知道。

2K8可能嗎?

+0

當時你還有什麼需要澄清的回答你的問題? – 2009-08-14 13:58:19

+0

看起來不錯。下面我添加了一個問題。 – Chris 2009-08-18 14:40:54

回答

2

你不能添加一個觸發器到系統表,但您可以創建一個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

1

最簡單的事情是腳本化數據庫,然後進行搜索。


  1. 右鍵單擊數據庫,並選擇任務 - >生成腳本
  2. 單擊「下一步」,如果歡迎頁面出現
  3. 選擇數據庫
  4. 單擊「下一步」再次
  5. 選擇數據庫觸發器,存儲過程,表,用戶自定義函數和視圖,然後單擊「下一步」
  6. 在接下來的幾頁中,選擇SEL的所有對象ected類型通過使用「全選」,然後單擊「下一步」
  7. 選擇「腳本文件」,並保存文件,你可以找到它。
  8. 單擊「完成」

一旦腳本創建後,您可以使用自己喜歡的工具來搜索腳本。您甚至可以使用「在文件中查找」命令在SSMS中使用正則表達式。

+0

你能用一個概念證明詳細說明嗎? – Chris 2009-08-04 16:09:37

+0

對於我來說,這仍然看起來像一個手動過程,您必須更新腳本並在每次更改內容時運行查找。 我已經有一個存儲過程,可以找到一個函數/表/等的所有引用。我想要的是可以使用sp_executesql重新編譯所有這些引用的表。 – Chris 2009-08-18 14:39:50

0

另一個選項(如果這將是確定您的要求)是改變現有的程序,使舊的現有參數是可選的(剛加入「= NULL」結尾)添加新參數作爲可選的爲好,並重寫sProc sp,它將使用一個或另一個,具體取決於哪一個通過...然後舊的代碼調用它的舊參數將繼續運行,因爲它用於...