В SQL Server можете да използвате sys.dm_sql_referencing_entities()
функция за динамично управление на системата, за да получите списък с всички обекти в текущата база данни, които препращат към друг дефиниран от потребителя обект по име.
С други думи, той връща списък с обекти, които зависят от дадения обект.
По-конкретно, той докладва за следните типове обекти в текущата база данни, които препращат към посочения обект:
- Обвързани със схема или необвързани със схема обекти
- Задействания на DDL на ниво база данни
- Задействания на DDL на ниво сървър
Синтаксис
Синтаксисът е така:
sys.dm_sql_referencing_entities ( ' schema_name.referenced_entity_name ' , '' ) ::={ ОБЕКТ | ТИП | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION }
Пример 1 – Основен пример
Ето един основен пример за употреба:
ИЗПОЛЗВАЙТЕ WideWorldImporters;ИЗБЕРЕТЕ *ОТ sys.dm_sql_referencing_entities ('Application.Cities', 'OBJECT');
Резултат:
+---------------------+------------------ ---------+----------------+--------------------- +--------------------+-------------------- -+| referencing_schema_name | референтно_име_на_обект | referencing_id | референтен_клас | referencing_class_desc | зависи от_обаждащия се ||--------------------------+------------------- --------+------------------+---------------------+ -------------------------+----------------------- || Приложение | Определяне на достъпа на клиента | 1051150790 | 1 | OBJECT_OR_COLUMN | 0 || Интеграция | GetCityUpdates | 1758629308 | 1 | OBJECT_OR_COLUMN | 0 || Уебсайт | Клиенти | 1694629080 | 1 | OBJECT_OR_COLUMN | 0 || Уебсайт | Търсене за клиенти | 942626401 | 1 | OBJECT_OR_COLUMN | 0 || Уебсайт | Търсене на доставчици | 926626344 | 1 | OBJECT_OR_COLUMN | 0 || Уебсайт | Доставчици | 1678629023 | 1 | OBJECT_OR_COLUMN | 0 |+--------------------------+------------------- --------+------------------+---------------------+ -------------------------+----------------------- +
В този пример има шест обекта, които препращат към „Application.Cities“ в базата данни „WideWorldImporters“.
Microsoft изрично препоръчва да не използвате звездичката (*
), за да изберете всички колони от динамични изгледи за управление и функции (от които sys.dm_sql_referencing_entities()
е един). Това е така, защото техните схеми и данните, които връщат, може да се променят в бъдещи версии на SQL Server. Това може да доведе до добавяне на колони в края на списъка с колони в бъдещи версии, което може да обърка приложението ви, ако разчитате на звездичката, за да изберете всички колони.
Следователно предишният код трябва да бъде пренаписан на това:
Пример:
ИЗПОЛЗВАЙТЕ WideWorldImporters;ИЗБЕРЕТЕ referencing_schema_name, referencing_entity_name, referencing_id, referencing_class, referencing_class_desc, is_caller_dependentFROM sys.dm_sql_referencing_entities ('Application.Cities', 'OBJECT)Разбира се, винаги можете да посочите по-малко колони, ако желаете.
Пример 2 – Вземете типа на референтния обект
Горният пример е добър и добър, но не ни казва типа на референтния обект. С други думи, не можем да видим дали това е изглед, съхранена процедура и т.н.
Можете да получите тази информация, като се присъедините към
sys.dm_sql_referencing_entities()
сsys.objects
.Така че можем да модифицираме предишния пример по следния начин:
SELECT o.type_desc 'Тип', re.referencing_schema_name 'Схема', re.referencing_entity_name 'Име'FROM sys.dm_sql_referencing_entities ('Application.Cities', 'OBJECT') reINNER JOIN =reINNER JOIN sys.objects_id oON .object_idORDER BY 'Type' ASC;Резултат:
+--------------------------------+----------- --+------------------------------+| Тип | Схема | Име ||----------------------------------+------------ -+-------------------------|| SQL_INLINE_TABLE_VALUED_FUNCTION | Приложение | Определяне на клиентски достъп || SQL_STORED_PROCEDURE | Интеграция | GetCityUpdates || SQL_STORED_PROCEDURE | Уебсайт | Търсене за клиенти || SQL_STORED_PROCEDURE | Уебсайт | Търсене на доставчици || ВИЖТЕ | Уебсайт | Доставчици || ВИЖТЕ | Уебсайт | Клиенти |+---------------------------------+------------ -+------------------------+Пример 3 – Типове, дефинирани от потребителя
Ето пример за използване на
sys.dm_sql_referencing_entities()
за връщане на обекти, които препращат към даден тип псевдоним, дефиниран от потребителя.За този пример създадох потребителски дефиниран псевдоним, наречен
clientcode
. След това го използвах в две колони (в две различни таблици) и създадох също така съхранена процедура, която препраща към типа по име (тя приема аргумент, наречен@ClientCode
който е отclientcode
тип).За да върнете дефиниран от потребителя тип, използвайте
TYPE
като втори аргумент.Пример:
ИЗПОЛЗВАЙТЕ тест;ИЗБЕРЕТЕ referencing_entity_nameFROM sys.dm_sql_referencing_entities ('dbo.clientcode', 'TYPE');Резултат:
+---------------------+| рефериращо_име_на_обект ||------------------------------|| uspGetClient || uspGetOrdersByClient |+--------------------------+По имената мога да разбера, че и двете са съхранени процедури (и двете са с префикс с
usp
, което е обичайна конвенция при създаване на дефинирани от потребителя съхранени процедури), но можем да потвърдим това, като проверимsys.objects
преглед на системния каталог още веднъж:SELECT o.type_desc 'Тип', re.referencing_schema_name 'Схема', re.referencing_entity_name 'Име'FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE') reINNER JOIN sys.objects oON re. .object_idORDER BY 'Type' ASC;Резултат:
+---------------------+----------+------------ ----------+| Тип | Схема | Име ||---------------------+----------+------------ ---------|| SQL_STORED_PROCEDURE | dbo | uspGetClient || SQL_STORED_PROCEDURE | dbo | uspGetOrdersByClient |+---------------------+----------+------------ ---------+Имайте предвид, че този тип псевдоним се използва в колоните на две таблици в тази база данни. Те обаче не се появяват в нашия списък със зависимости, тъй като дефинираният от потребителя тип не е в дефиницията на изчислена колона,
CHECK
ограничение илиDEFAULT
ограничение в таблицата.Също така една от таблиците препраща към другата таблица чрез ограничение за външен ключ в колоната, която използва
dbo.clientcode
потребителски дефиниран тип, но това също не се появява в нашия списък.Официална документация
За по-подробна информация вижте
sys.dm_sql_referencing_entities
на уебсайта на Microsoft.