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

Tìm các đối tượng được tham chiếu trong SQL Server:sys.dm_sql_referenced_entities

Trong SQL Server, bạn có thể sử dụng sys.dm_sql_referenced_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ể do người dùng xác định được tham chiếu theo tên, trong định nghĩa của một thực thể nhất định.

Nói cách khác, nó trả về danh sách tất cả các thực thể do người dùng xác định mà một thực thể cụ thể phụ thuộc vào.

Cụ thể, nó báo cáo về các loại thực thể sau được tham chiếu bởi thực thể tham chiếu được chỉ định:

  • Các thực thể liên kết với giản đồ
  • Các thực thể không bị ràng buộc bởi giản đồ
  • Các thực thể trên nhiều cơ sở dữ liệu và trên nhiều máy chủ
  • Sự phụ thuộc ở cấp độ cột vào các thực thể liên kết với giản đồ và không bị ràng buộc bởi giản đồ
  • Loại do người dùng xác định (bí danh và CLR UDT)
  • Bộ sưu tập lược đồ XML
  • Các chức năng phân vùng

Cú pháp

Cú pháp như sau:

 sys.dm_sql_referenced_entities ('[schema_name.] reference_entity_name', '')  ::={OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER} 

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

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

 Kiểm tra SỬ DỤNG; SELECT reference_schema_name AS [Schema], reference_entity_name AS Entity, reference_minor_name AS Minor, reference_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ('dbo.entusp', '' 

Kết quả:

 + ---------- + ------------ + ------------ + --------- --------- + ----------------- + ---------------------- - + | Lược đồ | Thực thể | Tiểu nhị | Lớp học | is_select_all | is_all_columns_found || ---------- + ------------ + ------------ + ---------- -------- + ----------------- + ----------------------- - || dbo | Khách hàng | NULL | OBJECT_OR_COLUMN | 1 | 1 || dbo | Khách hàng | Mã khách hàng | OBJECT_OR_COLUMN | 1 | 1 || dbo | Khách hàng | FirstName | OBJECT_OR_COLUMN | 1 | 1 || dbo | Khách hàng | LastName | OBJECT_OR_COLUMN | 1 | 1 || NULL | mã máy khách | NULL | CÁC LOẠI | 0 | 0 | + ---------- + ------------ + ------------ + ---------- -------- + ----------------- + ----------------------- - + 

Ở đây tôi nhận được tất cả các thực thể được tham chiếu trong dbo.uspGetClient thủ tục được lưu trữ. Trong trường hợp này có năm thực thể.

Bảng đầu tiên là bảng có tên “Khách hàng”. Ba cột tiếp theo là tất cả các cột trong bảng đó. Loại cuối cùng là kiểu dữ liệu bí danh do người dùng xác định được gọi là “mã máy khách”.

Chúng ta cũng có thể thấy rằng bốn phần đầu tiên được sử dụng trong một câu lệnh select có sử dụng dấu hoa thị (* ) ký tự đại diện để chọn tất cả các cột (vì is_select_all của chúng được đặt thành 1 ).

Dưới đây là định nghĩa thực tế được sử dụng để tạo quy trình được lưu trữ mà chúng tôi đang phân tích:

 TẠO THỦ TỤC [dbo]. [uspGetClient] @ClientCode clientcode ASSELECT * FROM [dbo]. [Client] WHERE ClientCode =@ClientCode; 

Đúng, đó là một thủ tục được lưu trữ rất đơn giản, nhưng nó lý tưởng cho mục đích của chúng tôi. Chúng tôi có thể thấy tất cả các thực thể được tham chiếu như được trả về bởi sys.dm_sql_referenced_entities() .

Chúng ta cũng có thể thấy rằng quy trình này bao gồm một SELECT duy nhất truy vấn sử dụng ký tự đại diện dấu hoa thị để chọn tất cả các cột.

Ví dụ 2 - Xóa "Chọn tất cả" (* )

Hãy thay đổi quy trình đã lưu trữ để nó không sử dụng ký tự đại diện dấu hoa thị để chọn tất cả các cột.

 THỦ TỤC THAY THẾ [dbo]. [uspGetClient] @ClientCode clientcode ASSELECT FirstName, LastNameFROM [dbo]. [Client] WHERE ClientCode =@ClientCode; 

Vì vậy, bây giờ nó trả về cột “FirstName” và “LastName” một cách rõ ràng. Không tìm thấy ký tự đại diện nào.

Bây giờ hãy chạy sys.dm_sql_referenced_entities() một lần nữa:

 Kiểm tra SỬ DỤNG; SELECT reference_schema_name AS [Schema], reference_entity_name AS Entity, reference_minor_name AS Minor, reference_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ('dbo.entusp', '' 

Kết quả:

 + ---------- + ------------ + ------------ + --------- --------- + ----------------- + ---------------------- - + | Lược đồ | Thực thể | Tiểu nhị | Lớp học | is_select_all | is_all_columns_found || ---------- + ------------ + ------------ + ---------- -------- + ----------------- + ----------------------- - || dbo | Khách hàng | NULL | OBJECT_OR_COLUMN | 0 | 1 || dbo | Khách hàng | Mã khách hàng | OBJECT_OR_COLUMN | 0 | 1 || dbo | Khách hàng | FirstName | OBJECT_OR_COLUMN | 0 | 1 || dbo | Khách hàng | LastName | OBJECT_OR_COLUMN | 0 | 1 || NULL | mã máy khách | NULL | CÁC LOẠI | 0 | 0 | + ---------- + ------------ + ------------ + ---------- -------- + ----------------- + ----------------------- - + 

Lần này, is_select_all cột hiển thị 0 trên tất cả các hàng.

Ví dụ 3 - Tham chiếu đến một thực thể không tồn tại

Điều gì sẽ xảy ra nếu thực thể của bạn tham chiếu đến một thực thể không tồn tại?

Ví dụ:điều gì sẽ xảy ra nếu đồng nghiệp của bạn bỏ một cột đang thực sự được tham chiếu bởi một thủ tục được lưu trữ và sau đó bạn chạy sys.dm_sql_referenced_entities() chống lại thủ tục được lưu trữ đó?

Hãy cùng tìm hiểu.

 ALTER TABLE [dbo]. [Client] DROP COLUMN LastName; 

Tôi vừa bỏ LastName từ bảng của tôi.

Bây giờ hãy chạy sys.dm_sql_referenced_entities() một lần nữa:

 SELECT reference_schema_name AS [Schema], reference_entity_name AS Entity, reference_minor_name AS Minor, Reference_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ('dbo.uspGetClient'); 
 Kết quả:

 Msg 207, Cấp 16, Trạng thái 1, Thủ tục uspGetClient, Dòng 4 Tên cột không hợp lệ 'LastName'.Msg 2020, Cấp 16, Trạng thái 1, Dòng 3 Các phần phụ thuộc được báo cáo cho thực thể "dbo.uspGetClient" có thể không bao gồm tham chiếu đến tất cả các cột . Điều này là do thực thể tham chiếu đến một đối tượng không tồn tại hoặc do lỗi trong một hoặc nhiều câu lệnh trong thực thể. Trước khi chạy lại truy vấn, hãy đảm bảo rằng không có lỗi nào trong thực thể và tất cả các đối tượng được tham chiếu bởi thực thể đều tồn tại. 

Ví dụ 4 - Bỏ toàn bộ bảng

Hãy cùng tìm hiểu điều gì sẽ xảy ra nếu chúng ta bỏ toàn bộ bảng.

Máy khách
 DROP TABLE; 

Bảng đã bị xóa.

Chạy sys.dm_sql_referenced_entities() :

 SELECT reference_schema_name AS [Schema], reference_entity_name AS Entity, reference_minor_name AS Minor, Reference_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ('dbo.uspGetClient'); 
 Kết quả:

 Msg 2020, Cấp 16, Trạng thái 1, Dòng 2Các phần phụ thuộc được báo cáo cho thực thể "dbo.uspGetClient" có thể không bao gồm tham chiếu đến tất cả các cột. Điều này là do thực thể tham chiếu đến một đối tượng không tồn tại hoặc do lỗi trong một hoặc nhiều câu lệnh trong thực thể. Trước khi chạy lại truy vấn, hãy đảm bảo rằng không có lỗi nào trong thực thể và tất cả các đối tượng được tham chiếu bởi thực thể đều tồn tại. 

Ví dụ 5 - Trả lại Tất cả các Cột

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_referenced_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.

Điều đó nói rằng, đây là một ví dụ thực hiện điều đó:sử dụng dấu hoa thị (* ) để chọn tất cả các cột từ sys.dm_sql_referenced_entities() . Tôi chỉ làm điều này để cho bạn biết những cột nào thực sự được trả về từ hàm này (ít nhất là trong SQL Server 2019).

 SELECT * FROM sys.dm_sql_referenced_entities ('dbo.uspGetClient', 'OBJECT'); 

Kết quả (sử dụng đầu ra dọc):

 - [GHI 1] ------------------------- reference_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | NULLreferenced_id | 434100587referenced_minor_id | 0referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0is_ambiguous | 0is_selected | 1is_updated | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_incomplete | 0- [GHI 2] ------------------------- reference_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | ClientCodereferenced_id | 434100587referenced_minor_id | 1referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0is_ambiguous | 0is_selected | 1is_updated | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_incomplete | 0- [GHI 3] ------------------------- reference_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | FirstNamereferenced_id | 434100587referenced_minor_id | 2referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0is_ambiguous | 0is_selected | 1is_updated | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_incomplete | 0- [GHI 4] ------------------------- reference_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | LastNamereferenced_id | 434100587referenced_minor_id | 3referenced_class | 1referenced_class_desc | OBJECT_OR_COLUMNis_caller_dependent | 0is_ambiguous | 0is_selected | 1is_updated | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_incomplete | 0- [GHI CHÚ 5] ------------------------- reference_minor_id | 0referenced_server_name | NULLreferenced_database_name | NULLreferenced_schema_name | NULLreferenced_entity_name | clientcodereferenced_minor_name | NULLreferenced_id | 257referenced_minor_id | 0referenced_class | 6referenced_class_desc | TYPEis_caller_dependent | 0is_ambiguous | 0is_selected | 0is_updated | 0is_select_all | 0is_all_columns_found | 0is_insert_all | 0is_incomplete | 0 (5 hàng bị ảnh hưởng) 

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

Để biết thêm thông tin chi tiết và ví dụ, hãy xem sys.dm_sql_referenced_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. Trả về thông tin cột từ một máy chủ được liên kết trong SQL Server (Ví dụ T-SQL)

  2. Cách hoạt động của hàm SOUNDEX () SQL Server

  3. Cách chèn giá trị vào cột IDENTITY trong SQL Server

  4. Cách sử dụng toán tử GIỮA trong SQL Server

  5. SQL Server - các giao dịch quay trở lại do lỗi?