CREATE SCHEMA (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Crea uno schema nel database corrente. La transazione CREATE SCHEMA può anche creare tabelle e viste all'interno del nuovo schema e impostare le autorizzazioni GRANT, DENY o REVOKE per tali oggetti.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

-- Syntax for SQL Server and Azure SQL Database  
  
CREATE SCHEMA schema_name_clause [ <schema_element> [ ...n ] ]  
  
<schema_name_clause> ::=  
    {  
    schema_name  
    | AUTHORIZATION owner_name  
    | schema_name AUTHORIZATION owner_name  
    }  
  
<schema_element> ::=   
    {   
        table_definition | view_definition | grant_statement |   
        revoke_statement | deny_statement   
    }  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
CREATE SCHEMA schema_name [ AUTHORIZATION owner_name ] [;]  

Argomenti

schema_name
Nome con il quale viene identificato lo schema all'interno del database.

AUTHORIZATION owner_name
Specifica il nome dell'entità a livello di database che sarà proprietaria dello schema. L'entità può essere proprietaria di altri schemi e non può utilizzare lo schema corrente come schema predefinito.

table_definition
Specifica un'istruzione CREATE TABLE che crea una tabella all'interno dello schema. L'entità che esegue l'istruzione deve disporre dell'autorizzazione CREATE TABLE per il database corrente.

view_definition
Specifica un'istruzione CREATE VIEW che crea una vista all'interno dello schema. L'entità che esegue l'istruzione deve disporre dell'autorizzazione CREATE VIEW per il database corrente.

grant_statement
Specifica un'istruzione GRANT che concede le autorizzazioni per ogni entità a protezione diretta ad eccezione del nuovo schema.

revoke_statement
Specifica un'istruzione REVOKE che revoca le autorizzazioni per ogni entità a protezione diretta ad eccezione del nuovo schema.

deny_statement
Specifica un'istruzione DENY che nega le autorizzazioni per ogni entità a protezione diretta ad eccezione del nuovo schema.

Osservazioni:

Nota

Le istruzioni che contengono CREATE SCHEMA AUTHORIZATION ma non specificano un nome sono supportate unicamente per compatibilità con le versioni precedenti. L'istruzione non causa un errore ma non crea uno schema.

CREATE SCHEMA consente di creare uno schema, le tabelle e le viste in esso contenute e concedere, revocare o negare le autorizzazioni per ogni entità a protezione diretta in una singola istruzione. Questa istruzione deve essere eseguita come batch separato. Gli oggetti creati tramite l'istruzione CREATE SCHEMA vengono creati all'interno dello schema di cui è in corso la creazione.

Le transazioni CREATE SCHEMA sono atomiche. In caso di errori durante l'esecuzione di un'istruzione CREATE SCHEMA, non verrà creata alcuna entità a protezione diretta e non verranno concesse autorizzazioni.

Le entità a protezione diretta da creare tramite CREATE SCHEMA possono essere elencate in qualsiasi ordine, ad eccezione delle viste che fanno riferimento ad altre viste. In questo caso, la vista a cui viene fatto riferimento deve essere creata prima della vista che vi fa riferimento.

Un'istruzione GRANT può pertanto concedere l'autorizzazione per un oggetto prima che l'oggetto stesso venga creato, mentre un'istruzione CREATE VIEW può essere visualizzata prima delle istruzioni CREATE TABLE che creano le tabelle a cui fa riferimento la vista. Le istruzioni CREATE TABLE, inoltre, possono dichiarare chiavi esterne per le tabelle definite successivamente nell'istruzione CREATE SCHEMA.

Nota

Le clausole DENY e REVOKE sono supportate nelle istruzioni CREATE SCHEMA. Le clausole DENY e REVOKE vengono eseguite nell'ordine in cui compaiono nell'istruzione CREATE SCHEMA.

L'entità che esegue CREATE SCHEMA può specificare un'altra entità di database come proprietario dello schema di cui è in corso la creazione. A tale scopo, sono richieste ulteriori autorizzazioni, come illustrato nella sezione "Autorizzazioni" più avanti in questo argomento.

Il nuovo schema è di proprietà di una delle seguenti entità a livello di database: utente di database, ruolo di database o ruolo applicazione. Gli oggetti creati all'interno di uno schema appartengono al proprietario dello schema e hanno un valore NULL per principal_id in sys.objects. La proprietà degli oggetti contenuti in uno schema può essere trasferita a qualsiasi entità a livello di database, ma il proprietario dello schema mantiene sempre l'autorizzazione CONTROL per gli oggetti all'interno dello schema.

Attenzione

A partire da SQL Server 2005, il funzionamento degli schemi è stato modificato. È pertanto possibile che il codice in cui gli schemi vengono considerati equivalenti agli utenti del database non restituisca risultati corretti. Non utilizzare le viste del catalogo delle versioni precedenti, inclusa sysobjects, nei database in cui sia già stata utilizzata una delle istruzioni DDL seguenti: CREATE SCHEMA, ALTER SCHEMA, DROP SCHEMA, CREATE USER, ALTER USER, DROP USER, CREATE ROLE, ALTER ROLE, DROP ROLE, CREATE APPROLE, ALTER APPROLE, DROP APPROLE, ALTER AUTHORIZATION. In tali database è invece necessario usare le nuove viste del catalogo. Le nuove viste del catalogo prendono in considerazione la separazione tra entità e schemi introdotta in SQL Server 2005. Per altre informazioni sulle viste del catalogo, vedere Viste del catalogo (Transact-SQL).

Schema implicito e creazione di utenti

Nota

Microsoft Entra ID era precedentemente conosciuto come Azure Active Directory (Azure AD).

In alcuni casi un utente può usare un database senza disporre di un account utente di database, ovvero un'entità database nel database. L'errore può verificarsi nelle situazioni seguenti:

  • Un account di accesso dispone di privilegi CONTROL SERVER.

  • Un utente di Windows non dispone di un account utente di database individuale (un'entità database nel database), ma accede a un database come membro di un gruppo di Windows che dispone di un account utente di database (un'entità database per il gruppo di Windows).

  • Un utente di Microsoft Entra non dispone di un singolo account utente del database (un'entità di database nel database), ma accede a un database come membro di un gruppo Microsoft Entra che dispone di un account utente di database (un'entità di database per il gruppo Microsoft Entra).

Quando un utente privo di account utente di database crea un oggetto senza specificare uno schema esistente, nel database saranno creati automaticamente un'entità database e uno schema predefinito per tale utente. L'entità database e lo schema creati avranno lo stesso nome usato dall'utente per la connessione a SQL Server (l'ID di accesso per l'autenticazione di SQL Server o il nome utente di Windows).

Questo comportamento è necessario per permettere agli utenti che usano gruppi di Windows di creare e possedere oggetti. Può tuttavia comportare la creazione accidentale di schemi e utenti. Per evitare di creare implicitamente utenti e schema, creare sempre, quando possibile, in modo esplicito le entità database e assegnare uno schema predefinito. In alternativa, dichiarare in modo esplicito uno schema esistente quando si creano oggetti in un database, usando nomi oggetto costituiti da due o tre parti.

Nota

La creazione implicita di un utente di Microsoft Entra non è possibile in database SQL. Poiché la creazione di un utente di Microsoft Entra da un provider esterno deve controllare lo stato dell'utente in Microsoft Entra ID, la creazione dell'utente avrà esito negativo con errore 2760: il nome dello schema specificato "<user_name@domain>" non esiste o non si dispone dell'autorizzazione per usarlo. Errore 2759: CREATE SCHEMA non riuscito a causa di errori precedenti. I tentativi di creazione o modifica degli schemi genereranno l'errore 15151: Impossibile trovare l'utente '', perché non esiste o non si dispone dell'autorizzazione., seguito anche dall'errore 2759. Per risolvere questi errori, creare l'utente di Microsoft Entra da un provider esterno o modificare il gruppo Microsoft Entra per assegnare uno schema predefinito. Eseguire quindi di nuovo l'istruzione creando l'oggetto .

In Endpoint di analisi SQL e Warehouse in Microsoft Fabric i nomi degli schemi non possono contenere / o \ terminare con un oggetto ..

Informativa sulle funzionalità deprecate

Le istruzioni CREATE SCHEMA che non specificano un nome di schema sono attualmente supportate per compatibilità con le versioni precedenti. Tali istruzioni in realtà non creano uno schema all'interno del database, ma creano tabelle e viste e concedono autorizzazioni. Le entità non necessitano dell'autorizzazione CREATE SCHEMA per eseguire questa versione meno recente di CREATE SCHEMA, perché non viene creato alcuno schema. Questa funzionalità verrà rimossa a partire da una delle prossime versioni di SQL Server.

Autorizzazioni

È richiesta l'autorizzazione CREATE SCHEMA per il database.

Per creare un oggetto specificato all'interno dell'istruzione CREATE SCHEMA, l'utente deve disporre dell'autorizzazione CREATE corrispondente.

Per specificare un altro utente come proprietario dello schema che viene creato, l'utente deve disporre dell'autorizzazione IMPERSONATE per quell'utente. Se si specifica un ruolo di database come proprietario, il chiamante deve disporre dell'appartenenza al ruolo oppure dell'autorizzazione ALTER per il ruolo.

Nota

Per motivi di compatibilità con la sintassi precedente, non vengono controllate le autorizzazioni per CREATE SCHEMA perché non viene creato alcuno schema.

Esempi

R. Creazione di uno schema e concessione di autorizzazioni

Nell'esempio seguente viene creato lo schema Sprockets, di proprietà di Annik, contenente la tabella NineProngs. L'istruzione concede SELECT a Mandar e nega SELECT a Prasanna. Si noti che Sprockets e NineProngs vengono creati in una singola istruzione.

USE AdventureWorks2022;  
GO  
CREATE SCHEMA Sprockets AUTHORIZATION Annik  
    CREATE TABLE NineProngs (source int, cost int, partnumber int)  
    GRANT SELECT ON SCHEMA::Sprockets TO Mandar  
    DENY SELECT ON SCHEMA::Sprockets TO Prasanna;  
GO   

Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)

B. Creazione di uno schema e di una tabella nello schema

Nell'esempio seguente viene creato lo schema Sales e poi la tabella Sales.Region nello schema.

CREATE SCHEMA Sales;  
GO
  
CREATE TABLE Sales.Region   
(Region_id INT NOT NULL,  
Region_Name CHAR(5) NOT NULL)  
WITH (DISTRIBUTION = REPLICATE);  
GO  

C. Impostazione del proprietario di uno schema

Nell'esempio seguente viene creato lo schema Production, di proprietà di Mary.

CREATE SCHEMA Production AUTHORIZATION [Contoso\Mary];  
GO  

Vedi anche

ALTER SCHEMA (Transact-SQL)
DROP SCHEMA (Transact-SQL)
GRANT (Transact-SQL)
DENY (Transact-SQL)
REVOKE (Transact-SQL)
CREATE VIEW (Transact-SQL)
EVENTDATA (Transact-SQL)
sys.schemas (Transact-SQL)
Creazione di uno schema di database