Megosztás a következőn keresztül:


sys.dm_sql_referenced_entities (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Minden felhasználó által definiált entitáshoz egy sort ad vissza, amelyet a megadott hivatkozási entitás definíciójában az SQL Server definíciójában név szerint hivatkoznak. Két entitás közötti függőség akkor jön létre, amikor egy felhasználó által definiált entitás, az úgynevezett hivatkozott entitás, név szerint megjelenik egy másik felhasználó által definiált entitás, az úgynevezett referencia entitás, egy SQL kifejezőben megmaradva. Például, ha egy tárolt eljárás a megadott hivatkozási entitás, ez a függvény visszaadja az összes felhasználó által definiált entitást, amely a tárolt eljárásban hivatkozik, például táblákat, nézeteket, felhasználódefiniált típusokat (UDT-k) vagy más tárolt eljárásokat.

Ezt a dinamikus menedzsment funkciót használhatod a következő típusú entitásokról, amelyeket a megadott hivatkozási entitás hivatkoz, jelentést készíthetsz:

  • Séma-kötött entitások

  • Nem séma-kötött entitások

  • Adatbázis- és szerverre-ellen működő entitások

  • Oszlopszintű függőségek sémához kötött és nem séma-kötött entitásokhoz

  • Felhasználó által definiált típusok (alias és CLR UDT)

  • XML-sémagyűjtemények

  • Partíciófüggvények

Szemantika

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
Ez a hivatkozó entitás neve. schema_name szükséges, ha a hivatkozó osztály OBJECT.

schema_name.referencing_entity_namenvarchar(517).

<referencing_class> ::= { OBJEKTUM | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Az adott referenciaentitás osztálya. Egy állításhoz csak egy osztály lehet megadni.

<referencing_class>nvarchar(60).

Visszaadott tábla

Oszlop név Adattípus Description
referencing_minor_id int Oszlopazonosító, ha a hivatkozó entitás oszlop; egyébként 0. Nem lehet null értékű.
referenced_server_name sysname A hivatkozott entitás szerverének neve.

Ez az oszlop szerverek közötti függőségekhez van feltöltve, amelyeket érvényes négyrészes név megjelölésével hoznak létre. A többrészes nevekről információért lásd Transact-SQL szintaxiskonvenciókat.

NULL olyan nem séma-függőségeknél, amelyekhez az entitást négyrészes név megadása nélkül hivatkozták.

NULL a séma-kötött entitások esetén, mert ugyanabban az adatbázisban kell lennie, ezért csak kétrészes (séma.objektum) néven definiálhatók.
referenced_database_name sysname A hivatkozott entitás adatbázisának neve.

Ez az oszlop az adatbázisok vagy szerverek közötti hivatkozások számára van töltve, amelyeket egy érvényes, három- vagy négyrészes név megadásával készítenek.

NULL a nem séma-kötött hivatkozásokhoz, ha egy- vagy kétrészes néven van megadva.

NULL a séma-kötött entitások esetén, mert ugyanabban az adatbázisban kell lennie, ezért csak kétrészes (séma.objektum) néven definiálhatók.
referenced_schema_name sysname Séma, amelybe a hivatkozott entitás tartozik.

NULL nem séma-kötött hivatkozásokhoz, amelyekben az entitást a séma név megadása nélkül használták.

Soha ne NULL legyen a sémához kötött hivatkozásokhoz.
referenced_entity_name sysname A hivatkozott entitás neve. Nem lehet null értékű.
referenced_minor_name sysname Oszlop neve, ha a hivatkozott entitás oszlop; egyébként NULL. Például referenced_minor_name NULL abban a sorban, amely magát a hivatkozott entitást tartalmazza.

A hivatkozott entitás olyan oszlop, amikor egy oszlopot név szerint azonosítanak a hivatkozó entitásban, vagy amikor az anya-entitást egy SELECT * utasításban használják.
referenced_id int A hivatkozott entitás azonosítója. Ha referenced_minor_id nem 0, akkor az referenced_id az entitás, amelyben az oszlop definiált.

Mindig NULL a szerverek közötti hivatkozásokhoz.

NULL az adatbázis-kereszthivatkozásokhoz, amikor az azonosító nem határozható meg, mert az adatbázis offline vagy az entitás nem köthető be.

NULL az adatbázison belüli hivatkozásokhoz, ha az azonosító nem határozható meg. Nem séma-függő hivatkozások esetén az azonosító nem oldható meg, ha a hivatkozott entitás nem létezik az adatbázisban, vagy ha a név feloldása hívótól függ. Az utóbbi esetben is_caller_dependent 1-re van beállítva.

Soha ne NULL legyen a sémához kötött hivatkozásokhoz.
referenced_minor_id int Oszlopazonosító, ha a hivatkozott entitás oszlop; egyébként 0. Például referenced_minor_is 0 abban a sorban, amely magát a hivatkozott entitást tartalmazza.

Nem séma-kötött hivatkozások esetén az oszlopfüggőségeket csak akkor jelentik, ha minden hivatkozott entitás korlátozható. Ha bármely hivatkozott entitás nem lehet korlátozható, akkor nem jelentenek oszlopszintű függőséget, és referenced_minor_id 0. Lásd a D példát.
referenced_class tinyint Az említett entitás osztálya.

1 = Objektum vagy oszlop

6 = Típus

10 = XML sémagyűjtemény

21 = Partíciós függvény
referenced_class_desc nvarchar(60) A hivatkozott entitás osztályának leírása.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Jelzi, hogy a hivatkozott entitás sémakötése futásidőben történik; ezért az entitás azonosítójának feloldása a hívó sémájától függ. Ez akkor fordul elő, ha a hivatkozott entitás egy tárolt eljárás, kiterjesztett tárolt eljárás vagy egy EXECUTE utasításon belül meghívott felhasználó által definiált függvény.

1 = A hivatkozott entitás hívófüggő, és futásidőben oldódik. Ebben az esetben referenced_id NULL.

0 = A hivatkozott entitásazonosító nem függ a hívótól. Mindig 0 a séma-kötött hivatkozásoknál, valamint az adatbázis- és szerverek közötti hivatkozásoknál, amelyek kifejezetten megadják a séma nevet. Például egy entitásra vonatkozó hivatkozás a formátumban EXEC MyDatabase.MySchema.MyProc nem hívótól függ. Azonban a formátumban EXEC MyDatabase..MyProc szereplő hivatkozás hívótól függ.
is_ambiguous bit Azt jelzi, hogy a hivatkozás kétértelmű, és futásidőben megoldható egy felhasználó által definiált függvényre, egy felhasználódefiniált típusra (UDT) vagy egy xquery hivatkozásra egy xml típusú oszlopra. Például tegyük fel, hogy az állítás SELECT Sales.GetOrder() FROM Sales.MySales egy tárolt eljárásban van definiálva. Amíg a tárolt eljárás el nem hajtják végre, nem tudni, hogy a sémában felhasználó által definiált függvény van-e Sales.GetOrder() vagy UDT típusú oszlopSales, amelynek nevű metódusa GetOrder().Sales

1 = Egy felhasználó által definiált függvényre vagy oszlop felhasználó-definiált típusra (UDT) való hivatkozás kétértelmű.

0 = A hivatkozás egyértelmű, vagy az entitás sikeresen korlátozható, amikor a függvényt meghívják.

Mindig 0 a sémákhoz kötött hivatkozásoknál.
is_selected bit 1 = A tárgy vagy oszlop ki van választva.
is_updated bit 1 = Az objektum vagy oszlop módosított.
is_select_all bit 1 = Az objektumot egy SELECT * klauzulában használják (csak objektum szinten).
is_all_columns_found bit 1 = Az objektum összes oszlopfüggősége megtalálható.

0 = Az objektum oszlopfüggőségei nem voltak megtalálhatók.
is_insert_all bit 1 = Az objektum egy INSERT utasításban jelenik meg oszloplista nélkül (csak objektum szinten).

Ezt az oszlopot az SQL Server 2016-ban adták fel.
is_incomplete bit 1 = Az objektum vagy oszlop kötési hibát mutat be, és hiányos.

Ezt az oszlopot az SQL Server 2016 SP2-ben adták fel.

Exceptions

Üres eredményhalmazt ad vissza az alábbi feltételek bármelyike esetén:

  • Rendszerobjektum van megadva.

  • A megadott entitás nem létezik a jelenlegi adatbázisban.

  • A megadott entitás nem hivatkozik semmilyen entitásra.

  • Egy érvénytelen paramétert továbbítunk.

Hibát ad vissza, ha a megadott hivatkozási entitás számozott tárolt eljárás.

A 2020-as hibát adja vissza, ha az oszlopfüggőségek nem oldhatók meg. Ez a hiba nem akadályozza meg a lekérdezést abban, hogy objektumszintű függőségeket adjon vissza.

Megjegyzések

Ez a függvény bármely adatbázis kontextusában végrehajtható, hogy visszaadja azokat az entitásokat, amelyek egy szerverszintű DDL triggerre hivatkoznak.

Az alábbi táblázat felsorolja azokat az entitástípusokat, amelyekhez a függőségi információkat hozják létre és karbantartják. Függőségi információkat nem hoznak létre vagy karbantartanak szabályokhoz, alapértelmezettekhez, ideiglenes táblákhoz, ideiglenes tárolt eljárásokhoz vagy rendszerobjektumokhoz.

Entitástípus Referencing entity Hivatkozott entitás
Táblázat Igen* Igen
View Igen Igen
Transact-SQL tárolt eljárás** Igen Igen
CLR tárolt eljárás Nem Igen
Transact-SQL felhasználó által definiált függvény Igen Igen
CLR felhasználó által definiált függvény Nem Igen
CLR trigger (DML és DDL) Nem Nem
Transact-SQL DML trigger Igen Nem
Transact-SQL adatbázis-szintű DDL trigger Igen Nem
Transact-SQL szerver szintű DDL trigger Igen Nem
Kiterjesztett tárolt eljárások Nem Igen
Várólista Nem Igen
Szinonima Nem Igen
Típus (alias és CLR felhasználó által definiált típus) Nem Igen
XML séma gyűjtemény Nem Igen
Partíciós függvény Nem Igen

* Egy táblázatot csak akkor követnek referenciaentitásként, ha egy Transact-SQL modulra, felhasználó által definiált típusra vagy XML sémagyűjteményre hivatkozik egy számított oszlop, CHECK korlátozás vagy DEFAULT korlátozás definíciójában.

** Az egész szám értékű 1-nél nagyobb számú tárolt eljárásokat nem követik sem hivatkozó, sem hivatkozott entitásként.

Permissions

SELECT engedélyre van szükség a sys.dm_sql_referenced_entities-hez és VIEW DEFINITION engedélyre a hivatkozó entitáson. Alapértelmezés szerint a SELECT engedély nyilvános. View DEFINITION-engedély szükséges az adatbázishoz vagy az ALTER DATABASE DDL TRIGGER engedélyéhez az adatbázisban, ha a hivatkozási entitás adatbázisszintű DDL-eseményindító. A VIEW ANY DEFINITION engedélyre van szükség a kiszolgálón, ha a hivatkozási entitás kiszolgálószintű DDL-trigger.

Példák

A. Olyan entitások, amelyeket adatbázis-szintű DDL trigger hivatkoz vissza

A következő példa adja vissza azokat az entitásokat (táblákat és oszlopokat), amelyeket az adatbázis-szintű DDL trigger ddlDatabaseTriggerLoghivatkoz.

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. Vissza olyan entitások, amelyeket egy objektum hivatkozik

A következő példa adja vissza azokat az entitásokat, amelyeket a felhasználó által definiált függvény dbo.ufnGetContactInformationhivatkozik .

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. Vissza oszlopfüggőségek

A következő példa létrehozza a táblázatot Table1 , amelynek kiszámított oszlopa ca oszlopok és baz összessége alapján definiálja. A sys.dm_sql_referenced_entities kilátás ekkor szól. A nézet két sort ad vissza, egyet minden oszlophoz, amely a számított oszlopban definiált.

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  

Itt van az eredmények összessége.

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

D. Nem séma-kötött oszlopfüggőségek visszaadása

A következő példa eldobja Table1 , létrehozza Table2 és tárolja az eljárást Proc1. Az eljárás hivatkozásai Table2 és a nem létező tábla Table1. A nézetet sys.dm_sql_referenced_entities a tárolt eljárás a hivatkozó entitásként jelölve futtatják. Az eredményhalmaz egy sort és Table1 3 sort mutatja .Table2 Mivel Table1 nem létezik, az oszlopfüggőségek nem oldhatók meg, és a 2020-as hiba visszatér. Az is_all_columns_found oszlop 0-t ad vissza, jelezve Table1 , hogy voltak olyan oszlopok, amelyeket nem lehetett felfedezni.

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  

Itt van az eredmények összessége.

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. Dinamikus függőségfenntartás bemutatása

Ez az E példa feltételezi, hogy D példát lefuttatták. Az E példa azt mutatja, hogy a függőségek dinamikusan fennmaradnak. A példa a következőket teszi el:

  1. Újrateremti Table1, amit a D példában hagytak ki.
  2. A Run Then sys.dm_sql_referenced_entities újra fut, a tárolt eljárást jelölve referencia entitásként.

Az eredményhalmaz azt mutatja, hogy mindkét tábla és a tárolt eljárásban meghatározott oszlopok visszakerülnek. Ezen felül az is_all_columns_found oszlop minden objektumra és oszlopra 1-et ad vissza.

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  

Itt van az eredmények összessége.

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. Objektum- vagy oszlophasználat visszaküldése

A következő példa adja vissza a tárolt eljárás HumanResources.uspUpdateEmployeePersonalInfoobjektumait és oszlopfüggőségét. Ez az eljárás frissíti NationalIDNumbera tábla oszlopait , BirthDate,``MaritalStatus, és GenderEmployee egy meghatározott BusinessEntityID érték alapján. Egy másik tárolt eljárás upsLogError egy TRY-ben van definiálva... CATCH blokk, hogy rögzítse az esetleges végrehajtási hibákat. Az is_selected, is_updated, és is_select_all oszlopok információt adnak arról, hogyan használják ezeket az objektumokat és oszlopokat a hivatkozási objektumon belül. A módosított táblázatot és oszlopokat egy 1-es jelzéssel jelölik a is_updated oszlopban. Az BusinessEntityID oszlopot csak kiválasztják, és a tárolt eljárást uspLogError sem kiválasztják, sem módosítják.

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

Itt van az eredmények összessége.

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

Lásd még:

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