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

Temukan Entitas Referensi di SQL Server:sys.dm_sql_referencing_entities()

Di SQL Server, Anda dapat menggunakan sys.dm_sql_referencing_entities() fungsi manajemen dinamis sistem untuk mendapatkan daftar semua entitas dalam database saat ini yang merujuk entitas lain yang ditentukan pengguna berdasarkan nama.

Dengan kata lain, ia mengembalikan daftar entitas yang bergantung pada entitas yang diberikan.

Secara khusus, ini melaporkan jenis entitas berikut dalam database saat ini yang mereferensikan entitas yang ditentukan:

  • Entitas terikat skema atau tidak terikat skema
  • Pemicu DDL tingkat basis data
  • Pemicu DDL tingkat server

Sintaks

Sintaksnya seperti ini:

sys.dm_sql_referencing_entities (  
    ' schema_name.referenced_entity_name ' , '  ' )  
  
 ::=  
{  
    OBJECT  
  | TYPE  
  | XML_SCHEMA_COLLECTION  
  | PARTITION_FUNCTION  
}

Contoh 1 – Contoh Dasar

Berikut adalah contoh dasar penggunaan:

USE WideWorldImporters;
SELECT *
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Hasil:

+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
| referencing_schema_name   | referencing_entity_name   | referencing_id   | referencing_class   | referencing_class_desc   | is_caller_dependent   |
|---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------|
| Application               | DetermineCustomerAccess   | 1051150790       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Integration               | GetCityUpdates            | 1758629308       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | Customers                 | 1694629080       | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | SearchForCustomers        | 942626401        | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | SearchForSuppliers        | 926626344        | 1                   | OBJECT_OR_COLUMN         | 0                     |
| Website                   | Suppliers                 | 1678629023       | 1                   | OBJECT_OR_COLUMN         | 0                     |
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+

Dalam contoh ini, ada enam entitas yang mereferensikan 'Application.Cities' di database 'WideWorldImporters'.

Microsoft secara khusus merekomendasikan untuk tidak menggunakan tanda bintang (* ) untuk memilih semua kolom dari tampilan dan fungsi manajemen dinamis (di antaranya sys.dm_sql_referencing_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.

Oleh karena itu, kode sebelumnya harus ditulis ulang menjadi ini:

Contoh:

USE WideWorldImporters;
SELECT 
  referencing_schema_name,
  referencing_entity_name,
  referencing_id,
  referencing_class,
  referencing_class_desc,
  is_caller_dependent
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Tentu saja, Anda selalu dapat menentukan lebih sedikit kolom jika diinginkan.

Contoh 2 – Dapatkan Jenis Entitas Referensi

Contoh di atas semuanya baik dan baik, tetapi tidak memberi tahu kami jenis entitas referensi. Dengan kata lain, kita tidak dapat melihat apakah itu tampilan, prosedur tersimpan, dll.

Anda bisa mendapatkan informasi ini dengan bergabung dengan sys.dm_sql_referencing_entities() dengan sys.objects .

Jadi kita bisa memodifikasi contoh sebelumnya seperti ini:

SELECT 
  o.type_desc 'Type',
  re.referencing_schema_name 'Schema',
  re.referencing_entity_name 'Name'
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT') re
INNER JOIN sys.objects o
ON re.referencing_id = o.object_id
ORDER BY 'Type' ASC;  

Hasil:

+----------------------------------+-------------+-------------------------+
| Type                             | Schema      | Name                    |
|----------------------------------+-------------+-------------------------|
| SQL_INLINE_TABLE_VALUED_FUNCTION | Application | DetermineCustomerAccess |
| SQL_STORED_PROCEDURE             | Integration | GetCityUpdates          |
| SQL_STORED_PROCEDURE             | Website     | SearchForCustomers      |
| SQL_STORED_PROCEDURE             | Website     | SearchForSuppliers      |
| VIEW                             | Website     | Suppliers               |
| VIEW                             | Website     | Customers               |
+----------------------------------+-------------+-------------------------+

Contoh 3 – Jenis Buatan Pengguna

Berikut ini contoh penggunaan sys.dm_sql_referencing_entities() untuk mengembalikan entitas yang mereferensikan jenis alias yang ditentukan pengguna tertentu.

Untuk contoh ini, saya membuat alias yang ditentukan pengguna yang disebut clientcode . Saya kemudian menggunakannya dalam dua kolom (dalam dua tabel berbeda), dan saya juga membuat prosedur tersimpan yang mereferensikan tipe berdasarkan nama (ia menerima argumen yang disebut @ClientCode yang merupakan clientcode jenis).

Untuk mengembalikan tipe yang ditentukan pengguna, gunakan TYPE sebagai argumen kedua.

Contoh:

USE Test;
SELECT 
  referencing_entity_name
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE');

Hasil:

+---------------------------+
| referencing_entity_name   |
|---------------------------|
| uspGetClient              |
| uspGetOrdersByClient      |
+---------------------------+

Saya dapat mengetahui dari namanya bahwa keduanya adalah prosedur tersimpan (keduanya diawali dengan usp , yang merupakan konvensi umum saat membuat prosedur tersimpan yang ditentukan pengguna), tetapi kami dapat mengonfirmasi ini dengan memeriksa sys.objects tampilan katalog sistem sekali lagi:

SELECT 
  o.type_desc 'Type',
  re.referencing_schema_name 'Schema',
  re.referencing_entity_name 'Name'
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE') re
INNER JOIN sys.objects o
ON re.referencing_id = o.object_id
ORDER BY 'Type' ASC;  

Hasil:

+----------------------+----------+----------------------+
| Type                 | Schema   | Name                 |
|----------------------+----------+----------------------|
| SQL_STORED_PROCEDURE | dbo      | uspGetClient         |
| SQL_STORED_PROCEDURE | dbo      | uspGetOrdersByClient |
+----------------------+----------+----------------------+

Perhatikan bahwa tipe alias ini digunakan dalam kolom dua tabel dalam database ini. Namun, ini tidak muncul dalam daftar dependensi kami karena tipe yang ditentukan pengguna tidak ada dalam definisi kolom yang dihitung, CHECK kendala, atau DEFAULT kendala dalam tabel.

Juga, salah satu tabel mereferensikan tabel lain melalui batasan kunci asing pada kolom yang menggunakan dbo.clientcode jenis yang ditentukan pengguna, tetapi ini juga tidak muncul dalam daftar kami.

Dokumentasi Resmi

Untuk informasi lebih detail, lihat sys.dm_sql_referencing_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. SEPERTI vs BERISI di SQL Server

  2. OPENROWSET tidak menerima variabel untuk argumennya (SQL Server)

  3. Melewati varchar yang penuh dengan nilai yang dibatasi koma ke fungsi SQL Server IN

  4. Inilah Tiga Alasan Mengapa Anda Mungkin Melihat Aktivitas Puncak di Instance SQL Anda

  5. Konversi nilai teks di SQL Server dari UTF8 ke ISO 8859-1