ALTER SCHEMA (Transact-SQL)

Transfiere un elemento que puede protegerse entre esquemas.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

ALTER SCHEMA schema_name 
      TRANSFER [ <entity_type> :: ] securable_name [;]
<entity_type> ::=
    {
        Object | Type | XML Schema Collection
    }

Argumentos

  • schema_name
    Es el nombre de un esquema de la base de datos actual, al que se moverá el elemento que puede protegerse. No puede ser SYS ni INFORMATION_SCHEMA.

  • <entity_type>
    Es la clase de entidad en la que se va a cambiar el propietario. El valor predeterminado es objeto.

  • securable_name
    Es el nombre de una o dos partes de un elemento que puede protegerse contenido en el esquema que se va a mover al esquema.

Notas

Usuarios y esquemas están completamente separados. Para obtener más información, vea Separación de esquemas de usuario.

ALTER SCHEMA sólo se puede utilizar para mover elementos que pueden protegerse entre esquemas de la misma base de datos. Para cambiar o quitar un elemento que puede protegerse de un esquema, use la instrucción ALTER o DROP específica para ese elemento.

Si se usa un nombre de una parte para securable_name, se usarán las reglas de resolución de nombres actualmente vigentes para localizar el elemento que puede protegerse.

Todos los permisos asociados al elemento que puede protegerse se quitarán cuando se mueva el elemento al nuevo esquema. Si el propietario del elemento que puede protegerse se ha establecido de forma explícita, el propietario no cambiará. Si el propietario del elemento que puede protegerse se ha establecido en SCHEMA OWNER, el propietario seguirá siendo SCHEMA OWNER; no obstante, después del traslado, SCHEMA OWNER se resolverá al propietario del nuevo esquema. El principal_id del nuevo propietario será NULL.

Para cambiar el esquema de una tabla o vista mediante SQL Server Management Studio, en el Explorador de objetos, haga clic con el botón secundario en la tabla o vista y, a continuación, haga clic en Diseño. Presione F4 para abrir la ventana Propiedades. En el cuadro Esquema, seleccione un nuevo esquema.

Nota de advertenciaAdvertencia

El comportamiento de los esquemas cambió en SQL Server 2005. En consecuencia, el código que supone que los esquemas son equivalentes a los usuarios de base de datos puede dejar de devolver resultados correctos. Las antiguas vistas de catálogo, incluida sysobjects, no se deben usar en una base de datos en la que se haya utilizado alguna vez cualquiera de las siguientes instrucciones DDL: 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. En esas bases de datos, debe usar las nuevas vistas de catálogo. En las nuevas vistas de catálogo se tiene en cuenta la separación de entidades de seguridad y esquemas que se estableció en SQL Server 2005. Para obtener más información sobre las vistas de catálogo, vea Vistas de catálogo (Transact-SQL).

Permisos

Para transferir un elemento que puede protegerse de un esquema a otro, el usuario actual debe tener el permiso CONTROL para el elemento (no el esquema) y el permiso ALTER para el esquema de destino.

Si el elemento que puede protegerse tiene una especificación EXECUTE AS OWNER y el propietario se establece en SCHEMA OWNER, el usuario también debe tener el permiso IMPERSONATION para el propietario del esquema de destino.

Cuando se mueve el elemento que puede protegerse, se quitan todos los permisos asociados a él.

Ejemplos

A. Transferir la propiedad de una tabla

En el siguiente ejemplo se modifica el esquema HumanResources transfiriendo la tabla Address del esquema Person al esquema.

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

B. Transferir la propiedad de un tipo

El ejemplo siguiente crea un tipo en el esquema Production y, a continuación, transfiere el tipo al esquema Person.

USE AdventureWorks;
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

Historial de cambios

Contenido actualizado

Sintaxis corregida agregando las opciones de colección de esquemas XML y tipo.

Agregado el ejemplo B.