sys.dm_sql_referenced_entities (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Mengembalikan satu baris untuk setiap entitas yang ditentukan pengguna yang dirujuk berdasarkan nama dalam definisi entitas referensi yang ditentukan di SQL Server. Dependensi antara dua entitas dibuat ketika satu entitas yang ditentukan pengguna, yang disebut entitas yang direferensikan, muncul berdasarkan nama dalam ekspresi SQL yang bertahan dari entitas lain yang ditentukan pengguna, yang disebut entitas referensi. Misalnya, jika prosedur tersimpan adalah entitas referensi yang ditentukan, fungsi ini mengembalikan semua entitas yang ditentukan pengguna yang dirujuk dalam prosedur tersimpan seperti tabel, tampilan, jenis yang ditentukan pengguna (UDT), atau prosedur tersimpan lainnya.

Anda dapat menggunakan fungsi manajemen dinamis ini untuk melaporkan jenis entitas berikut yang dirujuk oleh entitas referensi yang ditentukan:

  • Entitas terikat skema

  • Entitas yang tidak terikat skema

  • Entitas lintas database dan lintas server

  • Dependensi tingkat kolom pada entitas yang terikat skema dan tidak terikat skema

  • Jenis yang ditentukan pengguna (alias dan CLR UDT)

  • Koleksi skema XML

  • Fungsi partisi

Sintaks

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

Argumen

[ schema_name . ] referencing_entity_name
Adalah nama entitas referensi. schema_name diperlukan saat kelas referensi adalah OBJECT.

schema_name.referencing_entity_name adalah nvarchar(517).

<> referencing_class ::= { OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Adalah kelas entitas referensi yang ditentukan. Hanya satu kelas yang dapat ditentukan per pernyataan.

<> referencing_class adalah nvarchar(60).

Tabel Dikembalikan

Nama kolom Jenis data Deskripsi
referencing_minor_id int ID Kolom saat entitas referensi adalah kolom; jika tidak, 0. Tidak dapat diubah ke null.
referenced_server_name nama sysname Nama server entitas yang dirujuk.

Kolom ini diisi untuk dependensi lintas server yang dibuat dengan menentukan nama empat bagian yang valid. Untuk informasi tentang nama multipihak, lihat Konvensi sintaks transact-SQL.

NULL untuk dependensi yang tidak terikat skema yang entitasnya dirujuk tanpa menentukan nama empat bagian.

NULL untuk entitas yang terikat skema karena harus berada dalam database yang sama dan oleh karena itu hanya dapat ditentukan menggunakan nama dua bagian (skema.object).
referenced_database_name nama sysname Nama database entitas yang dirujuk.

Kolom ini diisi untuk referensi lintas database atau lintas server yang dibuat dengan menentukan nama tiga bagian atau empat bagian yang valid.

NULL untuk referensi yang tidak terikat skema saat ditentukan menggunakan nama satu bagian atau dua bagian.

NULL untuk entitas yang terikat skema karena harus berada dalam database yang sama dan oleh karena itu hanya dapat ditentukan menggunakan nama dua bagian (skema.object).
referenced_schema_name nama sysname Skema tempat entitas yang dirujuk berada.

NULL untuk referensi yang tidak terikat skema di mana entitas dirujuk tanpa menentukan nama skema.

Jangan pernah NULL untuk referensi terikat skema.
referenced_entity_name nama sysname Nama entitas yang dirujuk. Tidak dapat diubah ke null.
referenced_minor_name nama sysname Nama kolom saat entitas yang dirujuk adalah kolom; jika tidak, NULL. Misalnya, referenced_minor_name adalah NULL dalam baris yang mencantumkan entitas yang dirujuk itu sendiri.

Entitas yang direferensikan adalah kolom ketika kolom diidentifikasi berdasarkan nama di entitas referensi, atau ketika entitas induk digunakan dalam pernyataan SELECT * .
referenced_id int ID entitas yang dirujuk. Saat referenced_minor_id bukan 0, referenced_id adalah entitas tempat kolom ditentukan.

Selalu NULL untuk referensi lintas server.

NULL untuk referensi lintas database ketika ID tidak dapat ditentukan karena database offline atau entitas tidak dapat terikat.

NULL untuk referensi dalam database jika ID tidak dapat ditentukan. Untuk referensi yang tidak terikat skema, ID tidak dapat diselesaikan ketika entitas yang dirujuk tidak ada dalam database atau ketika resolusi nama bergantung pada pemanggil. Dalam kasus terakhir, is_caller_dependent diatur ke 1.

Jangan pernah NULL untuk referensi terikat skema.
referenced_minor_id int ID Kolom saat entitas yang dirujuk adalah kolom; jika tidak, 0. Misalnya, referenced_minor_is adalah 0 dalam baris yang mencantumkan entitas yang dirujuk itu sendiri.

Untuk referensi yang tidak terikat skema, dependensi kolom hanya dilaporkan ketika semua entitas yang direferensikan dapat terikat. Jika ada entitas yang direferensikan tidak dapat diikat, tidak ada dependensi tingkat kolom yang dilaporkan dan referenced_minor_id adalah 0. Lihat Contoh D.
referenced_class kecil Kelas entitas yang dirujuk.

1 = Objek atau kolom

6 = Jenis

10 = Koleksi skema XML

21 = Fungsi partisi
referenced_class_desc nvarchar(60) Deskripsi kelas entitas yang dirujuk.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Menunjukkan pengikatan skema untuk entitas yang dirujuk terjadi pada waktu proses; oleh karena itu, resolusi ID entitas tergantung pada skema pemanggil. Ini terjadi ketika entitas yang direferensikan adalah prosedur tersimpan, prosedur tersimpan yang diperluas, atau fungsi yang ditentukan pengguna yang disebut dalam pernyataan EXECUTE.

1 = Entitas yang dirujuk bergantung pada pemanggil dan diselesaikan pada waktu proses. Dalam hal ini, referenced_id NULL.

0 = ID entitas yang dirujuk bukan dependen penelepon. Selalu 0 untuk referensi terikat skema dan untuk referensi lintas database dan lintas server yang secara eksplisit menentukan nama skema. Misalnya, referensi ke entitas dalam format EXEC MyDatabase.MySchema.MyProc bukan dependen penelepon. Namun, referensi dalam format EXEC MyDatabase..MyProc adalah dependen penelepon.
is_ambiguous bit Menunjukkan referensi ambigu dan dapat diselesaikan pada waktu proses ke fungsi yang ditentukan pengguna, jenis yang ditentukan pengguna (UDT), atau referensi xquery ke kolom jenis xml. Misalnya, asumsikan pernyataan SELECT Sales.GetOrder() FROM Sales.MySales didefinisikan dalam prosedur tersimpan. Hingga prosedur tersimpan dijalankan, tidak diketahui apakah Sales.GetOrder() itu fungsi yang ditentukan pengguna dalam Sales skema atau kolom bernama Sales jenis UDT dengan metode bernama GetOrder().

1 = Referensi ke fungsi yang ditentukan pengguna atau metode jenis yang ditentukan pengguna (UDT) bersifat ambigu.

0 = Referensi tidak ambigu atau entitas dapat berhasil terikat saat fungsi dipanggil.

Selalu 0 untuk referensi terikat skema.
is_selected bit 1 = Objek atau kolom dipilih.
is_updated bit 1 = Objek atau kolom dimodifikasi.
is_select_all bit 1 = Objek digunakan dalam klausa SELECT * (hanya tingkat objek).
is_all_columns_found bit 1 = Semua dependensi kolom untuk objek dapat ditemukan.

0 = Dependensi kolom untuk objek tidak dapat ditemukan.
is_insert_all bit 1 = Objek digunakan dalam pernyataan INSERT tanpa daftar kolom (hanya tingkat objek).

Kolom ini ditambahkan di SQL Server 2016.
is_incomplete bit 1 = Objek atau kolom memiliki kesalahan pengikatan dan tidak lengkap.

Kolom ini ditambahkan di SQL Server 2016 SP2.

Pengecualian

Mengembalikan tataan hasil kosong di bawah salah satu kondisi berikut:

  • Objek sistem ditentukan.

  • Entitas yang ditentukan tidak ada di database saat ini.

  • Entitas yang ditentukan tidak mereferensikan entitas apa pun.

  • Parameter yang tidak valid diteruskan.

Mengembalikan kesalahan ketika entitas referensi yang ditentukan adalah prosedur tersimpan bernomor.

Mengembalikan kesalahan 2020 ketika dependensi kolom tidak dapat diselesaikan. Kesalahan ini tidak mencegah kueri mengembalikan dependensi tingkat objek.

Keterangan

Fungsi ini dapat dijalankan dalam konteks database apa pun untuk mengembalikan entitas yang mereferensikan pemicu DDL tingkat server.

Tabel berikut mencantumkan jenis entitas yang informasi dependensinya dibuat dan dikelola. Informasi dependensi tidak dibuat atau dikelola untuk aturan, default, tabel sementara, prosedur tersimpan sementara, atau objek sistem.

Jenis entitas Entitas referensi Entitas yang dirujuk
Tabel Ya* Ya
Tampilan Ya Ya
Prosedur tersimpan T-SQL** Ya Ya
Prosedur tersimpan CLR Tidak Ya
Fungsi yang ditentukan pengguna Transact-SQL Ya Ya
Fungsi yang ditentukan pengguna CLR Tidak Ya
Pemicu CLR (DML dan DDL) Tidak Tidak
Pemicu DML T-SQL Ya Tidak
Pemicu DDL tingkat database Transact-SQL Ya Tidak
Pemicu DDL tingkat server Transact-SQL Ya Tidak
Prosedur tersimpan diperpanjang Tidak Ya
Antrean Tidak Ya
Sinonim Tidak Ya
Jenis (alias dan jenis yang ditentukan pengguna CLR) Tidak Ya
Koleksi skema XML Tidak Ya
Fungsi partisi Tidak Ya

* Tabel dilacak sebagai entitas referensi hanya ketika mereferensikan modul Transact-SQL, jenis yang ditentukan pengguna, atau koleksi skema XML dalam definisi kolom komputasi, batasan CHECK, atau batasan DEFAULT.

** Prosedur tersimpan bernomor dengan nilai bilangan bulat yang lebih besar dari 1 tidak dilacak sebagai entitas referensi atau referensi.

Izin

Memerlukan izin SELECT pada izin sys.dm_sql_referenced_entities dan VIEW DEFINITION pada entitas referensi. Secara default, izin SELECT diberikan kepada publik. Memerlukan izin LIHAT DEFINISI pada database atau izin UBAH PEMICU DDL DATABASE pada database saat entitas referensi adalah pemicu DDL tingkat database. Memerlukan izin LIHAT DEFINISI APA PUN di server saat entitas referensi adalah pemicu DDL tingkat server.

Contoh

J. Mengembalikan entitas yang dirujuk oleh pemicu DDL tingkat database

Contoh berikut mengembalikan entitas (tabel dan kolom) yang dirujuk oleh pemicu ddlDatabaseTriggerLogDDL tingkat database .

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. Mengembalikan entitas yang dirujuk oleh objek

Contoh berikut mengembalikan entitas yang dirujuk oleh fungsi dbo.ufnGetContactInformationyang ditentukan pengguna .

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. Mengembalikan dependensi kolom

Contoh berikut membuat tabel Table1 dengan kolom c komputasi yang didefinisikan sebagai jumlah kolom a dan b. Tampilan sys.dm_sql_referenced_entities kemudian dipanggil. Tampilan mengembalikan dua baris, satu untuk setiap kolom yang ditentukan dalam kolom komputasi.

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  

Berikut adalah hasil yang ditetapkan.

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

D. Mengembalikan dependensi kolom yang tidak terikat skema

Contoh berikut menghilangkan Table1 dan membuat serta prosedur Proc1tersimpan Table2 . Referensi Table2 prosedur dan tabel Table1yang tidak ada . Tampilan sys.dm_sql_referenced_entities dijalankan dengan prosedur tersimpan yang ditentukan sebagai entitas referensi. Kumpulan hasil menunjukkan satu baris untuk Table1 dan 3 baris untuk Table2. Karena Table1 tidak ada, dependensi kolom tidak dapat diselesaikan dan kesalahan 2020 dikembalikan. Kolom is_all_columns_found mengembalikan 0 untuk Table1 menunjukkan bahwa ada kolom yang tidak dapat ditemukan.

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  

Berikut adalah hasil yang ditetapkan.

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. Menunjukkan pemeliharaan dependensi dinamis

Contoh E ini mengasumsikan bahwa Contoh D telah dijalankan. Contoh E menunjukkan bahwa dependensi dipertahankan secara dinamis. Contoh melakukan hal-hal berikut:

  1. Membuat ulang Table1, yang dihilangkan di Contoh D.
  2. Jalankan Kemudian sys.dm_sql_referenced_entities dijalankan lagi dengan prosedur tersimpan yang ditentukan sebagai entitas referensi.

Kumpulan hasil menunjukkan bahwa kedua tabel, dan kolom masing-masing yang ditentukan dalam prosedur tersimpan, dikembalikan. Selain itu, is_all_columns_found kolom mengembalikan 1 untuk semua objek dan kolom.

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  

Berikut adalah hasil yang ditetapkan.

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. Mengembalikan penggunaan objek atau kolom

Contoh berikut mengembalikan objek dan dependensi kolom dari prosedur HumanResources.uspUpdateEmployeePersonalInfotersimpan . Prosedur ini memperbarui kolom NationalIDNumber, , dan GenderEmployee tabel berdasarkan nilai yang ditentukan BusinessEntityIDBirthDate,``MaritalStatus. Prosedur tersimpan lainnya, upsLogError didefinisikan dalam TRY... Blok CATCH untuk menangkap kesalahan eksekusi apa pun. Kolom is_selected, is_updated, dan is_select_all mengembalikan informasi tentang bagaimana objek dan kolom ini digunakan dalam objek referensi. Tabel dan kolom yang dimodifikasi ditunjukkan oleh 1 di kolom is_updated. Kolom BusinessEntityID hanya dipilih dan prosedur uspLogError tersimpan tidak dipilih atau dimodifikasi.

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

Berikut adalah hasil yang ditetapkan.

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

Lihat Juga

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