V SQL Server můžete použít sys.sql_expression_dependencies
zobrazení systémového katalogu pro vrácení všech závislostí na uživatelsky definované entitě v aktuální databázi. To zahrnuje závislosti mezi nativně zkompilovanými, skalárními uživatelem definovanými funkcemi a dalšími moduly SQL Server.
Toto zobrazení můžete použít k:
- Vrátí entity, které závisí na dané entitě
- Vrátí entity, na kterých daná entita závisí
Můžete jej tedy například použít k vrácení všech objektů, které odkazují na konkrétní tabulku. Můžete jej také použít k vrácení všech objektů, na které konkrétní uložená procedura odkazuje ve svém kódu.
Konkrétně sys.sql_expression_dependencies
zobrazit informace o závislostech sestav pro následující entity:
- Entity vázané na schéma.
- Entity bez vazby na schéma.
- entity napříč databázemi a servery. Názvy entit jsou hlášeny; ID entit však nejsou vyřešena.
- Závislosti na úrovni sloupců na entitách vázaných na schéma. Závislosti na úrovni sloupců pro objekty nevázané na schéma lze vrátit pomocí sys.dm_sql_referenced_entities.
- Spouštění DDL na úrovni serveru, když je v kontextu hlavní databáze.
Příklad 1 – Vráceny všechny sloupce
Zde je rychlý příklad, který vybere všechny sloupce z sys.sql_expression_dependencies
. To nám ukazuje, jaká data jsou skutečně vrácena ve výběru dat, a kterýkoli z těchto sloupců můžeme použít v našich dotazech, abychom vrátili pouze data, která nás zajímají.
SELECT TOP(1) * FROM sys.sql_expression_dependencies;
Výsledek (při použití vertikálního výstupu):
referencing_id | 114099447 referencing_minor_id | 0 referencing_class | 1 referencing_class_desc | OBJECT_OR_COLUMN is_schema_bound_reference | 0 referenced_class | 1 referenced_class_desc | OBJECT_OR_COLUMN referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | dbo referenced_entity_name | Client referenced_id | 434100587 referenced_minor_id | 0 is_caller_dependent | 0 is_ambiguous | 0
Tento příklad používá vertikální výstup, aby bylo snazší vidět názvy sloupců bez nutnosti vodorovného posouvání. Proto jsou názvy sloupců uvedeny vlevo a jejich příslušné hodnoty vpravo.
Také jsem kvůli stručnosti použil TOP(1)
omezit výsledky pouze na první řádek.
Příklad 2 – Nalezení entit, které závisí na entitě
Chcete-li najít objekty závislé na dané entitě, použijte referencing_id
této entity při výběru z pohledu.
Příklad:
SELECT referenced_server_name AS [Referenced Server], referenced_database_name AS [Referenced DB], referenced_schema_name AS [Referenced Schema], referenced_entity_name AS [Referenced Entity], referenced_class_desc AS [Referenced Entity Class] FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('uspGetClient');
Výsledek:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | NULL | NULL | dbo | Client | OBJECT_OR_COLUMN | | NULL | NULL | NULL | clientcode | TYPE | +---------------------+-----------------+---------------------+---------------------+---------------------------+
Zde získám všechny entity, na které se odkazuje v uspGetClient
uložené procedury.
Zde je skutečná definice uspGetClient
:
CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS SELECT FirstName, LastName FROM [dbo].[Client] WHERE ClientCode = @ClientCode;
Můžeme tedy vidět, že vybírá data z tabulky nazvané Client
a přijímá argument nazvaný @ClientCode
s (uživatelsky definovaným aliasem) datovým typem clientcode
.
Příklad 3 – Vyhledání entit, na kterých entita závisí
Můžete to také přepnout a získat objekty, na kterých závisí daná entita. Chcete-li to provést, použijte referenced_id
(místo referencing_id
) při výběru z pohledu.
Příklad:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity], referencing_class_desc AS [Class], COL_NAME(referenced_id, referenced_minor_id) AS [Column] FROM sys.sql_expression_dependencies WHERE referenced_id = OBJECT_ID('Client');
Výsledek:
+----------------------+----------------------------+------------------+------------+ | Referencing Entity | Referencing Minor Entity | Class | Column | |----------------------+----------------------------+------------------+------------| | uspGetClient | NULL | OBJECT_OR_COLUMN | NULL | | uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL | | chkClientCode | NULL | OBJECT_OR_COLUMN | ClientCode | +----------------------+----------------------------+------------------+------------+
V tomto příkladu jsem chtěl vidět, které entity závisí na Client
tabulka (tj. které entity odkazují na tuto tabulku ve svém kódu SQL).
Všimnete si, že jsem také vybral jiné sloupce. Je to proto, že hledám informace o odkazování entita, nikoli odkazovaná entity jako v předchozím příkladu.
Příklad 4 – Získání dalších informací
Chcete-li získat další informace, můžete tento pohled spojit s jinými pohledy a/nebo tabulkami.
Můžete se k němu například připojit pomocí sys.objects
abyste získali typ odkazujícího objektu:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], o.type_desc AS [Type], COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column], referenced_entity_name AS [Referenced Entity], COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column] 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'Client');
Výsledek:
+----------------------+----------------------+----------+---------------------+------------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+----------------------+----------+---------------------+------------| | uspGetClient | SQL_STORED_PROCEDURE | (n/a) | Client | (n/a) | | uspGetOrdersByClient | SQL_STORED_PROCEDURE | (n/a) | Client | (n/a) | | chkClientCode | CHECK_CONSTRAINT | (n/a) | Client | ClientCode | +----------------------+----------------------+----------+---------------------+------------+
V tomto příkladu jsem také přidal COALESCE()
funkce vrátí (n/a)
kdykoli referencing_minor_id
je NULL
. Tato funkce je jedním z několika způsobů, jak můžete nahradit hodnotu NULL řetězcem v SQL Server.
Příklad 5 – Mezi databázemi a entitami mezi servery
Jak již bylo zmíněno, sql_expression_dependencies
také pracuje na entitách napříč databázemi a mezi servery. V tomto případě se však hlásí názvy entit, ale ID entit se nerozlišují.
Tento příklad používá přesně stejný kód jako v příkladu 2, ale tentokrát je pro jinou entitu. Tentokrát chci najít entity, které závisí na uspGetAlbumsByArtist
:
SELECT referenced_server_name AS [Referenced Server], referenced_database_name AS [Referenced DB], referenced_schema_name AS [Referenced Schema], referenced_entity_name AS [Referenced Entity], referenced_class_desc AS [Referenced Entity Class] FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('uspGetAlbumsByArtist');
Výsledek:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | Homer | Music | dbo | Albums | OBJECT_OR_COLUMN | +---------------------+-----------------+---------------------+---------------------+---------------------------+
V tomto příkladu mají odkazovaný server a odkazovaná databáze hodnotu (místo NULL jako v předchozím příkladu). Je to proto, že uspGetAlbumsByArtist
uložená procedura používá čtyřdílný název k odkazování na entitu na propojeném serveru (uložená procedura z předchozího příkladu nepoužívala čtyřdílný název a nepoužila ani třídílný název k určení DB) .
V tomto příkladu Homer
je název propojeného serveru a Music
je databáze, na kterou se uložená procedura dotazuje.
Můžeme to vidět v uspGetAlbumsByArtist
definice:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [Homer].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
Oficiální dokumentace
Podrobnější informace a příklady naleznete v části sys.sql_expression_dependencies
na webu společnosti Microsoft.
Zde je další článek společnosti Microsoft, který obsahuje pokyny pro získání závislostí prostřednictvím SSMS.