CREATE DATABASE - Amazon Redshift

CREATE DATABASE

Crea una nueva base de datos.

Para crear una base de datos, debe ser un superusuario o tener el privilegio CREATEDB. Para crear una base de datos asociada a una integración sin ETL, debe ser un superusuario o tener los privilegios CREATEDB y CREATEUSER.

No se puede ejecutar CREATE DATABASE en un bloque de transacción (BEGIN ... END). Para obtener más información acerca de las transacciones, consulte Aislamiento serializable.

Sintaxis

CREATE DATABASE database_name [ { [ WITH ] [ OWNER [=] db_owner ] [ CONNECTION LIMIT { limit | UNLIMITED } ] [ COLLATE { CASE_SENSITIVE | CASE_INSENSITIVE } ] [ ISOLATION LEVEL { SERIALIZABLE | SNAPSHOT } ] } | { [ WITH PERMISSIONS ] FROM DATASHARE datashare_name ] OF [ ACCOUNT account_id ] NAMESPACE namespace_guid } | { FROM { { ARN '<arn>' } { WITH DATA CATALOG SCHEMA '<schema>' | WITH NO DATA CATALOG SCHEMA } } | { INTEGRATION '<integration_id>'} } | { IAM_ROLE {default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' } }

Parámetros

database_name

Nombre de la nueva base de datos. Para obtener más información acerca de los nombres válidos, consulte Nombres e identificadores.

WITH

Palabra clave opcional.

OWNER

Especifica un propietario de la base de datos.

=

Carácter opcional.

db_owner

Nombre de usuario del propietario de la base de datos.

CONNECTION LIMIT { limit | UNLIMITED }

La cantidad máxima de conexiones a la base de datos que los usuarios pueden tener abiertas al mismo tiempo. Este límite no se aplica a los superusuarios. Use la palabra clave UNLIMITED para permitir la cantidad máxima de conexiones simultáneas. También puede aplicarse un límite de la cantidad de conexiones de cada usuario. Para obtener más información, consulte CREAR USUARIO. El valor predeterminado es UNLIMITED. Para ver las conexiones actuales, consulte la vista del sistema STV_SESSIONS.

nota

Si se aplican los límites de conexión tanto para usuarios como para bases de datos, debe haber una ranura de conexión sin utilizar disponible dentro de ambos límites cuando un usuario intenta conectarse.

COLLATE { CASE_SENSITIVE | CASE_INSENSITIVE }

Se trata de una cláusula que especifica si la búsqueda o la comparación de cadenas es CASE_SENSITIVE o CASE_INSENSITIVE. El valor predeterminado es CASE_SENSITIVE.

ISOLATION LEVEL { SERIALIZABLE | SNAPSHOT }

Una cláusula que especifica el nivel de aislamiento utilizado cuando las consultas se ejecutan en una base de datos.

  • Aislamiento SERIALIZABLE: proporciona serialización completa para transacciones simultáneas. Para obtener más información, consulte Aislamiento serializable.

  • Aislamiento SNAPSHOT: proporciona un nivel de aislamiento con protección contra conflictos de actualización y eliminación. Es el valor predeterminado para una base de datos creada en un clúster aprovisionado o espacio de nombres sin servidor.

Puede ver qué modelo de simultaneidad ejecuta la base de datos de la siguiente manera:

  • Consulte la vista de catálogo STV_DB_ISOLATION_LEVEL. Para obtener más información, consulte STV_DB_ISOLATION_LEVEL.

    SELECT * FROM stv_db_isolation_level;
  • Consulte la vista PG_DATABASE_INFO.

    SELECT datname, datconfig FROM pg_database_info;

    El nivel de aislamiento por base de datos aparece junto a la clave concurrency_model. Un valor de 1 indica SNAPSHOT. Un valor de 2 denota SERIALIZABLE.

En las bases de datos de Amazon Redshift, el aislamiento SERIALIZABLE y SNAPSHOT son tipos de niveles de aislamiento serializable. Es decir, las lecturas sucias, las lecturas no repetibles y las lecturas fantasma se impiden de acuerdo con el estándar SQL. Los niveles de aislamiento garantizan que una transacción opera en una instantánea de datos en el momento en el que aparece cuando comienza la transacción y que ninguna otra transacción puede cambiar esa instantánea. Sin embargo, el aislamiento SNAPSHOT no proporciona serialización completa porque no impide las inserciones ni actualizaciones de sesgos de escritura en diferentes filas de tablas.

En el siguiente escenario se ilustran actualizaciones de sesgos de escritura en las que se utiliza el nivel de aislamiento SNAPSHOT. Una tabla llamada Numbers contiene una columna denominada digits que contiene los valores 0 y 1. La instrucción UPDATE de cada usuario no se superpone a la del otro usuario. Sin embargo, los valores 0 y 1 se intercambian. El SQL que ejecutan sigue esta escala de tiempo con los siguientes resultados:

Tiempo Acción del usuario 1 Acción del usuario 2
1 BEGIN;
2 BEGIN;
3 SELECT * FROM Numbers;
digits
------
0
1
4 SELECT * FROM Numbers;
digits
------
0
1
5 UPDATE Numbers SET digits=0 WHERE digits=1;
6 SELECT * FROM Numbers;
digits
------
0
0
7 COMMIT;
8 Actualizar número SET dígitos=0 WHERE dígitos=1;
9 SELECT * FROM Numbers;
digits
------
1
1
10 COMMIT;
11 SELECT * FROM Numbers;
digits
------
1
0
12 SELECT * FROM Numbers;
digits
------
1
0

Si se ejecuta el mismo escenario mediante aislamiento serializable, Amazon Redshift termina el usuario 2 debido a una infracción serializable y devuelve un error 1023. Para obtener más información, consulte Cómo corregir errores de aislamiento serializable. En este caso, solo el usuario 1 puede confirmar correctamente. No todas las cargas de trabajo requieren aislamiento serializable como requisito, en cuyo caso el aislamiento de instantáneas es suficiente como nivel de aislamiento de destino para la base de datos.

FROM ARN '<ARN>'

ARN de base de datos de AWS Glue que se puede utilizar para crear la base de datos.

{ DATA CATALOG SCHEMA '<esquema>' | WITH NO DATA CATALOG SCHEMA }
nota

Este parámetro solo se puede aplicar si el comando CREATE DATABASE también utiliza el parámetro FROM ARN.

Especifica si se va a crear la base de datos mediante un esquema para acceder a los objetos de AWS Glue Data Catalog.

FROM INTEGRATION '<integration_id>'

Especifica si se debe crear la base de datos mediante un identificador de integración sin ETL. Puede recuperar integration_id de la vista del sistema SVV_INTEGRATION. Para ver un ejemplo, consulte Creación de bases de datos para recibir los resultados de las integraciones sin ETL. Para obtener más información sobre la creación de bases de datos con integraciones sin ETL, consulte Creación de bases de datos de destino en Amazon Redshift en la Guía de administración de Amazon Redshift.

IAM_ROLE { default | 'SESSION' | 'arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>' }
nota

Este parámetro solo se puede aplicar si el comando CREATE DATABASE también utiliza el parámetro FROM ARN.

Si especifica un rol de IAM asociado al clúster al ejecutar el comando CREATE DATABASE, Amazon Redshift utilizará las credenciales del rol cuando ejecute consultas en la base de datos.

Especificar la palabra clave default significa utilizar el rol de IAM establecido como predeterminado y asociado al clúster.

Use 'SESSION' si se conecta al clúster de Amazon Redshift mediante una identidad federada y acceda a las tablas desde el esquema externo creado con este comando. Para ver un ejemplo de utilización de una identidad federada, consulte Uso de una identidad federada para administrar el acceso de Amazon Redshift a los recursos locales y a las tablas externas de Amazon Redshift Spectrum, lo que explica cómo configurar la identidad federada.

Utilice el nombre de recurso de Amazon (ARN), de un rol de IAM que el clúster utiliza para la autenticación y la autorización. Como mínimo, el rol de IAM debe tener permiso para realizar una operación LIST en el bucket de Amazon S3 al que se accederá y una operación GET en los objetos de Amazon S3 que el bucket contiene. Para obtener más información sobre cómo utilizar IAM_ROLE al crear una base de datos que utilice AWS Glue Data Catalog para los recursos compartidos de datos, consulte Uso de recursos compartidos de datos administrados por Lake Formation como consumidor.

A continuación se muestra la sintaxis de la cadena del parámetro IAM_ROLE para un único ARN.

IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'

Puede encadenar roles para que el clúster pueda asumir otro rol de IAM, que posiblemente pertenezca a otra cuenta. Puede encadenar hasta 10 roles. Para obtener más información, consulte Encadenamiento de roles de IAM en Amazon Redshift Spectrum.

Para este rol de IAM; asocie una política de permisos de IAM similar a la siguiente.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AccessSecret", "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "secretsmanager:GetRandomPassword", "secretsmanager:ListSecrets" ], "Resource": "*" } ] }

