代码之家  ›  专栏  ›  技术社区  ›  Carlos

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

  •  1
  • Carlos  · 技术社区  · 16 年前

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

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

    2 回复  |  直到 12 年前
        1
  •  1
  •   Jonathan    16 年前
    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
    
        2
  •  1
  •   bjnr    12 年前

    在SQL Server 2008中,引入了两个新的动态管理函数来跟踪对象依赖性: sys.dm_sql_referenced_entities 和 sys.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');
    

    另一个选择是使用一个非常有用的工具 SQL Dependency Tracker 来自红门。