SQLServer查看存储过程的依赖关系

1、本文内容

开始之前

如何查看存储过程的依赖关系

另请参阅

适用于:

  • SQL Server
  • Azure SQL 数据库 不支持。
  • Azure Synapse Analytics
  • 分析平台系统 (PDW)

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中查看存储过程依赖项。

  • 准备工作:限制和局限、安全性

  • 若要查看过程的依赖关系,请使用: SQL Server Management Studio、Transact-SQL

2、开始之前

限制和局限

安全性

权限

系统函数: sys.dm_sql_referencing_entities

要求对被引用的实体拥有 CONTROL 权限,并且对 sys.dm_sql_referencing_entities 拥有 SELECT 权限。 当被引用的实体是分区函数时,要求对数据库拥有 CONTROL 权限。 默认情况下,SELECT 权限授予 public。

系统函数: sys.dm_sql_referenced_entities

要求对 sys.dm_sql_referenced_entities 拥有 SELECT 权限并对引用实体拥有 VIEW DEFINITION 权限。 默认情况下,SELECT 权限授予 public。 要求对数据库拥有 VIEW DEFINITION 权限或 ALTER DATABASE DDL TRIGGER 权限(当引用实体为数据库级 DDL 触发器时)。 当引用实体为服务器级 DDL 触发器时,要求对服务器拥有 VIEW ANY DEFINITION 权限。

对象目录视图: sys.sql_expression_dependencies

要求对数据库具有 VIEW DEFINITION 权限,并对数据库的 sys.sql_expression_dependencies 具有 SELECT 权限。 默认情况下,SELECT 权限仅授予 db_owner 固定数据库角色的成员。 将 SELECT 和 VIEW DEFINITION 权限授予其他用户时,被授权者可以查看数据库中的所有依赖关系。

3、如何查看存储过程的依赖关系

您可以使用以下项之一:

  • SQL Server Management Studio

  • Transact-SQL

3.1、 SQL Server Management Studio

在对象资源管理器中查看过程的依赖关系

  1. 在对象资源管理器中,连接到 数据库引擎 的实例,然后展开该实例。

  2. 展开 "数据库" 、过程所属的数据库以及 "可编程性" 。

  3. 展开"存储过程",右键单击此过程,再单击"查看依赖关系"。

  4. 查看依赖于过程的对象的列表。

  5. 查看过程所依赖的对象的列表。

  6. 单击"确定"。

3.2、"使用 Transact-SQL"

本文中的 Transact-SQL 代码示例使用 AdventureWorks2022 或 AdventureWorksDW2022 示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。

在查询编辑器中查看过程的依赖关系

系统函数: sys.dm_sql_referencing_entities

此函数用于显示依赖于过程的对象。

  1. 在 "对象资源管理器" 中,连接到 数据库引擎 的实例,然后展开该实例。

  2. 展开 "数据库" ,然后展开过程所属的数据库。

  3. 在 "文件" 菜单下,单击 "新建查询" 。

  4. 复制以下示例并将其粘贴到查询编辑器中。 第一个示例创建 uspVendorAllInfo 过程,该过程返回 Adventure Works Cycles 数据库中所有供应商的名称、所提供的产品、信用等级以及可用性。

sql 复制代码
USE AdventureWorks2022;  
GO  

IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL   
    DROP PROCEDURE Purchasing.uspVendorAllInfo;  
GO  

CREATE PROCEDURE Purchasing.uspVendorAllInfo  
WITH EXECUTE AS CALLER  
AS  
    SET NOCOUNT ON;  
    SELECT v.Name AS Vendor, p.Name AS 'Product name',   
      v.CreditRating AS 'Rating',   
      v.ActiveFlag AS Availability  
    FROM Purchasing.Vendor v   
    INNER JOIN Purchasing.ProductVendor pv  
      ON v.BusinessEntityID = pv.BusinessEntityID   
    INNER JOIN Production.Product p  
      ON pv.ProductID = p.ProductID   
    ORDER BY v.Name ASC;  
