V SQL Server můžete použít sys.dm_sql_referencing_entities()
funkce systémové dynamické správy k získání seznamu všech entit v aktuální databázi, které podle názvu odkazují na jinou uživatelem definovanou entitu.
Jinými slovy, vrací seznam entit, které závisí na dané entitě.
Konkrétně uvádí následující typy entit v aktuální databázi, které odkazují na zadanou entitu:
- Entity vázané nebo nevázané na schéma
- Spouštěče DDL na úrovni databáze
- Spouštěče DDL na úrovni serveru
Syntaxe
Syntaxe vypadá takto:
sys.dm_sql_referencing_entities ( ' schema_name.referenced_entity_name ' , '' ) ::= { OBJECT | TYPE | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION }
Příklad 1 – Základní příklad
Zde je základní příklad použití:
USE WideWorldImporters; SELECT * FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT');
Výsledek:
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+ | referencing_schema_name | referencing_entity_name | referencing_id | referencing_class | referencing_class_desc | is_caller_dependent | |---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------| | Application | DetermineCustomerAccess | 1051150790 | 1 | OBJECT_OR_COLUMN | 0 | | Integration | GetCityUpdates | 1758629308 | 1 | OBJECT_OR_COLUMN | 0 | | Website | Customers | 1694629080 | 1 | OBJECT_OR_COLUMN | 0 | | Website | SearchForCustomers | 942626401 | 1 | OBJECT_OR_COLUMN | 0 | | Website | SearchForSuppliers | 926626344 | 1 | OBJECT_OR_COLUMN | 0 | | Website | Suppliers | 1678629023 | 1 | OBJECT_OR_COLUMN | 0 | +---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
V tomto příkladu existuje šest entit, které odkazují na ‘Application.Cities’ v databázi ‘WideWorldImporters’.
Společnost Microsoft výslovně nedoporučuje používat hvězdičku (*
), chcete-li vybrat všechny sloupce ze zobrazení a funkcí dynamické správy (z toho sys.dm_sql_referencing_entities()
je jeden). Důvodem je, že jejich schémata a data, která vracejí, se mohou v budoucích verzích SQL Serveru změnit. To by mohlo mít za následek přidání sloupců na konec seznamu sloupců v budoucích verzích, což by mohlo zkomplikovat vaši aplikaci, pokud se při výběru všech sloupců spoléháte na hvězdičku.
Proto by měl být předchozí kód přepsán na tento:
Příklad:
USE WideWorldImporters; SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class, referencing_class_desc, is_caller_dependent FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT');
Samozřejmě můžete vždy zadat méně sloupců, pokud chcete.
Příklad 2 – Získání typu odkazující entity
Výše uvedený příklad je v pořádku, ale neříká nám typ odkazující entity. Jinými slovy, nemůžeme vidět, zda se jedná o pohled, uloženou proceduru atd.
Tyto informace můžete získat připojením k sys.dm_sql_referencing_entities()
s sys.objects
.
Předchozí příklad bychom tedy mohli upravit takto:
SELECT o.type_desc 'Type', re.referencing_schema_name 'Schema', re.referencing_entity_name 'Name' FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT') re INNER JOIN sys.objects o ON re.referencing_id = o.object_id ORDER BY 'Type' ASC;
Výsledek:
+----------------------------------+-------------+-------------------------+ | Type | Schema | Name | |----------------------------------+-------------+-------------------------| | SQL_INLINE_TABLE_VALUED_FUNCTION | Application | DetermineCustomerAccess | | SQL_STORED_PROCEDURE | Integration | GetCityUpdates | | SQL_STORED_PROCEDURE | Website | SearchForCustomers | | SQL_STORED_PROCEDURE | Website | SearchForSuppliers | | VIEW | Website | Suppliers | | VIEW | Website | Customers | +----------------------------------+-------------+-------------------------+
Příklad 3 – Uživatelsky definované typy
Zde je příklad použití sys.dm_sql_referencing_entities()
vrátit entity, které odkazují na daný uživatelsky definovaný typ aliasu.
Pro tento příklad jsem vytvořil uživatelem definovaný alias nazvaný clientcode
. Poté jsem jej použil ve dvou sloupcích (ve dvou různých tabulkách) a také jsem vytvořil uloženou proceduru, která odkazuje na typ podle názvu (přijímá argument nazvaný @ClientCode
což je z clientcode
typ).
Chcete-li vrátit uživatelem definovaný typ, použijte TYPE
jako druhý argument.
Příklad:
USE Test; SELECT referencing_entity_name FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE');
Výsledek:
+---------------------------+ | referencing_entity_name | |---------------------------| | uspGetClient | | uspGetOrdersByClient | +---------------------------+
Podle názvů poznám, že obě jsou uložené procedury (obě mají předponu usp
, což je běžná konvence při vytváření uživatelsky definovaných uložených procedur), ale můžeme to potvrdit kontrolou sys.objects
zobrazení systémového katalogu ještě jednou:
SELECT o.type_desc 'Type', re.referencing_schema_name 'Schema', re.referencing_entity_name 'Name' FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE') re INNER JOIN sys.objects o ON re.referencing_id = o.object_id ORDER BY 'Type' ASC;
Výsledek:
+----------------------+----------+----------------------+ | Type | Schema | Name | |----------------------+----------+----------------------| | SQL_STORED_PROCEDURE | dbo | uspGetClient | | SQL_STORED_PROCEDURE | dbo | uspGetOrdersByClient | +----------------------+----------+----------------------+
Všimněte si, že tento typ aliasu se používá ve sloupcích dvou tabulek v této databázi. Tyto závislosti se však nezobrazují v našem seznamu závislostí, protože uživatelsky definovaný typ není v definici vypočítaného sloupce, CHECK
omezení nebo DEFAULT
omezení v tabulce.
Jedna z tabulek také odkazuje na druhou tabulku prostřednictvím omezení cizího klíče ve sloupci, který používá dbo.clientcode
uživatelsky definovaný typ, ale tento se také neobjevuje v našem seznamu.
Oficiální dokumentace
Podrobnější informace naleznete v části sys.dm_sql_referencing_entities
na webu společnosti Microsoft.