Tento článek vysvětlí, co jsou databázová schémata, jejich výhody a jak vytvářet a používat schémata na SQL Serveru.
V systému správy relačních databází, jako je SQL Server, databáze obsahuje různé objekty. Mohou to být tabulky, uložené procedury, pohledy a funkce. V databázi schéma odkazuje na logickou kolekci databázových objektů. K oddělení objektů můžete použít schémata v závislosti na aplikaci, přístupových právech a zabezpečení.
Schémata SQL Server
SQL Server poskytuje následující integrovaná logická schémata:
- dbo
- sys
- host
- INFORMAČNÍ_SCHÉMA
Každé schéma SQL Server musí mít uživatele databáze jako vlastníka schématu. Vlastník schématu má nad schématem plnou kontrolu. Můžete také změnit vlastníka schématu nebo přesunout objekty z jednoho schématu do druhého.
Schémata SQL Server poskytují následující výhody:
- Poskytuje větší flexibilitu a kontrolu pro správu databázových objektů v logických skupinách
- Umožňuje rychle přesouvat objekty mezi různými schématy
- Umožňuje vám spravovat zabezpečení objektů na úrovni schématu
- Umožňuje uživatelům spravovat logické skupiny objektů v rámci databáze
- Umožňuje uživatelům převádět vlastnictví mezi různými schématy
Předpokládejme, že v databázi vaší organizace chcete seskupit objekty podle oddělení. Například tabulky a uložené procedury pro personální oddělení by měly být logicky seskupeny ve schématu [HR]. Podobně by tabulky finančního oddělení měly být ve schématu [Fin]. Každé schéma (logická skupina) obsahuje objekty SQL Server, jako jsou tabulky, uložené procedury, pohledy, funkce, indexy, typy a synonyma.
Poznámka:Schéma je entita s rozsahem databáze. Můžete mít stejné schéma v různých databázích instance SQL Server.
Ve výchozím nastavení používá SQL Server schéma [dbo] pro všechny objekty v databázi. Můžeme zadat dotaz SCHEMA_NAME(), abychom získali výchozí schéma pro připojeného uživatele.
SELECT SCHEMA_NAME() AS defaultschema;
Výpis všech databázových schémat v aktuální databázi
Seznam schémat můžete získat pomocí dotazu SSMS nebo T-SQL. Chcete-li to provést v SSMS, připojte se k instanci SQL, rozbalte databázi SQL a prohlédněte si schémata ve složce zabezpečení.
Případně můžete použít sys.schemas k získání seznamu databázových schémat a jejich příslušných vlastníků.
SELECT s.name AS schema_name, u.name AS schema_owner FROM sys.schemas s INNER JOIN sys.sysusers u ON u.uid = s.principal_id ORDER BY s.name;
Vytvoření schématu SQL Server pomocí CREATE SCHEMA
K vytvoření nového schématu SQL Serveru používáme příkaz CREATE SCHEMA t-SQL. Jeho syntaxe je uvedena níže.
CREATE SCHEMA <schema_name> AUTHORIZATION <owner_name>
- Schema_name:Toto je schéma, které chceme vytvořit
- Autorizace:Toto je jméno vlastníka schématu
Skript pro vytváření schémat [HR], [Admin] a [Fin] s vlastníkem schématu [dbo] je uveden níže.
CREATE SCHEMA HR AUTHORIZATION dbo; GO CREATE SCHEMA Admin AUTHORIZATION dbo; Go CREATE SCHEMA Fin AUTHORIZATION dbo; GO
Můžete obnovit databázi a zobrazit nově vytvořené schéma, jak je uvedeno níže.
Vytvoření nové tabulky v rámci schématu
Chcete-li vytvořit objekty, jako je tabulka, musíme zadat název schématu, ve kterém bude objekt vytvořen. Například následující skript vytvoří [TableA] v různých schématech [HR], [Admin] a [Fin].
CREATE TABLE HR.TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) ) CREATE TABLE [Admin].TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) ) CREATE TABLE [Fin].TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) )
Můžete spojit systémové tabulky sys.tables a sys.schema a uvést název tabulky s jejich schématy. Například níže uvedený dotaz vrátí [TableA] s jeho schématem.
SELECT s.name AS SchemaName, t.name AS TableName FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.name ='TableA'
Pokud při vytváření objektu nezadáte schéma, SQL Server použije výchozí schéma. Například níže uvedený skript vytvoří tabulku A ve schématu dbo.
CREATE TABLE TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) )
Poznámka:Můžete vytvořit tabulku s podobným názvem v jiném schématu databáze.
Chcete-li načíst data ze správného schématu, musíte zadat schéma tabulky. Například, jak je ukázáno výše, máme [TableA] ve všech schématech. Pokud tedy vyberete záznamy přímo bez zadání schématu, vyhledá objekt ve výchozím schématu DBO. Proto vždy zadejte název schématu, například SELECT * FROM HR.TableA pro načítání dat nebo provádění jakýchkoli operací.
Vytvoření uložené procedury v rámci schématu
Podobně můžete vytvářet objekty, jako jsou uložené procedury, v určených schématech. Například níže uvedený skript vytvoří SP ve schématu HR.
CREATE PROCEDURE HR.GetEmpData AS BEGIN SELECT * FROM [HR].[TableA] END
Přenos objektu do jiného schématu
V určitém okamžiku můžete získat požadavek na přesunutí objektu do konkrétního schématu. Předpokládejme například, že jste vytvořili nové schéma [Org] a chcete, aby se vaše [HR].[TableA] přesunulo ze schématu [HR] na schéma [Org].
V tomto případě můžete použít příkaz Alter SCHEMA s následující syntaxí.
ALTER SCHEMA target_schema_name TRANSFER [ entity_type :: ] securable_name;
Níže uvedený skript přenese objekt [HR].[TableA] do schématu [Org].
CREATE SCHEMA [ORG] GO ALTER SCHEMA ORG TRANSFER HR.TableA
Nyní přeneseme uloženou proceduru [HR].[GetEmpData] do schématu [Org].
ALTER SCHEMA ORG TRANSFER HR.GetEmpData
Jakmile skript spustíte, zobrazí uloženou proceduru ve schématu [Org].
Uvnitř uložené procedury však kód stále odkazuje na schéma [HR].[TableA].
Proto byste neměli přesouvat uložené procedury, funkce nebo pohledy pomocí funkce ALTER SCHEMA, protože ta může mít odkazy na objekty v definici. Místo toho můžete postup vypustit, vytvořit nebo změnit, jak je uvedeno níže.
Vypuštění schématu
Schéma můžete vypustit z databáze SQL Server, ale schéma by nemělo obsahovat žádné objekty. Pokud se například pokusím zrušit schéma [Org], zobrazí se chyba, že schéma nelze zrušit, protože na něj odkazuje objekt GetEmpData.
Proto můžete buď přenést objekt do jiného schématu, nebo nejprve objekty vypustit. Například zrušme uložené procedury GetEmpData a potom se pokusíme zrušit schéma. Opět došlo k chybě, protože ve schématu [Org] máme [TableA].
Jakmile zrušíme nebo přesuneme všechny objekty ve schématu databáze, můžete schéma zrušit.
Poznámka:Systémová schémata jako dbo, information_schema, sys.
nelze zrušitVýhody použití databázových schémat
- Databázová schémata nám poskytují flexibilitu při vytváření skupin logických objektů v databázi. Pokud více týmů pracuje se stejnou databází, můžeme navrhnout různá schémata k oddělení jejich objektů.
- Databázová schémata pomáhají databázovým profesionálům spravovat přístup, protože můžete řídit přístup k uživatelům pro jejich příslušná schémata namísto poskytování přístupu k databázi jako celku.
- Můžete efektivněji spravovat databáze, protože to umožňuje, aby se stejné objekty ve více schématech jevily jako různé logické skupiny.
- Můžete rychle přesouvat objekty v rámci různých schémat.
- Vlastnictví schématu lze přiřadit libovolnému principálovi databáze nebo rolím a lze také převést vlastnictví.
- Poskytuje další vrstvu zabezpečení, protože k dotazování nebo manipulaci s daty potřebujete znát správné schéma objektu. Můžete také řídit přístup ke schématu a objektům vlastněným schématem.