Para obtener información sobre los pasos para crear un rol de IAM que se utilizará con la consulta federada, consulte Creación de un secreto y rol de IAM para utilizar consultas federadas.

nota

No incluya espacios en la lista de roles encadenados.

A continuación se muestra la sintaxis para encadenar tres roles.

IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'

Sintaxis para utilizar CREATE DATABASE con un datashare

La siguiente sintaxis describe el comando CREATE DATABASE que se utiliza para crear bases de datos a partir de un recurso compartido de datos para compartir datos dentro de la misma cuenta de AWS.

CREATE DATABASE database_name [ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name ] OF [ ACCOUNT account_id ] NAMESPACE namespace_guid

La siguiente sintaxis describe el comando CREATE DATABASE que se utiliza para crear bases de datos a partir de un recurso compartido de datos, para compartir datos entre cuentas de AWS.

CREATE DATABASE database_name [ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name ] OF ACCOUNT account_id NAMESPACE namespace_guid

Parámetros para utilizar CREATE DATABASE con un datashare

FROM DATASHARE

Se trata de una palabra clave que indica dónde está ubicado el datashare.

datashare_name

Se trata del nombre del datashare en el que se crea la base de datos consumidora.

WITH PERMISSIONS

Especifica que la base de datos creada a partir del recurso compartido de datos requiere permisos de nivel de objeto para acceder a los objetos individuales de la base de datos. Sin esta cláusula, los usuarios o roles a los que se conceda el permiso USAGE en la base de datos tendrán acceso automáticamente a todos los objetos de la base de datos.

