sys.dm_sql_referencing_entities (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例

针对当前数据库中按名称引用另一个用户定义实体的每个实体均返回一行。 当一个称为“被引用的实体”的实体按名称显示在另一个称为“引用实体”的实体的持久化 SQL 表达式中时,将创建这两个实体之间的依赖关系。 例如,如果将某个用户定义类型 (UDT) 指定为被引用的实体,则此函数将返回在其定义中按名称引用该类型的每个用户定义实体。 该函数不会返回其他数据库中可能引用该指定实体的实体。 必须在 master 数据库的上下文中执行该函数,以便将服务器级 DDL 触发器作为引用实体返回。

可以使用此动态管理函数来报告当前数据库中引用指定实体的以下类型实体:

  • 绑定到架构或非绑定到架构的实体

  • 数据库级 DDL 触发器

  • 服务器级 DDL 触发器

适用于:SQL Server (SQL Server 2008 (10.0.x) 及更高版本),SQL 数据库。

Transact-SQL 语法约定

语法

sys.dm_sql_referencing_entities (  
    ' schema_name.referenced_entity_name ' , ' <referenced_class> ' )  
  
<referenced_class> ::=  
{  
    OBJECT  
  | TYPE  
  | XML_SCHEMA_COLLECTION  
  | PARTITION_FUNCTION  
}  

参数

schema_name.referenced_entity_name 被引用实体的名称。

schema_name 是必需的,除非引用的类PARTITION_FUNCTION。

schema_name.referenced_entity_namenvarchar(517)。

<referenced_class> ::= { OBJECT | TYPE | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION } 被引用实体的类。 每个语句只能指定一个类。

<referenced_class>nvarchar(60)。

返回的表

列名称 数据类型 描述
referencing_schema_name sysname 引用实体所属的架构。 可以为 Null。

对于数据库级和服务器级 DDL 触发器,为 NULL。
referencing_entity_name sysname 引用实体的名称。 不可为 null。
referencing_id int 引用实体的 ID。 不可为 null。
referencing_class tinyint 引用实体的类。 不可为 null。

1 = 对象

12 = 数据库级 DDL 触发器

13 = 服务器级 DDL 触发器
referencing_class_desc nvarchar(60) 引用实体类的说明。

OBJECT

DATABASE_DDL_TRIGGER

SERVER_DDL_TRIGGER
is_caller_dependent bit 指示被引用的实体的 ID 解析发生在运行时,因为它依赖于调用方的架构。

1 = 引用实体可能会引用该实体,但是,被引用的实体的 ID 解析依赖于调用方,因此不能确定此解析。 仅对于非绑定到架构的引用且被引用对象为存储过程、扩展存储过程或在 EXECUTE 语句中调用的用户定义函数时,才会出现这种情况。

0 = 被引用的实体不依赖于调用方。

异常

在满足以下任一条件时将返回空的结果集:

  • 指定了系统对象。

  • 当前数据库中不存在指定的实体。

  • 指定的实体不引用任何实体。

  • 传递了无效参数。

当指定的被引用的实体是带编号的存储过程时,将返回错误。

注解

下表列出了为其创建和维护依赖关系信息的实体类型。 不为规则、默认值、临时表、临时存储过程或系统对象创建或维护依赖关系信息。

实体类型 引用实体 被引用的实体
是*
查看​
Transact-SQL 存储过程**
CLR 存储过程
Transact-SQL 用户定义函数
CLR 用户定义函数
CLR 触发器(DML 和 DDL)
Transact-SQL DML 触发器
Transact-SQL 数据库级 DDL 触发器
Transact-SQL 服务器级 DDL 触发器
扩展的存储过程
队列
同义词
类型(别名和 CLR 用户定义类型)
XML 架构集合
分区函数

* 仅当表在计算列定义、CHECK 约束或 DEFAULT 约束中引用 Transact-SQL 模块、用户定义类型或 XML 架构集合时,才会将该表作为引用实体进行跟踪。

** 整数值大于 1 的带编号的存储过程将不会作为引用实体或被引用的实体进行跟踪。

权限

SQL Server 2008 (10.0.x) - SQL Server 2012 (11.x)

  • 需要对引用对象拥有 CONTROL 权限。 当被引用的实体是分区函数时,要求对数据库拥有 CONTROL 权限。

  • 需要对sys.dm_sql_referencing_entities具有 SELECT 权限。 默认情况下,SELECT 权限授予 public。

SQL Server 2014 (12.x) 及更高版本

  • 不需要对引用对象拥有任何权限。 如果用户只对某些引用实体拥有 VIEW DEFINITION 权限,可能返回部分结果。

  • 当引用实体为对象时,要求对对象拥有 VIEW DEFINITION 权限。

  • 当引用实体为数据库级 DDL 触发器时,要求对数据库拥有 VIEW DEFINITION 权限。

  • 当引用实体为服务器级 DDL 触发器时,要求对服务器拥有 VIEW ANY DEFINITION 权限。

示例

A. 返回引用给定实体的实体

下面的示例返回当前数据库中引用指定表的实体。

USE AdventureWorks2022;  
GO  
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent  
FROM sys.dm_sql_referencing_entities ('Production.Product', 'OBJECT');  
GO  

B. 返回引用给定类型的实体

下面的示例返回引用别名类型 dbo.Flag 的实体。 结果集中显示了使用此类型的两个存储过程。 该 dbo.Flag 类型还用于表中多个列 HumanResources.Employee 的定义;但是,由于该类型不在计算列、CHECK 约束或表中 DEFAULT 约束的定义中,因此不会返回该表的 HumanResources.Employee 行。

USE AdventureWorks2022;  
GO  
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent  
FROM sys.dm_sql_referencing_entities ('dbo.Flag', 'TYPE');  
GO  

结果集如下。

referencing_schema_name referencing_entity_name   referencing_id referencing_class_desc is_caller_dependent  
----------------------- -------------------------  ------------- ---------------------- -------------------  
HumanResources          uspUpdateEmployeeHireInfo  1803153469    OBJECT_OR_COLUMN       0  
HumanResources          uspUpdateEmployeeLogin     1819153526    OBJECT_OR_COLUMN       0  
(2 row(s) affected)`  

另请参阅

sys.dm_sql_referenced_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL)