Denne artikel vil forklare, hvad databaseskemaer er, deres fordele, og hvordan man opretter og bruger skemaer i SQL Server.
I et relationelt databasestyringssystem som SQL Server indeholder databasen forskellige objekter. Det kan være tabeller, lagrede procedurer, visninger og funktioner. I en database refererer skemaet til den logiske samling af databaseobjekter. Du kan bruge skemaer til at adskille objekter afhængigt af applikationen, adgangsrettigheder og sikkerhed.
SQL Server-skemaer
SQL Server har følgende indbyggede logiske skemaer:
- dbo
- sys
- gæst
- INFORMATION_SCHEMA
Ethvert SQL Server-skema skal have en databasebruger som skemaejer. Skemaejeren har fuld kontrol over skemaet. Du kan også ændre skemaejeren eller flytte objekter fra et skema til et andet.
SQL Server-skemaer giver følgende fordele:
- Giver mere fleksibilitet og kontrol til styring af databaseobjekter i logiske grupper
- Giver dig mulighed for hurtigt at flytte objekter mellem forskellige skemaer
- Gør det muligt for dig at administrere objektsikkerhed på skemaniveau
- Tillader brugere at administrere logiske grupper af objekter i en database
- Tillader brugere at overføre ejerskab mellem forskellige skemaer
Antag, at du for din organisations database vil gruppere objekter baseret på afdelinger. For eksempel bør tabellerne og lagrede procedurer for HR-afdelingen være logisk grupperet i [HR]-skemaet. På samme måde bør finansafdelingstabeller være i [Fin]-skemaet. Hvert skema (logisk gruppe) indeholder SQL Server-objekter såsom tabeller, lagrede procedurer, visninger, funktioner, indekser, typer og synonymer.
Bemærk:Skemaet er en databaseomfattet enhed. Du kan have det samme skema i forskellige databaser i en SQL Server-instans.
Som standard bruger SQL Server [dbo]-skema til alle objekter i en database. Vi kan forespørge SCHEMA_NAME() for at få standardskemaet for den tilsluttede bruger.
SELECT SCHEMA_NAME() AS defaultschema;
Visning af alle databaseskemaer i den aktuelle database
Du kan få en liste over skemaerne ved hjælp af en SSMS- eller T-SQL-forespørgsel. For at gøre dette i SSMS skal du oprette forbindelse til SQL-instansen, udvide SQL-databasen og se skemaerne under sikkerhedsmappen.
Alternativt kan du bruge sys.schemas til at få en liste over databaseskemaer og deres respektive ejere.
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;
Oprettelse af et SQL Server-skema ved hjælp af CREATE SCHEMA
For at oprette et nyt SQL Server-skema bruger vi CREATE SCHEMA t-SQL-sætningen. Dens syntaks er vist nedenfor.
CREATE SCHEMA <schema_name> AUTHORIZATION <owner_name>
- Skema_navn:Dette er det skema, vi ønsker at oprette
- Godkendelse:Dette er skemaejerens navn
Scriptet til at oprette skemaer [HR], [Admin] og [Fin] med [dbo] skemaejer er vist nedenfor.
CREATE SCHEMA HR AUTHORIZATION dbo; GO CREATE SCHEMA Admin AUTHORIZATION dbo; Go CREATE SCHEMA Fin AUTHORIZATION dbo; GO
Du kan opdatere databasen og se det nyoprettede skema som vist nedenfor.
Oprettelse af en ny tabel i et skema
For at oprette objekter, såsom en tabel, skal vi angive skemanavnet, hvori objektet skal oprettes. For eksempel opretter følgende script [TabelA] i forskellige skemaer [HR], [Admin] og [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) )
Du kan forbinde sys.tables og sys.schema systemtabeller for at vise tabelnavnet med deres skemaer. For eksempel returnerer nedenstående forespørgsel [TabelA] med sit skema.
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'
Hvis du ikke angiver et skema, mens du opretter objektet, bruger SQL Server standardskemaet. For eksempel opretter nedenstående script en TabelA i dbo-skemaet.
CREATE TABLE TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) )
Bemærk:Du kan oprette en tabel med et lignende navn i det forskellige skema i en database.
Du skal angive tabelskemaet for at hente data fra det korrekte skema. For eksempel, som vist ovenfor, har vi [TabelA] i alle skemaer. Derfor, hvis du vælger poster direkte uden at angive skemaet, leder det efter et objekt i standard DBO-skemaet. Angiv derfor altid skemanavnet, såsom SELECT * FROM HR.TableA for at hente data eller udføre handlinger.
Oprettelse af en lagret procedure i et skema
På samme måde kan du oprette objekter såsom lagrede procedurer i specificerede skemaer. For eksempel opretter nedenstående script en SP i HR-skemaet.
CREATE PROCEDURE HR.GetEmpData AS BEGIN SELECT * FROM [HR].[TableA] END
Overførsel af objektet til et andet skema
På et tidspunkt kan du få et krav om at flytte objektet til et bestemt skema. Antag for eksempel, at du har oprettet et nyt skema [Org], og du vil have dit [HR].[TabelA] til at flytte fra [HR]-skema til [Org]-skema.
I dette tilfælde kan du bruge kommandoen Alter SCHEMA med følgende syntaks.
ALTER SCHEMA target_schema_name TRANSFER [ entity_type :: ] securable_name;
Nedenstående script overfører objekt [HR].[TabelA] til [Org]-skemaet.
CREATE SCHEMA [ORG] GO ALTER SCHEMA ORG TRANSFER HR.TableA
Lad os nu overføre den lagrede procedure [HR].[GetEmpData] til [Org]-skemaet.
ALTER SCHEMA ORG TRANSFER HR.GetEmpData
Når du har udført scriptet, viser det den lagrede procedure i [Org]-skemaet.
Men i den lagrede procedure henviser koden stadig til [HR].[TabelA]-skemaet.
Derfor bør du ikke flytte lagrede procedurer, funktioner eller visninger ved hjælp af ALTER SCHEMA-funktionen, da den kan have referencer til objekterne i definitionen. I stedet kan du droppe, oprette eller ændre proceduren som vist nedenfor.
Slet et skema
Du kan slippe et skema i en SQL Server-database, men skemaet bør ikke indeholde nogen objekter. For eksempel, hvis jeg prøver at droppe [Org]-skemaet, giver det en fejl om, at du ikke kan droppe skemaet, fordi objektet GetEmpData refererer til det.
Derfor kan du enten overføre objektet til et andet skema eller slippe objekterne først. Lad os for eksempel droppe GetEmpData-lagrede procedurer og derefter prøve at droppe skemaet. Vi fik igen en fejl, fordi vi har [TabelA] i [Org]-skemaet.
Når vi har droppet eller flyttet alle objekter i databaseskemaet, kan du derefter droppe skemaet.
Bemærk:Du kan ikke droppe systemskemaer såsom dbo, information_schema, sys.
Fordele ved at bruge databaseskemaer
- Databaseskemaer giver os fleksibiliteten til at oprette logiske objektgrupper i en database. Hvis flere teams arbejder med den samme database, kan vi designe forskellige skemaer for at adskille deres objekter.
- Databaseskemaer hjælper databaseprofessionelle med at administrere adgang, da du kan kontrollere adgangen til brugere for deres respektive skemaer i stedet for at give adgang til databasen som helhed.
- Du kan administrere databaser mere effektivt, fordi det tillader, at de samme objekter i flere skemaer vises som en anden logisk gruppe.
- Du kan hurtigt flytte objekter inden for forskellige skemaer.
- Skemaejerskabet kan tildeles enhver databaseprincipper eller -roller, og ejerskab kan også overføres.
- Det giver et ekstra lag af sikkerhed, da du skal kende det korrekte objektskema for at forespørge eller manipulere data. Du kan også kontrollere adgangen til skema- og skemaejede objekter.