NAMESPACE namespace_guid

Se trata de un valor que especifica el espacio de nombres productor al que pertenece el recurso compartido de datos.

ACCOUNT account_id

Se trata de un valor que especifica la cuenta productora a la que pertenece el recurso compartido de datos.

Notas de uso para CREATE DATABASE en el uso compartido de datos

Como superusuario de base de datos, cuando utilice CREATE DATABASE para crear bases de datos a partir de recursos compartidos de datos en la cuenta de AWS, especifique la opción NAMESPACE. La opción ACCOUNT es opcional. Cuando utilice CREATE DATABASE para crear bases de datos a partir de recursos compartidos de datos entre las cuentas de AWS, especifique las opciones ACCOUNT y NAMESPACE desde el productor.

Solo puede crear una base de datos consumidora para un recurso compartido de datos en un clúster consumidor. No se pueden crear varias bases de datos consumidoras que hagan referencia al mismo recurso compartido de datos.

CREATE DATABASE desde AWS Glue Data Catalog

Para crear una base de datos mediante un ARN de base de datos de AWS Glue, especifique el ARN en el comando CREATE DATABASE.

CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA;

Si lo desea, también puede suministrar un valor en el parámetro IAM_ROLE. Para obtener más información sobre el parámetro y los valores aceptados, consulte Parámetros.

A continuación, se muestran ejemplos que demuestran cómo crear una base de datos a partir de un ARN mediante un rol de IAM.

CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA IAM_ROLE <iam-role-arn>
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA IAM_ROLE default;

También puede crear una base de datos mediante DATA CATALOG SCHEMA.

CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH DATA CATALOG SCHEMA <sample_schema> IAM_ROLE default;

Creación de bases de datos para recibir los resultados de las integraciones sin ETL

Para crear una base de datos mediante una identidad de integración sin ETL, especifique integration_id en el comando CREATE DATABASE.

CREATE DATABASE destination_db_name FROM INTEGRATION 'integration_id';

Por ejemplo, primero, recupere los identificadores de integración de SVV_INTEGRATION;

SELECT integration_id FROM SVV_INTEGRATION;

A continuación, utilice uno de los identificadores de integración recuperados para crear la base de datos que recibe integraciones sin ETL.

CREATE DATABASE sampledb FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111';

Límites de CREATE DATABASE

Amazon Redshift aplica estos límites para las bases de datos:

  • Máximo de 60 bases de datos definidas por el usuario por clúster.

  • Máximo de 127 bytes para un nombre de base de datos.

  • El nombre de una base de datos no puede ser una palabra reservada.

Intercalación de bases de datos

La intercalación representa un conjunto de reglas que define la forma en que el motor de base de datos compara y ordena los datos del tipo caracteres en SQL. La intercalación sin distinción entre mayúsculas y minúsculas es la utilizada con más frecuencia. Amazon Redshift utiliza intercalación sin distinción entre mayúsculas y minúsculas para facilitar la migración desde otros sistemas de almacenamiento de datos. Gracias a la compatibilidad nativa con la intercalación sin distinción entre mayúsculas y minúsculas, Amazon Redshift sigue utilizando importantes métodos de ajuste u optimización, como claves de distribución, claves de ordenación o análisis de rango restringido.

