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


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

Возвращает по одной строке для каждой определяемой пользователем сущности, на имя которой ссылается определение рассматриваемой сущности. Зависимость между двумя сущностями создается в тех случаях, когда имя некоторой пользовательской сущности, называемой упоминаемой, встречается в составе постоянного выражения SQL другой пользовательской сущности, называемой ссылающейся. Например, если в качестве ссылающейся сущности выступает хранимая процедура, то данная функция выводит список всех определяемых пользователем сущностей, упоминаемых в данной хранимой процедуре. К упоминаемым определяемым пользователем сущностям относятся: таблицы, представления, определяемые пользователем типы (UDT), а также другие хранимые процедуры.

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

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

  • несвязанные сущности;

  • межбазовые и межсерверные сущности;

  • зависимости уровня столбца, как связанные, так и не связанные со схемами;

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

  • коллекции XML-схем;

  • функции секционирования.

Синтаксис

sys.dm_sql_referenced_entities (
        ' [ schema_name. ] referencing_entity_name ' , ' <referencing_class> ' )

<referencing_class> ::=
{
    OBJECT
  | DATABASE_DDL_TRIGGER
  | SERVER_DDL_TRIGGER
}

Аргументы

  • [ schema_name. ] referencing_entity_name
    Имя ссылающейся сущности. Если ссылающаяся сущность принадлежит к классу объектов (OBJECT), то необходимо указывать аргумент schema_name.

    Аргумент schema_name.referencing_entity_name имеет тип nvarchar(517).

  • <referencing_class> ::= { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
    Класс заданной ссылающейся сущности. В одной инструкции может быть указан только один класс.

    Аргумент <referencing_class> имеет тип nvarchar(60).

Возвращенная таблица

Имя столбца

Тип данных

Описание

referencing_minor_id

int

Идентификатор столбца в случае, если ссылающейся сущностью является столбец, и 0 — в противном случае. Не может принимать значение NULL.

referenced_server_name

sysname

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

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

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

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

referenced_database_name

sysname

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

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

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

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

referenced_schema_name

sysname

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

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

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

referenced_entity_name

sysname

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

referenced_minor_name

sysname

Имя столбца, если упоминаемая сущность является столбцом. В противном случае — значение NULL. Например, параметр referenced_minor_name будет иметь значение NULL в строке, которая содержит саму упоминаемую сущность.

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

referenced_id

int

Идентификатор упоминаемой сущности. Если значение параметра referenced_minor_id отлично от 0, то величина referenced_id представляет сущность, определяющую столбец.

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

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

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

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

  • Разрешение имени зависит от вызывающего объекта. В этом случае параметр is_caller_dependent устанавливается в значение 1.

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

referenced_minor_id

int

Идентификатор столбца, если упоминаемая сущность является столбцом. В противном случае — значение 0. Например, параметр referenced_minor_is равен 0 в строке, которая содержит саму упоминаемую сущность.

При наличии не привязанных к схеме ссылок список зависимостей уровня столбцов может быть выведен только в случае ограниченности всех упоминаемых сущностей. Если какая-либо из упоминаемых сущностей не может быть ограничена, то в списке не отображается ни одной зависимости уровня столбца, а параметру referenced_minor_id присваивается значение 0. См. пример Г.

referenced_class

tinyint

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

1 = Объект или столбец.

6 = Тип.

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

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

referenced_class_desc

nvarchar(60)

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

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION

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 = ссылка на определяемую пользователем функцию или на метод определяемого пользователем типа (UDT) столбца неоднозначна.

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

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

Исключения

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

  • Указан системный объект.

  • Указанная сущность не существует в текущей базе данных.

  • Указанная сущность не ссылается ни на какие сущности.

  • Передан недопустимый параметр.

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

Возвращает ошибку 2020, когда не удается разрешить зависимости столбца. Эта ошибка не препятствует возврату запросом зависимостей на уровне объектов. Дополнительные сведения см. в разделе Диагностика зависимостей SQL.

Замечания

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

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

Тип сущности

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

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

Таблица

Да*

Да

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

Да

Да

Хранимая процедура 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 не отслеживаются в качестве ссылающихся или упоминаемых сущностей.

Дополнительные сведения см. в разделе Основные сведения о зависимостях SQL.

Разрешения

Требует разрешения SELECT для функции sys.dm_sql_referenced_entities и разрешения VIEW DEFINITION для ссылающейся сущности. Разрешение SELECT по умолчанию предоставляется роли public. Требует разрешения VIEW DEFINITION для базы данных, либо, если ссылающаяся сущность является триггером DDL уровня базы данных, разрешения ALTER DATABASE DDL TRIGGER. Если указанный модуль является триггером DDL уровня сервера, то требуется разрешение VIEW ANY DEFINITION на уровне сервера.

Примеры

А. Отображение списка сущностей, упоминаемых триггером DDL уровня базы данных

В ходе выполнения следующего примера производится отображение списка сущностей (таблиц и столбцов), упоминаемых триггером DDL уровня базы данных ddlDatabaseTriggerLog.

USE AdventureWorks;
GO
SELECT referenced_schema_name, referenced_entity_name, referenced_minor_name, 
    referenced_minor_id, referenced_class_desc
FROM sys.dm_sql_referenced_entities ('ddlDatabaseTriggerLog', 'DATABASE_DDL_TRIGGER');
GO

Б. Отображение списка сущностей, упоминаемых объектом

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

USE AdventureWorks;
GO
SELECT referenced_schema_name, referenced_entity_name, referenced_minor_name, 
    referenced_minor_id, referenced_class_desc, is_caller_dependent, is_ambiguous
FROM sys.dm_sql_referenced_entities ('dbo.ufnGetContactInformation', 'OBJECT');
GO

В. Отображение списка зависимостей столбцов

В ходе выполнения представленного ниже примера осуществляется создание таблицы Table1, в которой содержится вычисляемый столбец c, определяемый как сумма столбцов a и b. Затем производится вызов представления sys.dm_sql_referenced_entities. Представление содержит две строки, по одной для каждого столбца, определенного в вычисляемом столбце.

USE AdventureWorks;
GO
CREATE TABLE dbo.Table1 (a int, b int, c AS a + b);
GO
SELECT referenced_schema_name AS schema_name,
    referenced_entity_name AS table_name,
    referenced_minor_name AS referenced_column,
    COALESCE(COL_NAME(OBJECT_ID(N'dbo.Table1'),referencing_minor_id), 'N/A') AS referencing_column_name
FROM sys.dm_sql_referenced_entities ('dbo.Table1', 'OBJECT');
GO
-- Remove the table.
DROP TABLE dbo.Table1;
GO

Ниже приводится результирующий набор.

schema_name table_name referenced_column referencing_column

----------- ---------- ----------------- ------------------

dbo Table1 a c

dbo Table1 b c

Г. Отображение зависимостей столбцов, не привязанных к схеме

В ходе выполнения представленного ниже примера производится очистка таблицы Table1, а также создание таблицы Table2 и хранимой процедуры Proc1. Процедура ссылается на таблицу Table2 и на несуществующую таблицу Table1. Представление sys.dm_sql_referenced_entities запускается с помощью хранимой процедуры, которая указана в качестве ссылающейся сущности. В результирующем наборе показана одна строка для таблиц Table1 и Table2. Поскольку таблица Table1 не существует, то не удается разрешить зависимости столбца и возвращается ошибка 2020.

USE AdventureWorks;
GO
IF OBJECT_ID ( 'dbo.Table1', 'U' ) IS NOT NULL 
    DROP TABLE dbo.Table1;
GO
CREATE TABLE dbo.Table2 (c1 int, c2 int);
GO
CREATE PROCEDURE dbo.Proc1 AS
    SELECT a, b, c FROM Table1;
    SELECT c1, c2 FROM Table2;
GO
SELECT referenced_id, referenced_entity_name AS table_name, referenced_minor_name AS referenced_column_name
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO

Д. Отображение содержимого динамических зависимостей

Следующий пример является продолжением примера Г и предназначен для отображения динамического характера ссылок. В примере сначала производится воссоздание таблицы Table1, которая была удалена в примере Г. Затем снова запускается инструкция sys.dm_sql_referenced_entities, в которой в качестве ссылающейся сущности указана хранимая процедура. Результирующий набор содержит обе таблицы и их соответствующие столбцы, определенные в хранимой процедуре.

USE AdventureWorks;
GO
CREATE TABLE Table1 (a int, b int, c AS a + b);
GO 
SELECT referenced_id, referenced_entity_name AS table_name, referenced_minor_name as column_name
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO
DROP TABLE Table1, Table2;
DROP PROC Proc1;
GO

Ниже приводится результирующий набор.

referenced_id, table_name, column_name

------------- ----------- -----------

2139154566 Table1 NULL

2139154566 Table1 a

2139154566 Table1 b

2139154566 Table1 c

2707154552 Table2 NULL

2707154552 Table2 c1

2707154552 Table2 c2

Журнал изменений

Обновления

Из раздела «Примечания» удалена фраза «Зависимости столбцов не отслеживаются для возвращающих табличное значение функций CLR».

Исправлен тип данных параметра referencing_entity_name.