sql >> Databáze >  >> RDS >> Sqlserver

Najít závislosti na serveru SQL Server:sql_expression_dependencies

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.


  1. Jak načíst velké množství řetězců, aby odpovídaly databázi Oracle?

  2. Jak nainstalovat SQL Server na M1 Mac (ARM64)

  3. Primární klíče MySQL

  4. Jak to_char() funguje v PostgreSQL