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

Contoh sys.dm_sql_referenced_entities() SQL Server Mengembalikan Entitas yang Mereferensikan Server Tertaut

Salah satu hal tentang sys.dm_sql_referenced_entities() fungsi manajemen dinamis sistem adalah bahwa Anda dapat menggunakannya pada entitas lintas-database dan lintas-server.

Ini berarti Anda dapat menemukan entitas yang direferensikan yang berada di database yang berbeda dan bahkan di server yang berbeda.

Artikel ini memberikan contoh sys.dm_sql_referenced_entities() mengembalikan prosedur tersimpan yang menanyakan database di server tertaut.

Contoh 1 – Prosedur Tersimpan

Pertama, mari buat prosedur tersimpan yang mengembalikan data dari server tertaut:

CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [Homer].[Music].[dbo].[Albums]
WHERE ArtistId = @ArtistId;

Kita dapat melihat bahwa prosedur tersimpan menggunakan nama empat bagian untuk referensi tabel database. Ini karena database berada di server berbeda yang telah dikonfigurasi sebagai server tertaut dari server tempat prosedur tersimpan.

Dengan kata lain, prosedur tersimpan ini mengembalikan data dari server tertaut.

Dalam contoh ini, Homer adalah server tertaut, dan Music adalah databasenya.

Contoh 2 – Jalankan sys.dm_sql_referenced_entities() Terhadap Stored Procedure

Sekarang mari kita gunakan sys.dm_sql_referenced_entities() untuk mengembalikan entitas yang dirujuk dalam prosedur tersimpan.

SELECT 
    referenced_server_name AS [Server],
     referenced_database_name AS [Database],
     referenced_schema_name AS [Schema],
     referenced_entity_name AS [Entity],
     referenced_minor_name AS [Minor],
     referenced_class_desc AS [Class]
FROM sys.dm_sql_referenced_entities (
    'dbo.uspGetAlbumsByArtist', 
    'OBJECT');

Hasil:

+----------+------------+----------+----------+---------+------------------+
| Server   | Database   | Schema   | Entity   | Minor   | Class            |
|----------+------------+----------+----------+---------+------------------|
| Homer    | Music      | dbo      | Albums   | NULL    | OBJECT_OR_COLUMN |
+----------+------------+----------+----------+---------+------------------+

Jadi berhasil mengembalikan tabel yang direferensikan (walaupun bukan kolom/nama minor). Itu juga termasuk nama server ( Homer ) dan nama database ( Musik ).

Perhatikan bahwa saya tidak mengembalikan semua kolom dalam contoh ini demi singkatnya.

Contoh 3 – Menjalankan sys.dm_sql_referenced_entities() PADA Server Tertaut

Apakah hasil tersebut terlihat berbeda dengan apa yang kami dapatkan jika prosedur tersimpan berada di server tertaut (jarak jauh) yang sebenarnya?

Mari kita coba.

Di sini, saya melompat ke server lain dan menjalankan kode berikut:

CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [dbo].[Albums]
WHERE ArtistId = @ArtistId;

Perhatikan bahwa saya tidak perlu menggunakan empat bagian penamaan, mengingat ini membuat kueri tabel di server yang sama.

Sekarang jalankan sys.dm_sql_referenced_entities() di server tertaut:

SELECT 
    referenced_server_name AS [Server],
     referenced_database_name AS [Database],
     referenced_schema_name AS [Schema],
     referenced_entity_name AS [Entity],
     referenced_minor_name AS [Minor],
     referenced_class_desc AS [Class]
FROM sys.dm_sql_referenced_entities (
    '[dbo].uspGetAlbumsByArtist', 
    'OBJECT');

Hasil:

+----------+------------+----------+----------+-----------+------------------+
| Server   | Database   | Schema   | Entity   | Minor     | Class            |
|----------+------------+----------+----------+-----------+------------------|
| NULL     | NULL       | dbo      | Albums   | NULL      | OBJECT_OR_COLUMN |
| NULL     | NULL       | dbo      | Albums   | AlbumName | OBJECT_OR_COLUMN |
| NULL     | NULL       | dbo      | Albums   | ArtistId  | OBJECT_OR_COLUMN |
+----------+------------+----------+----------+-----------+------------------+

