ALTER SCHEMA (Transact-SQL)

Trasferisce un'entità a sicurezza diretta da uno schema a un altro.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

ALTER SCHEMA schema_name 
   TRANSFER [ <entity_type> :: ] securable_name [;]

<entity_type> ::=
    {
        Object | Type | XML Schema Collection
    }

Argomenti

  • schema_name
    Nome di uno schema nel database corrente in cui verrà spostata l'entità a protezione diretta. Non può essere SYS o INFORMATION_SCHEMA.

  • <entity_type>
    Classe dell'entità per la quale viene modificato il proprietario. L'oggetto rappresenta l'impostazione predefinita.

  • securable_name
    Nome composto da una o due parti di un'entità a protezione diretta inclusa nello schema da spostare nello schema.

Osservazioni

Utenti e schemi sono completamente distinti. Per ulteriori informazioni, vedere Separazione tra schema e utente.

È possibile utilizzare ALTER SCHEMA solo per spostare le entità a sicurezza diretta tra schemi presenti nello stesso database. Per modificare o eliminare un'entità a sicurezza diretta all'interno di uno schema, utilizzare l'istruzione ALTER o DROP specifica dell'entità a sicurezza diretta desiderata.

Se per securable_name viene utilizzato un nome composto da una parte, verranno utilizzate le regole di risoluzione dei nomi valide per individuare l'entità a sicurezza diretta.

Tutte le autorizzazioni associate all'entità a sicurezza diretta vengono eliminate quando l'entità viene spostata nel nuovo schema. Se è stato impostato in modo esplicito, il proprietario dell'entità a sicurezza diretta rimarrà invariato. Se è stato impostato su SCHEMA OWNER, il proprietario dell'entità a sicurezza diretta rimarrà SCHEMA OWNER. Tuttavia, in seguito allo spostamento SCHEMA OWNER verrà risolto nel nome del proprietario del nuovo schema. Il valore di principal_id del nuovo proprietario sarà NULL.

Per modificare lo schema di una tabella o di una vista mediante SQL Server Management Studio, in Esplora oggetti fare clic con il pulsante destro del mouse sulla tabella o sulla vista, quindi fare clic su Progetta. Premere F4 per aprire la finestra Proprietà. Nella casella Schema selezionare un nuovo schema.

Nota di attenzioneAttenzione

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 utilizzare 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 ulteriori informazioni sulle viste del catalogo, vedere Viste del catalogo (Transact-SQL).

Autorizzazioni

Per trasferire un'entità a sicurezza diretta da un altro schema, l'utente deve disporre dell'autorizzazione CONTROL per l'entità (non per lo schema) e dell'autorizzazione ALTER per lo schema di destinazione.

Se l'entità a sicurezza diretta è associata a una specifica dell'istruzione EXECUTE AS OWNER e il proprietario è impostato su SCHEMA OWNER, l'utente deve inoltre disporre dell'autorizzazione IMPERSONATION per il proprietario dello schema di destinazione.

Tutte le autorizzazioni associate all'entità a protezione diretta in fase di trasferimento vengono eliminate al momento dello spostamento.

Esempi

A. Trasferimento della proprietà di una tabella

Nell'esempio seguente viene modificato lo schema HumanResources mediante il trasferimento nello schema della tabella Address dello schema Person.

USE AdventureWorks2008R2;
GO
ALTER SCHEMA HumanResources TRANSFER Person.Address;
GO

B. Trasferimento della proprietà di un tipo

Nell'esempio seguente viene creato un tipo nello schema Production, quindi il tipo viene trasferito nello schema Person.

USE AdventureWorks2008R2;
GO

CREATE TYPE Production.TestType FROM [varchar](10) NOT NULL ;
GO

-- Check the type owner.
SELECT sys.types.name, sys.types.schema_id, sys.schemas.name
    FROM sys.types JOIN sys.schemas 
        ON sys.types.schema_id = sys.schemas.schema_id 
    WHERE sys.types.name = 'TestType' ;
GO

-- Change the type to the Person schema.
ALTER SCHEMA Person TRANSFER type::Production.TestType ;
GO

-- Check the type owner.
SELECT sys.types.name, sys.types.schema_id, sys.schemas.name
    FROM sys.types JOIN sys.schemas 
        ON sys.types.schema_id = sys.schemas.schema_id 
    WHERE sys.types.name = 'TestType' ;
GO