sql >> Databasteknik >  >> RDS >> Sqlserver

Använda databasscheman i SQL Server

Den här artikeln kommer att förklara vad databasscheman är, deras fördelar och hur man skapar och använder scheman i SQL Server.

I ett relationsdatabashanteringssystem som SQL Server innehåller databasen olika objekt. Det kan vara tabeller, lagrade procedurer, vyer och funktioner. I en databas hänvisar schemat till den logiska samlingen av databasobjekt. Du kan använda scheman för att separera objekt beroende på applikation, åtkomsträttigheter och säkerhet.

SQL Server-scheman

SQL Server tillhandahåller följande inbyggda logiska scheman:

  • dbo
  • sys
  • gäst
  • INFORMATION_SCHEMA

Varje SQL Server-schema måste ha en databasanvändare som schemaägare. Schemaägaren har full kontroll över schemat. Du kan också ändra schemaägaren eller flytta objekt från ett schema till ett annat.

SQL Server-scheman ger följande fördelar:

  • Ger mer flexibilitet och kontroll för att hantera databasobjekt i logiska grupper
  • Låter dig flytta objekt mellan olika scheman snabbt
  • Låter dig hantera objektsäkerhet på schemanivå
  • Tillåter användare att hantera logiska grupper av objekt i en databas
  • Tillåter användare att överföra ägandeskap mellan olika scheman

Anta att du för din organisations databas vill gruppera objekt baserat på avdelningar. Till exempel bör tabellerna och de lagrade procedurerna för HR-avdelningen logiskt grupperas i [HR]-schemat. På samma sätt bör ekonomiavdelningens tabeller finnas i schemat [Fin]. Varje schema (logisk grupp) innehåller SQL Server-objekt såsom tabeller, lagrade procedurer, vyer, funktioner, index, typer och synonymer.

Obs! Schemat är en databasomfattad enhet. Du kan ha samma schema i olika databaser av en SQL Server-instans.

Som standard använder SQL Server [dbo]-schema för alla objekt i en databas. Vi kan fråga SCHEMA_NAME() för att få standardschemat för den anslutna användaren.

SELECT SCHEMA_NAME() AS defaultschema;

Listar alla databasscheman i den aktuella databasen

Du kan få en lista över scheman med hjälp av en SSMS- eller T-SQL-fråga. För att göra detta i SSMS skulle du ansluta till SQL-instansen, expandera SQL-databasen och visa scheman under säkerhetsmappen.

Alternativt kan du använda sys.schemas för att få en lista över databasscheman och deras respektive ägare.

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;

Skapa ett SQL Server-schema med CREATE SCHEMA

För att skapa ett nytt SQL Server-schema använder vi CREATE SCHEMA t-SQL-satsen. Dess syntax visas nedan.

CREATE SCHEMA <schema_name>
AUTHORIZATION <owner_name>
  • Schema_name:Detta är schemat som vi vill skapa
  • Auktorisering:Detta är schemaägarens namn

Skriptet för att skapa scheman [HR], [Admin] och [Fin] med [dbo] schemaägare visas nedan.

CREATE SCHEMA HR AUTHORIZATION dbo;

GO

CREATE SCHEMA Admin AUTHORIZATION dbo;

Go

CREATE SCHEMA Fin AUTHORIZATION dbo;

GO

Du kan uppdatera databasen och se det nyskapade schemat som visas nedan.

Skapa en ny tabell i ett schema

