2008-11-18 116 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