Questo articolo spiegherà cosa sono gli schemi di database, i loro vantaggi e come creare e utilizzare gli schemi in SQL Server.
In un sistema di gestione di database relazionali come SQL Server, il database contiene vari oggetti. Possono essere tabelle, stored procedure, viste e funzioni. In un database, lo schema fa riferimento alla raccolta logica di oggetti di database. Puoi utilizzare gli schemi per separare gli oggetti a seconda dell'applicazione, dei diritti di accesso e della sicurezza.
Schemi di SQL Server
SQL Server fornisce i seguenti schemi logici incorporati:
- dbo
- sistema
- ospite
- INFORMATION_SCHEMA
Ogni schema di SQL Server deve avere un utente del database come proprietario dello schema. Il proprietario dello schema ha il controllo completo sullo schema. Puoi anche modificare il proprietario dello schema o spostare oggetti da uno schema all'altro.
Gli schemi di SQL Server offrono i seguenti vantaggi:
- Fornisce maggiore flessibilità e controllo per la gestione degli oggetti di database in gruppi logici
- Consente di spostare rapidamente oggetti tra schemi diversi
- Consente di gestire la sicurezza degli oggetti a livello di schema
- Consente agli utenti di gestire gruppi logici di oggetti all'interno di un database
- Consente agli utenti di trasferire la proprietà tra vari schemi
Supponiamo per il database della tua organizzazione di voler raggruppare oggetti in base ai reparti. Ad esempio, le tabelle e le procedure memorizzate per il reparto risorse umane devono essere raggruppate logicamente nello schema [HR]. Allo stesso modo, le tabelle del dipartimento finanziario dovrebbero trovarsi nello schema [Fin]. Ogni schema (gruppo logico) contiene oggetti SQL Server come tabelle, stored procedure, viste, funzioni, indici, tipi e sinonimi.
Nota:lo schema è un'entità con ambito database. Puoi avere lo stesso schema in database diversi di un'istanza di SQL Server.
Per impostazione predefinita, SQL Server utilizza lo schema [dbo] per tutti gli oggetti in un database. Possiamo interrogare SCHEMA_NAME() per ottenere lo schema predefinito per l'utente connesso.
SELECT SCHEMA_NAME() AS defaultschema;
Elenco di tutti gli schemi di database nel database corrente
È possibile ottenere un elenco degli schemi utilizzando una query SSMS o T-SQL. Per farlo in SSMS, devi connetterti all'istanza SQL, espandere il database SQL e visualizzare gli schemi nella cartella di sicurezza.
In alternativa, puoi utilizzare sys.schemas per ottenere un elenco di schemi di database e dei rispettivi proprietari.
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;
Creazione di uno schema SQL Server utilizzando CREATE SCHEMA
Per creare un nuovo schema di SQL Server, utilizziamo l'istruzione CREATE SCHEMA t-SQL. La sua sintassi è mostrata di seguito.
CREATE SCHEMA <schema_name> AUTHORIZATION <owner_name>
- Nome_schema:questo è lo schema che vogliamo creare
- Autorizzazione:questo è il nome del proprietario dello schema
Lo script per creare gli schemi [HR], [Admin] e [Fin] con il proprietario dello schema [dbo] è mostrato di seguito.
CREATE SCHEMA HR AUTHORIZATION dbo; GO CREATE SCHEMA Admin AUTHORIZATION dbo; Go CREATE SCHEMA Fin AUTHORIZATION dbo; GO
Puoi aggiornare il database e visualizzare lo schema appena creato come mostrato di seguito.
Creazione di una nuova tabella all'interno di uno schema
Per creare oggetti come una tabella, è necessario specificare il nome dello schema in cui verrà creato l'oggetto. Ad esempio, lo script seguente crea [TableA] in diversi schemi [HR], [Admin] e [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) )
È possibile unire le tabelle di sistema sys.tables e sys.schema per elencare il nome della tabella con i relativi schemi. Ad esempio, la query seguente restituisce [TableA] con il relativo 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'
Se non si specifica uno schema durante la creazione dell'oggetto, SQL Server utilizza lo schema predefinito. Ad esempio, lo script seguente crea una TableA nello schema dbo.
CREATE TABLE TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) )
Nota:puoi creare una tabella con un nome simile nel diverso schema di un database.
È necessario specificare lo schema della tabella per recuperare i dati dallo schema corretto. Ad esempio, come mostrato sopra, abbiamo [TableA] in tutti gli schemi. Pertanto, se si selezionano i record direttamente senza specificare lo schema, viene cercato un oggetto nello schema DBO predefinito. Pertanto, specifica sempre il nome dello schema come SELECT * FROM HR.TableA per il recupero dei dati o l'esecuzione di qualsiasi operazione.
Creazione di una procedura memorizzata all'interno di uno schema
Allo stesso modo, è possibile creare oggetti come stored procedure in schemi specificati. Ad esempio, lo script seguente crea un SP nello schema HR.
CREATE PROCEDURE HR.GetEmpData AS BEGIN SELECT * FROM [HR].[TableA] END
Trasferimento dell'oggetto in uno schema diverso
Ad un certo punto, potresti ricevere un requisito per spostare l'oggetto in uno schema specifico. Ad esempio, supponiamo che tu abbia creato un nuovo schema [Org] e desideri che il tuo [HR].[TableA] si sposti dallo schema [HR] allo schema [Org].
In questo caso, puoi utilizzare il comando Alter SCHEMA con la seguente sintassi.
ALTER SCHEMA target_schema_name TRANSFER [ entity_type :: ] securable_name;
Lo script seguente trasferisce l'oggetto [HR].[TableA] allo schema [Org].
CREATE SCHEMA [ORG] GO ALTER SCHEMA ORG TRANSFER HR.TableA
Ora trasferiamo la stored procedure [HR].[GetEmpData] allo schema [Org].
ALTER SCHEMA ORG TRANSFER HR.GetEmpData
Una volta eseguito, lo script mostra la procedura memorizzata nello schema [Org].
Tuttavia, all'interno della procedura memorizzata, il codice fa ancora riferimento allo schema [HR].[TableA].
Pertanto, non dovresti spostare stored procedure, funzioni o viste utilizzando la funzione ALTER SCHEMA in quanto potrebbe avere riferimenti per gli oggetti nella definizione. Puoi invece eliminare, creare o modificare la procedura come mostrato di seguito.
Eliminazione di uno schema
È possibile eliminare uno schema in un database di SQL Server, ma lo schema non deve contenere alcun oggetto. Ad esempio, se provo a eliminare lo schema [Org], viene visualizzato un errore che indica che non è possibile eliminare lo schema perché l'oggetto GetEmpData vi fa riferimento.
Pertanto, puoi trasferire l'oggetto a uno schema diverso o eliminare prima gli oggetti. Ad esempio, eliminiamo le stored procedure GetEmpData e quindi proviamo a eliminare lo schema. Abbiamo ricevuto di nuovo un errore perché abbiamo [TableA] nello schema [Org].
Dopo aver eliminato o spostato tutti gli oggetti nello schema del database, puoi eliminare lo schema.
Nota:non puoi eliminare schemi di sistema come dbo, information_schema, sys.
Vantaggi dell'utilizzo di schemi di database
- Gli schemi di database ci forniscono la flessibilità per creare gruppi di oggetti logici in un database. Se più team lavorano con lo stesso database, possiamo progettare vari schemi per separare i loro oggetti.
- Gli schemi di database aiutano i professionisti del database a gestire l'accesso, poiché puoi controllare l'accesso agli utenti per i loro rispettivi schemi invece di fornire l'accesso al database nel suo insieme.
- Puoi gestire i database in modo più efficiente perché consente agli stessi oggetti in più schemi di apparire come un gruppo logico diverso.
- Puoi spostare rapidamente oggetti all'interno di schemi diversi.
- La proprietà dello schema può essere assegnata con qualsiasi entità o ruolo del database e anche la proprietà può essere trasferita.
- Fornisce un ulteriore livello di sicurezza poiché è necessario conoscere lo schema di oggetti corretto per interrogare o manipolare i dati. Puoi anche controllare l'accesso allo schema e agli oggetti di proprietà dello schema.