Sdílet prostřednictvím


sys.dm_sql_referenced_entities (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vrací jeden řádek pro každou uživatelsky definovanou entitu, která je v definici specifikované referenční entity v SQL Serveru odkazována jménem. Závislost mezi dvěma entitami vzniká, když se jedna uživatelem definovaná entita, nazývaná referencovaná entita, objeví jménem v trvalém SQL výrazu jiné uživatelsky definované entity, nazývané referenční entita. Například pokud je uložená procedura specifikovanou referenční entitou, tato funkce vrací všechny uživatelsky definované entity, které jsou v uložené procedurě odkazovány, jako jsou tabulky, pohledy, uživatelsky definované typy (UDT) nebo jiné uložené procedury.

Tuto dynamickou správu můžete použít k hlášení o následujících typech entit, na které je odkazována určená referenční entita:

  • Entity vázané na schéma

  • Entity nevázané na schéma

  • Entity mezi databázemi a servery

  • Závislosti na úrovni sloupců na entitách vázaných na schéma a bez nich

  • Uživatelsky definované typy (aliasy a CLR UDT)

  • Kolekce schémat XML

  • Funkce oddílů

Syntaxe

sys.dm_sql_referenced_entities (  
    ' [ schema_name. ] referencing_entity_name ' ,
    ' <referencing_class> ' )  
  
<referencing_class> ::=  
{  
    OBJECT  
  | DATABASE_DDL_TRIGGER  
  | SERVER_DDL_TRIGGER  
}  

Arguments

[ schema_name. ] referencing_entity_name
Je název odkazující entity. schema_name je vyžadováno, když je referenční třída OBJECT.

schema_name.referencing_entity_name je nvarchar(517).

<referencing_class> ::= { OBJEKT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Je třída specifikované referenční entity. Na příkaz lze zadat pouze jednu třídu.

<referencing_class> je nvarchar(60).

Vrácená tabulka

Název sloupce Datový typ Description
referencing_minor_id int ID sloupce, když je referenční entita sloupec; jinak 0. Není možné nastavit jako null.
referenced_server_name sysname Název serveru dané entity.

Tento sloupec je vyplněn pro závislosti napříč servery, které vznikají zadáním platného čtyřdílného názvu. Pro informace o vícedílných názvech viz Transact-SQL syntaktických konvencí.

NULL pro závislosti, které nejsou vázané na schémata, u kterých byla entita odkazována bez specifikace čtyřdílného názvu.

NULL pro entity vázané na schémata, protože musí být ve stejné databázi a lze je tedy definovat pouze pomocí dvoudílného (schema.object) jména.
referenced_database_name sysname Název databáze odkazované entity.

Tento sloupec se vyplňuje pro odkazy mezi databázemi nebo servery, které se vytvářejí zadáním platného tří- nebo čtyřdílného názvu.

NULL pro odkazy nevázané na schémata, pokud je specifikováno pomocí jednosložkového nebo dvoudílného jména.

NULL pro entity vázané na schémata, protože musí být ve stejné databázi a lze je tedy definovat pouze pomocí dvoudílného (schema.object) jména.
referenced_schema_name sysname Schéma, do kterého odkazovaná entita patří.

NULL pro odkazy bez schématového omezení, kde byla entita odkazována bez specifikace názvu schématu.

Nikdy NULL pro reference vázané na schémata.
referenced_entity_name sysname Název odkazované entity. Není možné nastavit jako null.
referenced_minor_name sysname Název sloupce, když je odkazovaná entita sloupec; jinak NULL. Například referenced_minor_name je NULL v řádku, který uvádí samotnou citovanou entitu.

Odkazovaná entita je sloupec, když je sloupec identifikován jménem v referenční entitě nebo když je mateřská entita použita v příkazu SELECT *.
referenced_id int ID odkazované entity. Pokud referenced_minor_id není 0, referenced_id je entita, ve které je sloupec definován.

Vždy NULL pro reference napříč servery.

NULL pro křížové databázové odkazy, když nelze určit ID, protože databáze je offline nebo entita nemůže být omezena.

NULL pro reference v databázi, pokud nelze identifikovat ID. U referencí nevázaných na schéma nelze ID vyřešit, pokud odkazovaná entita v databázi neexistuje nebo když je rozlišení jmen závislé na volajícím. V druhém případě je is_caller_dependent nastaveno na 1.

Nikdy NULL pro reference vázané na schémata.
referenced_minor_id int ID sloupce, když je odkazovaná entita sloupec; jinak 0. Například referenced_minor_is je 0 v řádku, který uvádí samotnou odkazovanou entitu.

U odkazů bez schématu jsou sloupcové závislosti hlášeny pouze tehdy, když lze všechny odkazované entity svázat. Pokud nelze jakoukoli referencovanou entitu svázat, nejsou hlášeny žádné závislosti na úrovni sloupců a referenced_minor_id je 0. Viz příklad D.
referenced_class tinyint Třída odkazované entity.

1 = Objekt nebo sloupec

6 = Typ

10 = XML kolekce schémat

21 = Funkce rozdělení
referenced_class_desc nvarchar(60) Popis třídy odkazované entity.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Označuje, že vazba schématu pro odkazovanou entitu probíhá za běhu; proto rozlišení entity ID závisí na schématu volajícího. K tomu dochází, když je odkazovaná entita uložená procedura, rozšířená uložená procedura nebo uživatelem definovaná funkce volaná v příkazu EXEKUTE.

1 = Odkazovaná entita je závislá na volajícím a je vyřešena za běhu. V tomto případě je referenced_id NULL.

0 = Odkazované ID entity není závislé na volajícím. Vždy 0 pro odkazy vázané na schémata a pro reference mezi databázemi a servery, které explicitně určují název schématu. Například odkaz na entitu ve formátu EXEC MyDatabase.MySchema.MyProc není závislý na volajícím. Odkaz ve formátu EXEC MyDatabase..MyProc však závisí na volajícím.
is_ambiguous bit Označuje, že reference je nejednoznačná a může se za běhu vyřešit na uživatelem definovanou funkci, uživatelem definovaný typ (UDT) nebo xquery odkaz na sloupec typu xml. Například předpokládejme, že tvrzení SELECT Sales.GetOrder() FROM Sales.MySales je definováno v uložené procedurě. Dokud není uložená procedura vykonána, není známo, zda Sales.GetOrder() je v schématu Sales uživatelsky definovaná funkce, nebo sloupec Sales typu UDT s metodou nazvanou GetOrder().

1 = Odkaz na uživatelsky definovanou funkci nebo sloupcovou metodu uživatelsky definovaného typu (UDT) je nejednoznačný.

0 = Reference je jednoznačná, nebo lze entitu úspěšně ohradit, když je funkce vyvolána.

Vždy 0 pro reference vázané na schémata.
is_selected bit 1 = Objekt nebo sloupec je vybrán.
is_updated bit 1 = Objekt nebo sloupec je upraven.
is_select_all bit 1 = Objekt je použit v klauzuli SELECT * (pouze na úrovni objektu).
is_all_columns_found bit 1 = Všechny sloupcové závislosti pro objekt lze nalézt.

0 = Sloupcové závislosti pro objekt nebyly nalezeny.
is_insert_all bit 1 = Objekt se používá v příkazu INSERT bez seznamu sloupců (pouze na úrovni objektu).

Tento sloupec byl přidán v SQL Server 2016.
is_incomplete bit 1 = Objekt nebo sloupec má chybu ve vázání a je neúplný.

Tento sloupec byl přidán v SQL Server 2016 SP2.

Exceptions

Vrací prázdnou množinu výsledků za kterékoliv z následujících podmínek:

  • Je specifikován systémový objekt.

  • Specifikovaná entita v aktuální databázi neexistuje.

  • Specifikovaná entita neodkazuje na žádné entity.

  • Je předán neplatný parametr.

Vrací chybu, pokud je specifikovaná referenční entita číslovaná uložená procedura.

Vrací chybu 2020, když nelze vyřešit závislosti sloupců. Tato chyba nebrání dotazu v vrácení závislostí na úrovni objektu.

Poznámky

Tato funkce může být vykonána v kontextu jakékoli databáze a vracet entity, které odkazují na DDL trigger na úrovni serveru.

Následující tabulka uvádí typy entit, pro které jsou informace o závislostech vytvářeny a udržovány. Informace o závislostech nejsou vytvářeny ani udržovány pro pravidla, výchozí nastavení, dočasné tabulky, dočasné uložené procedury ani systémové objekty.

Typ entity Referenční entita Odkazovaná entita
Table Ano* Ano
Zobrazit Ano Ano
Transact-SQL uložený postup** Ano Ano
Uložená procedura CLR Ne Ano
Transact-SQL uživatelem definovaná funkce Ano Ano
Uživatelsky definovaná funkce CLR Ne Ano
CLR spoušť (DML a DDL) Ne Ne
Transact-SQL DML trigger Ano Ne
Transact-SQL DDL trigger na úrovni databáze Ano Ne
Transact-SQL spouštěč DDL na úrovni serveru Ano Ne
Rozšířené uložené procedury Ne Ano
Queue Ne Ano
Synonym Ne Ano
Typ (alias a CLR uživatelsky definovaný typ) Ne Ano
Kolekce schémat XML Ne Ano
Partition funkce Ne Ano

* Tabulka je sledována jako referenční entita pouze tehdy, když odkazuje na Transact-SQL modul, uživatelem definovaný typ nebo kolekci XML schématu v definici vypočítaného sloupce, omezení CHECK nebo omezení DEFAULT.

** Číslované uložené procedury s celočíselnou hodnotou větší než 1 nejsou sledovány ani jako referencující, ani jako referencovaná entita.

Povolení

Vyžaduje oprávnění SELECT pro sys.dm_sql_referenced_entities a oprávnění VIEW DEFINITION pro odkazovanou entitu. Ve výchozím nastavení se oprávnění SELECT uděluje veřejnosti. Vyžaduje oprávnění VIEW DEFINITION pro databázi nebo oprávnění ALTER DATABASE DDL TRIGGER v databázi, pokud odkazující entita je trigger DDL na úrovni databáze. Vyžaduje oprávnění VIEW ANY DEFINITION na serveru, pokud je odkazující entita triggerem DDL na úrovni serveru.

Examples

A. Vraťte entity, na které odkazuje DDL trigger na úrovni databáze

Následující příklad vrací entity (tabulky a sloupce), na které odkazuje DDL spouštěč ddlDatabaseTriggerLogna úrovni databáze.

USE AdventureWorks2022;  
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  

B. Vraťte entity, na které objekt odkazuje

Následující příklad vrací entity, na které odkazuje uživatelem definovaná funkce dbo.ufnGetContactInformation.

USE AdventureWorks2022;  
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  

C. Závislosti sloupců vrácení

Následující příklad vytváří tabulku Table1 s vypočteným sloupcem c definovaným jako součet sloupců a a b. Poté se vyjmenuje výhled sys.dm_sql_referenced_entities . Zobrazení vrací dva řádky, jeden pro každý sloupec definovaný ve vypočteném sloupci.

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  

Tady je soubor výsledků.

schema_name table_name referenced_column referencing_column  
----------- ---------- ----------------- ------------------  
dbo         Table1     a                 c  
dbo         Table1     b                 c  

D. Vrácení závislostí sloupců bez schématu

Následující příklad obsahuje proceduru Proc1drop Table1 and save Table2 and storage . Procedura Table2 odkazuje na neexistující tabulku Table1. Pohled sys.dm_sql_referenced_entities se spouští s uloženou procedurou určenou jako referenční entita. Výsledná množina ukazuje jeden řádek pro a Table1 3 řádky pro Table2. Protože Table1 neexistuje, závislosti sloupců nelze vyřešit a chyba 2020 se vrátí. Sloupec is_all_columns_found vrací 0, což znamená Table1 , že existují sloupce, které nelze objevit.

DROP TABLE IF EXISTS 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,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  

Tady je soubor výsledků.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1  
935674381     Table2       C1                      1  
935674381     Table2       C2                      1  
NULL          Table1       NULL                    0  

Msg 2020, Level 16, State 1, Line 1
The dependencies reported for entity "dbo.Proc1" might not include
 references to all columns. This is either because the entity
 references an object that does not exist or because of an error
 in one or more statements in the entity.  Before rerunning the
 query, ensure that there are no errors in the entity and that
 all objects referenced by the entity exist.

E. Demonstrace dynamické údržby závislostí

Tento příklad E předpokládá, že byl spuštěn Příklad D. Příklad E ukazuje, že závislosti jsou udržovány dynamicky. Příklad dělá následující:

  1. Re-creates Table1, což bylo v Příkladu D vyřazeno.
  2. Run Poté sys.dm_sql_referenced_entities se spustí znovu s uloženou procedurou určenou jako referenční entita.

Výsledná sada ukazuje, že obě tabulky a jejich příslušné sloupce definované v uložené procedurě jsou vráceny. Navíc sloupec is_all_columns_found vrací 1 pro všechny objekty a sloupce.

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,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  
DROP TABLE Table1, Table2;  
DROP PROC Proc1;  
GO  

Tady je soubor výsledků.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1 
935674381     Table2       c1                      1 
935674381     Table2       c2                      1 
967674495     Table1       NULL                    1 
967674495     Table1       a                       1  
967674495     Table1       b                       1  
967674495     Table1       c                       1  

F. Použití vracejícího objektu nebo sloupce

Následující příklad vrací objekty a závislosti sloupců uložené procedury HumanResources.uspUpdateEmployeePersonalInfo. Tento postup aktualizuje NationalIDNumbersloupce , BirthDate,``MaritalStatus, a tabulky EmployeeGender na základě zadané BusinessEntityID hodnoty. Další uložený postup upsLogError je definován v TRY... CATCH blok pro zachycení případných chyb při vykonání. Sloupce is_selected, is_updated, a is_select_all vracejí informace o tom, jak jsou tyto objekty a sloupce používány v referenčním objektu. Tabulka a sloupce, které jsou upraveny, jsou označeny jedničkou ve sloupci is_updated. Sloupec BusinessEntityID je pouze vybrán a uložená procedura uspLogError není ani vybrána, ani upravena.

USE AdventureWorks2022;
GO
SELECT
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_selected,  is_updated,  is_select_all
    FROM
        sys.dm_sql_referenced_entities(
            'HumanResources.uspUpdateEmployeePersonalInfo',
            'OBJECT')
;

Tady je soubor výsledků.

table_name    column_name         is_selected is_updated is_select_all  
------------- ------------------- ----------- ---------- -------------  
uspLogError   NULL                0           0          0  
Employee      NULL                0           1          0  
Employee      BusinessEntityID    1           0          0  
Employee      NationalIDNumber    0           1          0  
Employee      BirthDate           0           1          0  
Employee      MaritalStatus       0           1          0  
Employee      Gender              0           1          0

Viz také

sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL)