如何找到数据库表的所有依赖项?

时间:2010-05-17 12:29:31

标签: sql-server dependencies

在MS SQL 2005中,是否可以找出哪些表/列作为另一个表中的键或作为存储过程的一部分使用?

原因是我正在尝试清理一些旧的存储过程和表,其中一些可以删除,其中一些可以修剪列。但显然我不想删除正在使用的东西。

2 个答案:

答案 0 :(得分:1)

DECLARE @BaseObject varchar(100)
SET @BaseObject = 'AddEntry'

SET NOCOUNT ON

DECLARE @Objects TABLE (
    id int
)

INSERT @Objects (id)
SELECT id FROM sysobjects
WHERE name like @BaseObject

WHILE (@@ROWCOUNT > 0)
BEGIN
    INSERT @Objects (id)
    SELECT d.depid
    FROM sysdepends d
    WHERE d.id IN (SELECT id FROM @Objects)
    AND d.depid NOT IN (SELECT id FROM @Objects)
END

SET NOCOUNT OFF

SELECT convert(varchar(100),
        '[' + oo.name + '].[' + o.name + ']') AS '--Object--'
FROM sysobjects o 
INNER JOIN sysusers oo ON o.uid = oo.uid
WHERE o.id IN (SELECT id FROM @Objects)
ORDER BY oo.name, o.name

答案 1 :(得分:1)

在SQL Server 2008中,引入了两个新的动态管理功能来跟踪对象依赖性:sys.dm_sql_referenced_entitiessys.dm_sql_referencing_entities

1 /返回引用给定实体的实体:

SELECT
        referencing_schema_name, referencing_entity_name, 
        referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('<TableName>', 'OBJECT')

2 /返回对象引用的实体:

SELECT
        referenced_schema_name, referenced_entity_name, referenced_minor_name, 
        referenced_class_desc, is_caller_dependent, is_ambiguous
FROM sys.dm_sql_referenced_entities ('<StoredProcedureName>', 'OBJECT');

另一种选择是使用Red Gate中名为SQL Dependency Tracker的非常有用的工具。