如何在SQL Server中查找表的所有依赖项

45

我有一个数据库,其中包含表、存储过程、视图和触发器的列表。但我希望有一条查询语句可以获取一个表的所有依赖项,包括引用父表的子表。

13个回答

90
以下是我们可以使用的检查依赖关系的方法:
方法1:使用 sp_depends
 sp_depends 'dbo.First'
 GO

方法2:使用information_schema.routines

 SELECT *
 FROM information_schema.routines ISR
 WHERE CHARINDEX('dbo.First', ISR.ROUTINE_DEFINITION) > 0
 GO

方法三:使用 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

25
请指定本文的来源,Mala先生:http://blog.sqlauthority.com/2010/02/04/sql-server-get-the-list-of-object-dependencies-sp_depends-and-information_schema-routines-and-sys-dm_sql_referencing_entities/ - user3104183
6
选项3更好,因为sp_depends在其文档中被标记为已过时。 - Tom W
2
当对象被重新创建时,sp_depends返回错误的结果。 - Juozas
sp_depends函数是否只返回存储过程的依赖关系? - Iman Bahrampour

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

你也可以使用sp_depends

EXEC sp_depends '<TableName>'

另一个选择是使用一种非常有用的工具,称为 SQL Dependency Tracker ,由Red Gate开发。


1
这是正确的答案。sp_depends在其文档中被注明为已弃用。 - Tom W
感谢您同时引用和被引用的依赖项变量。 - Jaans

12
除了其他答案中提到的方法(sp_depends系统存储过程、SQL Server动态管理函数),您还可以从SSMS查看SQL Server对象之间的依赖关系。
您可以使用SSMS中的查看依赖项选项。从对象资源管理器窗格中,右键单击对象,从上下文菜单中选择查看依赖项选项。
我个人更喜欢一个第三方依赖项查看器ApexSQL Search。它是一个免费的附加组件,集成到SSMS和Visual Studio中,用于SQL对象和数据文本搜索、扩展属性管理、安全对象重命名和关系可视化。

依赖关系查看器已经在 ApexSQL Search 中被弃用。https://blog.apexsql.com/visual-dependency-viewer-feature-deprecated-in-apexsql-search-2018/ - emragins

11
找到所有的外键
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]

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]

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'

一种查找引用特定对象(或任何给定文本)名称的视图/函数/触发器/过程的方法是:
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%'

3

方法 1:使用 sp_depends

 sp_depends 'dbo.First'
 GO

方法二:使用sys.procedures来查询存储过程
select Name from sys.procedures where OBJECT_DEFINITION(OBJECT_ID) like '%Any Keyword Name%'

'

'% 任何关键字名称 %' 是您正在寻找的搜索关键字

方法3:使用sys.views进行视图

'
select Name from sys.views where OBJECT_DEFINITION(OBJECT_ID) like '%Any Keyword Name%'

'

'% 任何关键词名称 %'是您正在寻找的搜索关键字

'

1
sp_depends 在其文档中被标注为已废弃。@Mihai Bejenariu 的回答是更好的选择,以确保未来兼容性。 - Tom W

3
下面的SQL列出了所有数据库和服务器上的对象依赖关系:
IF(OBJECT_ID('tempdb..#Obj_Dep_Details') IS NOT NULL)
BEGIN
    DROP TABLE #Obj_Dep_Details
END
CREATE TABLE #Obj_Dep_Details
(
   [Database]               nvarchar(128)
  ,[Schema]                 nvarchar(128)
  ,dependent_object         nvarchar(128)
  ,dependent_object_type    nvarchar(60)
  ,referenced_server_name   nvarchar(128)
  ,referenced_database_name nvarchar(128)
  ,referenced_schema_name   nvarchar(128)
  ,referenced_entity_name   nvarchar(128)
  ,referenced_id            int
  ,referenced_object_db     nvarchar(128)
  ,referenced_object_type   nvarchar(60)
  ,referencing_id           int
  ,SchemaDep                nvarchar(128)
)
EXEC sp_MSForEachDB @command1='USE [?];
INSERT INTO #Obj_Dep_Details
SELECT DISTINCT
       DB_NAME()                          AS [Database]
      ,SCHEMA_NAME(od.[schema_id])        AS [Schema]
      ,OBJECT_NAME(d1.referencing_id)     AS dependent_object
      ,od.[type_desc]                     AS dependent_object_type
      ,COALESCE(d1.referenced_server_name, @@SERVERNAME)                AS referenced_server_name
      ,COALESCE(d1.referenced_database_name, DB_NAME())                 AS referenced_database_name
      ,COALESCE(d1.referenced_schema_name, SCHEMA_NAME(ro.[schema_id])) AS referenced_schema_name
      ,d1.referenced_entity_name
      ,d1.referenced_id
      ,DB_NAME(ro.parent_object_id)        AS referenced_object_db
      ,ro.[type_desc]                      AS referenced_object_type
      ,d1.referencing_id
      ,SCHEMA_NAME(od.[schema_id])         AS SchemaDep
  FROM sys.sql_expression_dependencies d1
  LEFT OUTER JOIN sys.all_objects od
    ON d1.referencing_id = od.[object_id]
  LEFT OUTER JOIN sys.objects ro
    ON d1.referenced_id = ro.[object_id]'

SELECT [Database]                                       AS [Dep_Object_DB]
      ,[Schema]                                         AS [Dep_Object_Schema]
      ,dependent_object                                 AS [Dep_Object_Name]
      ,LOWER(REPLACE(dependent_object_type, '_', ' '))  AS [Dep_Object_Type]
      ,referenced_server_name                           AS [Ref_Object_Server_Name]
      ,referenced_database_name                         AS [Ref_Object_DB]
      ,referenced_schema_name                           AS [Ref_Object_Schema]
      ,referenced_entity_name                           AS [Ref_Object_Name]
      ,referenced_id                                    AS [Ref_Object_ID]
      ,LOWER(REPLACE(referenced_object_type, '_', ' ')) AS [Ref_Object_Type]
      ,referencing_id                                   AS [Dep_Object_ID]
  FROM #Obj_Dep_Details WITH(NOLOCK)
 WHERE referenced_entity_name = 'TableName'
ORDER BY [Dep_Object_DB]
        ,[Dep_Object_Name]
        ,[Ref_Object_Name]
        ,[Ref_Object_DB]

表名 依赖关系


这是一个非常棒的脚本!喜欢它! - Monic

2
你可以使用一个名为Advanced SQL Server Dependencies的免费工具。 http://advancedsqlserverdependencies.codeplex.com/ 它支持所有数据库对象(表、视图等),并且可以跨多个数据库查找依赖关系(在同义词的情况下)。

1

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