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

Temukan Dependensi di SQL Server:sql_expression_dependencies

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan pembaruan dinamis dengan nama kolom variabel

  2. Lima Pertimbangan Teratas untuk Desain Indeks Basis Data di SQL Server

  3. Sintaks gabungan mana yang lebih baik?

  4. SQL:dalam klausa dalam prosedur tersimpan:cara melewatkan nilai

  5. Bitmap Mode Batch di SQL Server