Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Temukan Entitas yang Direferensikan di SQL Server:sys.dm_sql_referenced_entities

Di SQL Server, Anda dapat menggunakan sys.dm_sql_referenced_entities() fungsi manajemen dinamis sistem untuk mendapatkan daftar semua entitas yang ditentukan pengguna yang direferensikan berdasarkan nama, dalam definisi entitas tertentu.

Dengan kata lain, ini mengembalikan daftar semua entitas yang ditentukan pengguna yang bergantung pada entitas tertentu.

Secara khusus, ini melaporkan jenis entitas berikut yang direferensikan oleh entitas referensi yang ditentukan:

  • Entitas terikat skema
  • Entitas yang tidak terikat skema
  • Entitas lintas-database dan lintas-server
  • Ketergantungan 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

Sintaksnya seperti ini:

sys.dm_sql_referenced_entities ( ' [ schema_name. ] referencing_entity_name ' , '  ' )  ::={ OBYEK | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }

Contoh 1 – Contoh Dasar

Berikut contoh penggunaannya:

USE Test;SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.usp>
GetClient'); 

Hasil:

+----------+------------+------------+--------- ---------+-----------------+---------------------- --+| Skema | Entitas | kecil | Kelas | is_select_all | is_all_columns_found ||----------+------------+------------+---------- --------+-----------------+----------------------- -|| dbo | Klien | NULL | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klien | Kode Klien | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klien | Nama Depan | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klien | Nama Belakang | OBJECT_OR_COLUMN | 1 | 1 || NULL | kode klien | NULL | JENIS | 0 | 0 |+----------+------------+------------+---------- --------+-----------------+----------------------- -+

Di sini saya mendapatkan semua entitas yang dirujuk dalam dbo.uspGetClient prosedur tersimpan. Dalam hal ini ada lima entitas.

Yang pertama adalah tabel yang disebut "Klien". Tiga berikutnya adalah semua kolom dalam tabel itu. Yang terakhir adalah tipe data alias yang ditentukan pengguna yang disebut "kode klien".

Kita juga dapat melihat bahwa empat yang pertama digunakan dalam pernyataan pilih yang menggunakan tanda bintang (* ) wildcard untuk memilih semua kolom (karena is_select_all their disetel ke 1 ).

Berikut definisi sebenarnya yang digunakan untuk membuat prosedur tersimpan yang kami analisis:

BUAT PROSEDUR [dbo].[uspGetClient] @ClientCode kode klien ASSELECT * FROM [dbo].[Klien]WHERE ClientCode =@ClientCode;

Ya, ini adalah prosedur tersimpan yang sangat sederhana, tetapi ideal untuk tujuan kita. Kita dapat melihat semua entitas yang direferensikan seperti yang dikembalikan oleh sys.dm_sql_referenced_entities() .

Kita juga dapat melihat bahwa prosedurnya terdiri dari satu SELECT kueri yang menggunakan wildcard asterisk untuk memilih semua kolom.

Contoh 2 – Hapus “Pilih Semua” (* )

Mari kita ubah prosedur tersimpan sehingga tidak menggunakan wildcard asterisk untuk memilih semua kolom.

ALTER PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode ASSELECT FirstName, LastNameFROM [dbo].[Client]WHERE ClientCode =@ClientCode;

Jadi sekarang secara eksplisit mengembalikan kolom "FirstName" dan "LastName". Tidak ada karakter pengganti yang dapat ditemukan.

Sekarang jalankan sys.dm_sql_referenced_entities() lagi:

USE Test;SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.usp>
GetClient'); 

Hasil:

+----------+------------+------------+--------- ---------+-----------------+---------------------- --+| Skema | Entitas | kecil | Kelas | is_select_all | is_all_columns_found ||----------+------------+------------+---------- --------+-----------------+----------------------- -|| dbo | Klien | NULL | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klien | Kode Klien | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klien | Nama Depan | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klien | Nama Belakang | OBJECT_OR_COLUMN | 0 | 1 || NULL | kode klien | NULL | JENIS | 0 | 0 |+----------+------------+------------+---------- --------+-----------------+----------------------- -+

Kali ini, is_select_all kolom menunjukkan 0 di semua baris.

Contoh 3 – Mereferensikan Entitas yang Tidak Ada

Bagaimana jika entitas Anda merujuk entitas yang tidak ada?

Misalnya, bagaimana jika kolega Anda menjatuhkan kolom yang sebenarnya direferensikan oleh prosedur tersimpan, lalu Anda menjalankan sys.dm_sql_referenced_entities() terhadap prosedur tersimpan itu?

Mari kita cari tahu.

ALTER TABLE [dbo].[Client] DROP COLUMN LastName;

Saya baru saja menjatuhkan LastName kolom dari tabel saya.

Sekarang jalankan sys.dm_sql_referenced_entities() lagi:

SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.usp>
GetClient'); 
 Hasil:

