Поделиться через


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

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

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

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

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

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

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

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

Применимо для следующих объектов: SQL Server (начиная с SQL Server 2008 до текущей версии).

Имя столбца

Тип данных

Описание

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 = тип

10 = коллекция схем XML

21 = функция секционирования

Не допускает значения NULL.

referenced_class_desc

nvarchar(60)

Описание класса упоминаемой сущности.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION

Не допускает значения NULL.

referenced_server_name

sysname

Имя сервера упоминаемой сущности.

Этот столбец заполняется для межсерверных зависимостей, которые создаются путем задания допустимого четырехкомпонентного имени. Сведения о многокомпонентных именах см. в разделе Синтаксические обозначения в Transact-SQL (Transact-SQL).

Значение NULL для не привязанных к схеме сущностей, ссылка на которые осуществляется без указания четырехкомпонентного имени.

Имеет значение NULL для привязанных к схеме сущностей, поскольку они должны находиться в одной базе данных, и поэтому их можно определить только с использованием только двухкомпонентного имени (schema.object).

referenced_database_name

sysname

Имя базы данных упоминаемой сущности.

Этот столбец заполняется для межбазовых и межсерверных ссылок, которые задаются путем указания допустимого трехкомпонентного или четырехкомпонентного имени.

Имеет значение NULL для не привязанных к схеме ссылок, задаваемых с помощью однокомпонентного или двухкомпонентного имени.

Имеет значение NULL для привязанных к схеме сущностей, поскольку они должны находиться в одной базе данных, и поэтому их можно определить только с использованием только двухкомпонентного имени (schema.object).

referenced_schema_name

sysname

Схема, которой принадлежит упоминаемая сущность.

Имеет значение NULL для не привязанных к схеме ссылок, в которых сущность упоминается без указания имени схемы.

Никогда не имеет значение NULL для привязанных к схеме ссылок, поскольку привязанные к схеме сущности должны определяться двухкомпонентным именем и ссылаться с помощью двухкомпонентных ссылок.

referenced_entity_name

sysname

Имя упоминаемой сущности. Не допускает значения NULL.

referenced_id

int

Идентификатор упоминаемой сущности.

Всегда значение NULL для межсерверных и межбазовых ссылок.

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

  • Упоминаемая сущность не существует в базе данных.

  • Схема упоминаемой сущности зависит от схемы участника и разрешается во время выполнения. В этом случае параметру is_caller_dependent присваивается значение 1.

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

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

Указывает, что ссылка является неоднозначной и на этапе выполнения может разрешиться к определяемой пользователем функции, определяемому пользователем типу или ссылке XQuery на столбец типа xml.

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

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

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

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

Замечания

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

Тип сущности

Ссылающаяся сущность

Упоминаемая сущность

Таблица

Да*

Да

Представление

Да

Да

Фильтруемый индекс

Да**

Нет

Статистика фильтрации

Да**

Нет

Хранимая процедура Transact-SQL***

Да

Да

Хранимая процедура CLR

Нет

Да

Определяемая пользователем функция Transact-SQL

Да

Да

Определяемая пользователем функция CLR

Нет

Да

Триггер CLR (DML и DDL)

Нет

Нет

Триггер DML Transact-SQL

Да

Нет

Триггер DDL Transact-SQL уровня базы данных

Да

Нет

Триггер DDL Transact-SQL уровня сервера

Да

Нет

Расширенные хранимые процедуры

Нет

Да

Очередь

Нет

Да

Синоним

Нет

Да

Тип (псевдоним и определяемый пользователем тип данных CLR)

Нет

Да

Коллекция схем XML

Нет

Да

Функция секционирования

Нет

Да

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

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

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

Разрешения

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

Примеры

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

В следующем примере возвращаются таблицы и столбцы, на которые ссылается представление Production.vProductAndDescription. Это представление зависит от сущностей (таблиц и столбцов), возвращаемых в столбцах referenced_entity_name и referenced_column_name.

USE AdventureWorks2012;
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_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');
GO

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

В следующем примере возвращаются сущности, ссылающиеся на таблицу Production.Product. Сущности, возвращенные в столбце referencing_entity_name, зависят от таблицы Product.

USE AdventureWorks2012;
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'Production.Product');
GO

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

В следующем примере возвращаются все межбазовые зависимости. Вначале в примере создается база данных db1 и две хранимые процедуры, которые ссылаются на таблицы в базах данных db2 и db3. Затем запрашивается таблица sys.sql_expression_dependencies, чтобы сообщить о наличии межбазовых зависимостей между процедурами и таблицами. Обратите внимание, что в столбце referenced_schema_name для упоминаемой сущности t3 возвращается значение NULL, потому что для этой сущности в определении процедуры не указано имя схемы.

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;
GO

См. также

Справочник

Функция динамического управления sys.dm_sql_referenced_entities (Transact-SQL)

sys.dm_sql_referencing_entities (Transact-SQL)