Di SQL Server, Anda dapat menggunakan sys.sql_expression_dependencies
tampilan katalog sistem untuk mengembalikan semua dependensi pada entitas yang ditentukan pengguna dalam database saat ini. Ini termasuk ketergantungan antara yang dikompilasi secara asli, fungsi skalar yang ditentukan pengguna dan modul SQL Server lainnya.
Anda dapat menggunakan tampilan ini untuk:
- Mengembalikan entitas yang bergantung pada entitas tertentu
- Mengembalikan entitas tempat entitas tertentu bergantung
Jadi misalnya, Anda bisa menggunakannya untuk mengembalikan semua objek yang mereferensikan tabel tertentu. Anda juga dapat menggunakannya untuk mengembalikan semua objek yang dirujuk oleh prosedur tersimpan tertentu di dalam kodenya.
Secara khusus, sys.sql_expression_dependencies
lihat informasi ketergantungan laporan untuk entitas berikut:
- Entitas terikat skema.
- Entitas yang tidak terikat skema.
- Entitas lintas-database dan lintas-server. Nama entitas dilaporkan; namun, ID entitas tidak diselesaikan.
- Ketergantungan tingkat kolom pada entitas yang terikat skema. Dependensi tingkat kolom untuk objek yang tidak terikat skema dapat dikembalikan dengan menggunakan sys.dm_sql_referenced_entities.
- DDL tingkat server terpicu saat dalam konteks database master.
Contoh 1 – Semua Kolom Dikembalikan
Berikut adalah contoh cepat yang memilih semua kolom dari sys.sql_expression_dependencies
. Ini menunjukkan kepada kita data apa yang sebenarnya dikembalikan dalam tampilan, dan kita dapat menggunakan salah satu kolom ini dalam kueri kita untuk mengembalikan hanya data yang kita minati.
SELECT TOP(1) * FROM sys.sql_expression_dependencies;
Hasil (menggunakan keluaran vertikal):
referencing_id | 114099447 referencing_minor_id | 0 referencing_class | 1 referencing_class_desc | OBJECT_OR_COLUMN is_schema_bound_reference | 0 referenced_class | 1 referenced_class_desc | OBJECT_OR_COLUMN referenced_server_name | NULL referenced_database_name | NULL referenced_schema_name | dbo referenced_entity_name | Client referenced_id | 434100587 referenced_minor_id | 0 is_caller_dependent | 0 is_ambiguous | 0
Contoh ini menggunakan output vertikal sehingga memudahkan untuk melihat nama kolom tanpa harus menggulir secara horizontal. Oleh karena itu, nama kolom dicantumkan di sebelah kiri dan nilainya masing-masing ada di sebelah kanan.
Juga, demi singkatnya saya menggunakan TOP(1)
untuk membatasi hasil hanya pada baris pertama.
Contoh 2 – Temukan Entitas yang Bergantung pada Entitas
Untuk menemukan objek yang bergantung pada entitas tertentu, gunakan referencing_id
entitas tersebut saat memilih dari tampilan.
Contoh:
SELECT referenced_server_name AS [Referenced Server], referenced_database_name AS [Referenced DB], referenced_schema_name AS [Referenced Schema], referenced_entity_name AS [Referenced Entity], referenced_class_desc AS [Referenced Entity Class] FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('uspGetClient');
Hasil:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | NULL | NULL | dbo | Client | OBJECT_OR_COLUMN | | NULL | NULL | NULL | clientcode | TYPE | +---------------------+-----------------+---------------------+---------------------+---------------------------+
Di sini saya mendapatkan semua entitas yang dirujuk dalam uspGetClient
prosedur tersimpan.
Berikut definisi sebenarnya untuk uspGetClient
:
CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS SELECT FirstName, LastName FROM [dbo].[Client] WHERE ClientCode = @ClientCode;
Jadi kita dapat melihat bahwa ia memilih data dari tabel yang disebut Client
, dan menerima argumen yang disebut @ClientCode
dengan tipe data (alias yang ditentukan pengguna) dari clientcode
.
Contoh 3 – Temukan Entitas tempat Entitas Bergantung
Anda juga dapat mengubahnya dan mendapatkan objek tempat entitas tertentu bergantung. Untuk melakukannya, gunakan referenced_id
(bukan referencing_id
) saat memilih dari tampilan.
Contoh:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity], referencing_class_desc AS [Class], COL_NAME(referenced_id, referenced_minor_id) AS [Column] FROM sys.sql_expression_dependencies WHERE referenced_id = OBJECT_ID('Client');
Hasil:
+----------------------+----------------------------+------------------+------------+ | Referencing Entity | Referencing Minor Entity | Class | Column | |----------------------+----------------------------+------------------+------------| | uspGetClient | NULL | OBJECT_OR_COLUMN | NULL | | uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL | | chkClientCode | NULL | OBJECT_OR_COLUMN | ClientCode | +----------------------+----------------------------+------------------+------------+
Dalam contoh ini saya ingin melihat entitas mana yang bergantung pada Client
table (yaitu entitas mana yang mereferensikan tabel itu dalam kode SQL mereka).
Anda akan melihat bahwa saya juga memilih kolom yang berbeda. Ini karena saya mencari informasi tentang referensi entitas, bukan direferensikan entitas seperti pada contoh sebelumnya.
Contoh 4 – Ambil Informasi Lebih Lanjut
Anda dapat menggabungkan tampilan ini dengan tampilan dan/atau tabel lain untuk mengembalikan informasi selengkapnya.
Misalnya, Anda dapat menggabungkannya dengan sys.objects
untuk mendapatkan tipe objek referensi:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], o.type_desc AS [Type], COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column], referenced_entity_name AS [Referenced Entity], COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column] FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id WHERE referenced_id = OBJECT_ID(N'Client');
Hasil:
+----------------------+----------------------+----------+---------------------+------------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+----------------------+----------+---------------------+------------| | uspGetClient | SQL_STORED_PROCEDURE | (n/a) | Client | (n/a) | | uspGetOrdersByClient | SQL_STORED_PROCEDURE | (n/a) | Client | (n/a) | | chkClientCode | CHECK_CONSTRAINT | (n/a) | Client | ClientCode | +----------------------+----------------------+----------+---------------------+------------+
Dalam contoh ini saya juga menambahkan COALESCE()
berfungsi untuk mengembalikan (n/a)
kapan pun referencing_minor_id
adalah NULL
. Fungsi ini adalah salah satu dari beberapa cara Anda dapat mengganti nilai NULL dengan string di SQL Server.
Contoh 5 – Entitas Lintas-Database &Lintas-Server
Seperti disebutkan, sql_expression_dependencies
juga berfungsi pada entitas lintas basis data dan lintas server. Namun, dalam kasus ini, nama entitas dilaporkan tetapi ID entitas tidak diselesaikan.
Contoh ini menggunakan kode yang sama persis dengan Contoh 2, kecuali kali ini untuk entitas yang berbeda. Kali ini, saya ingin mencari entitas yang bergantung pada uspGetAlbumsByArtist
:
SELECT referenced_server_name AS [Referenced Server], referenced_database_name AS [Referenced DB], referenced_schema_name AS [Referenced Schema], referenced_entity_name AS [Referenced Entity], referenced_class_desc AS [Referenced Entity Class] FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('uspGetAlbumsByArtist');
Hasil:
+---------------------+-----------------+---------------------+---------------------+---------------------------+ | Referenced Server | Referenced DB | Referenced Schema | Referenced Entity | Referenced Entity Class | |---------------------+-----------------+---------------------+---------------------+---------------------------| | Homer | Music | dbo | Albums | OBJECT_OR_COLUMN | +---------------------+-----------------+---------------------+---------------------+---------------------------+
Dalam contoh ini, server yang direferensikan dan database yang direferensikan memiliki nilai (bukan NULL seperti pada contoh sebelumnya). Itu karena uspGetAlbumsByArtist
prosedur tersimpan menggunakan nama empat bagian untuk mereferensikan entitas pada server tertaut (prosedur tersimpan dari contoh sebelumnya tidak menggunakan nama empat bagian, dan juga tidak menggunakan nama tiga bagian untuk menentukan DB) .
Dalam contoh ini, Homer
adalah nama server yang ditautkan, dan Music
adalah database yang diminta oleh prosedur tersimpan.
Kita bisa melihat ini di uspGetAlbumsByArtist
definisi:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [Homer].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
Dokumentasi Resmi
Untuk informasi dan contoh yang lebih detail, lihat sys.sql_expression_dependencies
di situs web Microsoft.
Berikut artikel Microsoft lainnya yang menyertakan instruksi untuk mendapatkan dependensi melalui SSMS.