GO  
  1. 创建该过程后,第二个示例使用 sys.dm_sql_referencing_entities 函数来显示依赖于该过程的对象。
sql 复制代码
USE AdventureWorks2022;  
GO  

SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent  
FROM sys.dm_sql_referencing_entities ('Purchasing.uspVendorAllInfo', 'OBJECT');   
GO  

3.3、系统函数: sys.dm_sql_referenced_entities

此函数用于显示过程所依赖的对象。

  1. 在 "对象资源管理器" 中,连接到 数据库引擎 的实例,然后展开该实例。

  2. 展开 "数据库" ,然后展开过程所属的数据库。

  3. 在 "文件" 菜单下,单击 "新建查询" 。

  4. 复制以下示例并将其粘贴到查询编辑器中。 第一个示例创建 uspVendorAllInfo 过程,该过程返回 Adventure Works Cycles 数据库中所有供应商的名称、所提供的产品、信用等级以及可用性。

sql 复制代码
USE AdventureWorks2022;  
GO  

IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL   
    DROP PROCEDURE Purchasing.uspVendorAllInfo;  
GO  

CREATE PROCEDURE Purchasing.uspVendorAllInfo  
WITH EXECUTE AS CALLER  
AS  
    SET NOCOUNT ON;  
    SELECT v.Name AS Vendor, p.Name AS 'Product name',   
      v.CreditRating AS 'Rating',   
      v.ActiveFlag AS Availability  
    FROM Purchasing.Vendor v   
    INNER JOIN Purchasing.ProductVendor pv  
      ON v.BusinessEntityID = pv.BusinessEntityID   
    INNER JOIN Production.Product p  
      ON pv.ProductID = p.ProductID   
    ORDER BY v.Name ASC;  
GO  
  1. 创建该过程后,第二个示例使用 sys.dm_sql_referenced_entities 函数来显示该过程依赖的对象。
sql 复制代码
USE AdventureWorks2022;  
GO  

SELECT referenced_schema_name, referenced_entity_name,  
referenced_minor_name,referenced_minor_id, referenced_class_desc,  
is_caller_dependent, is_ambiguous  
FROM sys.dm_sql_referenced_entities ('Purchasing.uspVendorAllInfo', 'OBJECT');  
GO 

3.4、对象目录视图: sys.sql_expression_dependencies

此视图可以用于显示过程所依赖的对象或依赖于过程的对象。

显示依赖于过程的对象。

  1. 在 "对象资源管理器" 中,连接到 数据库引擎 的实例,然后展开该实例。

  2. 展开 "数据库" ,然后展开过程所属的数据库。

  3. 在 "文件" 菜单下,单击 "新建查询" 。

  4. 复制以下示例并将其粘贴到查询编辑器中。 第一个示例创建 uspVendorAllInfo 过程,该过程返回 Adventure Works Cycles 数据库中所有供应商的名称、所提供的产品、信用等级以及可用性。

sql 复制代码
USE AdventureWorks2022;  
GO  

IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL   
    DROP PROCEDURE Purchasing.uspVendorAllInfo;  
GO  

CREATE PROCEDURE Purchasing.uspVendorAllInfo  
WITH EXECUTE AS CALLER  
AS  
    SET NOCOUNT ON;  
    SELECT v.Name AS Vendor, p.Name AS 'Product name',   
      v.CreditRating AS 'Rating',   
      v.ActiveFlag AS Availability  
    FROM Purchasing.Vendor v   
    INNER JOIN Purchasing.ProductVendor pv  
      ON v.BusinessEntityID = pv.BusinessEntityID   
    INNER JOIN Production.Product p  
      ON pv.ProductID = p.ProductID   
    ORDER BY v.Name ASC;  
GO  
  1. 创建该过程后,第二个示例使用 sys.sql_expression_dependencies 视图来显示依赖于该过程的对象。
sql 复制代码
USE AdventureWorks2022;  
GO  

