Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL 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í:
- Re-creates
Table1, což bylo v Příkladu D vyřazeno. - Run Poté
sys.dm_sql_referenced_entitiesse 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)