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í.