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)

相关推荐
敲敲敲-敲代码1 天前
【SQL实验】高级查询(三)含附加数据库操作
数据库·sql·sqlserver
敲敲敲-敲代码1 天前
【SQL实验】更新操作
数据库·笔记·sql·学习·sqlserver
geovindu1 天前
string split function in postgreSQL 17.01 or SQL Server2019 or mySQL 9.0
数据库·sql·mysql·postgresql·sqlserver
qtvb19872 天前
Sql server 备份还原方法
数据库·sqlserver
威哥爱编程5 天前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
woshilys5 天前
sql server 文件和文件组介绍
sqlserver
CodeCraft Studio7 天前
【实用技能】在 SQL Server 中使用 LIMIT 子句的替代方案
数据库·sql·sqlserver
我是苏苏7 天前
数据库的使用02:SQLServer的连接字符串、备份、还原、SQL监视相关设置
数据库·sqlserver
小蜗的房子7 天前
SQL Server 2022安装要求(硬件、软件、操作系统等)
运维·windows·sql·学习·microsoft·sqlserver·操作系统
敲敲敲-敲代码10 天前
【SQL实验】高级查询(包含导入ACCESS数据的详细操作)
数据库·sql·学习·sqlserver