Msg 207, Level 16, State 1, Procedure uspGetClient, Line 4Nama kolom tidak valid 'LastName'.Msg 2020, Level 16, State 1, Line 3 Dependensi yang dilaporkan untuk entitas "dbo.uspGetClient" mungkin tidak menyertakan referensi ke semua kolom . Ini karena entitas mereferensikan objek yang tidak ada atau karena kesalahan dalam satu atau lebih pernyataan dalam entitas. Sebelum menjalankan ulang kueri, pastikan tidak ada kesalahan dalam entitas dan semua objek yang dirujuk oleh entitas ada.

Contoh 4 – Lepaskan Seluruh Tabel

Mari kita cari tahu apa yang terjadi jika kita menjatuhkan seluruh tabel.

Klien DROP TABLE;

Meja telah dijatuhkan.

Jalankan sys.dm_sql_referenced_entities() :

SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.usp>
GetClient'); 
 Hasil:

Msg 2020, Level 16, State 1, Line 2Ketergantungan yang dilaporkan untuk entitas "dbo.uspGetClient" mungkin tidak menyertakan referensi ke semua kolom. Ini karena entitas mereferensikan objek yang tidak ada atau karena kesalahan dalam satu atau lebih pernyataan dalam entitas. Sebelum menjalankan ulang kueri, pastikan tidak ada kesalahan dalam entitas dan semua objek yang dirujuk oleh entitas ada.

Contoh 5 – Kembalikan Semua Kolom

Microsoft secara khusus merekomendasikan untuk tidak menggunakan tanda bintang (* ) untuk memilih semua kolom dari tampilan dan fungsi manajemen dinamis (di antaranya sys.dm_sql_referenced_entities() adalah satu). Ini karena skema mereka dan data yang mereka kembalikan dapat berubah di rilis SQL Server mendatang. Hal ini dapat mengakibatkan kolom ditambahkan ke akhir daftar kolom di rilis mendatang, yang dapat mengacaukan aplikasi Anda jika Anda mengandalkan tanda bintang untuk memilih semua kolom.

Yang mengatakan, inilah contoh yang melakukan hal itu:menggunakan tanda bintang (* ) untuk memilih semua kolom dari sys.dm_sql_referenced_entities() . Saya hanya melakukan ini untuk menunjukkan kepada Anda kolom apa yang sebenarnya dikembalikan dari fungsi ini (setidaknya di SQL Server 2019).

SELECT *FROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');

Hasil (menggunakan keluaran vertikal):

-[ REKAM 1 ]-------------------------referensi_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | NULLreferensi_id | 43410587referenced_minor_id | 0referensi_kelas | 1referensi_kelas_desc | OBJECT_OR_COLUMNAdas_caller_dependent | 0is_ambigu | 0is_dipilih | 1is_diperbarui | 0is_select_all | 0is_all_columns_found | 1is_masukkan_semua | 0is_tidak lengkap | 0-[ REKAM 2 ]-------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | ClientCodereferenced_id | 43410587referenced_minor_id | 1kelas_referensi | 1referensi_kelas_desc | OBJECT_OR_COLUMNAdas_caller_dependent | 0is_ambigu | 0is_dipilih | 1is_diperbarui | 0is_select_all | 0is_all_columns_found | 1is_masukkan_semua | 0is_tidak lengkap | 0-[ REKAM 3 ]-------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | FirstNamereferenced_id | 43410587referenced_minor_id | 2kelas_referensi | 1referensi_kelas_desc | OBJECT_OR_COLUMNAdas_caller_dependent | 0is_ambigu | 0is_dipilih | 1is_diperbarui | 0is_select_all | 0is_all_columns_found | 1is_masukkan_semua | 0is_tidak lengkap | 0-[ REKAM 4 ]-------------------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | Namabelakangreferensi_id | 43410587referenced_minor_id | 3kelas_referensi | 1referensi_kelas_desc | OBJECT_OR_COLUMNAdas_caller_dependent | 0is_ambigu | 0is_dipilih | 1is_diperbarui | 0is_select_all | 0is_all_columns_found | 1is_masukkan_semua | 0is_tidak lengkap | 0-[ REKAM 5 ]--------------referencing_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | NULLreferenced_entity_name | clientcodereferenced_minor_name | NULLreferensi_id | 257referensi_minor_id | 0referensi_kelas | 6referensi_kelas_desc | TYPEis_caller_dependent | 0is_ambigu | 0is_dipilih | 0is_diperbarui | 0is_select_all | 0is_all_columns_found | 0is_insert_all | 0is_tidak lengkap | 0(5 baris terpengaruh)

Dokumentasi Resmi

Untuk informasi dan contoh yang lebih detail, lihat sys.dm_sql_referenced_entities di situs web Microsoft.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbedaan Antara Fungsi Bernilai Tabel Multi-Pernyataan &Fungsi Bernilai Tabel Sebaris di SQL Server

  2. Cara menggunakan Stopwords dan Stoplist untuk meningkatkan Pencarian Teks Lengkap (FTS) SQL Server

  3. Apakah KECUALI dieksekusi lebih cepat daripada GABUNG ketika kolom tabel sama?

  4. Buat Fungsi Bernilai Tabel Sebaris (ITVF) di SQL Server

  5. Jenis Kursor SQL Server - Kursor Dinamis | Tutorial SQL Server / Tutorial TSQL