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

Tìm các thực thể tham chiếu trong SQL Server:sys.dm_sql_referencing_entities ()

Trong SQL Server, bạn có thể sử dụng sys.dm_sql_referencing_entities() chức năng quản lý động hệ thống để lấy danh sách tất cả các thực thể trong cơ sở dữ liệu hiện tại tham chiếu đến một thực thể khác do người dùng xác định theo tên.

Nói cách khác, nó trả về một danh sách các thực thể phụ thuộc vào thực thể đã cho.

Cụ thể, nó báo cáo về các loại thực thể sau trong cơ sở dữ liệu hiện tại tham chiếu đến thực thể được chỉ định:

  • Các thực thể liên kết với giản đồ hoặc không liên kết với giản đồ
  • Trình kích hoạt DDL cấp cơ sở dữ liệu
  • Trình kích hoạt DDL cấp máy chủ

Cú pháp

Cú pháp như sau:

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

Ví dụ 1 - Ví dụ cơ bản

Dưới đây là một ví dụ cơ bản về cách sử dụng:

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

Kết quả:

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

Trong ví dụ này, có sáu thực thể tham chiếu đến ‘Application.Cities’ trong cơ sở dữ liệu ‘WideWorldImporters’.

Microsoft đặc biệt khuyến cáo không nên sử dụng dấu hoa thị (* ) để chọn tất cả các cột từ các chế độ xem và chức năng quản lý động (trong đó sys.dm_sql_referencing_entities() là một). Điều này là do các lược đồ của chúng và dữ liệu chúng trả về có thể thay đổi trong các bản phát hành SQL Server trong tương lai. Điều này có thể dẫn đến việc các cột được thêm vào cuối danh sách cột trong các bản phát hành trong tương lai, điều này có thể làm rối ứng dụng của bạn nếu bạn dựa vào dấu hoa thị để chọn tất cả các cột.

Do đó, mã trước đó nên được viết lại thành:

Ví dụ:

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

Tất nhiên, bạn luôn có thể chỉ định ít cột hơn nếu bạn muốn.

Ví dụ 2 - Lấy loại thực thể tham chiếu

Ví dụ trên là tốt và tốt, nhưng nó không cho chúng ta biết loại thực thể tham chiếu. Nói cách khác, chúng tôi không thể biết liệu đó có phải là một chế độ xem, một quy trình được lưu trữ, v.v.

Bạn có thể lấy thông tin này bằng cách tham gia sys.dm_sql_referencing_entities() với sys.objects .

Vì vậy, chúng tôi có thể sửa đổi ví dụ trước như sau:

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;  

Kết quả:

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

Ví dụ 3 - Các loại do người dùng xác định

Đây là một ví dụ về việc sử dụng sys.dm_sql_referencing_entities() để trả về các thực thể tham chiếu đến một loại bí danh nhất định do người dùng xác định.

Đối với ví dụ này, tôi đã tạo một bí danh do người dùng xác định có tên là clientcode . Sau đó, tôi sử dụng nó trong hai cột (trong hai bảng khác nhau) và tôi cũng tạo một thủ tục được lưu trữ tham chiếu đến kiểu theo tên (nó chấp nhận một đối số có tên là @ClientCode thuộc về clientcode loại).

Để trả về kiểu do người dùng xác định, hãy sử dụng TYPE như đối số thứ hai.

Ví dụ:

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

Kết quả:

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

Tôi có thể biết bằng tên rằng cả hai đều là các thủ tục được lưu trữ (cả hai đều có tiền tố là usp , là quy ước chung khi tạo các thủ tục được lưu trữ do người dùng xác định), nhưng chúng tôi có thể xác nhận điều này bằng cách kiểm tra sys.objects chế độ xem danh mục hệ thống một lần nữa:

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;  

Kết quả:

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

Lưu ý rằng loại bí danh này được sử dụng trong các cột của hai bảng trong cơ sở dữ liệu này. Tuy nhiên, những thứ này không xuất hiện trong danh sách phụ thuộc của chúng tôi vì kiểu do người dùng xác định không có trong định nghĩa của cột được tính, CHECK ràng buộc, hoặc DEFAULT ràng buộc trong bảng.

Ngoài ra, một trong các bảng tham chiếu đến bảng khác thông qua ràng buộc khóa ngoại trên cột sử dụng dbo.clientcode loại do người dùng xác định, nhưng loại này cũng không xuất hiện trong danh sách của chúng tôi.

Tài liệu chính thức

Để biết thêm thông tin chi tiết, hãy xem sys.dm_sql_referencing_entities trên trang web của 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. Hướng dẫn cho người mới bắt đầu về bảng SQL

  2. Thêm danh tính AppPool IIS 7 làm nhật ký máy chủ SQL

  3. Ví dụ về Chèn máy chủ SQL

  4. Cách gửi email từ SQL Server (T-SQL)

  5. Làm cách nào để xoay số cột không xác định &không có tổng hợp trong SQL Server?