sys.sql_expression_dependencies (Transact-SQL)

适用于:SQL ServerAzureSQL Managed InstanceAzureSynapse AnalyticsSQLAnalytics endpoint in Microsoft FabricWarehouseinMicrosoft Fabric中的Microsoft FabricSQL数据库

当前数据库中用户定义实体的每个按名称依赖项在此表中均占一行。 这包括本机编译的标量用户定义函数和其他 SQL Server 模块之间的依赖关系。 当一个称为“被引用的实体”的实体按名称显示在另一个称为“引用实体”的实体的持久化 SQL 表达式中时,将创建这两个实体之间的依赖关系。 例如,在视图定义中引用表时,作为引用实体的视图将依赖于表这个被引用的实体。 如果删除该表,则该视图不可用。

有关详细信息,请参阅内存中 OLTP 的标量用户定义函数。

您可以使用此目录视图来报告以下实体的依赖关系信息:

  • 绑定到架构的实体。

  • 非绑定到架构的实体。

  • 跨数据库和跨服务器的实体。 实体名称会被报告;但实体ID尚未解决。

  • 绑定到架构的实体的列级依赖关系。 可以使用 sys.dm_sql_referenced_entities 返回非绑定到架构的对象的列级依赖关系。

  • 服务器级DDL在数据库上下文 master 中触发。

列名称 数据类型 说明
referencing_id int 引用实体的 ID。 不可为 null。
referencing_minor_id int 引用实体为列时的列 ID;否则为 0。 不可为 null。
referencing_class tinyint 引用实体的类。

1 = 对象或列
12 = 数据库DDL触发器
13 = 服务器DDL触发器

不可为 null。
referencing_class_desc nvarchar(60) 对引用实体的类的说明。

OBJECT_OR_COLUMN
DATABASE_DDL_TRIGGER
SERVER_DDL_TRIGGER

不可为 null。
is_schema_bound_reference bit 1 = 被引用的实体是模式绑定的。
0 = 被引用的实体是非模式绑定的。

不可为 null。
referenced_class tinyint 被引用的实体的类。

1 = 对象或列
6 = 类型
7 = 索引
10 = XML 模式集合
21 = 配分函数

不可为 null。
referenced_class_desc nvarchar(60) 对被引用的实体的类的说明。

OBJECT_OR_COLUMN
TYPE
INDEX
XML_SCHEMA_COLLECTION
PARTITION_FUNCTION

不可为 null。
referenced_server_name sysname 被引用的实体的服务器的名称。

此列是为通过指定由四个部分组成的有效名称所生成的跨服务器依赖关系填充的。 有关多部分名称的信息,请参阅 Transact-SQL 语法约定。

NULL 对于非模式绑定实体,且该实体被引用时未指定四部分名称。

NULL 对于模式绑定实体,因为它们必须处于同一数据库中,因此只能使用两部分(schema.object)名称来定义。
referenced_database_name sysname 被引用的实体的数据库的名称。

此列是为通过指定由三个部分或四个部分组成的有效名称生成的跨数据库或跨服务器引用填充的。

NULL 对于非模式绑定的引用,当使用单部分或两部分名称指定时。

NULL 对于模式绑定实体,因为它们必须处于同一数据库中,因此只能通过两部分(模式)来定义。对象)名称。
referenced_schema_name sysname 被引用的实体所属的架构。

NULL 用于非模式绑定的引用,即在引用中实体未指定模式名称。

绝不用于 NULL 模式绑定的引用,因为模式绑定的实体必须使用两部分名称来定义和引用。
referenced_entity_name sysname 被引用的实体的名称。 不可为 null。
referenced_id int 被引用的实体的 ID。 该列的值绝不 NULL 用于模式绑定的引用。 该列的值始终 NULL 用于跨服务器和跨数据库引用。

NULL 如果无法确定ID,则用于数据库中的引用。 对于非模式绑定的引用,在以下情况下无法解析该 ID:

被引用的实体在数据库中不存在。