För att skapa objekt som t.ex. en tabell måste vi ange schemanamnet där objektet ska skapas. Till exempel skapar följande skript [TabellA] i olika scheman [HR], [Admin] och [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 ansluta sys.tables och sys.schema systemtabeller för att lista tabellnamnet med deras scheman. Till exempel returnerar frågan nedan [TabellA] med dess 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'

Om du inte anger ett schema när du skapar objektet, använder SQL Server standardschemat. Till exempel skapar skriptet nedan en TabellA i dbo-schemat.

CREATE TABLE TableA
(
ID int identity(1,1) PRIMARY KEY,
[Name] varchar(100)
)

Obs! Du kan skapa en tabell med ett liknande namn i det olika schemat för en databas.

Du måste ange tabellschemat för att hämta data från rätt schema. Till exempel, som visas ovan, har vi [TabellA] i alla scheman. Därför, om du väljer poster direkt utan att ange schemat, letar det efter ett objekt i standard DBO-schemat. Ange därför alltid schemanamnet som SELECT * FROM HR.TableA för datahämtning eller för att utföra några operationer.

Skapa en lagrad procedur i ett schema

På samma sätt kan du skapa objekt som lagrade procedurer i specificerade scheman. Till exempel skapar skriptet nedan en SP i HR-schemat.

CREATE PROCEDURE HR.GetEmpData
AS
BEGIN
SELECT * FROM [HR].[TableA]
END

Överföra objektet till ett annat schema

Vid något tillfälle kan du få ett krav på att flytta objektet till ett specifikt schema. Anta till exempel att du skapade ett nytt schema [Org] och du vill att ditt [HR].[TabellA] ska flyttas från [HR]-schema till [Org]-schema.

I det här fallet kan du använda kommandot Alter SCHEMA med följande syntax.

ALTER SCHEMA target_schema_name
TRANSFER [ entity_type :: ] securable_name;

Skriptet nedan överför objektet [HR].[TabellA] till [Org]-schemat.

CREATE SCHEMA [ORG]
GO
ALTER SCHEMA ORG TRANSFER HR.TableA

Låt oss nu överföra den lagrade proceduren [HR].[GetEmpData] till [Org]-schemat.

ALTER SCHEMA ORG TRANSFER HR.GetEmpData

När du kört skriptet visar det den lagrade proceduren i [Org]-schemat.

Men i den lagrade proceduren hänvisar koden fortfarande till schemat [HR].[TabellA].

Därför bör du inte flytta lagrade procedurer, funktioner eller vyer med funktionen ALTER SCHEMA eftersom den kan ha referenser för objekten i definitionen. Istället kan du släppa, skapa eller ändra proceduren som visas nedan.

Släpp ett schema

Du kan släppa ett schema i en SQL Server-databas, men schemat bör inte innehålla några objekt. Om jag till exempel försöker släppa [Org]-schemat, ger det ett felmeddelande om att du inte kan släppa schemat eftersom objektet GetEmpData refererar till det.

Därför kan du antingen överföra objektet till ett annat schema eller släppa objekten först. Låt oss till exempel släppa GetEmpData lagrade procedurer och sedan försöka släppa schemat. Vi fick ett fel igen eftersom vi har [TabellA] i [Org]-schemat.

När vi har släppt eller flyttat alla objekt i databasschemat kan du släppa schemat.

Obs:Du kan inte släppa systemscheman som dbo, information_schema, sys.

Fördelar med att använda databasscheman

  • Databasscheman ger oss flexibiliteten att skapa logiska objektgrupper i en databas. Om flera team arbetar med samma databas kan vi designa olika scheman för att separera deras objekt.
  • Databasscheman hjälper databasproffs att hantera åtkomst, eftersom du kan kontrollera åtkomst till användare för deras respektive schema(n) istället för att ge åtkomst till databasen som helhet.
  • Du kan hantera databaser mer effektivt eftersom det tillåter samma objekt i flera scheman att visas som en annan logisk grupp.
  • Du kan snabbt flytta objekt inom olika scheman.
  • Schemats äganderätt kan tilldelas vilken databashuvud eller roller som helst och äganderätten kan också överföras.
  • Det ger ett extra lager av säkerhet eftersom du behöver känna till rätt objektschema för att fråga eller manipulera data. Du kan också styra åtkomst till schema- och schemaägda objekt.

  1. 4 sätt att få SQL Server-jobbhistorik

  2. Hantera transaktioner samtidigt med lås i SQL Server

  3. Skapa en skalär användardefinierad funktion i SQL Server

  4. SUBDATE() Exempel – MySQL