Delen via


sys.dm_sql_referenced_entities (Transact-SQL)

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Geeft één rij terug voor elke door de gebruiker gedefinieerde entiteit die bij naam wordt aangeduid in de definitie van de gespecificeerde referentie-entiteit in SQL Server. Er ontstaat een afhankelijkheid tussen twee entiteiten wanneer één door de gebruiker gedefinieerde entiteit, de zogenaamde referentie-entiteit, bij naam verschijnt in een behouden SQL-expressie van een andere door de gebruiker gedefinieerde entiteit, de zogenaamde referentie-entiteit. Als bijvoorbeeld een opgeslagen procedure de gespecificeerde referentie-entiteit is, geeft deze functie alle door de gebruiker gedefinieerde entiteiten terug die in de opgeslagen procedure worden genoemd, zoals tabellen, weergaven, door de gebruiker gedefinieerde types (UDT's) of andere opgeslagen procedures.

U kunt deze dynamische beheerfunctie gebruiken om te rapporteren over de volgende typen entiteiten waarnaar wordt verwezen door de gespecificeerde referentie-entiteit:

  • Schema-gebonden entiteiten

  • Niet-schema-gebonden entiteiten

  • Cross-database en cross-server entiteiten

  • Kolomniveau-afhankelijkheden van schema-gebonden en niet-schema-gebonden entiteiten

  • Door de gebruiker gedefinieerde types (alias en CLR UDT)

  • XML-schemaverzamelingen

  • Partitiefuncties

Syntaxis

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
Is de naam van de verwijzende entiteit. schema_name is vereist wanneer de referentieklasse OBJECT is.

schema_name.referencing_entity_name is nvarchar(517).

<referencing_class> ::= { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Is de klasse van de gespecificeerde referentie-entiteit. Per statement kan slechts één klasse worden opgegeven.

<referencing_class> is nvarchar(60).

Tabel geretourneerd

Kolomnaam Gegevenstype Description
referencing_minor_id int Kolom-ID wanneer de verwijzende entiteit een kolom is; anders 0. Is niet nulbaar.
referenced_server_name sysname Naam van de server van de genoemde entiteit.

Deze kolom wordt gevuld voor cross-serverafhankelijkheden die worden gemaakt door een geldige vierdelige naam te specificeren. Voor informatie over meervoudige namen, zie Transact-SQL syntaxisconventies.

NULL voor niet-schema-gebonden afhankelijkheden waarvoor de entiteit werd verwezen zonder een vierdelige naam te specificeren.

NULL voor schema-gebonden entiteiten omdat ze in dezelfde database moeten zitten en daarom alleen kunnen worden gedefinieerd met een tweedelige (schema.object) naam.
referenced_database_name sysname Naam van de database van de genoemde entiteit.

Deze kolom wordt gevuld voor cross-database- of cross-serverreferenties die worden gemaakt door een geldige drie- of vierdelige naam te specificeren.

NULL voor niet-schema-gebonden referenties wanneer gespecificeerd met een naam van één of twee delen.

NULL voor schema-gebonden entiteiten omdat ze in dezelfde database moeten zitten en daarom alleen kunnen worden gedefinieerd met een tweedelige (schema.object) naam.
referenced_schema_name sysname Schema waarin de verwezen entiteit thuishoort.

NULL voor niet-schema-gebonden referenties waarin de entiteit werd genoemd zonder de schemanaam te specificeren.

Nooit NULL voor schema-gebonden referenties.
referenced_entity_name sysname Naam van de genoemde entiteit. Is niet nulbaar.
referenced_minor_name sysname Kolomnaam wanneer de verwezen entiteit een kolom is; anders NULL. Bijvoorbeeld, referenced_minor_name is NULL in de rij die de genoemde entiteit zelf vermeldt.

Een referentiede entiteit is een kolom wanneer een kolom wordt geïdentificeerd met naam in de referentie-entiteit, of wanneer de moederentiteit wordt gebruikt in een SELECT * statement.
referenced_id int ID van de genoemde entiteit. Wanneer referenced_minor_id niet 0 is, is referenced_id de entiteit waarin de kolom is gedefinieerd.

Altijd NULL voor cross-server referenties.

NULL voor cross-database referenties wanneer de ID niet kan worden bepaald omdat de database offline is of de entiteit niet kan worden gebonden.

NULL voor referenties binnen de database als de ID niet kan worden bepaald. Voor niet-schema-gebonden referenties kan de ID niet worden opgelost wanneer de gerefereerde entiteit niet in de database bestaat of wanneer de naamresolutie afhankelijk is van de aanroeper. In het laatste geval wordt is_caller_dependent op 1 gezet.

Nooit NULL voor schema-gebonden referenties.
referenced_minor_id int Kolom-ID wanneer de verwezen entiteit een kolom is; anders 0. Bijvoorbeeld, referenced_minor_is is 0 in de rij die de genoemde entiteit zelf vermeldt.

Voor niet-schema-gebonden referenties worden kolomafhankelijkheden alleen gerapporteerd wanneer alle gerefereerde entiteiten kunnen worden gebonden. Als een verwezen entiteit niet kan worden gebonden, worden er geen kolomniveau-afhankelijkheden gerapporteerd en is referenced_minor_id 0. Zie voorbeeld D.
referenced_class tinyint Klasse van de verwezen entiteit.

1 = Object of kolom

6 = Type

10 = XML-schemaverzameling

21 = Partitiefunctie
referenced_class_desc nvarchar(60) Beschrijving van de klasse van de gerefereerde entiteit.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Geeft aan dat schemabinding voor de gerefereerde entiteit tijdens run plaatsvindt; daarom hangt de resolutie van de entiteits-ID af van het schema van de aanroeper. Dit gebeurt wanneer de verwezen entiteit een opgeslagen procedure, uitgebreide opgeslagen procedure of een door de gebruiker gedefinieerde functie is die binnen een uitvoerbare instructie wordt aangeroepen.

1 = De gerefereerde entiteit is afhankelijk van de aanroeper en wordt tijdens uitvoering opgelost. In dit geval is referenced_id NULL.

0 = De verwezen entiteit-ID is niet afhankelijk van de aanroeper. Altijd 0 voor schema-gebonden referenties en voor cross-database- en cross-serverreferenties die expliciet een schemanaam specificeren. Bijvoorbeeld, een verwijzing naar een entiteit in het formaat EXEC MyDatabase.MySchema.MyProc is niet afhankelijk van de aanroeper. Een referentie in het formaat EXEC MyDatabase..MyProc is echter afhankelijk van de aanroeper.
is_ambiguous bit Geeft aan dat de referentie ambigu is en tijdens runtime kan worden opgelost naar een door de gebruiker gedefinieerde functie, een door de gebruiker gedefinieerd type (UDT), of een xquery-referentie naar een kolom van het type xml. Stel bijvoorbeeld dat de instructie SELECT Sales.GetOrder() FROM Sales.MySales is gedefinieerd in een opgeslagen procedure. Totdat de opgeslagen procedure is uitgevoerd, is het niet bekend of Sales.GetOrder() er een door de gebruiker gedefinieerde functie in het Sales schema of kolom met de naam Sales UDT is met een methode genaamd GetOrder().

1 = Verwijzing naar een door de gebruiker gedefinieerde functie of kolom door het gebruik gedefinieerde type (UDT) methode is dubbelzinnig.

0 = De referentie is ondubbelzinnig of de entiteit kan succesvol worden gebonden wanneer de functie wordt aangeroepen.

Altijd 0 voor schema-gebonden referenties.
is_selected bit 1 = Het object of de kolom wordt geselecteerd.
is_updated bit 1 = Het object of de kolom wordt aangepast.
is_select_all bit 1 = Het object wordt gebruikt in een SELECT * clausule (alleen objectniveau).
is_all_columns_found bit 1 = Alle kolomafhankelijkheden voor het object konden worden gevonden.

0 = Kolomafhankelijkheden voor het object konden niet worden gevonden.
is_insert_all bit 1 = Het object wordt gebruikt in een INSERT-instructie zonder kolomlijst (alleen objectniveau).

Deze kolom is toegevoegd in SQL Server 2016.
is_incomplete bit 1 = Het object of de kolom heeft een bindingsfout en is onvolledig.

Deze kolom is toegevoegd in SQL Server 2016 SP2.

Exceptions

Geeft een lege resultaatset terug onder een van de volgende voorwaarden:

  • Er wordt een systeemobject gespecificeerd.

  • De gespecificeerde entiteit bestaat niet in de huidige database.

  • De gespecificeerde entiteit verwijst niet naar entiteiten.

  • Er wordt een ongeldige parameter doorgegeven.

Geeft een foutmelding wanneer de gespecificeerde referentie-entiteit een genummerde opgeslagen procedure is.

Geeft fout 2020 terug wanneer kolomafhankelijkheden niet kunnen worden opgelost. Deze fout voorkomt niet dat de query objectniveau-afhankelijkheden teruggeeft.

Opmerkingen

Deze functie kan worden uitgevoerd in de context van elke database om de entiteiten terug te geven die verwijzen naar een serverniveau DDL-trigger.

De volgende tabel geeft een overzicht van de typen entiteiten waarvoor afhankelijkheidsinformatie wordt aangemaakt en onderhouden. Afhankelijkheidsinformatie wordt niet aangemaakt of onderhouden voor regels, standaardinstellingen, tijdelijke tabellen, tijdelijke opgeslagen procedures of systeemobjecten.

Entiteitstype Referentie-entiteit Referentie entiteit
Table Ja* Yes
Bekijk Yes Yes
Transact-SQL opgeslagen procedure** Yes Yes
CLR stored procedure Nee. Yes
Transact-SQL door de gebruiker gedefinieerde functie Yes Yes
CLR-gebruikersgedefinieerde functie Nee. Yes
CLR-trigger (DML en DDL) Nee. Nee.
Transact-SQL DML-trigger Yes Nee.
Transact-SQL database-niveau DDL-trigger Yes Nee.
Transact-SQL serverniveau DDL-trigger Yes Nee.
Uitgebreide opgeslagen procedures Nee. Yes
Wachtrij Nee. Yes
Synoniem Nee. Yes
Type (alias en CLR-door de gebruiker gedefinieerd type) Nee. Yes
XML-schemaverzameling Nee. Yes
Partitionfunctie Nee. Yes

* Een tabel wordt alleen als referentie-entiteit gevolgd wanneer deze verwijst naar een Transact-SQL module, door de gebruiker gedefinieerd type of XML-schemaverzameling in de definitie van een berekende kolom, CHECK-beperking of DEFAULT-beperking.

** Genummerde opgeslagen procedures met een geheel getal groter dan 1 worden niet gevolgd als referentie- of referentieentiteit.

Permissions

Vereist SELECT-machtiging voor sys.dm_sql_referenced_entities- en VIEW DEFINITION-machtiging voor de verwijzende entiteit. Select-machtigingen worden standaard verleend aan het publiek. Vereist VIEW DEFINITION-machtiging voor de database of ALTER DATABASE DDL TRIGGER-machtiging voor de database wanneer de verwijzingsentiteit een DDL-trigger op databaseniveau is. Vereist VIEW ANY DEFINITION-machtiging op de server wanneer de verwijzende entiteit een DDL-trigger op serverniveau is.

Voorbeelden

Eén. Returneren entiteiten die worden aangeduid door een databaseniveau DDL-trigger

Het volgende voorbeeld geeft de entiteiten (tabellen en kolommen) terug die worden aangeduid door de databaseniveau DDL-trigger ddlDatabaseTriggerLog.

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. Geef entiteiten terug die door een object worden aangeduid

Het volgende voorbeeld geeft de entiteiten terug die worden aangeduid door de door de gebruiker gedefinieerde functie 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. Retourkolomafhankelijkheden

Het volgende voorbeeld creëert de tabel Table1 met de berekende kolom c gedefinieerd als de som van de kolommen a en b. De sys.dm_sql_referenced_entities weergave wordt dan geroepen. De weergave geeft twee rijen terug, één voor elke kolom die in de berekende kolom is gedefinieerd.

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  

Hier is het resultatenoverzicht.

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

D. Retourneren van niet-schema-gebonden kolomafhankelijkheden

Het volgende voorbeeld dropt Table1 en creëert Table2 en opgeslagen procedure Proc1. De procedure verwijst Table2 naar de niet-bestaande tabel Table1. De view sys.dm_sql_referenced_entities wordt uitgevoerd met de opgeslagen procedure gespecificeerd als de referentie-entiteit. De resultaatset toont één rij voor Table1 en 3 rijen voor Table2. Omdat Table1 niet bestaat, kunnen de kolomafhankelijkheden niet worden opgelost en wordt fout 2020 teruggegeven. De is_all_columns_found kolom geeft 0 terug om Table1 aan te geven dat er kolommen waren die niet ontdekt konden worden.

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  

Hier is het resultatenoverzicht.

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. Dynamisch afhankelijkheidsonderhoud aantonen

Dit voorbeeld E gaat ervan uit dat voorbeeld D is uitgevoerd. Voorbeeld E laat zien dat afhankelijkheden dynamisch worden onderhouden. Het voorbeeld doet het volgende:

  1. Maakt opnieuw aan, Table1wat in Voorbeeld D is weggelaten.
  2. Run Then sys.dm_sql_referenced_entities wordt opnieuw uitgevoerd met de opgeslagen procedure gespecificeerd als de referentie-entiteit.

De resultaatset toont aan dat beide tabellen, en hun respectievelijke kolommen gedefinieerd in de opgeslagen procedure, worden teruggegeven. Daarnaast geeft de is_all_columns_found kolom een 1 terug voor alle objecten en kolommen.

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  

Hier is het resultatenoverzicht.

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. Terugkerend gebruik van objecten of kolommen

Het volgende voorbeeld geeft de objecten en kolomafhankelijkheden van de opgeslagen procedure HumanResources.uspUpdateEmployeePersonalInfoterug. Deze procedure werkt de kolommen NationalIDNumber, BirthDate,``MaritalStatus, en Gender van de Employee tabel bij op basis van een gespecificeerde BusinessEntityID waarde. Een andere opgeslagen procedure upsLogError wordt gedefinieerd in een TRY... CATCH-blok om eventuele uitvoeringsfouten vast te leggen. De is_selected, is_updated, en is_select_all kolommen geven informatie terug over hoe deze objecten en kolommen binnen het referentieobject worden gebruikt. De tabel en kolommen die zijn aangepast worden aangegeven met een 1 in de is_updated kolom. De BusinessEntityID kolom is alleen geselecteerd en de opgeslagen procedure uspLogError wordt noch geselecteerd noch gewijzigd.

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')
;

Hier is het resultatenoverzicht.

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

Zie ook

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