Представление каталога sys.sql_expression_dependencies (Transact-SQL)
Содержит по одной строке для каждой именованной зависимости определяемой пользователем сущности в текущей базе данных. Зависимость между двумя сущностями создается, когда имя некоторой сущности, называемой упоминаемой, встречается в составе постоянного выражения языка SQL другой сущности, называемой ссылающейся. Например, если на таблицу ссылается определение представления, это представление, как ссылающаяся сущность, зависит от таблицы или упоминаемой сущности. При удалении таблицы представление становится непригодным для использования.
Это представление каталога можно использовать для получения сведений о зависимостях по следующим сущностям:
привязанные к схеме сущности;
сущности без привязки к схеме;
межбазовые и межсерверные сущности. Выводятся имена сущностей без идентификаторов;
зависимости на уровне столбцов в сущностях, привязанных к схеме. Зависимости на уровне столбцов для объектов, не привязанных к схеме, можно просмотреть в динамическом административном представлении sys.dm_sql_referenced_entities;
триггеры DDL на уровне сервера в контексте базы данных master.
Имя столбца |
Тип данных |
Описание |
---|---|---|
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 для ссылок в пределах базы данных, когда не удается определить идентификатор. Для ссылок, не привязанных к схеме, идентификатор не удается разрешить в следующих случаях.
Никогда не принимает значение 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_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
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_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
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
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)
Журнал изменений
Обновленное содержимое |
---|
Из раздела «Примечания» удалена фраза «Зависимости столбцов не отслеживаются для функций CLR с табличным значением». |