SELECT OBJECT_SCHEMA_NAME ( referencing_id ) AS referencing_schema_name,  
    OBJECT_NAME(referencing_id) AS referencing_entity_name,   
    o.type_desc AS referencing_desciption,   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,   
    referencing_class_desc, referenced_class_desc,  
    referenced_server_name, referenced_database_name, referenced_schema_name,  
    referenced_entity_name,   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,  
    is_caller_dependent, is_ambiguous  
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N'Purchasing.uspVendorAllInfo')  
GO  

3.5、显示过程所依赖的对象。

  1. 在 "对象资源管理器" 中,连接到 数据库引擎 的实例,然后展开该实例。

  2. 展开 "数据库" ,然后展开过程所属的数据库。

  3. 在 "文件" 菜单下,单击 "新建查询" 。

  4. 复制以下示例并将其粘贴到查询编辑器中。 第一个示例创建 uspVendorAllInfo 过程,该过程返回 Adventure Works Cycles 数据库中所有供应商的名称、所提供的产品、信用等级以及可用性。

sql 复制代码
USE AdventureWorks2022;  
GO  

IF OBJECT_ID ( 'Purchasing.uspVendorAllInfo', 'P' ) IS NOT NULL   
    DROP PROCEDURE Purchasing.uspVendorAllInfo;  
GO  

CREATE PROCEDURE Purchasing.uspVendorAllInfo  
WITH EXECUTE AS CALLER  
AS  
    SET NOCOUNT ON;  
    SELECT v.Name AS Vendor, p.Name AS 'Product name',   
      v.CreditRating AS 'Rating',   
      v.ActiveFlag AS Availability  
    FROM Purchasing.Vendor v   
    INNER JOIN Purchasing.ProductVendor pv  
      ON v.BusinessEntityID = pv.BusinessEntityID   
    INNER JOIN Production.Product p  
      ON pv.ProductID = p.ProductID   
    ORDER BY v.Name ASC;  
GO  
  1. 创建该过程后,第二个示例使用 sys.sql_expression_dependencies 视图来显示该过程依赖的对象。
sql 复制代码
USE AdventureWorks2022;  
GO  

SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name,   
    o.type_desc AS referencing_desciption,   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,   
    referencing_class_desc, referenced_class_desc,  
    referenced_server_name, referenced_database_name, referenced_schema_name,  
    referenced_entity_name,   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,  
    is_caller_dependent, is_ambiguous  
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referencing_id = OBJECT_ID(N'Purchasing.uspVendorAllInfo');  
GO  

4、另请参阅

重命名存储过程

sys.dm_sql_referencing_entities (Transact-SQL)

sys.dm_sql_referenced_entities (Transact-SQL)

sys.sql_expression_dependencies (Transact-SQL)

相关推荐
雁凡彡2 天前
mybatis-plus中sqlserver 查询数组中指定位置前的数据
数据库·sqlserver·mybatis
dishugj3 天前
[SQLSERVER] Lock Waits/sec参数含义详解
数据库·oracle·sqlserver
l1t6 天前
使用docker安装sql server linux版
linux·sql·docker·容器·sqlserver
杨云龙UP7 天前
Windows环境下安装SQL Server 2016企业版+SP3补丁+SSMS连接操作手册_20251230
运维·服务器·数据库·sql·算法·sqlserver·哈希算法
杨云龙UP8 天前
SQL Server定时自动备份配置:使用SSMS维护计划向导配置数据库每日自动备份_20260101
运维·服务器·数据库·sql·sqlserver·桌面
牛魔王_111 天前
SqlServer 大数据量分页查询
数据库·sqlserver·分页·查询·翻页
banpu12 天前
Spring相关
数据库·spring·sqlserver
野猪佩挤14 天前
k8s+Flink断点续传(MySQL同步Starrocks)
sqlserver·flink·kubernetes
航Hang*15 天前
第3章:复习篇——第5-2节:数据库编程2
数据库·笔记·sql·mysql·sqlserver
航Hang*15 天前
第3章:复习篇——第5-1节:数据库编程1
数据库·笔记·sql·mysql·sqlserver