Udostępnij za pomocą


sys.dm_sql_referenced_entities (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Zwraca jeden wiersz dla każdej jednostki zdefiniowanej przez użytkownika, która jest odwołana nazwą w definicji określonej jednostki referencyjnej w SQL Server. Zależność między dwoma podmiotami powstaje, gdy jedna jednostka zdefiniowana przez użytkownika, zwana cytowanym podmiotem, pojawia się z nazwy w trwałym wyrażeniu SQL innej jednostki zdefiniowanej przez użytkownika, zwanej encją referencyjną. Na przykład, jeśli procedura przechowywana jest określoną encją referencyjną, funkcja ta zwraca wszystkie jednostki zdefiniowane przez użytkownika, które są referencjonowane w procedurze przechowywanej, takie jak tabele, widoki, typy zdefiniowane przez użytkownika (UDT) lub inne procedury przechowywane.

Możesz użyć tej dynamicznej funkcji zarządzania do raportowania następujących typów encji odwołanych przez określony podmiot referencyjny:

  • Podmioty związane ze schematem

  • Podmioty niezwiązane ze schematem

  • Podmioty międzybazowe i serwerowe

  • Zależności na poziomie kolumn dla jednostek powiązanych ze schematem i niepowiązanych ze schematem

  • Typy definiowane przez użytkownika (alias i CLR UDT)

  • Kolekcje schematów XML

  • Funkcje partycji

Składnia

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
To nazwa podmiotu odwołującego się. schema_name jest wymagane, gdy klasą odwołującą jest OBJECT.

schema_name.referencing_entity_name to nvarchar(517).

<referencing_class> ::= { OBIEKT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Jest klasą określonego podmiotu referencyjnego. Na każde zdanie można określić tylko jedną klasę.

<referencing_class> to nvarchar(60).

Zwracana tabela

Nazwa kolumny Typ danych Description
referencing_minor_id int Identyfikator kolumny, gdy jednostką odwołującą jest kolumna; w przeciwnym razie 0. Nie jest nullowalny.
referenced_server_name sysname Nazwa serwera danej jednostki.

Ta kolumna jest wypełniana dla zależności międzyserwerowych, które powstają poprzez podanie poprawnej czteroczęściowej nazwy. Aby uzyskać informacje o nazwach wieloczęściowych, zobacz Transact-SQL konwencje składniowe.

NULL dla zależności niezwiązanych ze schematem, dla których jednostka była odwoływana bez podania czteroczęściowej nazwy.

NULL dla jednostek powiązanych ze schematem, ponieważ muszą znajdować się w tej samej bazie danych i dlatego mogą być definiowane tylko za pomocą dwuczęściowej nazwy (schema.object).
referenced_database_name sysname Nazwa bazy danych cytowanego podmiotu.

Ta kolumna jest wypełniana dla odniesień między bazami danych lub serwerami, które są tworzone przez podanie ważnej nazwy trzy- lub czteroczęściowej.

NULL dla odniesień niezwiązanych ze schematem, gdy określano je z nazwą jednoczęściową lub dwuczęściową.

NULL dla jednostek powiązanych ze schematem, ponieważ muszą znajdować się w tej samej bazie danych i dlatego mogą być definiowane tylko za pomocą dwuczęściowej nazwy (schema.object).
referenced_schema_name sysname Schemat, do którego należy dana jednostka.

NULL dla odniesień niezwiązanych ze schematem, w których dana encja była odwoływana bez podania nazwy schematu.

Nigdy nie używaj NULL dla odniesień związanych ze schematem.
referenced_entity_name sysname Nazwa wspomnianej jednostki. Nie jest nullowalny.
referenced_minor_name sysname Nazwa kolumny, gdy cytowana jednostka jest kolumną; w przeciwnym razie NULL. Na przykład referenced_minor_name jest NULL w wierszu, który wymienia samą cytowaną jednostkę.

Jednostka referencyjna to kolumna, gdy kolumna jest identyfikowana nazwą w encji referencyjnej lub gdy jednostka nadająca jest używana w instrukcji SELECT *.
referenced_id int Identyfikator cytowanego podmiotu. Gdy referenced_minor_id nie jest 0, referenced_id jest jednostką, w której kolumna jest zdefiniowana.

Zawsze NULL dla referencji między serwerami.

NULL dla odniesień między bazami danych, gdy ID nie może być ustalony, ponieważ baza jest offline lub jednostka nie może być ograniczona.

NULL dla odniesień w bazie danych, jeśli nie można ustalić ID. W przypadku referencji niezwiązanych ze schematem ID nie może zostać rozwiązany, gdy dana jednostka nie istnieje w bazie danych lub gdy rozwiązywanie nazw zależy od wywołującego. W tym drugim przypadku is_caller_dependent jest ustawione na 1.

Nigdy nie używaj NULL dla odniesień związanych ze schematem.
referenced_minor_id int Identyfikator kolumny, gdy referencjonowany podmiot jest kolumną; w przeciwnym razie 0. Na przykład referenced_minor_is jest 0 w wierszu, który wymienia samą cytowaną jednostkę.

Dla odniesień niezwiązanych ze schematem zależności kolumnowe są raportowane tylko wtedy, gdy wszystkie odwoływane jednostki mogą być ograniczone. Jeśli żadnej jednostki przypisanej nie można ograniczyć, nie są raportowane zależności na poziomie kolumn i referenced_minor_id wynosi 0. Zobacz przykład D.
referenced_class tinyint Klasa cytowanego bytu.

1 = Obiekt lub kolumna

6 = typ

10 = Kolekcja schematów XML

21 = Funkcja podziału
referenced_class_desc nvarchar(60) Opis klasy cytowanego bytu.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Wskazuje, że wiązanie schematu dla danej jednostki następuje w czasie działania; dlatego rozwiązywanie identyfikatora jednostki zależy od schematu wywołującego. Dzieje się tak, gdy cytowana jednostka jest procedurą przechowywaną, rozszerzoną procedurą przechowywaną lub funkcją zdefiniowaną przez użytkownika wywołaną w instrukcji EXEKUTE.

1 = Referencjonowany podmiot zależy od wywołującego i jest rozwiązywany w czasie działania. W tym przypadku referenced_id jest NULL.

0 = Identyfikator podmiotu do którego się odwołuje nie zależy od wywołującego. Zawsze 0 dla referencji powiązanych ze schematem oraz dla referencji między bazami danych i serwerami, które wyraźnie określają nazwę schematu. Na przykład odwołanie do jednostki w formacie EXEC MyDatabase.MySchema.MyProc nie zależy od wywołującego. Jednak odniesienie w formacie EXEC MyDatabase..MyProc zależy od wywołującego.
is_ambiguous bit Wskazuje, że referencja jest niejednoznaczna i może w czasie działania rozpoznać funkcję zdefiniowaną przez użytkownika, typ zdefiniowany przez użytkownika (UDT) lub referencję xquery do kolumny typu xml. Na przykład, załóżmy, że zdanie SELECT Sales.GetOrder() FROM Sales.MySales jest zdefiniowane w procedurze przechowywanej. Dopóki procedura przechowywana nie zostanie wykonana, nie wiadomo, czy Sales.GetOrder() jest funkcją zdefiniowaną przez użytkownika w schemacie Sales , czy kolumną o nazwie Sales typu UDT z metodą o nazwie GetOrder().

1 = Odniesienie do funkcji zdefiniowanej przez użytkownika lub metody typu użytkownika (UDT) jest niejednoznaczne.

0 = Odniesienie jest jednoznaczne lub jednostka może być skutecznie ograniczona, gdy funkcja jest wywołana.

Zawsze 0 dla odniesień powiązanych ze schematem.
is_selected bit 1 = Obiekt lub kolumna jest wybierana.
is_updated bit 1 = Obiekt lub kolumna jest modyfikowana.
is_select_all bit 1 = Obiekt jest używany w klauzuli SELECT * (tylko na poziomie obiektu).
is_all_columns_found bit 1 = Wszystkie zależności kolumn dla obiektu można było znaleźć.

0 = Zależności kolumn dla obiektu nie zostały znalezione.
is_insert_all bit 1 = Obiekt jest używany w instrukcji INSERT bez listy kolumn (tylko na poziomie obiektu).

Ta kolumna została dodana w SQL Server 2016.
is_incomplete bit 1 = Obiekt lub kolumna ma błąd wiązania i jest niepełna.

Ta kolumna została dodana w SQL Server 2016 SP2.

Exceptions

Zwraca pusty zbiór wyników pod dowolnymi z następujących warunków:

  • Określany jest obiekt systemowy.

  • Wskazana jednostka nie istnieje w aktualnej bazie danych.

  • Określony podmiot nie odnosi się do żadnych podmiotów.

  • Przekazywany jest nieprawidłowy parametr.

Zwraca błąd, gdy wskazana jednostka referencyjna jest numerowaną procedurą przechowywaną.

Zwraca błąd 2020, gdy zależności kolumn nie mogą zostać rozwiązane. Ten błąd nie uniemożliwia zapytania zwracania zależności na poziomie obiektowym.

Uwagi

Funkcja ta może być wykonywana w kontekście dowolnej bazy danych, aby zwracać jednostki odwołujące się do wyzwalacza DDL na poziomie serwera.

Poniższa tabela przedstawia typy podmiotów, dla których tworzone i utrzymywane są informacje zależności. Informacje o zależności nie są tworzone ani utrzymywane dla reguł, domyślnych, tabel tymczasowych, procedur tymczasowych przechowywanych ani obiektów systemowych.

Typ encji Jednostka odwołująca Podmiot referencyjny
Tabela Tak* Tak
View Tak Tak
Transact-SQL procedura przechowywana** Tak Tak
Procedura przechowywana CLR Nie. Tak
Transact-SQL funkcja definiowana przez użytkownika Tak Tak
Funkcja CLR zdefiniowana przez użytkownika Nie. Tak
Spust CLR (DML i DDL) Nie. Nie.
Transact-SQL wyzwalacz DML Tak Nie.
Transact-SQL wyzwalacz DDL na poziomie bazy danych Tak Nie.
Transact-SQL wyzwalacz DDL na poziomie serwera Tak Nie.
Rozszerzone procedury składowane Nie. Tak
Kolejka Nie. Tak
Synonim Nie. Tak
Typ (alias i CLR zdefiniowany przez użytkownika) Nie. Tak
Kolekcja schematów XML Nie. Tak
Funkcja podziału Nie. Tak

* Tabela jest śledzona jako encja referencyjna tylko wtedy, gdy odnosi się do modułu Transact-SQL, typu zdefiniowanego przez użytkownika lub kolekcji schematów XML w definicji obliczonej kolumny, ograniczenia CHECK lub ograniczenia DEFAULT.

** Numerowane procedury przechowywane o liczbie całkowitej większej niż 1 nie są śledzone ani jako jednostka referencyjna, ani referencyjna.

Permissions

Wymaga uprawnień SELECT dla sys.dm_sql_referenced_entities oraz uprawnień VIEW DEFINITION dla obiektu odwołującego się. Domyślnie uprawnienie SELECT jest przyznawane publicznie. Wymaga uprawnienia VIEW DEFINITION w bazie danych lub uprawnienia ALTER DATABASE DDL TRIGGER w bazie danych, gdy jednostka odwołująca się jest wyzwalaczem DDL na poziomie bazy danych. Wymaga uprawnienia WYŚWIETL DOWOLNĄ DEFINICJĘ na serwerze, gdy jednostka odwołująca się jest wyzwalaczem DDL na poziomie serwera.

Przykłady

A. Zwraca jednostki odwoływane przez wyzwalacz DDL na poziomie bazy danych

Poniższy przykład zwraca jednostki (tabele i kolumny), do których odwołuje się wyzwalacz ddlDatabaseTriggerLogDDL na poziomie bazy danych.

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. Zwracają jednostki odwoływane przez obiekt

Poniższy przykład zwraca jednostki odwołane przez funkcję dbo.ufnGetContactInformationzdefiniowaną przez użytkownika .

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. Zależności kolumn zwrotu

Poniższy przykład tworzy tabelę Table1 z obliczoną kolumną c zdefiniowaną jako sumę kolumn a i b. Następnie sys.dm_sql_referenced_entities wywołuje się widok. Widok zwraca dwa wiersze, po jednym dla każdej kolumny zdefiniowanej w obliczonej kolumnie.

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  

Oto zestaw wyników.

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

D. Zwracanie zależności kolumn niezwiązanych ze schematem

Poniższy przykład zawiera i Table2 tworzy Table1 oraz zapisuje procedurę Proc1. Procedura odnosi się Table2 do nieistniejącej tabeli Table1. Widok sys.dm_sql_referenced_entities jest uruchamiany z procedurą przechowywaną określoną jako encja referencyjna. Zbiór wyników pokazuje jeden wiersz dla Table1 i 3 wiersze dla Table2. Ponieważ Table1 nie istnieje, zależności kolumn nie mogą zostać rozwiązane i zwracany jest błąd 2020. Kolumna is_all_columns_found zwraca 0, wskazując, Table1 że istniały kolumny, których nie można było odkryć.

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  

Oto zestaw wyników.

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. Demonstracja dynamicznego utrzymania zależności

Ten przykład E zakłada, że Przykład D został uruchomiony. Przykład E pokazuje, że zależności są utrzymywane dynamicznie. Przykład robi następujące rzeczy:

  1. odtwarza Table1, co zostało usunięte w Przykładzie D.
  2. Run Następnie sys.dm_sql_referenced_entities uruchamia się ponownie z procedurą przechowywaną określoną jako encja referencyjna.

Zbiór wyników pokazuje, że obie tabele oraz ich kolumny zdefiniowane w procedurze przechowywanej są zwracane. Dodatkowo kolumna is_all_columns_found zwraca 1 dla wszystkich obiektów i kolumn.

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  

Oto zestaw wyników.

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. Zwracanie użycia obiektów lub kolumn

Poniższy przykład zwraca obiekty i zależności kolumnowe procedury HumanResources.uspUpdateEmployeePersonalInfoprzechowywanej . Procedura ta aktualizuje NationalIDNumberkolumny , BirthDate,``MaritalStatus, oraz GenderEmployee tabeli na podstawie określonej BusinessEntityID wartości. Inna procedura upsLogError przechowywana jest zdefiniowana w TRY... CATCH blokuję do rejestrowania błędów wykonywania. Kolumny is_selected, is_updated, i is_select_all zwracają informacje o tym, jak te obiekty i kolumny są używane w obiekcie odwołującym się. Tabela i kolumny, które są modyfikowane, oznaczone są literą 1 w kolumnie is_updated. Kolumna BusinessEntityID jest tylko wybierana, a procedura uspLogError przechowywana nie jest ani wybierana, ani modyfikowana.

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

Oto zestaw wyników.

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

Zobacz też

sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_zależności wyrażeń (Transact-SQL)