Представление каталога sys.sql_expression_dependencies (Transact-SQL)

Область применения: SQL Server Управляемый экземпляр SQL Azure конечную точку аналитики платформы Аналитики Azure Synapse Analytics (PDW) в хранилище Microsoft Fabricв Microsoft Fabric

Содержит по одной строке для каждой именованной зависимости определяемой пользователем сущности в текущей базе данных. Сюда входят зависимости между скомпилированных в собственном коде, скалярными пользовательскими функциями и другими модулями SQL Server. Зависимость между двумя сущностями создается, когда одна сущность, называемая указанной сущностью, отображается по имени в сохраняемом выражении SQL другой сущности, называемой сущностью ссылки. Например, если на таблицу ссылается определение представления, это представление, как ссылающаяся сущность, зависит от таблицы или упоминаемой сущности. При удалении таблицы представление становится непригодным для использования.

Дополнительные сведения см. в разделе Скалярные определяемые пользователем функции для выполняющейся в памяти OLTP.

Это представление каталога можно использовать для получения сведений о зависимостях по следующим сущностям:

  • привязанные к схеме сущности;

  • сущности без привязки к схеме;

  • межбазовые и межсерверные сущности. Указываются названия организаций; однако идентификаторы сущностей не разрешаются.

  • зависимости на уровне столбцов в сущностях, привязанных к схеме. Зависимости уровня столбца для объектов, не связанных с схемой, можно возвращать с помощью sys.dm_sql_referenced_entities.

  • DDL на уровне сервера срабатывает в контексте master базы данных.

Имя столбца Тип данных Description
referencing_id int Идентификатор ссылающейся сущности. Не допускает значения NULL.
referencing_minor_id int Идентификатор столбца, если ссылающаяся сущность является столбцом; в противном случае — 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 Идентификатор упоминаемой сущности. Значение этого столбца никогда NULL не относится к ссылкам, ограниченным схемой. Значение этого столбца всегда NULL относится к кросс-серверным и кросс-базам данных.

NULL для ссылок внутри базы данных, если идентификатор невозможно определить. Для ссылок, не связанных со схемой, ID нельзя разрешить в следующих случаях:

Ссылающаяся сущность не существует в базе данных.

Схема упоминаемой сущности зависит от схемы участника и разрешается во время выполнения. В этом случае параметр is_caller_dependent устанавливается в значение 1.
referenced_minor_id int Идентификатор ссылочного столбца в случае, если ссылающейся сущностью является столбец; в противном случае — 0. Не допускает значения NULL.

Упоминаемая сущность представляет собой столбец, если в ссылающейся сущности столбец определяется по имени или если в инструкции SELECT * используется родительская сущность.
is_caller_dependent bit Указывает, что привязка к схеме для упоминаемой сущности происходит во время выполнения, и поэтому разрешение идентификатора сущности зависит от схемы ссылающейся сущности. Это происходит, если упоминаемая сущность является хранимой процедурой, расширенной хранимой процедурой или определяемой пользователем функцией, не привязанной к схеме, вызываемой в инструкции EXECUTE.

1 = Ссылающаяся сущность зависит от вызывающего и разрешается во время выполнения. В данном случае referenced_id — NULL.

0 = Идентификатор сущности, на которую ссылается, не зависит от вызывающего.

Всегда имеет значение 0 для привязанных к схеме ссылок, а также для межбазовых и межсерверных ссылок, которые явно указывают имя схемы. Например, ссылка на сущность в формате EXEC MyDatabase.MySchema.MyProc не зависит от вызывающего. При этом ссылка в формате EXEC MyDatabase..MyProc зависит от вызывающего объекта.
is_ambiguous bit Указывает, что ссылка неоднозначна и может разрешиться во время выполнения с пользовательской функцией, пользовательским типом (UDT) или ссылкой на столбец типа xml в XQuery.

Например, предположим, что инструкция SELECT Sales.GetOrder() FROM Sales.MySales определена в хранимой процедуре. Пока сохранённая процедура не будет выполнена, неизвестно, является Sales.GetOrder() ли пользовательской функцией в Sales схеме или столбцем типа Sales UDT с методом под названием GetOrder().

1 = Ссылка неоднозначна.

0 = Ссылка однозначна или сущность может быть успешно связана при вызове представления.

Всегда принимает значение 0 для привязанных к схеме ссылок.

Замечания

В следующей таблице перечислены типы сущностей, для которых созданы и обновляются данные о зависимостях. Информация о зависимостях не создаётся и не поддерживается для правил, стандартов, временных таблиц, временных хранимых процедур или системных объектов.

Примечание.

Azure Synapse Analytics и Parallel Data Warehouse поддерживают таблицы, представления, отфильтрованные статистические данные и типы сущностей хранимых процедур Transact-SQL из этого списка. Сведения о зависимости создаются и поддерживаются только для таблиц, представлений и отфильтрованной статистики.

Тип объекта Ссылающаяся сущность Упоминаемая сущность
Таблица Да1 Да
Представления Да Да
Фильтруемый индекс Да2 No
Статистика фильтрации Да2 No
Transact-SQL сохранённая процедура3 Да Да
Хранимая процедура CLR No Да
Определяемая пользователем функция Transact-SQL Да Да
Определяемая пользователем функция CLR No Да
Триггер CLR (DML и DDL) No No
Триггер DML Transact-SQL Да No
Триггер DDL уровня базы данных Transact-SQL Да No
Триггер DDL уровня Transact-SQL Да No
Расширенные хранимые процедуры No Да
Queue No Да
Синоним No Да
Тип (псевдоним и определяемый пользователем тип данных CLR) No Да
Коллекция схем XML No Да
Функция секционирования No Да

1 Таблица отслеживается как сущность ссылки только тогда, когда она ссылается на Transact-SQL-модуль, пользовательский тип или коллекцию схем XML в определении вычисленного столбца, ограничения CHECK или DEFAULT ограничений.

2 Каждый столбец, используемый в предикате фильтра, отслеживается как сущность ссылок.

3 Нумерованные хранящиеся процедуры с целочисленным значением больше 1 не отслеживаются ни как ссылочные, ни как ссылочные сущности.

Разрешения

Требуется VIEW разрешение DEFINITION для базы данных и разрешение SELECT sys.sql_expression_dependencies для базы данных. По умолчанию разрешение SELECT предоставляется только членам предопределенной роли базы данных db_owner . Когда разрешения SELECT и VIEW DEFINITION предоставляются другому пользователю, участник может просматривать все зависимости в базе данных.

Примеры

А. Возвращать сущности, на которые ссылается другой сущность.

В следующем примере возвращаются таблицы и столбцы, на которые ссылается представление 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');

В. Возврат зависимостей между базами данных

В следующем примере возвращаются все межбазовые зависимости. Вначале в примере создается база данных 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;