sys.dm_sql_referenced_entities (T-SQL)
Berlaku untuk: SQL ServerAzure SQL Database Azure 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 ddlDatabaseTriggerLog
DDL 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.ufnGetContactInformation
yang 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 set hasilnya.
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 Proc1
tersimpan Table2
. Referensi Table2
prosedur dan tabel Table1
yang 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 set hasilnya.
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:
- Membuat ulang
Table1
, yang dihilangkan di Contoh D. - 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 set hasilnya.
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.uspUpdateEmployeePersonalInfo
tersimpan . Prosedur ini memperbarui kolom NationalIDNumber
, , dan Gender
Employee
tabel berdasarkan nilai yang ditentukan BusinessEntityID
BirthDate,``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 set hasilnya.
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 (Transact-SQL)