SQL Server依赖关系

11
有没有一种简单的方法来追踪SQL Server 2005+中表/存储过程/函数依赖关系? 我继承了一个庞大的应用程序,有很多表格,甚至更多的长时间互相关联的存储过程和函数。
最终是否有一种方法来构建依赖关系树? 理想情况下,我要查找的内容是双向的:
对于表/存储过程 - 什么依赖于它?:显示所有最终引用它的存储过程(理想情况下,以树形视图呈现,子过程嵌套到调用它们的较大过程中)。
对于存储过程 - 它依赖于什么?:显示运行时给定过程将(或可能)触及的所有过程和表格。
看起来这个工具不应该很难制作,对于数据库维护而言将非常有用。 是否有人知道这样的东西? 如果不存在,为什么没有呢?
Management Studio中内置的功能很好,但信息似乎并不完整。
8个回答

27
希望我没有来得太晚:
如果你的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),这些视图提供有关每个特定数据库对象类型的更详细信息;如果需要,可以使用它们来提供有关对象的上下文信息。


我相信sys.objects表所属的对象目录视图是在SQL 2005中引入的,但是可以使用Information Schema视图编写类似的查询。 它们有点棘手,但您可以在http://msdn.microsoft.com/en-us/library/aa933204(SQL.80).aspx找到有关它们的文档。 - Jeremy S
你可以将此保存到Excel中,然后使用Gephi(一款免费且非常先进的图形可视化工具)进行导入。 - Ivan Akcheurov
顺便提一下,sql_dependencies现在已经被弃用了,最好使用sys.sql_expression_dependencies - Ivan Akcheurov

12

Red Gate有一个非常有用的工具叫做SQL Dependency Tracker。我们已经成功地将其用于您希望获得的结果类型。


终于有时间使用免费试用了 - 这是一个很棒的工具。 - Cory

3

我发现了这个解决方案,非常好用。

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');

2

我认为这不是一个完全保证的列表,但在管理工具中,您可以右键单击表或存储过程,然后选择“查看依赖项”选项。


2
这是一个选项列表,如果你的预算有限:

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

你也可以运行跟踪,查看当你点击“查看依赖项”时管理工作室实际上正在做什么。获取这些代码,并尝试修改以适用于你自己的需求。这是一种很好的技术,用于弄清楚如何通过UI自动化执行各种操作。

2
通过使用分析器,您应该能够看到针对服务器运行的代码。 - Tom H

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

0

0

试图跟踪依赖关系的系统表通常是错误的,因此您从中获得的任何答案都必须通过其他方式重新确认,那么为什么要费心呢?

商业产品存在,例如Redgate SQL Dependency Tracker。

像我这样的菜鸟开发者使用免费的SQL Digger。通过搜索对象名称的DDL,您通常可以找到有关所讨论对象的一级依赖关系。

下一级依赖关系跟踪是跟踪C#或VB.NET net对象依赖于SQL中的对象,但据我所知,除了全局搜索外,不存在此类工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接