In dit artikel wordt uitgelegd wat databaseschema's zijn, wat hun voordelen zijn en hoe schema's in SQL Server kunnen worden gemaakt en gebruikt.
In een relationeel databasebeheersysteem zoals SQL Server bevat de database verschillende objecten. Dit kunnen tabellen, opgeslagen procedures, views en functies zijn. In een database verwijst het schema naar de logische verzameling database-objecten. U kunt schema's gebruiken om objecten te scheiden, afhankelijk van de toepassing, toegangsrechten en beveiliging.
SQL Server-schema's
SQL Server biedt de volgende ingebouwde logische schema's:
- dbo
- sys
- gast
- INFORMATION_SCHEMA
Elk SQL Server-schema moet een databasegebruiker als schema-eigenaar hebben. De schema-eigenaar heeft volledige controle over het schema. U kunt ook de eigenaar van het schema wijzigen of objecten van het ene schema naar het andere verplaatsen.
SQL Server-schema's bieden de volgende voordelen:
- Biedt meer flexibiliteit en controle voor het beheren van database-objecten in logische groepen
- Hiermee kunt u snel objecten tussen verschillende schema's verplaatsen
- Hiermee kunt u objectbeveiliging op schemaniveau beheren
- Hiermee kunnen gebruikers logische groepen objecten in een database beheren
- Hiermee kunnen gebruikers eigendom tussen verschillende schema's overdragen
Stel dat u voor de database van uw organisatie objecten wilt groeperen op basis van afdelingen. De tabellen en opgeslagen procedures voor de HR-afdeling moeten bijvoorbeeld logisch worden gegroepeerd in het [HR]-schema. Evenzo moeten de tabellen van de financiële afdeling in het [Fin]-schema staan. Elk schema (logische groep) bevat SQL Server-objecten zoals tabellen, opgeslagen procedures, views, functies, indexen, typen en synoniemen.
Opmerking:Het schema is een entiteit met een databasebereik. U kunt hetzelfde schema in verschillende databases van een SQL Server-instantie hebben.
Standaard gebruikt SQL Server het [dbo]-schema voor alle objecten in een database. We kunnen een query uitvoeren op SCHEMA_NAME() om het standaardschema voor de verbonden gebruiker te krijgen.
SELECT SCHEMA_NAME() AS defaultschema;
Alle databaseschema's in de huidige database weergeven
U kunt een lijst van de schema's krijgen met behulp van een SSMS- of T-SQL-query. Om dit in SSMS te doen, maakt u verbinding met de SQL-instantie, vouwt u de SQL-database uit en bekijkt u de schema's onder de beveiligingsmap.
U kunt ook de sys.schemas gebruiken om een lijst met databaseschema's en hun respectievelijke eigenaren te krijgen.
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;
Een SQL Server-schema maken met CREATE SCHEMA
Om een nieuw SQL Server-schema te maken, gebruiken we de CREATE SCHEMA t-SQL-instructie. De syntaxis wordt hieronder weergegeven.
CREATE SCHEMA <schema_name> AUTHORIZATION <owner_name>
- Schema_name:dit is het schema dat we willen maken
- Autorisatie:dit is de naam van de schema-eigenaar
Het script om schema's [HR], [Admin] en [Fin] te maken met [dbo] schema-eigenaar wordt hieronder weergegeven.
CREATE SCHEMA HR AUTHORIZATION dbo; GO CREATE SCHEMA Admin AUTHORIZATION dbo; Go CREATE SCHEMA Fin AUTHORIZATION dbo; GO
U kunt de database vernieuwen en het nieuw gemaakte schema bekijken zoals hieronder weergegeven.
Een nieuwe tabel maken binnen een schema
Om objecten zoals een tabel te maken, moeten we de schemanaam opgeven waarin het object wordt gemaakt. Het volgende script creëert bijvoorbeeld [TableA] in verschillende schema's [HR], [Admin] en [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) )
U kunt de systeemtabellen sys.tables en sys.schema samenvoegen om de tabelnaam met hun schema's weer te geven. De onderstaande query retourneert bijvoorbeeld [TableA] met zijn schema.
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'
Als u geen schema opgeeft tijdens het maken van het object, gebruikt SQL Server het standaardschema. Het onderstaande script maakt bijvoorbeeld een TableA aan in het dbo-schema.
CREATE TABLE TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) )
Opmerking:u kunt een tabel maken met een vergelijkbare naam in een ander schema van een database.
U moet het tabelschema specificeren om gegevens uit het juiste schema op te halen. Zoals hierboven weergegeven, hebben we bijvoorbeeld [TabelA] in alle schema's. Als u records rechtstreeks selecteert zonder het schema op te geven, zoekt het daarom naar een object in het standaard-DBO-schema. Geef daarom altijd de schemanaam op, zoals SELECT * FROM HR.TableA voor het ophalen van gegevens of het uitvoeren van bewerkingen.
Een opgeslagen procedure maken binnen een schema
Op dezelfde manier kunt u objecten maken, zoals opgeslagen procedures in gespecificeerde schema's. Het onderstaande script maakt bijvoorbeeld een SP in het HR-schema.
CREATE PROCEDURE HR.GetEmpData AS BEGIN SELECT * FROM [HR].[TableA] END
Het object overzetten naar een ander schema
Op een gegeven moment kunt u een vereiste krijgen om het object naar een specifiek schema te verplaatsen. Stel dat u bijvoorbeeld een nieuw schema [Org] hebt gemaakt en dat u wilt dat uw [HR].[TableA] van het [HR]-schema naar het [Org]-schema gaat.
In dit geval kunt u de opdracht Alter SCHEMA gebruiken met de volgende syntaxis.
ALTER SCHEMA target_schema_name TRANSFER [ entity_type :: ] securable_name;
Het onderstaande script zet object [HR].[TableA] over naar het [Org]-schema.
CREATE SCHEMA [ORG] GO ALTER SCHEMA ORG TRANSFER HR.TableA
Laten we nu de opgeslagen procedure [HR].[GetEmpData] overbrengen naar het [Org]-schema.
ALTER SCHEMA ORG TRANSFER HR.GetEmpData
Zodra u het script uitvoert, wordt de opgeslagen procedure in het [Org]-schema weergegeven.
Binnen de opgeslagen procedure verwijst de code echter nog steeds naar het [HR].[TableA]-schema.
Daarom moet u opgeslagen procedures, functies of weergaven niet verplaatsen met de functie ALTER SCHEMA, omdat deze mogelijk verwijzingen heeft naar de objecten in de definitie. In plaats daarvan kunt u de procedure laten vallen, maken of wijzigen zoals hieronder weergegeven.
Een schema laten vallen
U kunt een schema in een SQL Server-database neerzetten, maar het schema mag geen objecten bevatten. Als ik bijvoorbeeld het [Org]-schema probeer te verwijderen, geeft het een foutmelding dat u het schema niet kunt verwijderen omdat het object GetEmpData ernaar verwijst.
Daarom kunt u het object naar een ander schema overbrengen of eerst de objecten verwijderen. Laten we bijvoorbeeld de opgeslagen GetEmpData-procedures verwijderen en vervolgens proberen het schema te verwijderen. We hebben opnieuw een foutmelding gekregen omdat we [TableA] in het [Org]-schema hebben.
Zodra we alle objecten in het databaseschema hebben verwijderd of verplaatst, kunt u het schema verwijderen.
Opmerking:u kunt systeemschema's zoals dbo, information_schema, sys niet verwijderen.
Voordelen van het gebruik van databaseschema's
- Databaseschema's bieden ons de flexibiliteit om logische objectgroepen in een database te maken. Als meerdere teams met dezelfde database werken, kunnen we verschillende schema's ontwerpen om hun objecten te scheiden.
- Databaseschema's helpen databaseprofessionals de toegang te beheren, aangezien u de toegang tot gebruikers voor hun respectievelijke schema('s) kunt beheren in plaats van toegang te verlenen tot de database als geheel.
- Je kunt databases efficiënter beheren omdat dezelfde objecten in meerdere schema's als een andere logische groep kunnen worden weergegeven.
- Je kunt snel objecten verplaatsen binnen verschillende schema's.
- Het schema-eigendom kan worden toegewezen aan elke database-principal of -rollen en het eigendom kan ook worden overgedragen.
- Het biedt een extra beveiligingslaag, omdat u het juiste objectschema moet kennen om gegevens te kunnen opvragen of manipuleren. U kunt ook de toegang beheren voor objecten die eigendom zijn van een schema en schema's.