La cláusula COLLATE especifica la intercalación predeterminada para todas las columnas CHAR y VARCHAR de la base de datos. Si se especifica CASE_INSENSITIVE, todas las columnas CHAR o VARCHAR utilizan la intercalación sin distinción entre mayúsculas y minúsculas. Para obtener información acerca de la intercalación, consulte Secuencias de intercalación.

Los datos insertados o capturados en columnas donde no se distingue entre mayúsculas y minúsculas conservarán el formato original. No obstante, todas las operaciones de cadenas basadas en la comparación, incluidas la ordenación y la agrupación, no distinguirán entre mayúsculas y minúsculas. Las operaciones de búsqueda de coincidencias de patrones, como los predicados LIKE, similares a las funciones de expresión comunes y las propias funciones tampoco distinguirán entre mayúsculas y minúsculas.

Las siguientes operaciones de SQL son compatibles con la semántica de intercalación aplicable:

  • operadores de comparación: =, <>, <, <=, >, >=

  • operador LIKE

  • cláusulas ORDER BY

  • cláusulas GROUP BY

  • funciones de agrupación que utilizan la comparación de cadenas, como MIN, MAX y LISTAGG

  • funciones de ventana, como las cláusulas PARTITION BY y las cláusulas ORDER BY

  • funciones escalares greatest() y least(), STRPOS(), REGEXP_COUNT(), REGEXP_REPLACE(), REGEXP_INSTR(), REGEXP_SUBSTR()

  • cláusula Distinct

  • UNION, INTERSECT y EXCEPT

  • IN LIST

Para las consultas externas, incluidas las consultas federadas de Amazon Redshift Spectrum y Aurora PostgreSQL, la intercalación de la columna VARCHAR o CHAR es la misma que la intercalación actual en el nivel de base de datos.

En el siguiente ejemplo, se consulta una tabla de Amazon Redshift Spectrum:

SELECT ci_varchar FROM spectrum.test_collation WHERE ci_varchar = 'AMAZON'; ci_varchar ---------- amazon Amazon AMAZON AmaZon (4 rows)

Para obtener información sobre cómo crear tablas mediante la intercalación de bases de datos, consulte CREATE TABLE.

Para obtener información acerca de la función COLLATE, consulte Función COLLATE.

Limitaciones de la intercalación de bases de datos

A continuación, se describen las limitaciones que existen a la hora de trabajar con la intercalación de bases de datos en Amazon Redshift:

  • Todas las tablas o las vistas de sistema, incluidas las tablas del catálogo de PG y las tablas de sistema de Amazon Redshift, distinguen entre mayúsculas y minúsculas.

  • Cuando la base de datos consumidora y la base de datos productora tienen intercalaciones diferentes en el nivel de base de datos, Amazon Redshift no admite consultas entre bases de datos y clústeres.

  • Amazon Redshift no admite la intercalación sin distinción entre mayúsculas y minúsculas en la consulta del nodo principal específicamente.

    En el siguiente ejemplo, se muestra una consulta no admitida que no distingue entre mayúsculas y minúsculas, además del error que envía Amazon Redshift:

    SELECT collate(usename, 'case_insensitive') FROM pg_user; ERROR: Case insensitive collation is not supported in leader node only query.
  • Amazon Redshift no admite la interacción entre columnas donde se distingue entre mayúsculas y minúsculas, y columnas donde no se hace esa distinción, como comparación, función, combinación u operaciones con conjuntos.

    Los siguientes ejemplos muestran errores que ocurren cuando interactúan las columnas donde se distingue entre mayúsculas y minúsculas, y las columnas donde no se hace esa distinción:

    CREATE TABLE test (ci_col varchar(10) COLLATE case_insensitive, cs_col varchar(10) COLLATE case_sensitive, cint int, cbigint bigint);
    SELECT ci_col = cs_col FROM test; ERROR: Query with different collations is not supported yet.
    SELECT concat(ci_col, cs_col) FROM test; ERROR: Query with different collations is not supported yet.
    SELECT ci_col FROM test UNION SELECT cs_col FROM test; ERROR: Query with different collations is not supported yet.
    SELECT * FROM test a, test b WHERE a.ci_col = b.cs_col; ERROR: Query with different collations is not supported yet.
    Select Coalesce(ci_col, cs_col) from test; ERROR: Query with different collations is not supported yet.
    Select case when cint > 0 then ci_col else cs_col end from test; ERROR: Query with different collations is not supported yet.
  • Amazon Redshift no admite la intercalación para el tipo de datos SUPER. No se admiten la creación de columnas SUPER en bases de datos donde no se distingue entre mayúsculas y minúsculas, ni las interacciones entre columnas SUPER y columnas donde no se distingue entre mayúsculas y minúsculas.

    En el siguiente ejemplo, se crea una tabla con SUPER como tipo de datos en la base de datos donde no se distingue entre mayúsculas y minúsculas:

    CREATE TABLE super_table (a super); ERROR: SUPER column is not supported in case insensitive database.

    En el siguiente ejemplo, se consultan datos con una cadena donde no se distingue entre mayúsculas y minúsculas, con una comparación con los datos SUPER:

    CREATE TABLE test_super_collation (s super, c varchar(10) COLLATE case_insensitive, i int);
    SELECT s = c FROM test_super_collation; ERROR: Coercing from case insensitive string to SUPER is not supported.

