sql >> Databáze >  >> RDS >> Sqlserver

Rozdíl mezi sys.objects, sys.system_objects a sys.all_objects na serveru SQL Server

Pokud jste nějakou dobu používali T-SQL, pravděpodobně jste narazili na sys.objects pohled systémového katalogu, který vrací uživatelem definované objekty v rozsahu schématu v databázi.

Existují však dva další podobné názory, které si můžete nebo nemusíte být vědomi; sys.system_objects a sys.all_objects .

I když jsou podobné, jejich rozdíly jsou jasné a názvy napovídají rozdíl. Zde je oficiální definice všech tří pohledů:

sys.objects
Obsahuje řádek pro každý uživatelsky definovaný objekt v rozsahu schématu, který je vytvořen v databázi.
sys.system_objects
Obsahuje jeden řádek pro všechny systémové objekty v rozsahu schématu, které jsou součástí SQL Serveru.
sys.all_objects
Zobrazuje UNION všech uživatelsky definovaných objektů a systémových objektů v rozsahu schématu.

Jinými slovy, poslední pohled kombinuje výsledky předchozích dvou pohledů (vrací systémové a uživatelem definované objekty).

Příklad

Zde je příklad, který ukazuje rozdíl ve výsledcích vrácených těmito zobrazeními.

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

Výsledek:

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

Tato zobrazení vrací příliš mnoho řádků na to, abych je zde vypsal, takže používám COUNT() vrátit počet řádků, které každý vrátí.

Pokud jste dobří v matematice, rychle zjistíte, že počet sys.all_objects je součet sys.objects a sys.system_objects .

Zde je dotaz, který toto přidává.

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

Výsledek:

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

Všimněte si, že viditelnost metadat v zobrazeních katalogu je omezena na zabezpečovací prvky, které uživatel buď vlastní, nebo ke kterým má uživatel nějaké oprávnění.


  1. Jak spojit dvě tabulky mysql?

  2. Připojení k Microsoft Access v IRI Workbench

  3. Skupiny konverzace SQL Server Service Broker

  4. Jak přidám primární klíč auto_increment do databáze SQL Server?