Nếu bạn đã sử dụng T-SQL một thời gian, có thể bạn đã gặp phải sys.objects
chế độ xem danh mục hệ thống, trả về các đối tượng trong phạm vi lược đồ, do người dùng xác định trong cơ sở dữ liệu.
Nhưng có hai quan điểm tương tự khác mà bạn có thể nhận thức được hoặc không; sys.system_objects
và sys.all_objects
.
Mặc dù giống nhau, nhưng sự khác biệt của chúng rất rõ ràng, và những cái tên đã nói lên sự khác biệt. Đây là định nghĩa chính thức cho cả ba chế độ xem:
-
sys.objects
- Chứa một hàng cho mỗi đối tượng phạm vi lược đồ, do người dùng xác định, được tạo trong cơ sở dữ liệu.
-
sys.system_objects
- Chứa một hàng cho tất cả các đối tượng hệ thống phạm vi lược đồ được bao gồm trong SQL Server.
-
sys.all_objects
- Hiển thị
UNION
của tất cả các đối tượng do người dùng xác định trong phạm vi lược đồ và đối tượng hệ thống.
Nói cách khác, chế độ xem cuối cùng kết hợp các kết quả của hai chế độ xem trước đó (nó trả về cả hệ thống và đối tượng do người dùng xác định).
Ví dụ
Dưới đây là một ví dụ chứng minh sự khác biệt về kết quả do các chế độ xem này trả về.
USE WideWorldImportersDW; SELECT COUNT(*) AS [sys.objects] FROM sys.objects; SELECT COUNT(*) AS [sys.system_objects] FROM sys.system_objects; SELECT COUNT(*) AS [sys.all_objects] FROM sys.all_objects; SELECT (SELECT COUNT(*) AS [sys.all_objects] FROM sys.all_objects) - (SELECT COUNT(*) AS [sys.system_objects] FROM sys.system_objects) AS [sys.all_objects MINUS sys.system_objects];
Kết quả:
+---------------+ | sys.objects | |---------------| | 224 | +---------------+ (1 row affected) +----------------------+ | sys.system_objects | |----------------------| | 2205 | +----------------------+ (1 row affected) +-------------------+ | sys.all_objects | |-------------------| | 2429 | +-------------------+ (1 row affected)
Các chế độ xem này trả về quá nhiều hàng khiến tôi không thể liệt kê chúng ở đây, vì vậy tôi đang sử dụng COUNT()
để trả về số hàng mà mỗi hàng trả về.
Nếu bạn giỏi toán, bạn sẽ nhanh chóng thấy rằng số lượng sys.all_objects
là tổng của sys.objects
và sys.system_objects
.
Đây là một truy vấn thực hiện việc bổ sung đó.
SELECT (SELECT COUNT(*) AS [sys.objects] FROM sys.objects) + (SELECT COUNT(*) AS [sys.system_objects] FROM sys.system_objects) AS [sys.objects PLUS sys.system_objects];
Kết quả:
+---------------------------------------+ | sys.objects PLUS sys.system_objects | |---------------------------------------| | 2429 | +---------------------------------------+
Lưu ý rằng khả năng hiển thị của siêu dữ liệu trong các chế độ xem danh mục bị giới hạn đối với các bảo mật mà người dùng sở hữu hoặc người dùng đã được cấp một số quyền.