Para que estas consultas funcionen, utilice la función COLLATE para convertir la intercalación de una columna de manera que coincida con la otra. Para obtener más información, consulte Función COLLATE.

Ejemplos

Creación de una base de datos

En el siguiente ejemplo, se crea una base de datos llamada TICKIT y se concede la propiedad al usuario DWUSER.

create database tickit with owner dwuser;

Consulte la tabla de catálogo PG_DATABASE_INFO para ver los detalles de las bases de datos.

select datname, datdba, datconnlimit from pg_database_info where datdba > 1; datname | datdba | datconnlimit -------------+--------+------------- admin | 100 | UNLIMITED reports | 100 | 100 tickit | 100 | 100

En el siguiente ejemplo se crea una base de datos denominada sampledb con nivel de aislamiento SNAPSHOT.

CREATE DATABASE sampledb ISOLATION LEVEL SNAPSHOT;

En el siguiente ejemplo, se crea la base de datos sales_db a partir del recurso compartido de datos SalesShare.

CREATE DATABASE sales_db FROM DATASHARE salesshare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';

Ejemplos de intercalación de bases de datos

Creación de una base de datos donde no se distingue entre mayúsculas y minúsculas

En el siguiente ejemplo, se crea la base de datos sampledb, se crea la tabla T1 y se insertan datos en la tabla T1.

create database sampledb collate case_insensitive;

Conéctese a la nueva base de datos que acaba de crear mediante su cliente SQL. Cuando utilice el editor de consultas de Amazon Redshift v2, seleccione sampledb en el Editor. Cuando utiliza use RSQL, puede utilizar un comando como el siguiente.

\connect sampledb;
CREATE TABLE T1 ( col1 Varchar(20) distkey sortkey );
INSERT INTO T1 VALUES ('bob'), ('john'), ('Mary'), ('JOHN'), ('Bob');

Luego, la consulta encuentra resultados con John.

SELECT * FROM T1 WHERE col1 = 'John'; col1 ------ john JOHN (2 row)
Ordenación sin distinción entre mayúsculas y minúsculas

En el siguiente ejemplo, se muestra la ordenación sin distinción entre mayúsculas y minúsculas con la tabla T1. La ordenación de Bob y bob, o de John y john, no es determinista, porque son iguales en la columna donde no se distingue entre mayúsculas y minúsculas.

SELECT * FROM T1 ORDER BY 1; col1 ------ bob Bob JOHN john Mary (5 rows)

Del mismo modo, el siguiente ejemplo muestra cómo se ordena sin distinción entre mayúsculas y minúsculas con la cláusula GROUP BY. Bob y bob son iguales y pertenecen al mismo grupo. No es determinístico cuál aparece en el resultado.

SELECT col1, count(*) FROM T1 GROUP BY 1; col1 | count -----+------ Mary | 1 bob | 2 JOHN | 2 (3 rows)
Consulta con una función de ventana en columnas donde no se distingue entre mayúsculas y minúsculas

En el siguiente ejemplo, se consulta una función de ventana en una columna donde no se distingue entre mayúsculas y minúsculas.

SELECT col1, rank() over (ORDER BY col1) FROM T1; col1 | rank -----+------ bob | 1 Bob | 1 john | 3 JOHN | 3 Mary | 5 (5 rows)
Consulta con la palabra clave DISTINCT

En el siguiente ejemplo, se consulta la tabla T1 con la palabra clave DISTINCT.

SELECT DISTINCT col1 FROM T1; col1 ------ bob Mary john (3 rows)
Consulta con la cláusula UNION

En el siguiente ejemplo, se muestran los resultados de la cláusula UNION de las tablas T1 y T2.

CREATE TABLE T2 AS SELECT * FROM T1;
SELECT col1 FROM T1 UNION SELECT col1 FROM T2; col1 ------ john bob Mary (3 rows)