被引用的实体的架构依赖于调用方的架构,并在运行时解析。 在这种情况下,is_caller_dependent 设置为 1。
referenced_minor_id int 引用实体为列时被引用的列的 ID;否则为 0。 不可为 null。

当列在引用实体中按名称标识时,或者当 SELECT * 语句中使用了父实体时,被引用的实体为列。
is_caller_dependent bit 指示被引用的实体的架构绑定在运行时发生,因此,实体 ID 的解析依赖于调用方的架构。 当被引用的实体为存储过程、扩展存储过程或在 EXECUTE 语句中调用的非绑定到架构的用户定义函数时,将会出现这种情况。

1 = 被引用的实体依赖于调用者,并在运行时解析。 在这种情况下,referenced_id 是 NULL。

0 = 引用的实体ID不依赖于呼叫者。

对于绑定到架构的引用、显式指定架构名称的跨数据库和跨服务器的引用,始终为 0。 例如,格式 EXEC MyDatabase.MySchema.MyProc 中对实体的引用不依赖于呼叫者。 但是,格式为 EXEC MyDatabase..MyProc 的引用依赖调用方。
is_ambiguous bit 表示引用不明确,可在运行时解析为用户定义函数、用户定义类型(UDT)或 XQuery 引用的 XML 类型列。

例如,假定语句 SELECT Sales.GetOrder() FROM Sales.MySales 是在存储过程中定义的。 在存储过程执行之前,无法确定模式或列中是否 Sales.GetOrder() 是用户自定义函数 Sales ,类型为 Sales UDT,方法名为 GetOrder()。

1 = 参考文献含糊不清。

0 = 引用是明确的,或者在调用视图时可以成功绑定实体。

对于绑定到架构的引用始终为 0。

备注

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

注意

Azure Synapse Analytics 支持该列表中的表、视图、过滤统计以及 Transact-SQL 存储过程实体类型。 仅针对表、视图和筛选统计信息创建和维护依赖关系信息。

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

1 只有当表在计算列、CHECK约束 DEFAULT 或约束的定义中引用 Transact-SQL 模块、用户定义类型或XML模式集合时,才被追踪为引用实体。

2 过滤谓词中使用的每一列都作为引用实体被追踪。

3 整数值大于 1 的编号存储过程既不作为引用实体也不会被跟踪。

权限

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

示例

A. 被另一个实体引用的返回实体

下例返回在 Production.vProductAndDescription 视图中引用的表和列。 该视图依赖于 referenced_entity_name 和 referenced_column_name 列中返回的实体(表和列)。

USE AdventureWorks2022;
GO

SELECT
    OBJECT_NAME(referencing_id) AS referencing_entity_name,
    o.type_desc AS referencing_description,
    COALESCE (COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,
    referencing_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'Production.vProductAndDescription');

B. 引用另一个实体的返回实体

下面的示例返回引用表 Production.Product 的实体。 referencing_entity_name 列中返回的实体依赖于 Product 表。

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_description,
    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'Production.Product');

C. 返回跨数据库依赖

下面的示例返回所有跨数据库的依赖关系。 此示例首先创建数据库 db1 以及两个引用数据库 db2 和 db3 中的表的存储过程。 然后,对 sys.sql_expression_dependencies 表进行查询,以报告这两个过程和表之间的跨数据库依赖关系。 NULL由于过程定义中未指定该实体的模式名称,在被引用实体referenced_schema_name的列中返回t3。

CREATE DATABASE db1;
GO

USE db1;
GO

CREATE PROCEDURE p1 AS
SELECT * FROM db2.s1.t1;
GO

CREATE PROCEDURE p2 AS
UPDATE db3..t3
SET c1 = c1 + 1;
GO

SELECT
    OBJECT_NAME(referencing_id),
    referenced_database_name,
    referenced_schema_name,
    referenced_entity_name
FROM sys.sql_expression_dependencies
WHERE referenced_database_name IS NOT NULL;
GO

USE master;
GO

DROP DATABASE db1;