Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Différence entre sys.objects, sys.system_objects et sys.all_objects dans SQL Server

Si vous utilisez T-SQL depuis un certain temps, il est probable que vous ayez rencontré le sys.objects vue du catalogue système, qui renvoie des objets définis par l'utilisateur et étendus au schéma dans la base de données.

Mais il existe deux autres points de vue similaires dont vous pouvez ou non être conscients ; sys.system_objects et sys.all_objects .

Bien que similaires, leurs différences sont claires et les noms font la différence. Voici la définition officielle des trois vues :

sys.objects
Contient une ligne pour chaque objet de portée de schéma défini par l'utilisateur qui est créé dans une base de données.
sys.system_objects
Contient une ligne pour tous les objets système de portée de schéma qui sont inclus avec SQL Server.
sys.all_objects
Affiche l'UNION de tous les objets définis par l'utilisateur et les objets système à l'échelle du schéma.

En d'autres termes, la dernière vue combine les résultats des deux vues précédentes (elle renvoie à la fois le système et objets définis par l'utilisateur).

Exemple

Voici un exemple qui illustre la différence dans les résultats renvoyés par ces vues.

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];

Résultat :

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

Ces vues renvoient trop de lignes pour que je les liste ici, donc j'utilise COUNT() pour renvoyer le nombre de lignes que chacune renvoie.

Si vous êtes bon en maths, vous verrez rapidement que le nombre de sys.all_objects est la somme de sys.objects et sys.system_objects .

Voici une requête qui fait cet ajout.

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];

Résultat :

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

Notez que la visibilité des métadonnées dans les vues de catalogue est limitée aux éléments sécurisables qu'un utilisateur possède ou sur lesquels l'utilisateur a reçu une autorisation.