ALTER SCHEMA (Transact-SQL)

Transfère un élément sécurisable d'un schéma à un autre.

Icône Lien de rubriqueConventions de la syntaxe Transact-SQL

Syntaxe

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

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

Arguments

  • schema_name
    Nom d'un schéma de la base de données active où l'élément sécurisable doit être transféré. Ne peut pas être SYS ou INFORMATION_SCHEMA.

  • <entity_type>
    Classe de l'entité pour laquelle il y a un changement de propriétaire. Object est la valeur par défaut.

  • securable_name
    Nom composé d'une ou deux parties, qui désigne l'élément sécurisable de schéma à transférer.

Notes

Les utilisateurs et les schémas sont complètement distincts. Pour plus d'informations, consultez Séparation du schéma et de l'utilisateur.

L'instruction ALTER SCHEMA ne peut être utilisée que pour transférer des sécurisables entre des schémas de la même base de données. Pour modifier ou supprimer un sécurisable au sein du même schéma, utilisez l'instruction ALTER ou DROP propre à cet élément sécurisable.

Si securable_name utilise un nom en une seule partie, les règles de résolution de nom en vigueur s'appliquent pour identifier l'emplacement du sécurisable.

Toutes les autorisations associées à cet élément sécurisable sont supprimées après le transfert du sécurisable vers le nouveau schéma. Si le propriétaire du sécurisable a été défini explicitement, il reste inchangé. Si la valeur SCHEMA OWNER a été attribuée au propriétaire du sécurisable, celui-ci reste SCHEMA OWNER ; une fois le transfert effectué, la valeur de SCHEMA OWNER est le propriétaire du nouveau schéma. L'identification principal_id du nouveau propriétaire sera NULL.

Pour modifier le schéma d'une table ou d'une vue à l'aide de SQL Server Management Studio, dans l'Explorateur d'objets, cliquez avec le bouton droit sur la table ou la vue et cliquez sur Conception. Appuyez sur F4 pour ouvrir la fenêtre Propriétés. Dans la zone Schéma, sélectionnez un nouveau schéma.

AttentionAttention

Avec l'arrivée de SQL Server 2005, le comportement des schémas a changé. Ainsi, le code qui suppose que les schémas sont équivalents aux utilisateurs de base de données peut ne plus renvoyer des résultats corrects. Vous ne devez pas recourir aux anciens affichages catalogue, notamment sysobjects, dans une base de données où une des instructions DDL suivantes a été utilisée : 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. Dans ces bases de données, vous devez utiliser les nouveaux affichages catalogue. Les nouveaux affichages catalogue tiennent compte de la séparation des principaux et des schémas introduite dans SQL Server 2005 Pour plus d'informations sur les affichages catalogue, consultez Affichages catalogue (Transact-SQL).

Autorisations

Pour transférer un sécurisable provenant d'un autre schéma, l'utilisateur actuel doit bénéficier de l'autorisation CONTROL sur le sécurisable (et non sur le schéma) et de l'autorisation ALTER sur le schéma cible.

Si le sécurisable en question est soumis à une spécification EXECUTE AS OWNER et que le propriétaire est défini à SCHEMA OWNER, l'utilisateur doit également bénéficier de l'autorisation IMPERSONATION sur le propriétaire du schéma cible.

Toutes les autorisations associées à l'élément sécurisable soumis à un transfert sont supprimées lors du déplacement de cet élément.

Exemples

A. Transfert de la propriété d'une table

L'exemple suivant modifie le schéma HumanResources en y transférant la table Address du schéma Person.

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

B. Transfert de propriété d'un type

L'exemple suivant crée un type dans le schéma Production, puis transfère le type vers le schéma 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