Dalam hal ini, kolom disertakan dalam hasil.

Perhatikan juga bahwa kolom Server dan Database adalah NULL untuk semua baris. Ini karena keduanya tidak termasuk dalam definisi prosedur tersimpan. Jika saya mengubah definisi prosedur tersimpan untuk memasukkan server dan database, saya akan melihatnya di sini. Namun, server hanya muncul di baris pertama.

ALTER PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [SQLServer007].[Music].[dbo].[Albums]
WHERE ArtistId = @ArtistId;

Hasil:

+--------------+------------+----------+----------+-----------+------------------+
| Server       | Database   | Schema   | Entity   | Minor     | Class            |
|--------------+------------+----------+----------+-----------+------------------|
| SQLServer007 | Music      | dbo      | Albums   | NULL      | OBJECT_OR_COLUMN |
| NULL         | Music      | dbo      | Albums   | AlbumName | OBJECT_OR_COLUMN |
| NULL         | Music      | dbo      | Albums   | ArtistId  | OBJECT_OR_COLUMN |
+--------------+------------+----------+----------+-----------+------------------+

Dalam hal ini, nama servernya adalah SQLServer007, jadi saya harus menggunakannya sebagai ganti Homer (nama yang saya berikan saat membuat server tertaut dari server lain).

Kita juga dapat menggunakan OPENQUERY() jika kita ingin melompat kembali ke server lokal dan menjalankannya pada server yang ditautkan:

SELECT * FROM OPENQUERY(
    Homer,
    'SELECT 
    referenced_server_name AS [Server],
     referenced_database_name AS [Database],
     referenced_schema_name AS [Schema],
     referenced_entity_name AS [Entity],
     referenced_minor_name AS [Minor],
     referenced_class_desc AS [Class]
FROM sys.dm_sql_referenced_entities (
    ''[dbo].uspGetAlbumsByArtist'', 
    ''OBJECT'');'
);

Hasil:

+--------------+------------+----------+----------+-----------+------------------+
| Server       | Database   | Schema   | Entity   | Minor     | Class            |
|--------------+------------+----------+----------+-----------+------------------|
| SQLServer007 | Music      | dbo      | Albums   | NULL      | OBJECT_OR_COLUMN |
| NULL         | Music      | dbo      | Albums   | AlbumName | OBJECT_OR_COLUMN |
| NULL         | Music      | dbo      | Albums   | ArtistId  | OBJECT_OR_COLUMN |
+--------------+------------+----------+----------+-----------+------------------+

Perhatikan bahwa dalam hal ini saya harus menghindari semua karakter kutipan tunggal.

Juga, jika saya mencoba menjalankan fungsi melalui kueri terdistribusi (tanpa menggunakan OPENQUERY() ), saya mendapatkan pesan kesalahan 4122:

SELECT 
    referenced_server_name AS [Server],
     referenced_database_name AS [Database],
     referenced_schema_name AS [Schema],
     referenced_entity_name AS [Entity],
     referenced_minor_name AS [Minor],
     referenced_class_desc AS [Class]
FROM [Homer].[Music].[sys].dm_sql_referenced_entities (
    '[dbo].[uspGetAlbumsByArtist]', 
    'OBJECT');

Hasil:

Msg 4122, Level 16, State 1, Line 10
Remote table-valued function calls are not allowed.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sesi dan Status Aktif SQL Server

  2. Tips Cepat untuk Memperbaiki dan Memulihkan Database SQL Tanpa Cadangan

  3. Cara Mengaktifkan Kompresi pada Tabel yang Ada di SQL Server (T-SQL)

  4. Memahami Pemantauan Kinerja SQL Server Berbasis Cloud

  5. Mentransfer data dari satu database ke database lain