Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Ví dụ về sys.dm_sql_referenced_entities () của SQL Server’s sys.dm_sql_referenced_entities () Trả lại một thực thể tham chiếu đến máy chủ được liên kết

Một trong những điều về sys.dm_sql_referenced_entities() chức năng quản lý động hệ thống là bạn có thể sử dụng nó trên các thực thể cơ sở dữ liệu chéo và máy chủ chéo.

Điều này có nghĩa là bạn có thể tìm thấy các thực thể được tham chiếu trong một cơ sở dữ liệu khác và thậm chí trên một máy chủ khác.

Bài viết này cung cấp một ví dụ về sys.dm_sql_referenced_entities() trả về một thủ tục được lưu trữ truy vấn cơ sở dữ liệu trên máy chủ được liên kết.

Ví dụ 1 - Thủ tục được Lưu trữ

Trước tiên, hãy tạo một quy trình được lưu trữ trả về dữ liệu từ một máy chủ được liên kết:

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

Chúng ta có thể thấy rằng thủ tục được lưu trữ sử dụng tên gồm bốn phần để tham chiếu bảng cơ sở dữ liệu. Điều này là do cơ sở dữ liệu nằm trên một máy chủ khác đã được định cấu hình như một máy chủ được liên kết từ máy chủ mà quy trình được lưu trữ được đặt.

Nói cách khác, thủ tục được lưu trữ này trả về dữ liệu từ một máy chủ được liên kết.

Trong ví dụ này, Homer là máy chủ được liên kết và Music là cơ sở dữ liệu.

Ví dụ 2 - Chạy sys.dm_sql_referenced_entities () theo quy trình đã lưu trữ

Bây giờ, hãy sử dụng sys.dm_sql_referenced_entities() để trả về các thực thể được tham chiếu trong thủ tục được lưu trữ.

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');

Kết quả:

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

Vì vậy, nó đã trả về thành công bảng đang được tham chiếu (mặc dù không phải là tên cột / tên nhỏ). Nó cũng bao gồm tên máy chủ ( Homer ) và tên cơ sở dữ liệu ( Music ).

Lưu ý rằng tôi không trả lại tất cả các cột trong ví dụ này vì mục đích ngắn gọn.

Ví dụ 3 - Chạy sys.dm_sql_referenced_entities () TRÊN máy chủ được liên kết

Những kết quả đó có khác gì so với những gì chúng tôi nhận được nếu quy trình được lưu trữ trên máy chủ được liên kết thực tế (từ xa) không?

Hãy thử nó.

Tại đây, tôi chuyển sang máy chủ khác và chạy đoạn mã sau:

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

Lưu ý rằng tôi không cần sử dụng cách đặt tên bốn phần, vì nó đang truy vấn các bảng trên cùng một máy chủ.

Bây giờ hãy chạy sys.dm_sql_referenced_entities() trên máy chủ được liên kết:

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');

Kết quả:

+----------+------------+----------+----------+-----------+------------------+
| 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 |
+----------+------------+----------+----------+-----------+------------------+

Trong trường hợp này, các cột được bao gồm trong kết quả.

Cũng lưu ý rằng cột Máy chủ và Cơ sở dữ liệu là NULL cho tất cả các hàng. Điều này là do cả hai đều không có trong định nghĩa của thủ tục được lưu trữ. Nếu tôi thay đổi định nghĩa của thủ tục được lưu trữ để bao gồm máy chủ và cơ sở dữ liệu, tôi sẽ thấy chúng ở đây. Tuy nhiên, máy chủ chỉ xuất hiện ở hàng đầu tiên.

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

Kết quả:

+--------------+------------+----------+----------+-----------+------------------+
| 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 |
+--------------+------------+----------+----------+-----------+------------------+

Trong trường hợp này, tên của máy chủ là SQLServer007, vì vậy tôi phải sử dụng tên đó thay vì Homer (là tên tôi đã đặt khi tạo máy chủ được liên kết từ máy chủ khác).

Chúng tôi cũng có thể sử dụng OPENQUERY() nếu chúng tôi muốn quay lại máy chủ cục bộ và chạy nó trên máy chủ được liên kết:

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'');'
);

Kết quả:

+--------------+------------+----------+----------+-----------+------------------+
| 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 |
+--------------+------------+----------+----------+-----------+------------------+

Lưu ý rằng trong trường hợp này, tôi phải thoát khỏi tất cả các ký tự trích dẫn duy nhất.

Ngoài ra, nếu tôi cố gắng chạy hàm thông qua truy vấn phân tán (mà không sử dụng OPENQUERY() ), Tôi nhận được thông báo lỗi 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');

Kết quả:

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. Giải pháp cho cách đọc tệp nhật ký giao dịch SQL Server mà không có bất kỳ lỗi nào

  2. Kiểm tra xem một Bảng có được tham chiếu bởi một khóa ngoại trong SQL Server với OBJECTPROPERTY () hay không

  3. INFORMATION_SCHEMA so với sysobjects

  4. Cách cập nhật thống kê máy chủ SQL cho bảng lớn

  5. Tính tổng số đang chạy với mệnh đề OVER và mệnh đề PARTITION BY trong SQL Server