如何在sql server中查找表的所有依赖项

Axs*_*Axs 29 sql-server

我有一个数据库,其中包含表,过程,视图和触发器的列表.但我想要一个查询来获取一个表的所有依赖项,包括引用父表的子表.

小智 58

以下是可以检查依赖关系的方法

方法1:使用sp_depends

 sp_depends 'dbo.First'
 GO
Run Code Online (Sandbox Code Playgroud)

方法2:使用information_schema.routines

 SELECT *
 FROM information_schema.routines ISR
 WHERE CHARINDEX('dbo.First', ISR.ROUTINE_DEFINITION) > 0
 GO
Run Code Online (Sandbox Code Playgroud)

方法3:使用DMV sys.dm_sql_referencing_entities

 SELECT referencing_schema_name, referencing_entity_name,
 referencing_id, referencing_class_desc, is_caller_dependent
 FROM sys.dm_sql_referencing_entities ('dbo.First', 'OBJECT');
 GO
Run Code Online (Sandbox Code Playgroud)

  • 让我们指出本文的来源,Mala先生:http://blog.sqlauthority.com/2010/02/04/sql-server-get-the-list-of-object-dependencies-sp_depends-and-information_schema-例程和-SYS-dm_sql_referencing_entities / (13认同)
  • 选项3是更好的选项,因为`sp_depends`在其文档中被注释为不推荐使用. (3认同)
  • 重新创建对象时 sp_depends 返回错误结果 (2认同)

小智 10

除了其他答案中描述的方法(sp_depends系统存储过程,SQL Server动态管理功能),您还可以查看SQL Server对象之间的依赖关系 - 来自SSMS.

您可以使用SSMS中的View Dependencies选项.在" 对象资源管理器"窗格中,右键单击该对象,然后从上下文菜单中选择" 查看依赖项"选项

我自己更喜欢名为ApexSQL Search的第三方依赖查看器.它是一个免费的插件,集成到SSMS和Visual Studio中,用于SQL对象和数据文本搜索,扩展属性管理,安全对象重命名和关系可视化.


Mih*_*riu 9

在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')
Run Code Online (Sandbox Code Playgroud)

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');
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用sp_depends:

EXEC sp_depends '<TableName>'
Run Code Online (Sandbox Code Playgroud)

另一个选择是使用一个非常有用的工具,名为Red Gate的SQL Dependency Tracker.


小智 8

查找所有外键

SELECT src.name, srcCol.name, dst.name, dstCol.name
FROM sys.foreign_key_columns fk
    INNER JOIN sys.columns srcCol ON fk.parent_column_id = srcCol.[column_id] 
        AND fk.parent_object_id = srcCol.[object_id]
    INNER JOIN sys.tables src ON src.[object_id] = fk.parent_object_id
    INNER JOIN sys.tables dst ON dst.[object_id] = fk.[referenced_object_id]
    INNER JOIN sys.columns dstCol ON fk.referenced_column_id = dstCol.[column_id] 
        AND fk.[referenced_object_id] = dstCol.[object_id]
Run Code Online (Sandbox Code Playgroud)


Leo*_*ick 6

查询sysdepends表:

SELECT distinct schema_name(dependentObject.uid) as schema, 
       dependentObject.*
 FROM sysdepends d 
INNER JOIN sysobjects o on d.id = o.id 
INNER JOIN sysobjects dependentObject on d.depid = dependentObject.id
WHERE o.name = 'TableName'
Run Code Online (Sandbox Code Playgroud)

仅查看通过名称引用对象(或任何给定文本)的视图/函数/触发器/过程的方法是:

SELECT distinct schema_name(so.uid) + '.' + so.name 
  FROM syscomments sc 
 INNER JOIN  sysobjects so on sc.id = so.id 
 WHERE sc.text like '%Name%'
Run Code Online (Sandbox Code Playgroud)


Adi*_*dge 6

在 SQL Server 2008 或更高版本中,我使用以下查询来查找给定表的所有依赖存储过程、用户定义函数、触发器等:

SELECT 
coalesce(Referenced_server_name+'.','')+ --possible server name if cross-server
coalesce(referenced_database_name+'.','')+ --possible database name if cross-database
coalesce(referenced_schema_name+'.','')+ --likely schema name
coalesce(referenced_entity_name,'') + --very likely entity name
coalesce('.'+col_name(referenced_ID,referenced_minor_id),'')AS [referencing],
coalesce(object_schema_name(Referencing_ID)+'.','')+ --likely schema name
object_name(Referencing_ID)+ --definite entity name
coalesce('.'+col_name(referencing_ID,referencing_minor_id),'') AS [referenced]
FROM sys.sql_expression_dependencies
WHERE referenced_id =object_id('Table_name')
ORDER BY [referenced]
Run Code Online (Sandbox Code Playgroud)