CREATE SCHEMA (Transact-SQL)CREATE SCHEMA (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure Synapse Analytics (SQL DW) síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Crea un esquema en la base de datos actual.Creates a schema in the current database. La transacción CREATE SCHEMA también puede crear tablas y vistas dentro del nuevo esquema, así como establecer la concesión, denegación o revocación (GRANT, DENY o REVOKE) de permisos en esos objetos.The CREATE SCHEMA transaction can also create tables and views within the new schema, and set GRANT, DENY, or REVOKE permissions on those objects.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- 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 SQL Data Warehouse and Parallel Data Warehouse  
  
CREATE SCHEMA schema_name [ AUTHORIZATION owner_name ] [;]  

ArgumentosArguments

schema_nameschema_name
Es el nombre por el que se identifica al esquema en esta base de datos.Is the name by which the schema is identified within the database.

AUTHORIZATION owner_nameAUTHORIZATION owner_name
Especifica el nombre de la entidad de seguridad de la base de datos que poseerá el esquema.Specifies the name of the database-level principal that will own the schema. Es posible que esta entidad de seguridad posea otros esquemas y no utilice el esquema actual como predeterminado.This principal may own other schemas, and may not use the current schema as its default schema.

table_definitiontable_definition
Especifica una instrucción CREATE TABLE que crea una tabla en el esquema.Specifies a CREATE TABLE statement that creates a table within the schema. La entidad de seguridad que ejecuta esta instrucción debe tener el permiso CREATE TABLE en la base de datos actual.The principal executing this statement must have CREATE TABLE permission on the current database.

view_definitionview_definition
Especifica una instrucción CREATE VIEW que crea una vista en el esquema.Specifies a CREATE VIEW statement that creates a view within the schema. La entidad de seguridad que ejecuta esta instrucción debe tener el permiso CREATE VIEW en la base de datos actual.The principal executing this statement must have CREATE VIEW permission on the current database.

grant_statementgrant_statement
Especifica una instrucción GRANT que otorga permisos sobre cualquier elemento protegible, excepto el esquema nuevo.Specifies a GRANT statement that grants permissions on any securable except the new schema.

revoke_statementrevoke_statement
Especifica una instrucción REVOKE que revoca permisos sobre cualquier elemento protegible, excepto el esquema nuevo.Specifies a REVOKE statement that revokes permissions on any securable except the new schema.

deny_statementdeny_statement
Especifica una instrucción DENY que deniega permisos sobre cualquier elemento protegible, excepto el esquema nuevo.Specifies a DENY statement that denies permissions on any securable except the new schema.

ObservacionesRemarks

Nota

Las instrucciones que contienen CREATE SCHEMA AUTHORIZATION pero no especifican ningún nombre solo se admiten por razones de compatibilidad con versiones anteriores.Statements that contain CREATE SCHEMA AUTHORIZATION but do not specify a name, are permitted for backward compatibility only. La instrucción no provoca errores, pero no crea esquemas.The statement does not cause an error, but does not create a schema.

CREATE SCHEMA puede crear un esquema, las tablas y las vistas que lo contienen; asimismo, puede tener permisos GRANT, REVOKE o DENY para cualquier elemento protegible; todo ello en una sola instrucción.CREATE SCHEMA can create a schema, the tables and views it contains, and GRANT, REVOKE, or DENY permissions on any securable in a single statement. Esta instrucción debe ejecutarse como un lote independiente.This statement must be executed as a separate batch. Los objetos creados por la instrucción CREATE SCHEMA se crean dentro del esquema que se está creando.Objects created by the CREATE SCHEMA statement are created inside the schema that is being created.

Las transacciones CREATE SCHEMA son atómicas.CREATE SCHEMA transactions are atomic. Si ocurre un error durante la ejecución de una instrucción CREATE SCHEMA, no se crea ninguno de los elementos protegibles especificados ni se conceden permisos.If any error occurs during the execution of a CREATE SCHEMA statement, none of the specified securables are created and no permissions are granted.

Los elementos protegibles, que va a crear CREATE SCHEMA, se pueden enumerar en cualquier orden, excepto en el caso de las vistas que hacen referencia a otras vistas.Securables to be created by CREATE SCHEMA can be listed in any order, except for views that reference other views. En estos casos, la vista a la que se hace referencia debe crearse antes que la vista que hace la referencia.In that case, the referenced view must be created before the view that references it.

Por lo tanto, una instrucción GRANT puede conceder permiso para un objeto antes de que ese objeto se haya creado o una instrucción CREATE VIEW puede aparecer antes que las instrucciones CREATE TABLE que crean las tablas a las que hace referencia la vista.Therefore, a GRANT statement can grant permission on an object before the object itself is created, or a CREATE VIEW statement can appear before the CREATE TABLE statements that create the tables referenced by the view. Además, las instrucciones CREATE TABLE pueden declarar claves externas a las tablas definidas posteriormente en la instrucción CREATE SCHEMA.Also, CREATE TABLE statements can declare foreign keys to tables that are defined later in the CREATE SCHEMA statement.

Nota

DENY y REVOKE se admiten dentro de instrucciones CREATE SCHEMA.DENY and REVOKE are supported inside CREATE SCHEMA statements. Las cláusulas DENY y REVOKE se ejecutarán en el orden en que aparecen en la instrucción CREATE SCHEMA.DENY and REVOKE clauses will be executed in the order in which they appear in the CREATE SCHEMA statement.

La entidad de seguridad que ejecuta CREATE SCHEMA puede especificar otra entidad de seguridad de base de datos como el propietario del esquema que se crea.The principal that executes CREATE SCHEMA can specify another database principal as the owner of the schema being created. Esto requiere permisos adicionales, como se describe en la sección "Permisos", más adelante en este tema.This requires additional permissions, as described in the "Permissions" section later in this topic.

El esquema nuevo es propiedad de una de las siguientes entidades de seguridad de nivel de base de datos: usuario de base de datos, rol de base de datos o rol de aplicación.The new schema is owned by one of the following database-level principals: database user, database role, or application role. Los objetos creados dentro de un esquema son propiedad del esquema y tienen un principal_id NULL en sys.objects.Objects created within a schema are owned by the owner of the schema, and have a NULL principal_id in sys.objects. La propiedad de los objetos incluidos en el esquema puede transferirse a cualquier entidad de seguridad de nivel de base de datos, pero el propietario del esquema siempre mantiene el permiso CONTROL en los objetos del esquema.Ownership of schema-contained objects can be transferred to any database-level principal, but the schema owner always retains CONTROL permission on objects within the schema.

Precaución

El comportamiento de los esquemas cambió en SQL Server 2005.Beginning with SQL Server 2005, the behavior of schemas changed. 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.As a result, code that assumes that schemas are equivalent to database users may no longer return correct results. 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.Old catalog views, including sysobjects, should not be used in a database in which any of the following DDL statements have ever been used: 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.In such databases you must instead use the new catalog views. 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.The new catalog views take into account the separation of principals and schemas that was introduced in SQL Server 2005. Para obtener más información sobre las vistas de catálogo, vea Vistas de catálogo (Transact-SQL).For more information about catalog views, see Catalog Views (Transact-SQL).

Esquema implícito y creación de usuarioImplicit Schema and User Creation

En algunos casos, un usuario puede usar una base de datos sin necesidad de tener una cuenta de usuario de base de datos (una entidad de seguridad de base de datos en la base de datos).In some cases a user can use a database without having a database user account (a database principal in the database). El error puede ocurrir en las siguientes situaciones:This can happen in the following situations:

  • Un inicio de sesión tiene privilegios CONTROL SERVER.A login has CONTROL SERVER privileges.

  • Un usuario de Windows no tiene una cuenta de usuario de base de datos individual (una entidad de seguridad de base de datos en la base de datos), sino que obtiene acceso a una base de datos como miembro de un grupo de Windows que tiene una cuenta de usuario de base de datos (una entidad de seguridad de base de datos para el grupo de Windows).A Windows user does not have an individual database user account (a database principal in the database), but accesses a database as a member of a Windows group which has a database user account (a database principal for the Windows group).

Cuando un usuario sin cuenta de usuario de base de datos crea un objeto sin especificar un esquema existente, se crea automáticamente una entidad de seguridad de base de datos y un esquema predeterminado en la base de datos para ese usuario.When a user without a database user account creates an object without specifying an existing schema, a database principal and default schema will be automatically created in the database for that user. La entidad de seguridad de base de datos y el esquema que se creen tendrán el mismo nombre que el usuario empleado para conectarse a SQL ServerSQL Server (el nombre de inicio de sesión de autenticación en SQL ServerSQL Server o el nombre de usuario de Windows).The created database principal and schema will have the same name as the name that user used when connecting to SQL ServerSQL Server (the SQL ServerSQL Server authentication login name or the Windows user name).

Este comportamiento es necesario para permitir a los usuarios basados en grupos de Windows crear y poseer objetos.This behavior is necessary to allow users that are based on Windows groups to create and own objects. Sin embargo, puede dar lugar a la creación accidental de esquemas y usuarios.However it can result in the unintentional creation of schemas and users. Para evitar crear implícitamente usuarios y esquemas, siempre que sea posible cree explícitamente entidades de seguridad de base de datos y asigne un esquema predeterminado.To avoid implicitly creating users and schemas, whenever possible explicitly create database principals and assign a default schema. O establezca explícitamente un esquema existente cuando cree objetos en una base de datos, utilizando nombres de objetos de dos o tres elementos.Or explicitly state an existing schema when creating objects in a database, using two or three-part object names.

Nota

La creación implícita de un usuario de Azure Active Directory no es posible en SQL DatabaseSQL Database.The implicit creation of an Azure Active Directory user is not possible on SQL DatabaseSQL Database. Crear un usuario de Azure AD de proveedor externo conlleva comprobar el estado de los usuarios en AAD, con lo cual al crearlo se producirá el error 2760, que informa de que el nombre de esquema especificado "<user_name@domain>" no existe o no tiene permiso para usarlo.Since creating an Azure AD user from external provider must check the users status in the AAD, creating the user will fail with error 2760: The specified schema name "<user_name@domain>" either does not exist or you do not have permission to use it. Y, luego, el error 2759, que indica que se ha producido un error en CREATE SCHEMA debido a errores anteriores.And then error 2759: CREATE SCHEMA failed due to previous errors. Para solucionarlos, cree el usuario de Azure AD de proveedor externo en primer lugar y, después, vuelva a ejecutar la instrucción al crear el objeto.To work around these errors, create the Azure AD user from external provider first and then rerun the statement creating the object.

Aviso sobre elementos desusadosDeprecation Notice

Las instrucciones CREATE SCHEMA que no especifiquen ningún nombre de esquema se admiten actualmente por razones de compatibilidad con versiones anteriores.CREATE SCHEMA statements that do not specify a schema name are currently supported for backward compatibility. Estas instrucciones no crean realmente un esquema dentro de la base de datos, sino que crean tablas y vistas, y conceden permisos.Such statements do not actually create a schema inside the database, but they do create tables and views, and grant permissions. Las entidades de seguridad no necesitan el permiso CREATE SCHEMA para ejecutar esta forma anterior de CREATE SCHEMA, ya que en realidad no se crea ningún esquema.Principals do not need CREATE SCHEMA permission to execute this earlier form of CREATE SCHEMA, because no schema is being created. Esta funcionalidad se quitará de una próxima versión de SQL ServerSQL Server.This functionality will be removed from a future release of SQL ServerSQL Server.

PermisosPermissions

Requiere el permiso CREATE SCHEMA en la base de datos.Requires CREATE SCHEMA permission on the database.

Para crear un objeto especificado dentro de la instrucción CREATE SCHEMA, el usuario debe tener el permiso CREATE correspondiente.To create an object specified within the CREATE SCHEMA statement, the user must have the corresponding CREATE permission.

Para especificar otro usuario como el propietario del esquema que se está creando, el autor de la llamada debe tener el permiso IMPERSONATE sobre ese usuario.To specify another user as the owner of the schema being created, the caller must have IMPERSONATE permission on that user. Si se especifica un rol de base de datos como propietario, el autor de la llamada debe pertenecer al rol o debe tener el permiso ALTER para el rol.If a database role is specified as the owner, the caller must have one of the following: membership in the role or ALTER permission on the role.

Nota

En la sintaxis compatible con las versiones anteriores, no se comprueban los permisos CREATE SCHEMA porque no se está creando ningún esquema.For the backward-compatible syntax, no permissions to CREATE SCHEMA are checked because no schema is being created.

EjemplosExamples

A.A. Crear un esquema y conceder permisosCreating a schema and granting permissions

En el ejemplo siguiente se crea el esquema Sprockets, que es propiedad de Annik y contiene la tabla NineProngs.The following example creates schema Sprockets owned by Annik that contains table NineProngs. La instrucción concede el permiso SELECT a Mandar y deniega el permiso SELECT a Prasanna.The statement grants SELECT to Mandar and denies SELECT to Prasanna. Tenga en cuenta que Sprockets y NineProngs se crean en una sola instrucción.Note that Sprockets and NineProngs are created in a single statement.

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

Ejemplos: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) and Almacenamiento de datos paralelosParallel Data Warehouse

B.B. Crear un esquema y una tabla en el esquemaCreating a schema and a table in the schema

En el siguiente ejemplo se crea un esquema Sales y, luego, una tabla Sales.Region en ese esquema.The following example creates schema Sales and then creates a table Sales.Region in that 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.C. Establecer el propietario de un esquemaSetting the owner of a schema

En el siguiente ejemplo se crea un esquema Production, propiedad de Mary.The following example creates a schema Production owned by Mary.

CREATE SCHEMA Production AUTHORIZATION [Contoso\Mary];  
GO  

Consulte tambiénSee Also

ALTER SCHEMA (Transact-SQL) ALTER SCHEMA (Transact-SQL)
DROP SCHEMA (Transact-SQL) DROP SCHEMA (Transact-SQL)
GRANT (Transact-SQL) GRANT (Transact-SQL)
DENY (Transact-SQL) DENY (Transact-SQL)
REVOKE (Transact-SQL) REVOKE (Transact-SQL)
CREATE VIEW (Transact-SQL) CREATE VIEW (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.schemas (Transact-SQL) sys.schemas (Transact-SQL)
Crear un esquema de la base de datosCreate a Database Schema