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.