Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Diferença entre sys.objects, sys.system_objects e sys.all_objects no SQL Server


Se você usa o T-SQL há algum tempo, é provável que tenha encontrado o sys.objects exibição de catálogo do sistema, que retorna objetos definidos pelo usuário e com escopo de esquema no banco de dados.

Mas há duas outras visões semelhantes das quais você pode ou não estar ciente; sys.system_objects e sys.all_objects .



Embora semelhantes, suas diferenças são claras, e os nomes dizem a diferença. Aqui está a definição oficial de todas as três visualizações:
sys.objects
Contém uma linha para cada objeto com escopo de esquema definido pelo usuário que é criado em um banco de dados.
sys.system_objects
Contém uma linha para todos os objetos de sistema com escopo de esquema incluídos no SQL Server.
sys.all_objects
Mostra o UNION de todos os objetos definidos pelo usuário e objetos do sistema no escopo do esquema.

Em outras palavras, a última visualização combina os resultados das duas visualizações anteriores (ela retorna o sistema e objetos definidos pelo usuário).

Exemplo


Aqui está um exemplo que demonstra a diferença nos resultados retornados por essas visualizações.
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];

Resultado:
+---------------+
| sys.objects   |
|---------------|
| 224           |
+---------------+
(1 row affected)
+----------------------+
| sys.system_objects   |
|----------------------|
| 2205                 |
+----------------------+
(1 row affected)
+-------------------+
| sys.all_objects   |
|-------------------|
| 2429              |
+-------------------+
(1 row affected)

Essas visualizações retornam muitas linhas para eu listá-las aqui, então estou usando COUNT() para retornar o número de linhas que cada um retorna.

Se você for bom em matemática, verá rapidamente que a contagem de sys.all_objects é a soma de sys.objects e sys.system_objects .

Aqui está uma consulta que faz essa adição.
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];

Resultado:
+---------------------------------------+
| sys.objects PLUS sys.system_objects   |
|---------------------------------------|
| 2429                                  |
+---------------------------------------+

Observe que a visibilidade dos metadados nas exibições do catálogo é limitada aos protegíveis que um usuário possui ou para os quais o usuário recebeu alguma permissão.