2008-11-18 155 views
10

是否有一種簡單的方法可以追溯SQL Server 2005+中的表/存儲過程/函數依賴關係?我已經繼承了一個巨大的應用程序,它包含很多表格以及更多的存儲過程和功能,這些程序和功能是相互關聯的。SQL Server依賴關係

在一天結束時有沒有辦法建立一個依賴樹?理想情況下,我正在尋找雙向:

對於表/程序 - 什麼取決於它?:向我展示最終引用它的所有存儲過程(理想情況下在樹視圖中使子過程嵌套到調用它們的更大過程中)

對於過程 - IT依賴於什麼?:向我展示給定過程在運行時將(或可能)觸及的所有過程和表格。

看來這個工具不應該很難做,而且對於數據庫維護通常是非常有用的。有人知道這樣的事情嗎?如果這不存在,爲什麼不行?

Management Studio中的內置功能很不錯,但信息看起來並不完整。

回答

11

紅門有一個非常有用的工具,稱爲SQL Dependency Tracker。我們已經成功地將其用於您希望獲得的結果類型。

+0

終於可以使用免費試用 - 這是一個很好的工具。 – Cory 2008-12-02 18:57:32

2

我不認爲這是一個保證完整列表,但在Management Studio中,您可以右鍵單擊表或存儲過程並選擇View Dependencies選項。

0

試圖跟蹤依賴性的系統表通常是錯誤的,因此您從中得到的任何答案都必須通過其他方式進行重新確認,那麼爲什麼要這樣做呢?

存在商業產品,例如Redgate SQL Dependency Tracker。

像我這樣的貧窮開發者,我使用SQL Digger,它是免費的。通過在DDL中搜索對象名稱,通常可以找到有關對象的第一級依賴關係。

依賴關係跟蹤的下一級別是追蹤C#或VB.NET網絡對象依賴於SQL中的對象,但AFAIK工具不存在於全局搜索之外。

2

這裏,如果你的預算是低的選項列表:

http://www.mssqltips.com/tip.asp?tip=1294

你也可以當您單擊「視圖依賴性」運行跟蹤,看看什麼管理工作室實際上做。抓住該代碼,看看你是否可以修改它以供自己使用。這是一個很好的技巧,可以幫助您瞭解如何自動化通常通過UI執行的各種操作。

+0

如何「抓住該代碼」? – Cory 2008-11-18 16:21:27

+1

使用事件探查器,您應該能夠看到針對服務器運行的代碼。 – 2008-11-18 20:35:57

25

希望我不是太晚了這一點:

如果您的SQL登錄訪問sys架構在一個特定的數據庫,你可以使用sys.dependencies視角以尋找對象的所有依賴於一個拍攝:

SELECT o.name, o.type_desc, p.name, p.type_desc 
FROM sys.sql_dependencies d 
INNER JOIN sys.objects o 
    ON d.object_id = o.object_id 
INNER JOIN sys.objects p 
    ON d.referenced_major_id = p.object_id 

以此爲起點,您可以創建一個體面的工具來創建依賴關係樹。還有類型特定的視圖(例如sys.columns),它們提供了有關每個特定數據庫對象類型的更深入的信息;如有必要,這些可用於提供對象的上下文信息。

0

我發現這個解決方案,它的偉大。

SELECT referencing_schema_name, referencing_entity_name, 
referencing_id, referencing_class_desc, is_caller_dependent 
FROM sys.dm_sql_referencing_entities ('dbo.udf_func', 'OBJECT'); 
0

MSDN

SELECT * FROM sys.sql_expression_dependencies 
WHERE referenced_id = OBJECT_ID(N'Production.Product'); 

我們可以把它票友:

select 
I.name depending, I.xtype dependingtype, 
E.name depended, E.xtype dependedtype 
from sys.sql_expression_dependencies D 
left outer join sysobjects I on D.referencing_id = I.id 
left outer join sysobjects E on D.referenced_id = E.id 
where 1 = 1 
and (E.name = 'mytable' or I.name = 'mytable') -- customize this any way you want 
order by dependedtype, depended, dependingtype, depending