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.