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)

相关推荐
吃饭最爱5 天前
JUnit技术的核心和用法
数据库·oracle·sqlserver
tanxinji5 天前
SQLServer死锁监测方案:如何使用XE.Core解析xel文件里包含死锁扩展事件的死锁xml
sqlserver·死锁·扩展事件
代码的余温7 天前
SQL Server全链路安全防护
数据库·安全·sqlserver
张人玉7 天前
SQLSERVER数据备份
数据库·oracle·sqlserver
我想起个名字9 天前
sqlserver2008导入excel表数据遇到的问题
sqlserver·excel
浊尘9 天前
SQL server实现异地增量备份和全量备份
数据库·sqlserver
代码的余温9 天前
SQL Server服务管理
数据库·sqlserver
代码的余温9 天前
解析SQL Server核心服务与功能
数据库·sqlserver
YoungUpUp10 天前
【SQL Server 2022】保姆级SQL Server 详细图文下载安装教程
数据库·sql·sqlserver·sql server·sql server数据库·sql server 2022·sql 数据库
代码的余温10 天前
SQL Server核心架构深度解析
数据库·sqlserver·架构