sys.dm_sql_referencing_entities (Transact-SQL)

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

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

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

  • 数据库级 DDL 触发器

  • 服务器级 DDL 触发器

主题链接图标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_name 的数据类型为 nvarchar(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 依赖关系

权限

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

示例

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

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

USE AdventureWorks;
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 的实体。结果集中显示了使用此类型的两个存储过程。在 HumanResources.Employee 表中的若干列的定义中也使用了 dbo.Flag 类型;但是,因为该类型没有包含在表中的计算列、CHECK 约束或 DEFAULT 约束的定义中,所以不会返回 HumanResources.Employee 表的任何行。

USE AdventureWorks;
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)

更改历史记录

更新的内容

从“备注”部分中删除了“不为 CLR 表值函数跟踪列依赖关系”这句话。

更正了 referenced_entity_name 参数的数据类型。