

 Amazon Redshift dejará de admitir la creación de nuevas UDF de Python a partir del parche 198. Las UDF de Python existentes seguirán funcionando hasta el 30 de junio de 2026. Para obtener más información, consulte la [publicación del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

# Comandos SQL
<a name="c_SQL_commands"></a>

El lenguaje SQL consta de comandos que se utilizan para crear y manipular objetos de base de datos, ejecutar consultas, cargar tablas y modificar los datos de las tablas.

Amazon Redshift se basa en PostgreSQL. Amazon Redshift y PostgreSQL tienen una serie de diferencias significativas que debe tener en cuenta a la hora de diseñar y desarrollar aplicaciones de almacenamiento de datos. Para obtener más información acerca de las diferencias entre Amazon Redshift SQL y PostgreSQL, consulte [Amazon Redshift y PostgreSQL](c_redshift-and-postgres-sql.md).

**nota**  
El tamaño máximo de una instrucción SQL es de 16 MB.

**Topics**
+ [ABORT](r_ABORT.md)
+ [ALTER DATABASE](r_ALTER_DATABASE.md)
+ [ALTER DATASHARE](r_ALTER_DATASHARE.md)
+ [ALTER DEFAULT PRIVILEGES](r_ALTER_DEFAULT_PRIVILEGES.md)
+ [ALTER EXTERNAL SCHEMA](r_ALTER_EXTERNAL_SCHEMA.md)
+ [ALTER EXTERNAL VIEW](r_ALTER_EXTERNAL_VIEW.md)
+ [ALTER FUNCTION](r_ALTER_FUNCTION.md)
+ [ALTER GROUP](r_ALTER_GROUP.md)
+ [MODIFICAR PROVEEDOR DE IDENTIDADES](r_ALTER_IDENTITY_PROVIDER.md)
+ [ALTER MASKING POLICY](r_ALTER_MASKING_POLICY.md)
+ [ALTER MATERIALIZED VIEW](r_ALTER_MATERIALIZED_VIEW.md)
+ [ALTER RLS POLICY](r_ALTER_RLS_POLICY.md)
+ [ALTER ROLE](r_ALTER_ROLE.md)
+ [ALTER PROCEDURE](r_ALTER_PROCEDURE.md)
+ [ALTER SCHEMA](r_ALTER_SCHEMA.md)
+ [ALTER SYSTEM](r_ALTER_SYSTEM.md)
+ [ALTER TABLE](r_ALTER_TABLE.md)
+ [ALTER TABLE APPEND](r_ALTER_TABLE_APPEND.md)
+ [ALTER TEMPLATE](r_ALTER_TEMPLATE.md)
+ [ALTER USER](r_ALTER_USER.md)
+ [ANALYZE](r_ANALYZE.md)
+ [ANALYZE COMPRESSION](r_ANALYZE_COMPRESSION.md)
+ [ATTACH MASKING POLICY](r_ATTACH_MASKING_POLICY.md)
+ [ATTACH RLS POLICY](r_ATTACH_RLS_POLICY.md)
+ [BEGIN](r_BEGIN.md)
+ [CALL](r_CALL_procedure.md)
+ [CANCEL](r_CANCEL.md)
+ [CLOSE](close.md)
+ [COMMENT](r_COMMENT.md)
+ [COMMIT](r_COMMIT.md)
+ [COPY](r_COPY.md)
+ [CREATE DATABASE](r_CREATE_DATABASE.md)
+ [CREATE DATASHARE](r_CREATE_DATASHARE.md)
+ [CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md)
+ [CREATE EXTERNAL MODEL](r_create_external_model.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)
+ [CREATE EXTERNAL VIEW](r_CREATE_EXTERNAL_VIEW.md)
+ [CREATE FUNCTION](r_CREATE_FUNCTION.md)
+ [CREATE GROUP](r_CREATE_GROUP.md)
+ [CREATE IDENTITY PROVIDER](r_CREATE_IDENTITY_PROVIDER.md)
+ [CREATE LIBRARY](r_CREATE_LIBRARY.md)
+ [CREATE MASKING POLICY](r_CREATE_MASKING_POLICY.md)
+ [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)
+ [CREATE MODEL](r_CREATE_MODEL.md)
+ [CREATE PROCEDURE](r_CREATE_PROCEDURE.md)
+ [CREATE RLS POLICY](r_CREATE_RLS_POLICY.md)
+ [CREATE ROLE](r_CREATE_ROLE.md)
+ [CREATE SCHEMA](r_CREATE_SCHEMA.md)
+ [CREATE TABLE](r_CREATE_TABLE_NEW.md)
+ [CREATE TABLE AS](r_CREATE_TABLE_AS.md)
+ [CREATE TEMPLATE](r_CREATE_TEMPLATE.md)
+ [CREATE USER](r_CREATE_USER.md)
+ [CREATE VIEW](r_CREATE_VIEW.md)
+ [DEALLOCATE](r_DEALLOCATE.md)
+ [DECLARE](declare.md)
+ [DELETE](r_DELETE.md)
+ [DESC DATASHARE](r_DESC_DATASHARE.md)
+ [DESC IDENTITY PROVIDER](r_DESC_IDENTITY_PROVIDER.md)
+ [DETACH MASKING POLICY](r_DETACH_MASKING_POLICY.md)
+ [DETACH RLS POLICY](r_DETACH_RLS_POLICY.md)
+ [DROP DATABASE](r_DROP_DATABASE.md)
+ [DROP DATASHARE](r_DROP_DATASHARE.md)
+ [DROP EXTERNAL VIEW](r_DROP_EXTERNAL_VIEW.md)
+ [DROP FUNCTION](r_DROP_FUNCTION.md)
+ [DROP GROUP](r_DROP_GROUP.md)
+ [DROP IDENTITY PROVIDER](r_DROP_IDENTITY_PROVIDER.md)
+ [DROP LIBRARY](r_DROP_LIBRARY.md)
+ [DROP MASKING POLICY](r_DROP_MASKING_POLICY.md)
+ [DROP MODEL](r_DROP_MODEL.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)
+ [DROP PROCEDURE](r_DROP_PROCEDURE.md)
+ [DROP RLS POLICY](r_DROP_RLS_POLICY.md)
+ [DROP ROLE](r_DROP_ROLE.md)
+ [DROP SCHEMA](r_DROP_SCHEMA.md)
+ [DROP TABLE](r_DROP_TABLE.md)
+ [DROP TEMPLATE](r_DROP_TEMPLATE.md)
+ [DROP USER](r_DROP_USER.md)
+ [DROP VIEW](r_DROP_VIEW.md)
+ [END](r_END.md)
+ [EXECUTE](r_EXECUTE.md)
+ [EXPLAIN](r_EXPLAIN.md)
+ [FETCH](fetch.md)
+ [GRANT](r_GRANT.md)
+ [INSERT](r_INSERT_30.md)
+ [INSERT (tabla externa)](r_INSERT_external_table.md)
+ [LOCK](r_LOCK.md)
+ [MERGE](r_MERGE.md)
+ [PREPARE](r_PREPARE.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [RESET](r_RESET.md)
+ [REVOKE](r_REVOKE.md)
+ [ROLLBACK](r_ROLLBACK.md)
+ [SELECT](r_SELECT_synopsis.md)
+ [SELECT INTO](r_SELECT_INTO.md)
+ [SET](r_SET.md)
+ [SET SESSION AUTHORIZATION](r_SET_SESSION_AUTHORIZATION.md)
+ [SET SESSION CHARACTERISTICS](r_SET_SESSION_CHARACTERISTICS.md)
+ [SHOW](r_SHOW.md)
+ [SHOW COLUMN GRANTS](r_SHOW_COLUMN_GRANTS.md)
+ [SHOW COLUMNS](r_SHOW_COLUMNS.md)
+ [SHOW CONSTRAINTS](r_SHOW_CONSTRAINTS.md)
+ [SHOW EXTERNAL TABLE](r_SHOW_EXTERNAL_TABLE.md)
+ [SHOW DATABASES](r_SHOW_DATABASES.md)
+ [SHOW FUNCTIONS](r_SHOW_FUNCTIONS.md)
+ [SHOW GRANTS](r_SHOW_GRANTS.md)
+ [SHOW MODEL](r_SHOW_MODEL.md)
+ [SHOW DATASHARES](r_SHOW_DATASHARES.md)
+ [SHOW PARAMETERS](r_SHOW_PARAMETERS.md)
+ [SHOW POLICIES](r_SHOW_POLICIES.md)
+ [SHOW PROCEDURE](r_SHOW_PROCEDURE.md)
+ [SHOW PROCEDURES](r_SHOW_PROCEDURES.md)
+ [MOSTRAR ESQUEMAS](r_SHOW_SCHEMAS.md)
+ [SHOW TABLE](r_SHOW_TABLE.md)
+ [SHOW TABLES](r_SHOW_TABLES.md)
+ [SHOW TEMPLATE](r_SHOW_TEMPLATE.md)
+ [SHOW TEMPLATES](r_SHOW_TEMPLATES.md)
+ [SHOW VIEW](r_SHOW_VIEW.md)
+ [START TRANSACTION](r_START_TRANSACTION.md)
+ [TRUNCATE](r_TRUNCATE.md)
+ [UNLOAD](r_UNLOAD.md)
+ [UPDATE](r_UPDATE.md)
+ [USE](r_USE_command.md)
+ [VACUUM](r_VACUUM_command.md)

# ABORT
<a name="r_ABORT"></a>

Detiene la transacción que se está ejecutando en ese momento y descarta todas las actualizaciones realizadas por esa transacción. ABORT no tiene efecto en transacciones que ya están completadas.

Este comando lleva a cabo la misma función que el comando ROLLBACK. Para obtener más información, consulte [ROLLBACK](r_ROLLBACK.md).

## Sintaxis
<a name="r_ABORT-synopsis"></a>

```
ABORT [ WORK | TRANSACTION ]
```

## Parameters
<a name="r_ABORT-parameters"></a>

WORK  
Palabra clave opcional.

TRANSACTION  
Palabra clave opcional; WORK y TRANSACTION son sinónimos.

## Ejemplo
<a name="r_ABORT-example"></a>

En el siguiente ejemplo, se crea una tabla que inicia una transacción donde los datos se insertan en la tabla. Luego, el comando ABORT revierte la inserción de datos para dejar la tabla vacía.

El siguiente comando crea una tabla de ejemplo denominada MOVIE\$1GROSS:

```
create table movie_gross( name varchar(30), gross bigint );
```

El siguiente conjunto de comandos inicia una transacción en donde se insertan dos filas de datos en la tabla:

```
begin;

insert into movie_gross values ( 'Raiders of the Lost Ark', 23400000);

insert into movie_gross values ( 'Star Wars', 10000000 );
```

A continuación, el siguiente comando selecciona los datos de la tabla para mostrar que se insertaron correctamente:

```
select * from movie_gross;
```

El resultado del comando muestra que ambas filas se insertaron correctamente:

```
         name           |  gross
------------------------+----------
Raiders of the Lost Ark | 23400000
Star Wars               | 10000000
(2 rows)
```

Este comando ahora revierte los cambios de datos para que vuelvan al estado de inicio de la transacción:

```
abort;
```

Si selecciona los datos de la tabla, ahora se muestra una tabla vacía:

```
select * from movie_gross;

 name | gross
------+-------
(0 rows)
```

# ALTER DATABASE
<a name="r_ALTER_DATABASE"></a>

Cambia los atributos de una base de datos.

## Privilegios necesarios
<a name="r_ALTER_DATABASE-privileges"></a>

Para utilizar ALTER DATABASE, se requiere uno de los siguientes privilegios.
+ Superusuario
+ Usuarios con el privilegio ALTER DATABASE
+ Propietario de la base de datos

## Sintaxis
<a name="r_ALTER_DATABASE-synopsis"></a>

```
ALTER DATABASE database_name
{ 
  RENAME TO new_name
  | OWNER TO new_owner
  | [ CONNECTION LIMIT { limit | UNLIMITED } ]
    [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]
    [ ISOLATION LEVEL { SNAPSHOT | SERIALIZABLE } ]
| INTEGRATION
 { 
  REFRESH { { ALL | INERROR } TABLES [ IN SCHEMA schema [, ...] ] | TABLE schema.table [, ...] }
   | SET 
     [ QUERY_ALL_STATES [=] { TRUE | FALSE } ] 
     [ ACCEPTINVCHARS [=] { TRUE | FALSE } ] 
     [ REFRESH_INTERVAL <interval> ]
     [ TRUNCATECOLUMNS [=] { TRUE | FALSE } ]
     [ HISTORY_MODE [=] {TRUE | FALSE} [ FOR { {ALL} TABLES [IN SCHEMA schema [, ...] ] | TABLE schema.table [, ...] } ] ]
 }
}
```

## Parameters
<a name="r_ALTER_DATABASE-parameters"></a>

 *database\$1name*   
Nombre de la base de datos que se modificará. Por lo general, modifica una base de datos a la que no está actualmente conectado. De todos modos, los cambios entran en vigor únicamente en sesiones posteriores. Puede cambiar el propietario de la base de datos actual, pero no puede cambiar su nombre:  

```
alter database tickit rename to newtickit;
ERROR:  current database may not be renamed
```

RENAME TO   
Cambia el nombre de la base de datos especificada. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md). No puede cambiar el nombre de las bases de datos dev, padb\$1harvest, template0, template1 o sys:internal, ni puede cambiar el nombre de la base de datos actual. Solo el propietario de la base de datos o un [superuser](r_superusers.md#def_superusers) puede cambiar el nombre de una base de datos; los propietarios que no son superusuarios deben tener también el privilegio CREATEDB.

 *new\$1name*   
Nuevo nombre de la base de datos.

OWNER TO   
Cambia el propietario de la base de datos especificada. Puede cambiar el propietario de la base de datos actual o alguna otra base de datos. Solo un superusuario puede cambiar el propietario.

 *new\$1owner*   
Nuevo propietario de la base de datos. El nuevo propietario debe ser un usuario de la base de datos existente con privilegios de escritura. Para obtener más información acerca de los privilegios del usuario, consulte [GRANT](r_GRANT.md).

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
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 [CREATE USER](r_CREATE_USER.md). El valor predeterminado es UNLIMITED. Para ver las conexiones actuales, consulte la vista del sistema [STV\$1SESSIONS](r_STV_SESSIONS.md).  
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 \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Se trata de una cláusula que especifica si la búsqueda o la comparación de cadenas distinguen o no entre letras mayúsculas y minúsculas.   
Puede cambiar la distinción entre mayúsculas y minúsculas de la base de datos actual, incluso si está vacía.  
Debe tener permiso ALTER para la base de datos actual a fin de cambiar la distinción entre mayúsculas y minúsculas. Los superusuarios o propietarios de bases de datos con el permiso CREATE DATABASE también pueden cambiar la distinción entre mayúsculas y minúsculas de la base de datos.  
CASE\$1SENSITIVE y CS son intercambiables y producen los mismos resultados. Del mismo modo, CASE\$1INSENSITIVE y CI son intercambiables y producen los mismos resultados.

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
Una cláusula que especifica el nivel de aislamiento utilizado cuando las consultas se ejecutan en una base de datos. Para obtener más información sobre niveles de aislamiento, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md).  
+ Aislamiento SNAPSHOT: proporciona un nivel de aislamiento con protección contra conflictos de actualización y eliminación. 
+ Aislamiento SERIALIZABLE: proporciona serialización completa para transacciones simultáneas.
Tenga en cuenta los siguientes aspectos al modificar el nivel de aislamiento de una base de datos:  
+ Debe contar con el privilegio de superusuario o CREATE DATABASE en la base de datos actual para cambiar el nivel de aislamiento de la base de datos.
+ No puede modificar el nivel de aislamiento de la base de datos de `dev`. 
+ No puede modificar el nivel de aislamiento dentro de un bloque de transacción.
+ El comando ‎alter isolation level produce un error si otros usuarios están conectados a la base de datos.
+ El comando ‎alter isolation level puede modificar la configuración del nivel de aislamiento de la sesión actual.

INTEGRATION  
Modifique una base de datos de integración sin ETL.

REFRESH \$1\$1 ALL \$1 INERROR \$1 TABLES [IN SCHEMA *esquema* [, ...]] \$1 TABLE *esquema.tabla* [, ...]\$1  
Una cláusula que especifica si Amazon Redshift actualizará todas las tablas o las que contengan errores en el esquema o la tabla especificados. La actualización hará que las tablas del esquema o tabla especificados se repliquen completamente desde la base de datos de origen.  
Para obtener más información, consulte [Integraciones sin ETL](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.html) en la *Guía de administración de Amazon Redshift*. Para obtener más información acerca de los estados de integración, consulte [SVV\$1INTEGRATION\$1TABLE\$1STATE](r_SVV_INTEGRATION_TABLE_STATE.md) y [SVV\$1INTEGRATION](r_SVV_INTEGRATION.md).

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
La cláusula QUERY\$1ALL\$1STATES establece si las tablas de integración sin ETL pueden consultarse en todos los estados (`Synced`, `Failed`, `ResyncRequired` y `ResyncInitiated`). De forma predeterminada, una tabla de integración sin ETL solo puede consultarse en estado `Synced`.

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
La cláusula ACCEPTINVCHARS establece si las tablas de integración sin ETL continúan con la ingesta cuando se detectan caracteres no válidos para el tipo de datos VARCHAR. Cuando se encuentran caracteres no válidos, se reemplazan por un carácter `?` predeterminado.

REFRESH\$1INTERVAL <intervalo>  
La cláusula REFRESH\$1INTERVAL establece el intervalo de tiempo aproximado, en segundos, para actualizar los datos desde el origen sin ETL en la base de datos de destino. El `interval` se puede establecer de 0 a 432 000 segundos (5 días) para las integraciones sin ETL cuyo tipo de origen sea Aurora MySQL, Aurora PostgreSQL o RDS para MySQL. Para las integraciones sin ETL de Amazon DynamoDB, se puede configurar el `interval` entre 900 y 432 000 segundos (15 minutos y 5 días).  
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](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html) en la *Guía de administración de Amazon Redshift*.

TRUNCATECOLUMNS [=] \$1 TRUE \$1 FALSE \$1  
La cláusula TRUNCATECOLUMNS establece si las tablas de integración sin ETL continúan con la ingesta cuando los valores de la columna VARCHAR o los atributos de columna SUPER exceden el límite. Cuando `TRUE`, los valores se truncan para que quepan en la columna y los valores de los atributos JSON desbordados se truncan para que quepan en la columna SUPER.

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1 [ FOR \$1 \$1ALL\$1 TABLES [IN SCHEMA esquema [, ...]] \$1 TABLE esquema.tabla [, ...]\$1 ]  
Cláusula que especifica si Amazon Redshift establecerá el modo de historial para todas las tablas o las tablas del esquema especificado que participan en la integración sin ETL. Esta opción solo se aplica a las bases de datos creadas para la integración sin ETL.  
La cláusula HISTORY\$1MODE puede establecerse en `TRUE` o `FALSE`. El valor predeterminado es `FALSE`. Activar y desactivar el modo de historial solo es aplicable a las tablas que se encuentran en el estado `Synced`. Para obtener información sobre HISTORY\$1MODE, consulte [Modo de historial](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html) en la *Guía de administración de Amazon Redshift*.

## Notas de uso
<a name="r_ALTER_DATABASE-usage-notes"></a>

Los comandos ALTER DATABASE se aplican en sesiones posteriores, no en sesiones actuales. Debe volver a conectarse a la base de datos modificada para ver el efecto del cambio.

## Ejemplos
<a name="r_ALTER_DATABASE-examples"></a>

En el siguiente ejemplo, se cambia el nombre de una base de datos denominada TICKIT\$1SANDBOX a TICKIT\$1TEST: 

```
alter database tickit_sandbox rename to tickit_test;
```

En el siguiente ejemplo, se cambia el propietario de la base de datos TICKIT (la base de datos actual) a DWUSER: 

```
alter database tickit owner to dwuser;
```

En el siguiente ejemplo, se cambia la distinción entre letras mayúsculas y minúsculas de la base de datos sampledb:

```
ALTER DATABASE sampledb COLLATE CASE_INSENSITIVE;
```

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

```
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
```

En el siguiente ejemplo se actualizan las tablas **schema1.sample\$1table1** y **schema2.sample\$1table2** de la base de datos **sample\$1integration\$1db** de la integración sin ETL.

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH TABLE schema1.sample_table1, schema2.sample_table2;
```

En el siguiente ejemplo se actualizan todas las tablas sincronizadas y con errores de la integración sin ETL.

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH ALL tables;
```

El siguiente ejemplo establece el intervalo de actualización para las integraciones sin ETL en 600 segundos.

```
ALTER DATABASE sample_integration_db INTEGRATION SET REFRESH_INTERVAL 600;
```

En el siguiente ejemplo se actualizan todas las tablas incluidas en el `ErrorState` del esquema **sample\$1schema**.

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH INERROR TABLES in SCHEMA sample_schema;
```

En el siguiente ejemplo se activa el modo de historial para la tabla `myschema.table1`.

```
ALTER DATABASE sample_integration_db INTEGRATION SET HISTORY_MODE = true FOR TABLE myschema.table1
```

En el siguiente ejemplo se activa el modo de historial para todas las tablas en `myschema`. 

```
ALTER DATABASE sample_integration_db INTEGRATION SET HISTORY_MODE = true for ALL TABLES IN SCHEMA myschema
```

# ALTER DATASHARE
<a name="r_ALTER_DATASHARE"></a>

Cambia la definición de un datashare (recurso para compartir datos). Puede agregar objetos o quitarlos con ALTER DATASHARE. Solo puede cambiar un recurso compartido de datos en la base de datos actual. Agregue o elimine objetos de la base de datos asociada a un recurso compartido de datos. El propietario del datashare con los permisos necesarios sobre los objetos del datashare que se agregarán o se quitarán puede modificar el datashare.

## Privilegios necesarios
<a name="r_ALTER_DATASHARE-privileges"></a>

Los siguientes privilegios son necesarios para ALTER DATASHARE:
+ Superusuario.
+ Usuario con el privilegio ALTER DATASHARE.
+ Usuarios que tienen el privilegio ALTER u ALL en el recurso compartido de datos.
+ Para agregar objetos específicos a un recurso compartido de datos, los usuarios deben disponer del privilegio correspondiente sobre los objetos. En este caso, los usuarios deben ser propietarios de los objetos, o bien tener los privilegios SELECT, USAGE u ALL sobre ellos. 

## Sintaxis
<a name="r_ALTER_DATASHARE-synopsis"></a>

La sintaxis siguiente ilustra cómo agregar o quitar objetos al recurso compartido de datos.

```
ALTER DATASHARE datashare_name { ADD | REMOVE } {
TABLE schema.table [, ...]
| SCHEMA schema [, ...]
| FUNCTION schema.sql_udf (argtype,...) [, ...]
| ALL TABLES IN SCHEMA schema [, ...]
| ALL FUNCTIONS IN SCHEMA schema [, ...] }
```

La sintaxis siguiente ilustra cómo configurar las propiedades del recurso compartido de datos.

```
ALTER DATASHARE datashare_name {
[ SET PUBLICACCESSIBLE [=] TRUE | FALSE ]
[ SET INCLUDENEW [=] TRUE | FALSE FOR SCHEMA schema ] }
```

## Parameters
<a name="r_ALTER_DATASHARE-parameters"></a>

*datashare\$1name*  
Se trata del nombre del datashare que se modificará. 

ADD \$1 REMOVE  
Se trata de una cláusula que especifica si se agregan o se quitan objetos del datashare.

TABLE *schema*.*table* [, ...]  
Se trata del nombre de la tabla o la vista del esquema especificado que se agrega al datashare.

SCHEMA *schema* [, ...]   
Se trata del nombre del esquema que se agrega al datashare.

FUNCTION *schema*.*sql\$1udf* (argtype,...) [, ...]  
Se trata del nombre de la función definida por el usuario de SQL con tipos de argumentos que se agrega al recurso compartido de datos.

ALL TABLES IN SCHEMA *schema* [, ...]   
Se trata de una cláusula que especifica si se agregan todas las tablas y las vistas del esquema especificado al datashare.

ALL FUNCTIONS IN SCHEMA *schema* [, ...] \$1  
Se trata de una cláusula que especifica la incorporación de todas las funciones del esquema especificado al datashare.

[ SET PUBLICACCESSIBLE [=] TRUE \$1 FALSE ]  
Se trata de una cláusula que especifica si un datashare se puede compartir con clústeres que sean accesibles públicamente.

[ SET INCLUDENEW [=] TRUE \$1 FALSE FOR SCHEMA *schema* ]  
Se trata de una cláusula que especifica si se agregan futuras tablas, vistas o funciones definidas por el usuario (UDF) de SQL creadas en el esquema especificado al datashare. Las tablas, las vistas o las UDF de SQL actuales del esquema especificado no se agregan al datashare. Solo los superusuarios pueden modificar esta propiedad para cada par de esquema y datashare. De manera predeterminada, la cláusula INCLUDENEW es false. 

## Notas de uso de ALTER DATASHARE
<a name="r_ALTER_DATASHARE_usage"></a>
+ Los siguientes usuarios pueden modificar un datashare:
  + un superusuario
  + el propietario del datashare
  + usuarios que tienen privilegios ALTER o ALL en el recurso compartido de datos
+ Para agregar objetos específicos a un recurso compartido de datos, los usuarios deben disponer de los privilegios correspondientes sobre los objetos. Los usuarios deben ser los propietarios de los objetos o tener privilegios SELECT, USAGE u ALL sobre los objetos.
+ Puede compartir esquemas, tablas, vistas normales, vistas de enlace de tiempo de ejecución, vistas materializadas y funciones definidas por el usuario (UDF) de SQL. Primero, agregue un esquema al recurso compartido de datos antes de agregar otros objetos al esquema. 

  Cuando se agrega un esquema, Amazon Redshift no agrega todos los objetos que contiene. Se deben agregar de forma explícita. 
+ Le recomendamos que cree recursos compartidos de datos de AWS Data Exchange con la configuración de acceso público activada.
+ En general, recomendamos que no modifique un recurso compartido de datos de AWS Data Exchange para desactivar la accesibilidad pública mediante la instrucción ALTER DATASHARE. En caso contrario, las Cuentas de AWS que tengan acceso al recurso compartido de datos lo pierden si sus clústeres son accesibles de manera pública. Realizar este tipo de alteración puede infringir los términos del producto de datos en AWS Data Exchange. Para obtener una excepción a esta recomendación, consulte lo siguiente.

  El siguiente ejemplo muestra un error cuando se crea un recurso compartido de datos de AWS Data Exchange con la configuración desactivada.

  ```
  ALTER DATASHARE salesshare SET PUBLICACCESSIBLE FALSE;
  ERROR:  Alter of ADX-managed datashare salesshare requires session variable datashare_break_glass_session_var to be set to value 'c670ba4db22f4b'
  ```

  Para permitir la alteración de un recurso compartido de datos de AWS Data Exchange para desactivar la configuración de acceso público, configure la siguiente variable y ejecute de nuevo la instrucción ALTER DATASHARE.

  ```
  SET datashare_break_glass_session_var to 'c670ba4db22f4b';
  ```

  ```
  ALTER DATASHARE salesshare SET PUBLICACCESSIBLE FALSE;
  ```

  En este caso, Amazon Redshift genera un valor aleatorio único para configurar la variable de sesión para permitir ALTER DATASHARE SET PUBLICACCESIBLE FALSE para un recurso compartido de datos de AWS Data Exchange.

## Ejemplos
<a name="r_ALTER_DATASHARE_examples"></a>

En el siguiente ejemplo, se agrega el esquema `public` al recurso compartido de datos de `salesshare`.

```
ALTER DATASHARE salesshare ADD SCHEMA public;
```

En el siguiente ejemplo, se agregan todas las tablas de `public.tickit_sales_redshift` al recurso compartido de datos de `salesshare`.

```
ALTER DATASHARE salesshare ADD TABLE public.tickit_sales_redshift;
```

En el siguiente ejemplo, se agregan todas las tablas al recurso compartido de datos de `salesshare`.

```
ALTER DATASHARE salesshare ADD ALL TABLES IN SCHEMA PUBLIC;
```

En el siguiente ejemplo, se elimina la tabla de `public.tickit_sales_redshift` del recurso compartido de datos de `salesshare`.

```
ALTER DATASHARE salesshare REMOVE TABLE public.tickit_sales_redshift;
```

# ALTER DEFAULT PRIVILEGES
<a name="r_ALTER_DEFAULT_PRIVILEGES"></a>

Define el conjunto de permisos de acceso predeterminado que se van a aplicar a los objetos que el usuario especificado cree en el futuro. De manera predeterminada, los usuarios pueden cambiar solo sus propios permisos de acceso predeterminados. Solo un superusuario puede especificar los permisos predeterminados de otros usuarios.

Puede aplicar privilegios predeterminados a roles, usuarios o grupos de usuarios. Puede configurar permisos predeterminados globalmente para todos los objetos creados en la base de datos actual o para objetos creados solo en los esquemas especificados. 

Los permisos predeterminados se aplican solo a los objetos nuevos. Ejecutar ALTER DEFAULT PRIVILEGES no cambia los permisos de objetos existentes. Para conceder permisos a todos los objetos actuales y futuros creados por cualquier usuario dentro de una base de datos o un esquema, consulte [Permisos acotados](https://docs.aws.amazon.com/redshift/latest/dg/t_scoped-permissions.html). 

Para ver información acerca de los privilegios predeterminados para usuarios de bases de datos, consulte la tabla de catálogo del sistema [PG\$1DEFAULT\$1ACL](r_PG_DEFAULT_ACL.md). 

Para obtener más información acerca de los privilegios, consulte [GRANT](r_GRANT.md).

## Privilegios necesarios
<a name="r_ALTER_DEFAULT_PRIVILEGES-privileges"></a>

Los siguientes privilegios son necesarios para ALTER DEFAULT PRIVILEGES:
+ Superusuario
+ Usuarios con el privilegio ALTER DEFAULT PRIVILEGES
+ Usuarios que cambien sus propios privilegios de acceso predeterminados
+ Usuarios que establezcan privilegios para esquemas para los que tienen privilegios de acceso

## Sintaxis
<a name="r_ALTER_DEFAULT_PRIVILEGES-synopsis"></a>

```
ALTER DEFAULT PRIVILEGES
    [ FOR USER target_user [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    grant_or_revoke_clause

where grant_or_revoke_clause is one of:

GRANT { { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	TO { user_name [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	TO { user_name [ WITH GRANT OPTION ] |  ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	TO { user_name [ WITH GRANT OPTION ] |  ROLE role_name | GROUP group_name | PUBLIC } [, ...]

REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	FROM user_name [, ...] [ RESTRICT ]

REVOKE  { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	FROM user_name [, ...] [ RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	FROM user_name [, ...] [ RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]
```

## Parameters
<a name="r_ALTER_DEFAULT_PRIVILEGES-parameters"></a>

FOR USER *target\$1user*  <a name="default-for-user"></a>
Opcional. El nombre del usuario para el que se definen los privilegios predeterminados. Solo un superusuario puede especificar los privilegios predeterminados de otros usuarios. El valor predeterminado es el usuario actual.

IN SCHEMA *schema\$1name*   <a name="default-in-schema"></a>
Opcional. Si aparece una cláusula IN SCHEMA, los privilegios predeterminados especificados se aplican a objetos nuevos creados en el *schema\$1name* (nombre\$1de\$1esquema) especificado. En este caso, el usuario o grupo de usuarios que es destino de ALTER DEFAULT PRIVILEGES debe tener el privilegio CREATE para el esquema especificado. Los privilegios predeterminados que son específicos de un esquema se agregan a los privilegios predeterminados globales existentes. Por defecto, los privilegios predeterminados se aplican globalmente a toda la base de datos. 

GRANT   <a name="default-grant"></a>
Define el conjunto de privilegios que se concederá a los usuarios o grupos especificados para todas las tablas y vistas, funciones o procedimientos almacenados nuevos creados por el usuario especificado. Puede configurar los mismos privilegios y opciones con la cláusula GRANT que con el comando [GRANT](r_GRANT.md). 

WITH GRANT OPTION   <a name="default-grant-option"></a>
Una cláusula que indica que el usuario que recibe los privilegios puede, a cambio, concederles los mismos privilegios a otros. No puede conceder WITH GRANT OPTION a un grupo o a PUBLIC. 

TO *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*   <a name="default-to"></a>
El nombre del usuario, rol o grupo de usuarios a los que se aplican los privilegios predeterminados especificados.

REVOKE   <a name="default-revoke"></a>
El conjunto de privilegios que se revocará de los usuarios o grupos especificados para todas las tablas, funciones o procedimientos almacenados creados por el usuario especificado. Puede configurar los mismos privilegios y opciones con la cláusula REVOKE que con el comando [REVOKE](r_REVOKE.md). 

GRANT OPTION FOR  <a name="default-revoke-option"></a>
 Una cláusula que revoca solo la opción de conceder un privilegio especificado a otros usuarios y no revoca el privilegio en sí. No puede revocar GRANT OPTION de un grupo o de PUBLIC. 

FROM *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*  <a name="default-from"></a>
El nombre del usuario o grupo de usuarios de los que se revocan los privilegios especificados de manera predeterminada.

RESTRICT   <a name="default-restrict"></a>
La opción RESTRICT revoca solo aquellos privilegios que el usuario haya concedido directamente. Esta es la opción predeterminada.

## Ejemplos
<a name="r_ALTER_DEFAULT_PRIVILEGES-examples"></a>

Supongamos que desea permitir que cualquier usuario del grupo de usuarios `report_readers` vea todas las tablas y vistas creadas por el usuario `report_admin`. En este caso, ejecute el siguiente comando como superusuario. 

```
alter default privileges for user report_admin grant select on tables to group report_readers; 
```

En el siguiente ejemplo el primer comando concede privilegios SELECT en todas las tablas nuevas que usted crea. Cada vez que cree una vista nueva, debe conceder privilegios a la vista de forma explícita o volver a ejecutar el comando `alter default privileges`.

```
alter default privileges grant select on tables to public; 
```

En el siguiente ejemplo, se concede un privilegio INSERT al grupo de usuarios `sales_admin` para todas las tablas y vistas nuevas que usted crea en el esquema `sales`. 

```
alter default privileges in schema sales grant insert on tables to group sales_admin; 
```

En el siguiente ejemplo, se revierte el comando ALTER DEFAULT PRIVILEGES del ejemplo anterior. 

```
alter default privileges in schema sales revoke insert on tables from group sales_admin;
```

De manera predeterminada, el grupo de usuarios PUBLIC tiene permiso de ejecución para todas las funciones nuevas definidas por el usuario. Para revocar los permisos de ejecución `public` para las funciones nuevas y, luego, conceder el permiso de ejecución solo al grupo de usuarios `dev_test`, ejecute los siguientes comandos. 

```
alter default privileges revoke execute on functions from public;
alter default privileges grant execute on functions to group dev_test;
```

# ALTER EXTERNAL SCHEMA
<a name="r_ALTER_EXTERNAL_SCHEMA"></a>

Modifica un esquema externo existente en la base de datos actual. Solo los propietarios del esquema, los superusuarios o los usuarios con privilegios ALTER en el esquema pueden modificarlo. Solo se pueden modificar los esquemas externos creados a partir de DATA CATALOG, KAFKA o MSK.

El propietario de este esquema es el emisor del comando CREATE EXTERNAL SCHEMA. Para transferir la propiedad de un esquema externo, use ALTER SCHEMA para cambiar el propietario. Para conceder acceso al esquema a otros usuarios o grupos de usuarios, utilice el comando GRANT.

No puede usar los comandos GRANT o REVOKE para los permisos en una tabla externa. En lugar de ello, conceda o revoque los permisos en el esquema externo. 

Para obtener más información, consulte los siguientes temas:
+ [ALTER SCHEMA](r_ALTER_SCHEMA.md)
+ [GRANT](r_GRANT.md)
+ [REVOKE](r_REVOKE.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [Habilitación de la autenticación mTLS para un esquema externo existente](materialized-view-streaming-ingestion-mtls.md#materialized-view-streaming-ingestion-mtls-alter)

Para ver detalles de los esquemas externos, consulte la vista del sistema SVV\$1EXTERNAL\$1SCHEMAS. Para obtener más información, consulte [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md).

## Sintaxis
<a name="r_ALTER_EXTERNAL_SCHEMA-synopsis"></a>

```
ALTER EXTERNAL SCHEMA schema_name
[ IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' ] ]
[ AUTHENTICATION [ none | iam | mtls] ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'asm-secret-arn' ]
[ URI 'Kafka bootstrap URL' ]
```

Si tiene un esquema externo existente que utiliza para la ingesta de streaming y desea implementar un TLS mutuo para la autenticación, puede ejecutar un comando como el siguiente, que especifica la autenticación mTLS y el ARN del certificado ACM en ACM. 

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
AUTHENTICATION_ARN 'arn:aws:acm:us-east-1:444455556666:certificate/certificate_ID';
```

O bien, puede modificar la autenticación mTLS, con referencia al ARN del secreto en Secrets Manager.

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
```

El siguiente ejemplo muestra cómo modificar el URI para ALTER EXTERNAL SCHEMA:

```
ALTER EXTERNAL SCHEMA schema_name  
URI 'lkc-ghidef-67890.centralus.azure.glb.confluent.cloud:9092';
```

El siguiente ejemplo muestra cómo modificar el rol de IAM para ALTER EXTERNAL SCHEMA:

```
ALTER EXTERNAL SCHEMA schema_name  
IAM_ROLE 'arn:aws:iam::012345678901:role/testrole';
```

## Parameters
<a name="r_ALTER_EXTERNAL_SCHEMA-parameters"></a>

 IAM\$1ROLE[ default \$1 'SESSION' \$1 'arn:aws:iam::<AWS account-id>:role/<role-name>' ]   
Utilice la palabra clave `default` para que Amazon Redshift utilice el rol de IAM establecido como predeterminado.  
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 obtener más información, consulte [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html).

AUTENTICACIÓN  
El tipo de autenticación que se ha definido para la ingesta de streaming. La ingesta de streaming con tipos de autenticación funciona con Apache Kafka, Confluent Cloud y Amazon Managed Streaming para Apache Kafka. Para obtener más información, consulte [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html).

AUTHENTICATION\$1ARN  
El ARN del certificado de AWS Certificate Manager utilizado por Amazon Redshift para la autenticación mtls con Apache Kafka, Confluent Cloud o Amazon Managed Streaming para Apache Kafka (Amazon MSK). El ARN está disponible en la consola de ACM al elegir el certificado emitido.

SECRET\$1ARN  
El nombre de recurso de Amazon (ARN) o un secreto compatible creado con AWS Secrets Manager. Para obtener información sobre cómo crear y recuperar un ARN para un secreto, consulte [Administrar secretos con AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) en la *Guía del usuario de AWS Secrets Manager*, y [Recuperar el nombre de recurso de Amazon (ARN) del secreto en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html).

URI  
La URL de arranque del clúster de Apache Kafka, Confluent Cloud o Amazon Managed Streaming para Apache Kafka (Amazon MSK). El punto de conexión debe ser accesible (enrutable) desde el clúster de Amazon Redshift. Para obtener más información, consulte [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html).

# ALTER EXTERNAL VIEW
<a name="r_ALTER_EXTERNAL_VIEW"></a>

Utilice el comando ALTER EXTERNAL VIEW para actualizar la vista externa. Según los parámetros que utilice, es posible que también se vean afectados otros motores de SQL, como Amazon Athena y Amazon EMR Spark, que también pueden hacer referencia a esta vista. Para obtener más información sobre las vistas del Catálogo de datos, consulte [Vistas de AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

## Sintaxis
<a name="r_ALTER_EXTERNAL_VIEW-synopsis"></a>

```
ALTER EXTERNAL VIEW schema_name.view_name
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
[FORCE] { AS (query_definition) | REMOVE DEFINITION }
```

## Parameters
<a name="r_ALTER_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
Es el esquema asociado a la base de datos de AWS Glue, seguido del nombre de la vista.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
Es la notación del esquema que se utilizará al modificar la vista. Puede especificar el uso de AWS Glue Data Catalog, una base de datos de Glue que haya creado o un esquema externo que haya creado. Consulte [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) y [CREATE EXTERNAL SCHEMA ](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)para obtener más información.

FORCE  
Si AWS Lake Formation debe actualizar la definición de la vista incluso si los objetos a los que se hace referencia en la tabla no son coherentes con otros motores de SQL. Si Lake Formation actualiza la vista, esta se considera obsoleta para los demás motores de SQL hasta que dichos motores se actualicen.

 *AS query\$1definition*   
Es la definición de la consulta SQL que Amazon Redshift ejecuta para modificar la vista.

REMOVE DEFINITION  
Si se deben eliminar las vistas y volver a crearlas. Las vistas deben suprimirse y volver a crearse para marcarlas como `PROTECTED`.

## Ejemplos
<a name="r_ALTER_EXTERNAL_VIEW-examples"></a>

El siguiente ejemplo modifica una vista del catálogo de datos denominada sample\$1schema.glue\$1data\$1catalog\$1view.

```
ALTER EXTERNAL VIEW sample_schema.glue_data_catalog_view
FORCE
REMOVE DEFINITION
```

# ALTER FUNCTION
<a name="r_ALTER_FUNCTION"></a>

Cambia el nombre de una función o cambia el propietario. Se requieren tanto el nombre de la función como los tipos de datos. Solo el propietario o un superusuario pueden cambiar el nombre de una función. Solo un superusuario puede cambiar el propietario de una función. 

## Sintaxis
<a name="r_ALTER_FUNCTION-synopsis"></a>

```
ALTER FUNCTION function_name ( { [ py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] )
     RENAME TO new_name
```

```
ALTER FUNCTION function_name ( { [ py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] )
     OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
```

## Parameters
<a name="r_ALTER_FUNCTION-parameters"></a>

 *function\$1name*   
El nombre de la función que se va a alterar. Especifique el nombre de la función en la ruta de búsqueda actual o utilice el formato `schema_name.function_name` para usar un esquema específico.

*py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
Opcional. Una lista de nombres de argumentos de entrada y tipos de datos para la función definida por el usuario de Python o una lista de tipos de datos de argumentos de entrada para la función SQL definida por el usuario.

 *new\$1name*   
Un nuevo nombre para la función definida por el usuario. 

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
Un nuevo propietario para la función definida por el usuario. 

## Ejemplos
<a name="r_ALTER_FUNCTION-examples"></a>

El siguiente ejemplo cambia el nombre de una función de `first_quarter_revenue` a `quarterly_revenue`.

```
ALTER FUNCTION first_quarter_revenue(bigint, numeric, int) 
         RENAME TO quarterly_revenue;
```

En el siguiente ejemplo, se modifica el propietario de la función `quarterly_revenue` a `etl_user`.

```
ALTER FUNCTION quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

# ALTER GROUP
<a name="r_ALTER_GROUP"></a>

Cambia un grupo de usuarios. Utilice este comando para agregar usuarios al grupo, eliminar usuarios del grupo o cambiar el nombre del grupo. 

## Sintaxis
<a name="r_ALTER_GROUP-synopsis"></a>

```
ALTER GROUP group_name
{
ADD USER username [, ... ] |
DROP USER username [, ... ] |
RENAME TO new_name
}
```

## Parameters
<a name="r_ALTER_GROUP-parameters"></a>

 *group\$1name*   
Nombre del grupo de usuarios que se modificará. 

ADD   
Agrega un usuario a un grupo de usuarios. 

DROP   
Elimina un usuario del grupo de usuarios. 

 *username*   
Nombre del usuario que se agregará al grupo o que se eliminará del grupo. 

RENAME TO   
Cambia el nombre del grupo de usuarios. Los nombres de grupos que comienzan con dos guiones bajos se reservan para el uso interno de Amazon Redshift. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md). 

 *new\$1name*   
Nuevo nombre del grupo de usuarios. 

## Ejemplos
<a name="r_ALTER_GROUP-examples"></a>

En el siguiente ejemplo, se agrega un usuario denominado DWUSER al grupo ADMIN\$1GROUP.

```
ALTER GROUP admin_group
ADD USER dwuser;
```

En el siguiente ejemplo, se cambia el nombre del grupo ADMIN\$1GROUP a ADMINISTRATORS. 

```
ALTER GROUP admin_group
RENAME TO administrators;
```

En el siguiente ejemplo, se agrega un usuario denominado DWUSER al grupo ADMIN\$1GROUP. 

```
ALTER GROUP admin_group
ADD USER u1, u2;
```

En el siguiente ejemplo se eliminan dos usuarios del grupo ADMIN\$1GROUP. 

```
ALTER GROUP admin_group
DROP USER u1, u2;
```

# MODIFICAR PROVEEDOR DE IDENTIDADES
<a name="r_ALTER_IDENTITY_PROVIDER"></a>

Modifica un proveedor de identidades para asignar nuevos parámetros y valores. Cuando ejecuta este comando, todos los valores de parámetros establecidos anteriormente se eliminan antes de asignarse los nuevos valores. Solo un superusuario puede modificar un proveedor de identidades.

## Sintaxis
<a name="r_ALTER_IDENTITY_PROVIDER-synopsis"></a>

```
ALTER IDENTITY PROVIDER identity_provider_name
[PARAMETERS parameter_string]
[NAMESPACE namespace]
[IAM_ROLE iam_role]
[AUTO_CREATE_ROLES
    [ TRUE [ { INCLUDE | EXCLUDE } GROUPS LIKE filter_pattern] |
      FALSE
    ]
[DISABLE | ENABLE]
```

## Parameters
<a name="r_ALTER_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
Nombre del nuevo proveedor de identidades. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

 *parameter\$1string*   
Una cadena que contiene un objeto JSON con el formato correcto que contiene los parámetros y valores necesarios para el proveedor de identidades específico.

 *Espacio de nombres de*   
El espacio de nombres de la organización.

 *iam\$1role*   
El rol de IAM que proporciona permisos para la conexión al IAM Identity Center. Este parámetro solo se aplica cuando el tipo de proveedor de identidades es AWSIDC.

 *auto\$1create\$1roles*   
Habilita o deshabilita la característica de creación automática de roles. Si el valor es TRUE, Amazon Redshift habilita la característica de creación automática de roles. Si el valor es FALSE, Amazon Redshift desactiva la característica de creación automática de roles. Si no se especifica el valor de este parámetro, Amazon Redshift determina el valor mediante la siguiente lógica:   
+  Si se proporciona `AUTO_CREATE_ROLES` pero no se especifica el valor, el valor se establece en TRUE. 
+  Si no se proporciona `AUTO_CREATE_ROLES` y el proveedor de identidad es AWSIDC, el valor se establece en FALSE. 
+  Si no se proporciona `AUTO_CREATE_ROLES` y el proveedor de identidad es Azure, el valor se establece en TRUE. 
Para incluir grupos, especifique `INCLUDE`. El valor predeterminado es vacío, lo que significa incluir todos los grupos si `AUTO_CREATE_ROLES` está activado.  
Para excluir grupos, especifique `EXCLUDE`. El valor predeterminado es vacío, lo que significa que no se excluirá ningún grupo si `AUTO_CREATE_ROLES` está activado.

 *filter\$1pattern*   
Una expresión de caracteres UTF-8 válida con un patrón para hacer coincidir los nombres de grupo. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_ALTER_IDENTITY_PROVIDER.html)
Si *filter\$1pattern* no contiene metacaracteres, solo representa la propia cadena; en ese caso, LIKE actúa igual que el operador de igualdad.   
*filter\$1pattern* admite los siguientes caracteres:  
+  Caracteres alfabéticos en mayúsculas y minúsculas (A-Z y a-z) 
+  Números (0-9) 
+  Los siguientes caracteres especiales: 

  ```
  _ % ^ * + ? { } , $
  ```

 *DISABLE o ENABLE*   
Activa o desactiva un proveedor de identidades. El valor predeterminado es ENABLE.

## Ejemplos
<a name="r_ALTER_IDENTITY_PROVIDER-examples"></a>

En el siguiente ejemplo se modifica un proveedor de identidades denominado *oauth\$1standard*. Se aplica específicamente a los casos en que Microsoft Azure AD es el proveedor de identidades.

```
ALTER IDENTITY PROVIDER oauth_standard
PARAMETERS '{"issuer":"https://sts.windows.net/2sdfdsf-d475-420d-b5ac-667adad7c702/",
"client_id":"87f4aa26-78b7-410e-bf29-57b39929ef9a",
"client_secret":"BUAH~ewrqewrqwerUUY^%tHe1oNZShoiU7",
"audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift"]
}'
```

El siguiente ejemplo muestra cómo configurar el espacio de nombres del proveedor de identidades. Esto se puede aplicar a Microsoft Azure AD, si sigue una instrucción como la del ejemplo anterior o a otro proveedor de identidades. También se puede aplicar a los casos en los que conecte un clúster aprovisionado de Amazon Redshift o un grupo de trabajo de Amazon Redshift sin servidor existente a IAM Identity Center, si tiene una conexión configurada a través de una aplicación administrada.

```
ALTER IDENTITY PROVIDER "my-redshift-idc-application"
NAMESPACE 'MYCO';
```

El siguiente ejemplo establece el rol de IAM y funciona en el caso de uso para configurar la integración de Redshift con IAM Identity Center.

```
ALTER IDENTITY PROVIDER "my-redshift-idc-application"
IAM_ROLE 'arn:aws:iam::123456789012:role/myadministratorrole';
```

Para obtener más información sobre la configuración de una conexión de IAM Identity Center desde Redshift, consulte [Conectar Redshift con IAM Identity Center para ofrecer a los usuarios una experiencia de inicio de sesión único](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

**Desactivación de un proveedor de identidades**

La instrucción de ejemplo siguiente muestra cómo desactivar un proveedor de identidades. Cuando está desactivado, los usuarios federados del proveedor de identidades no pueden iniciar sesión en el clúster hasta que se vuelva a habilitar.

```
ALTER IDENTITY PROVIDER "redshift-idc-app" DISABLE;
```

# ALTER MASKING POLICY
<a name="r_ALTER_MASKING_POLICY"></a>

Modifica una política de enmascaramiento de datos dinámicos existente. Para obtener más información sobre el enmascaramiento dinámico de datos, consulte [Enmascaramiento de datos dinámico](t_ddm.md).

Los superusuarios y los usuarios o roles que tienen el rol sys:secadmin pueden modificar una política de enmascaramiento.

## Sintaxis
<a name="r_ALTER_MASKING_POLICY-synopsis"></a>

```
ALTER MASKING POLICY
{ policy_name | database_name.policy_name }
USING (masking_expression);
```

## Parameters
<a name="r_ALTER_MASKING_POLICY-parameters"></a>

*policy\$1name*   
 Nombre de la política de enmascaramiento. Debe ser el nombre de una política de enmascaramiento que ya exista en la base de datos. 

database\$1name  
El nombre de la base de datos a partir de la que se crea la política. La base de datos puede ser la base de datos conectada o una base de datos que admita los permisos federados de Amazon Redshift.

*masking\$1expression*  
Expresión SQL que se utiliza para transformar las columnas de destino. Se puede escribir mediante funciones de manipulación de datos, como las funciones de manipulación de cadenas, o junto con funciones definidas por el usuario escritas en SQL, Python o con AWS Lambda.   
 La expresión debe coincidir con las columnas de entrada y los tipos de datos de la expresión original. Por ejemplo, si las columnas de entrada de la política de enmascaramiento original fueran `sample_1 FLOAT` y`sample_2 VARCHAR(10)`, no podría modificar la política de enmascaramiento para que ocupara una tercera columna ni hacer que la política aceptara un valor FLOAT y un valor BOOLEAN. Si usa una constante como expresión de enmascaramiento, debe convertirla explícitamente a un tipo que coincida con el tipo de entrada.  
 Debe tener el permiso USAGE en todas las funciones definidas por el usuario que utilice en la expresión de enmascaramiento. 

Para obtener información sobre el uso de ALTER MASKING POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# ALTER MATERIALIZED VIEW
<a name="r_ALTER_MATERIALIZED_VIEW"></a>

Cambia los atributos de una vista materializada. 

## Sintaxis
<a name="r_ALTER_MATERIALIZED_VIEW-synopsis"></a>

```
ALTER MATERIALIZED VIEW mv_name
{
AUTO REFRESH { YES | NO } 
| ALTER DISTKEY column_name
| ALTER DISTSTYLE ALL
| ALTER DISTSTYLE EVEN
| ALTER DISTSTYLE KEY DISTKEY column_name
| ALTER DISTSTYLE AUTO
| ALTER [COMPOUND] SORTKEY ( column_name [,...] )
| ALTER SORTKEY AUTO
| ALTER SORTKEY NONE
| ROW LEVEL SECURITY { ON | OFF } [ CONJUNCTION TYPE { AND | OR } ] [FOR DATASHARES]
};
```

## Parameters
<a name="r_ALTER_MATERIALIZED_VIEW-parameters"></a>

*mv\$1name*  
Se trata del nombre de la vista materializada que se modificará.

AUTO REFRESH \$1 YES \$1 NO \$1  
Una cláusula que activa o desactiva la actualización automática de una vista materializada. Para obtener más información acerca de la actualización automática de vistas materializadas, consulte [Actualización de una vista materializada](materialized-view-refresh.md).

ALTER DISTSTYLE ALL  
Cláusula que cambia el estilo de distribución existente de una relación con `ALL`. Considere lo siguiente:  
+ Las operaciones ALTER DISTSTYTLE, ALTER SORTKEY y VACUUM no pueden ejecutarse simultáneamente en la misma relación. 
  + Si se está ejecutando la operación VACUUM actualmente, la ejecución de ALTER DISTSTYLE ALL devuelve un error. 
  + Si se está ejecutando ALTER DISTSTYLE ALL, no se iniciará una limpieza en segundo plano en una relación. 
+ El comando ALTER DISTSTYLE ALL no está admitido en relaciones con claves de clasificación intercaladas y tablas temporales.
+ Si el estilo de distribución se definió previamente como AUTO, la relación ya no será candidata para la optimización automática de tablas. 
Para obtener más información acerca de DISTSTYLE ALL, vaya a [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTSTYLE EVEN  
Cláusula que cambia el estilo de distribución existente de una relación con `EVEN`. Considere lo siguiente:  
+ Las operaciones ALTER DISTSYTLE, ALTER SORTKEY y VACUUM no pueden ejecutarse simultáneamente en la misma relación. 
  + Si se está ejecutando VACUUM actualmente, la ejecución de ALTER DISTSTYLE EVEN devuelve un error. 
  + Si se está ejecutando ALTER DISTSTYLE EVEN, no se iniciará una limpieza en segundo plano en una relación. 
+ El comando ALTER DISTSTYLE EVEN no está admitido en relaciones con claves de clasificación intercaladas y tablas temporales.
+ Si el estilo de distribución se definió previamente como AUTO, la relación ya no será candidata para la optimización automática de tablas. 
Para obtener más información acerca de DISTSTYLE EVEN, consulte [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTKEY *column\$1name* o ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
Cláusula que cambia la columna usada como la clave de distribución de una relación. Considere lo siguiente:  
+ Las operaciones VACUUM y ALTER DISTKEY no se pueden ejecutar simultáneamente en la misma relación. 
  + Si ya se está ejecutando VACUUM, ALTER DISTKEY devolverá un error.
  + Si se está ejecutando ALTER DISTKEY, la limpieza en segundo plano no se iniciará en una relación.
  + Si se está ejecutando ALTER DISTKEY, la limpieza en primer plano devolverá un error.
+ Solo puede ejecutar un comando ALTER DISTKEY en una relación a la vez. 
+ El comando ALTER DISTKEY no es compatible en relaciones con claves de clasificación intercalada. 
+ Si el estilo de distribución se definió previamente como AUTO, la relación ya no será candidata para la optimización automática de tablas. 
Al especificar DISTSTYLE KEY, los datos se distribuyen por los valores en la columna DISTKEY. Para obtener más información acerca de DISTSTYLE, consulte [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTSTYLE AUTO  
Cláusula que cambia el estilo de distribución existente de una relación a AUTO.   
Si modifica un estilo de distribución a AUTO, el estilo de distribución de la tabla se establece de la siguiente manera:   
+ Una relación pequeña con DISTSTYLE ALL se convierte a AUTO(ALL). 
+ Una relación pequeña con DISTSTYLE EVEN se convierte a AUTO(ALL). 
+ Una relación pequeña con DISTSTYLE KEY se convierte a AUTO(ALL). 
+ Una relación grande con DISTSTYLE ALL se convierte a AUTO(EVEN). 
+ Una relación grande con DISTSTYLE EVEN se convierte a AUTO(EVEN). 
+ Una relación grande con DISTSTYLE KEY se convierte a AUTO(KEY) y se conserva DISTKEY. En este caso, Amazon Redshift no cambia la relación.
Si Amazon Redshift determina que un estilo de distribución nuevo o una clave nueva mejorarán el rendimiento de las consultas, Amazon Redshift podría cambiar el estilo de distribución o la clave de la relación en el futuro. Por ejemplo, Amazon Redshift podría convertir una relación con un valor de DISTSTYLE de AUTO(KEY) en AUTO(EVEN) o viceversa. Para obtener más información sobre el comportamiento cuando se modifican las claves de distribución, incluida la redistribución de datos y los bloqueos, consulte [Recomendaciones de Amazon Redshift Advisor](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation).  
Para obtener más información acerca de DISTSTYLE AUTO, consulte [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).   
Para ver el estilo de distribución de una relación, consulte la vista de catálogo del sistema SVV\$1TABLE\$1INFO. Para obtener más información, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Si desea ver las recomendaciones para relaciones de Advisor de Amazon Redshift, consulte la vista de catálogo del sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Para obtener más información, consulte [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para ver las acciones llevadas a cabo por Amazon Redshift, consulte la vista de catálogo del sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obtener más información, consulte [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
Una cláusula que cambia o añade la clave de clasificación utilizada para una relación. ALTER SORTKEY no se admite en tablas temporales.  
Cuando se modifica una clave de ordenación, la codificación de compresión de las columnas de la clave de ordenación nueva u original puede cambiar. Si no se define de forma explícita ninguna codificación para la relación, entonces Amazon Redshift asigna automáticamente las codificaciones de compresión de la siguiente manera:  
+ A las columnas que están definidas como claves de ordenación se les asigna una compresión RAW.
+ A las columnas que están definidas como tipos de datos BOOLEAN, REAL o DOUBLE PRECISION se les asigna una compresión RAW.
+ A las columnas que se definen como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ se les asigna la compresión AZ64.
+ Las columnas que se definen como CHAR o VARCHAR tienen asignada la compresión LZO.
Considere lo siguiente:  
+ Puede definir un máximo de 400 columnas para una clave de clasificación para cada relación. 
+ Puede alterar una clave de ordenación intercalada por una clave de ordenación compuesta o por ninguna clave de ordenación. No obstante, no puede alterar una clave de ordenación compuesta por una clave de ordenación intercalada. 
+ Si la clave de clasificación se definió previamente como AUTO, la relación ya no será candidata para la optimización automática de tablas. 
+ Amazon Redshift recomienda utilizar la codificación RAW (sin compresión) para columnas definidas como claves de ordenación. Cuando se modifica una columna para elegirla como clave de ordenación, la compresión de la columna se cambia a la compresión RAW (sin compresión). Esto puede aumentar la cantidad de almacenamiento que requiere la relación. El aumento del tamaño de la relación depende de la definición específica de la relación y de su contenido. Para obtener más información acerca de la compresión, consulte [Codificaciones de compresión](c_Compression_encodings.md). 
Cuando se cargan datos en una relación, se hace en el orden definido por la clave de clasificación. Cuando se modifica la clave de ordenación, Amazon Redshift reordena los datos. Para obtener más información acerca de SORTKEY, consulte [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER SORTKEY AUTO  
Se trata de una cláusula que modifica la clave de clasificación de la relación de destino a AUTO o la añade. ALTER SORTKEY AUTO no se admite en tablas temporales.   
Cuando se modifica una clave de clasificación a AUTO, Amazon Redshift conserva la clave de ordenación existente de la relación.   
Si Amazon Redshift determina que una clave de clasificación nueva mejorará el rendimiento de las consultas, Amazon Redshift podría cambiar la clave de clasificación de la relación en el futuro.   
Para obtener más información acerca de SORTKEY AUTO, consulte [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).   
Para ver la clave de clasificación de una relación, consulte la vista de catálogo del sistema SVV\$1TABLE\$1INFO. Para obtener más información, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Si desea ver las recomendaciones para relaciones de Advisor de Amazon Redshift, consulte la vista de catálogo del sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Para obtener más información, consulte [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para ver las acciones llevadas a cabo por Amazon Redshift, consulte la vista de catálogo del sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obtener más información, consulte [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER SORTKEY NONE  
Se trata de una cláusula que quita la clave de clasificación de la relación de destino.   
Si la clave de clasificación se definió previamente como AUTO, la relación ya no será candidata para la optimización automática de tablas. 

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
Es una cláusula que activa o desactiva la seguridad de nivel de fila para una relación.  
Cuando la seguridad de nivel de fila está activada para una relación, solo puede leer las filas a las que la política de seguridad de nivel de fila le permite acceder. Si no hay ninguna política que le conceda acceso a la relación, no podrá ver ninguna fila de la relación. Solo los superusuarios y los usuarios o roles que tienen el rol `sys:secadmin` pueden establecer la cláusula ROW LEVEL SECURITY. Para obtener más información, consulte [Seguridad de nivel básico](t_rls.md).  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  Es una cláusula que le permite elegir el tipo de conjunción de la política de seguridad a nivel de fila para una relación. Si se asocian varias políticas de seguridad en el nivel de fila a una relación, puede combinarlas con la cláusula AND u OR. De forma predeterminada, Amazon Redshift combina las políticas de RLS con la cláusula AND. Los superusuarios, usuarios o roles que tienen el rol `sys:secadmin` pueden usar esta cláusula para definir el tipo de conjunción de la política de seguridad de nivel de fila para una relación. Para obtener más información, consulte [Combinación de varias políticas por usuario](t_rls_combine_policies.md). 
+ PARA RECURSOS COMPARTIDOS DE DATOS

   Es una cláusula que determina si se puede acceder a una relación protegida por RLS a través de recursos compartidos de datos. De forma predeterminada, no se puede acceder a una relación protegida por RLS a través de un recurso compartido de datos. Un comando ALTER MATERIALIZED VIEW ROW LEVEL SECURITY ejecutado con esta cláusula solo afecta a la propiedad de accesibilidad de recurso compartido de datos de la relación. La propiedad ROW LEVEL SECURITY no ha cambiado.

   Si hace que una relación protegida por RLS sea accesible a través de recursos compartidos de datos, la relación no tendrá seguridad de nivel de fila en la base de datos de recurso compartido de datos del lado del consumidor. La relación conserva su propiedad RLS del lado del productor. 

## Ejemplos
<a name="r_ALTER_MATERIALIZED_VIEW-examples"></a>

En el siguiente ejemplo, se habilita la actualización automática de la vista materializada `tickets_mv`.

```
ALTER MATERIALIZED VIEW tickets_mv AUTO REFRESH YES
```

# Ejemplos de DISTSTYLE y SORTKEY para ALTER MATERIALIZED VIEW
<a name="r_ALTER_MATERIALIZED_VIEW-DISTSTYLE-SORTKEY-examples"></a>

En los ejemplos de este tema se muestra cómo realizar cambios en DISTSTYLE y SORTKEY mediante ALTER MATERIALIZED VIEW.

Las consultas de ejemplo siguientes muestran cómo modificar una columna DISTSTYLE KEY DISTKEY mediante una tabla base de ejemplo:

```
CREATE TABLE base_inventory(
  inv_date_sk int4 NOT NULL,
  inv_item_sk int4 NOT NULL,
  inv_warehouse_sk int4 NOT NULL,
  inv_quantity_on_hand int4
);

INSERT INTO base_inventory VALUES(1,1,1,1);

CREATE materialized VIEW inventory diststyle even AS SELECT * FROM base_inventory;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER diststyle KEY distkey inv_warehouse_sk;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER distkey inv_item_sk;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

Modifique una vista materializada a DISTSTYLE ALL:

```
CREATE TABLE base_inventory(
  inv_date_sk int4 NOT NULL,
  inv_item_sk int4 NOT NULL,
  inv_warehouse_sk int4 NOT NULL,
  inv_quantity_on_hand int4
);

INSERT INTO base_inventory VALUES(1,1,1,1);

CREATE materialized VIEW inventory diststyle even AS SELECT * FROM base_inventory;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER MATERIALIZED VIEW inventory ALTER diststyle ALL;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

Los siguientes comandos muestran ejemplos de ALTER MATERIALIZED VIEW SORTKEY, con una tabla base de ejemplo:

```
CREATE TABLE base_inventory (c0 int, c1 int);

INSERT INTO base_inventory VALUES(1,1);

CREATE materialized VIEW inventory interleaved sortkey(c0, c1) AS SELECT * FROM base_inventory;
SELECT "table", sortkey1 FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey(c0, c1);
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey NONE;
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey(c0);
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

# ALTER RLS POLICY
<a name="r_ALTER_RLS_POLICY"></a>

Modifique una política de seguridad de nivel de fila existente en una tabla.

Los superusuarios y los usuarios o roles que tienen el rol `sys:secadmin` pueden modificar una política.

## Sintaxis
<a name="r_ALTER_RLS_POLICY-synopsis"></a>

```
ALTER RLS POLICY
{ policy_name | database_name.policy_name }
USING ( using_predicate_exp );
```

## Parameters
<a name="r_ALTER_RLS_POLICY-parameters"></a>

 *policy\$1name*   
El nombre de la política.

database\$1name  
El nombre de la base de datos a partir de la que se crea la política. La base de datos puede ser la base de datos conectada o una base de datos que admita los permisos federados de Amazon Redshift.

USING (* using\$1predicate\$1exp *)  
Especifica un filtro que se aplica a la cláusula WHERE de la consulta. Amazon Redshift aplica un predicado de política antes de los predicados de usuario de la consulta. Por ejemplo, **current\$1user = ‘joe’ and price > 10** limita a Joe a ver solo registros con un precio superior a 10 USD.  
La expresión tiene acceso a las variables declaradas en la cláusula WITH de la instrucción CREATE RLS POLICY que se utilizó para crear la política con el nombre policy\$1name.

Para obtener información sobre el uso de ALTER RLS POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Ejemplos
<a name="r_ALTER_RLS_POLICY-examples"></a>

En el siguiente ejemplo se modifica una política de RLS.

```
-- First create an RLS policy that limits access to rows where catgroup is 'concerts'.
CREATE RLS POLICY policy_concerts
WITH (catgroup VARCHAR(10))
USING (catgroup = 'concerts');

-- Then, alter the RLS policy to only show rows where catgroup is 'piano concerts'.
ALTER RLS POLICY policy_concerts
USING (catgroup = 'piano concerts');
```

# ALTER ROLE
<a name="r_ALTER_ROLE"></a>

Cambia el nombre de un rol o cambia el propietario. Para obtener una lista de roles definidos por el sistema de Amazon Redshift, consulte [Roles definidos por el sistema de Amazon Redshift](r_roles-default.md).

## Permisos necesarios
<a name="r_ALTER_ROLE-privileges"></a>

Los siguientes permisos son necesarios para ALTER ROLE:
+ Superusuario
+ Usuarios con los permisos ALTER ROLE

## Sintaxis
<a name="r_ALTER_ROLE-synopsis"></a>

```
ALTER ROLE role [ WITH ]
  { { RENAME TO role } | { OWNER TO user_name } }[, ...]
  [ EXTERNALID TO external_id ]
```

## Parameters
<a name="r_ALTER_ROLE-parameters"></a>

 *Rol*   
Nombre del rol que se debe modificar.

RENAME TO  
Nuevo nombre del rol.

OWNER TO *user\$1name*  
Nuevo propietario del rol. 

EXTERNALID TO *external\$1id*  
Un nuevo ID externo para el rol, que está asociado con un proveedor de identidades. Para obtener más información, consulte [Federación de proveedores de identidades nativos (IdP) para Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

## Ejemplos
<a name="r_ALTER_ROLE-examples"></a>

El siguiente ejemplo cambia el nombre de un rol de `sample_role1` a `sample_role2`.

```
ALTER ROLE sample_role1 RENAME TO sample_role2;
```

El siguiente ejemplo cambia el propietario del rol.

```
ALTER ROLE sample_role1 WITH OWNER TO user1
```

La sintaxis de ALTER ROLE es similar a la de ALTER PROCEDURE, que aparece a continuación.

```
ALTER PROCEDURE first_quarter_revenue(bigint, numeric) RENAME TO quarterly_revenue;
```

En el siguiente ejemplo, se modifica el propietario de un procedimiento a `etl_user`.

```
ALTER PROCEDURE quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

En el ejemplo siguiente se actualiza un rol `sample_role1` con un nuevo ID externo asociado a un proveedor de identidades.

```
ALTER ROLE sample_role1 EXTERNALID TO "XYZ456";
```

# ALTER PROCEDURE
<a name="r_ALTER_PROCEDURE"></a>

Cambia el nombre de un procedimiento o cambia el propietario. Se necesitan ambos, el nombre del procedimiento y los tipos de datos, o la firma. Solo el propietario o un superusuario pueden cambiar el nombre de un procedimiento. Solo un superusuario puede cambiar el propietario de un procedimiento. 

## Sintaxis
<a name="r_ALTER_PROCEDURE-synopsis"></a>

```
ALTER PROCEDURE sp_name [ ( [ [ argname ] [ argmode ] argtype [, ...] ] ) ]
    RENAME TO new_name
```

```
ALTER PROCEDURE sp_name [ ( [ [ argname ] [ argmode ] argtype [, ...] ] ) ]
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
```

## Parameters
<a name="r_ALTER_PROCEDURE-parameters"></a>

 *sp\$1name*   
El nombre del procedimiento que debe modificarse. Especifique solo el nombre del procedimiento en la ruta de búsqueda actual o utilice el formato `schema_name.sp_procedure_name` para usar un esquema específico.

*[argname] [argmode] argtype*   
Una lista de nombres de argumento, modos de argumento y tipos de datos. Solo se requieren los tipos de datos de entrada, que se utilizan para identificar el procedimiento almacenado. Además, puede proporcionar la firma completa utilizada para crear el procedimiento incluidos los parámetros de entrada y salida con sus modos.

 *new\$1name*   
Un nombre nuevo para el procedimiento almacenado. 

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
Un usuario nuevo para el procedimiento almacenado. 

## Ejemplos
<a name="r_ALTER_PROCEDURE-examples"></a>

En el siguiente ejemplo, se cambia el nombre de un procedimiento de `first_quarter_revenue` a `quarterly_revenue`.

```
ALTER PROCEDURE first_quarter_revenue(volume INOUT bigint, at_price IN numeric,
 result OUT int) RENAME TO quarterly_revenue;
```

Este ejemplo equivale a lo siguiente.

```
ALTER PROCEDURE first_quarter_revenue(bigint, numeric) RENAME TO quarterly_revenue;
```

En el siguiente ejemplo, se modifica el propietario de un procedimiento a `etl_user`.

```
ALTER PROCEDURE quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

# ALTER SCHEMA
<a name="r_ALTER_SCHEMA"></a>

Cambia la definición de un esquema existente. Utilice este comando para cambiar el nombre de un esquema o el propietario de un esquema. Por ejemplo, cambie el nombre de un esquema existente para conservar una copia de seguridad de ese esquema cuando planifique crear una nueva versión de ese esquema. Para obtener más información acerca de los esquemas, consulte [CREATE SCHEMA](r_CREATE_SCHEMA.md).

Para ver las cuotas del esquema configuradas, consulte [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md).

Para ver los registros en los que se superaron las cuotas del esquema, consulte [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md).

## Privilegios necesarios
<a name="r_ALTER_SCHEMA-privileges"></a>

Los siguientes privilegios son necesarios para ALTER SCHEMA:
+ Superusuario
+ Usuarios con el privilegio ALTER SCHEMA
+ Propietario del esquema

Al cambiar el nombre de un esquema, tenga en cuenta que los objetos que utilizan el nombre anterior, como los procedimientos almacenados o las vistas materializadas, deben actualizarse para utilizar el nuevo nombre.

## Sintaxis
<a name="r_ALTER_SCHEMA-synopsis"></a>

```
ALTER SCHEMA schema_name
{
RENAME TO new_name |
OWNER TO new_owner |
QUOTA { quota [MB | GB | TB] | UNLIMITED }
}
```

## Parameters
<a name="r_ALTER_SCHEMA-parameters"></a>

 *schema\$1name*   
El nombre del esquema de la base de datos que se modificará. 

RENAME TO   
Una cláusula que cambia el nombre del esquema. 

 *new\$1name*   
El nuevo nombre del esquema. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md). 

OWNER TO   
Una cláusula que cambia el propietario del esquema. 

 *new\$1owner*   
El nuevo propietario del esquema. 

QUOTA   
La cantidad máxima de espacio en disco que puede utilizar el esquema especificado. Este espacio es el tamaño colectivo de todas las tablas en el esquema especificado. Amazon Redshift convierte el valor seleccionado en megabytes. Gigabytes es la unidad de medida predeterminada cuando no se especifica un valor.   
Para obtener más información acerca de la configuración de las cuotas del esquema, consulte [CREATE SCHEMA](r_CREATE_SCHEMA.md).

## Ejemplos
<a name="r_ALTER_SCHEMA-examples"></a>

En el siguiente ejemplo, se cambia el nombre del esquema SALES a US\$1SALES.

```
alter schema sales
rename to us_sales;
```

En el siguiente ejemplo, se otorga la propiedad del esquema US\$1SALES al usuario DWUSER.

```
alter schema us_sales
owner to dwuser;
```

En el siguiente ejemplo, se cambia la cuota a 300 MB y se quita la cuota.

```
alter schema us_sales QUOTA 300 GB;
alter schema us_sales QUOTA UNLIMITED;
```

# ALTER SYSTEM
<a name="r_ALTER_SYSTEM"></a>

Cambia una opción de configuración en el sistema para el clúster de Amazon Redshift o el grupo de trabajo de Amazon Redshift sin servidor.

## Privilegios necesarios
<a name="r_ALTER_SYSTEM-privileges"></a>

Uno de los siguientes tipos de usuario puede ejecutar el comando ALTER SYSTEM:
+ Superusuario
+ Usuario administrador

## Sintaxis
<a name="r_ALTER_SYSTEM-synopsis"></a>

```
ALTER SYSTEM SET system-level-configuration = {true| t | on | false | f | off}
```

## Parameters
<a name="r_ALTER_SYSTEM-parameters"></a>

 *system-level-configuration*   
Configuración en el nivel del sistema. Valores válidos: `data_catalog_auto_mount` y `metadata_security`.

\$1true\$1 t \$1 on \$1 false \$1 f \$1 off\$1   
Un valor para activar o desactivar la configuración en el nivel de sistema. Un valor `true`, `t` o `on` indica que se active la configuración. Un valor `false`, `f` o `off` indica que se desactive la configuración.

## Notas de uso
<a name="r_ALTER_SYSTEM-usage-notes"></a>

Para un clúster aprovisionado, los cambios en `data_catalog_auto_mount` entran en vigor en el siguiente reinicio del clúster. Para obtener más información, consulte [Reinicio de un clúster](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#reboot-cluster) en la *Guía de administración de Amazon Redshift*.

En el caso de un grupo de trabajo sin servidor, los cambios en `data_catalog_auto_mount` no se aplican de forma inmediata.

## Ejemplos
<a name="r_ALTER_SYSTEM-examples"></a>

En el ejemplo siguiente se activa el montaje automático de AWS Glue Data Catalog.

```
ALTER SYSTEM SET data_catalog_auto_mount = true;
```

En el ejemplo siguiente se activa la seguridad de los metadatos.

```
ALTER SYSTEM SET metadata_security = true;
```

### Establecimiento de un espacio de nombres de identidad predeterminado
<a name="r_ALTER_SYSTEM-identity"></a>

Este ejemplo es específico para trabajar con un proveedor de identidades. Puede integrar Redshift con IAM Identity Center y un proveedor de identidades para centralizar la administración de identidades para Redshift y otros servicios de AWS.

El siguiente ejemplo muestra cómo configurar el espacio de nombres de identidades predeterminado para el sistema. Si lo hace posteriormente, resultará más sencillo ejecutar las instrucciones GRANT y CREATE, ya que no es necesario incluir el espacio de nombres como prefijo para cada identidad.

```
ALTER SYSTEM SET default_identity_namespace = 'MYCO';
```

Tras ejecutar el comando, puede ejecutar instrucciones como las siguientes:

```
GRANT SELECT ON TABLE mytable TO alice;

GRANT UPDATE ON TABLE mytable TO salesrole;
               
CREATE USER bob password 'md50c983d1a624280812631c5389e60d48c';
```

El efecto de establecer el espacio de nombres de identidades predeterminado es que cada identidad no lo requiere como prefijo. En este ejemplo, `alice` se sustituye por `MYCO:alice`. Esto ocurre con cualquier identidad incluida. Para obtener más información sobre cómo usar un proveedor de identidades con Redshift, consulte [Conectar Redshift con IAM Identity Center para ofrecer a los usuarios una experiencia de inicio de sesión único](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

Para obtener más información acerca de los ajustes relacionados con la configuración de Redshift con IAM Identity Center, consulte [SET](r_SET.md) y [MODIFICAR PROVEEDOR DE IDENTIDADES](r_ALTER_IDENTITY_PROVIDER.md).

# ALTER TABLE
<a name="r_ALTER_TABLE"></a>

Este comando cambia la definición de una tabla de Amazon Redshift o de una tabla externa de Amazon Redshift Spectrum. Este comando actualiza los valores y las propiedades establecidos por [CREATE TABLE](r_CREATE_TABLE_NEW.md) o [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). Puede utilizar ALTER TABLE en una vista para la seguridad a nivel de fila (RLS).

No puede ejecutar ALTER TABLE en una tabla externa dentro de un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

ALTER TABLE bloquea la tabla para operaciones de lectura y escritura hasta que se complete la transacción que incluye la operación ALTER TABLE, a menos que en la documentación se indique específicamente que se pueden realizar consultas de datos u otras operaciones en la tabla mientras se la modifica.

## Privilegios necesarios
<a name="r_ALTER_TABLE-privileges"></a>

El usuario que modifica una tabla necesita el privilegio adecuado para que el comando se ejecute correctamente. Según el comando ALTER TABLE, se requiere uno de los siguientes privilegios.
+ Superusuario
+ Usuarios con el privilegio ALTER TABLE
+ Propietario de la tabla con el privilegio USAGE en el esquema

## Sintaxis
<a name="r_ALTER_TABLE-synopsis"></a>

```
ALTER TABLE table_name
{
ADD table_constraint
| DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
| OWNER TO new_owner
| RENAME TO new_name
| RENAME COLUMN column_name TO new_name
| ALTER COLUMN column_name TYPE updated_varchar_data_type_size
| ALTER COLUMN column_name ENCODE new_encode_type
| ALTER COLUMN column_name ENCODE encode_type,
| ALTER COLUMN column_name ENCODE encode_type, .....;
| ALTER DISTKEY column_name
| ALTER DISTSTYLE ALL
| ALTER DISTSTYLE EVEN
| ALTER DISTSTYLE KEY DISTKEY column_name
| ALTER DISTSTYLE AUTO
| ALTER [COMPOUND] SORTKEY ( column_name [,...] )
| ALTER SORTKEY AUTO
| ALTER SORTKEY NONE
| ALTER ENCODE AUTO
| ADD [ COLUMN ] column_name column_type
  [ DEFAULT default_expr ]
  [ ENCODE encoding ]
  [ NOT NULL | NULL ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ] |
| DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ] 
| ROW LEVEL SECURITY { ON | OFF } [ CONJUNCTION TYPE { AND | OR } ] [ FOR DATASHARES ]
| MASKING { ON | OFF } FOR DATASHARES }

where table_constraint is:

[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] )
| PRIMARY KEY ( column_name [, ... ] )
| FOREIGN KEY (column_name [, ... ] )
   REFERENCES  reftable [ ( refcolumn ) ]}

The following options apply only to external tables:

SET LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }
| SET FILE FORMAT format |
| SET TABLE PROPERTIES ('property_name'='property_value')
| PARTITION ( partition_column=partition_value [, ...] )
  SET LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' }
| ADD [IF NOT EXISTS]
    PARTITION ( partition_column=partition_value [, ...] ) LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' }
    [, ... ]
| DROP PARTITION ( partition_column=partition_value [, ...] )
```

Para reducir el tiempo de ejecución del comando ALTER TABLE, puede combinar algunas cláusulas del comando ALTER TABLE.

Amazon Redshift admite las siguientes combinaciones de las cláusulas ALTER TABLE:

```
ALTER TABLE tablename ALTER SORTKEY (column_list), ALTER DISTKEY column_Id;
ALTER TABLE tablename ALTER DISTKEY column_Id, ALTER SORTKEY (column_list);
ALTER TABLE tablename ALTER SORTKEY (column_list), ALTER DISTSTYLE ALL;
ALTER TABLE tablename ALTER DISTSTYLE ALL, ALTER SORTKEY (column_list);
```

## Parameters
<a name="r_ALTER_TABLE-parameters"></a>

 *table\$1name*   
El nombre de la tabla que se modificará. Especifique solo el nombre de la tabla o use el formato *nombre\$1de\$1esquema.nombre\$1de\$1tabla* para usar un esquema específico. Las tablas externas deben estar clasificadas por el nombre de un esquema externo. También puede especificar un nombre de vista si está utilizando la instrucción ALTER TABLE para cambiar el nombre de una vista o cambiar su propietario. La longitud máxima del nombre de la tabla es de 127 bytes; los nombres más largos se truncan en 127 bytes. Puede usar caracteres multibyte UTF-8 de hasta un máximo de cuatro bytes. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

ADD *table\$1constraint*   
Una cláusula que agrega la restricción especificada a la tabla. Para obtener descripciones de los valores *table\$1constraint* válidos, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md).  
No se puede agregar una restricción de clave principal a una columna que se puede anular. Si la columna se creó originalmente con la restricción NOT NULL, puede agregar la restricción de clave principal.

DROP CONSTRAINT *constraint\$1name*   
Una cláusula que elimina la restricción mencionada de la tabla. Para eliminar una restricción, especifique el nombre de la restricción, no el tipo de restricción. Para ver los nombres de restricciones de la tabla, ejecute la siguiente consulta.  

```
select constraint_name, constraint_type
from information_schema.table_constraints;
```

RESTRICT   
Una cláusula que elimina solo la restricción especificada. RESTRICT es una opción para DROP CONSTRAINT. RESTRICT no puede utilizarse con CASCADE. 

CASCADE   
Una cláusula que elimina la restricción especificada y todos los elementos que dependen de esa restricción. CASCADE es una opción para DROP CONSTRAINT. CASCADE no puede utilizarse con RESTRICT.

OWNER TO *new\$1owner*   
Cláusula que cambia el propietario de la tabla (o la vista) al valor *new\$1owner*.

RENAME TO *new\$1name*   
Cláusula que cambia el nombre de una tabla (o una vista) al valor especificado en *new\$1name*. La longitud máxima del nombre de la tabla es de 127 bytes; los nombres más largos se truncan en 127 bytes.  
No se puede cambiar el nombre de una tabla permanente a un nombre que comienza por "\$1". El nombre de una tabla que comienza con "\$1" indica una tabla temporal.  
No se puede cambiar el nombre de una tabla externa.

ALTER COLUMN *nombre\$1de\$1columna* TYPE *tamaño\$1de\$1tipo\$1de\$1datos\$1varchar\$1actualizado*   
Una cláusula que cambia el tamaño de una columna definida como un tipo de datos VARCHAR. Esta cláusula solo admite la modificación del tamaño de un tipo de datos VARCHAR. Tenga en cuenta las siguientes restricciones:  
+ No puede modificar una columna con codificaciones de compresión BYTEDICT, RUNLENGTH, TEXT255 o TEXT32K. 
+ No puede disminuir el tamaño por debajo del tamaño máximo de los datos existentes. 
+ No puede modificar columnas con valores predeterminados. 
+ No puede modificar columnas con UNIQUE, PRIMARY KEY o FOREIGN KEY. 
+ No puede modificar las columnas dentro de un bloque de transacción (BEGIN … END) Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

ALTER COLUMN *column\$1name* ENCODE *new\$1encode\$1type*   
Se trata de una cláusula que cambia la codificación de compresión de una columna. Si especifica la codificación de compresión para una columna, la tabla ya no se establece en ENCODE AUTO. Para obtener información acerca de la codificación de compresión, consulte [Compresión de columnas para reducir el tamaño de los datos almacenados](t_Compressing_data_on_disk.md).   
Cuando se cambia la codificación de compresión de una columna, la tabla sigue disponible para realizar consultas.  
Tenga en cuenta las siguientes restricciones:  
+ No puede modificar una columna para que tenga la misma codificación que la definida actualmente. 
+ No puede modificar la codificación de una columna en una tabla con una clave de ordenación intercalada. 

ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, .....;   
Se trata de una cláusula que modifica la codificación de compresión de varias columnas en un solo comando. Para obtener información acerca de la codificación de compresión, consulte [Compresión de columnas para reducir el tamaño de los datos almacenados](t_Compressing_data_on_disk.md).  
Cuando se cambia la codificación de compresión de una columna, la tabla sigue disponible para realizar consultas.  
 Tenga en cuenta las siguientes restricciones:  
+ No puede modificar una columna con el mismo tipo de codificación o uno diferente varias veces con un solo comando.
+ No puede modificar una columna para que tenga la misma codificación que la definida actualmente. 
+ No puede modificar la codificación de una columna en una tabla con una clave de ordenación intercalada. 

ALTER DISTSTYLE ALL  
Cláusula que cambia el estilo de distribución existente de una tabla a `ALL`. Considere lo siguiente:  
+ Las operaciones ALTER DISTSTYTLE, ALTER SORTKEY y VACUUM no pueden ejecutarse simultáneamente en la misma tabla. 
  + Si se está ejecutando la operación VACUUM actualmente, la ejecución de ALTER DISTSTYLE ALL devuelve un error. 
  + Si se está ejecutando ALTER DISTSTYLE ALL, una limpieza en segundo plano no se iniciará en las tablas. 
+ El comando ALTER DISTSTYLE ALL no está admitido en tablas con claves de ordenación intercaladas y tablas temporales.
+ Si el estilo de distribución se definió previamente como AUTO, la tabla ya no será candidata para la optimización automática de tablas. 
Para obtener más información acerca de DISTSTYLE ALL, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md).

ALTER DISTSTYLE EVEN  
Cláusula que cambia el estilo de distribución existente de una tabla a `EVEN`. Considere lo siguiente:  
+ Las operaciones ALTER DISTSYTLE, ALTER SORTKEY y VACUUM no pueden ejecutarse simultáneamente en la misma tabla. 
  + Si se está ejecutando VACUUM actualmente, la ejecución de ALTER DISTSTYLE EVEN devuelve un error. 
  + Si se está ejecutando ALTER DISTSTYLE EVEN, una limpieza en segundo plano no se inicia en una tabla. 
+ El comando ALTER DISTSTYLE EVEN no se admite en tablas con claves de ordenación intercaladas y tablas temporales.
+ Si el estilo de distribución se definió previamente como AUTO, la tabla ya no será candidata para la optimización automática de tablas. 
Para obtener más información acerca de DISTSTYLE EVEN, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md).

ALTER DISTKEY *column\$1name* o ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
Una cláusula que cambia la columna usada como la clave de distribución de una tabla. Considere lo siguiente:  
+ Las operaciones VACUUM y ALTER DISTKEY no se pueden ejecutar simultáneamente en la misma tabla. 
  + Si ya se está ejecutando VACUUM, ALTER DISTKEY devolverá un error.
  + Si se está ejecutando ALTER DISTKEY, la limpieza en segundo plano no se iniciará en las tablas.
  + Si se está ejecutando ALTER DISTKEY, la limpieza en primer plano devolverá un error.
+ Solo puede ejecutar un comando ALTER DISTKEY en una tabla cada vez. 
+ El comando ALTER DISTKEY no es compatible en tablas con claves de ordenación intercalada. 
+ Si el estilo de distribución se definió previamente como AUTO, la tabla ya no será candidata para la optimización automática de tablas. 
Al especificar DISTSTYLE KEY, los datos se distribuyen por los valores en la columna DISTKEY. Para obtener más información acerca de DISTSTYLE, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md).

ALTER DISTSTYLE AUTO  
Se trata de una cláusula que cambia el estilo de distribución existente de una tabla a AUTO.   
Si modifica un estilo de distribución a AUTO, el estilo de distribución de la tabla se establece en las siguientes opciones:   
+ Una tabla pequeña con DISTSTYLE ALL se convierte a AUTO(ALL). 
+ Una tabla pequeña con DISTSTYLE EVEN se convierte a AUTO(ALL). 
+ Una tabla pequeña con DISTSTYLE KEY se convierte a AUTO(ALL). 
+ Una tabla grande con DISTSTYLE ALL se convierte a AUTO(EVEN). 
+ Una tabla grande con DISTSTYLE EVEN se convierte a AUTO(EVEN). 
+ Una tabla grande con DISTSTYLE KEY se convierte a AUTO(KEY) y se conserva DISTKEY. En este caso, Amazon Redshift no cambia la tabla.
Si Amazon Redshift determina que un estilo de distribución nuevo o una clave nueva mejorarán el rendimiento de las consultas, Amazon Redshift podría cambiar el estilo de distribución o la clave de la tabla en el futuro. Por ejemplo, Amazon Redshift podría convertir una tabla con un valor de DISTSTYLE de AUTO(KEY) en AUTO(EVEN) o viceversa. Para obtener más información sobre el comportamiento cuando se modifican las claves de distribución, incluida la redistribución de datos y los bloqueos, consulte las [Recomendaciones de Amazon Redshift Advisor](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation).  
Para obtener más información acerca de DISTSTYLE AUTO, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md).   
Para ver el estilo de distribución de una tabla, consulte la vista de catálogo del sistema SVV\$1TABLE\$1INFO. Para obtener más información, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Si desea ver las recomendaciones para tablas de Advisor de Amazon Redshift, consulte la vista de catálogo del sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Para obtener más información, consulte [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para ver las acciones llevadas a cabo por Amazon Redshift, consulte la vista de catálogo del sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obtener más información, consulte [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
Una cláusula que cambia o agrega la clave de ordenación utilizada para una tabla. ALTER SORTKEY no se admite en tablas temporales.  
Cuando se modifica una clave de ordenación, la codificación de compresión de las columnas de la clave de ordenación nueva u original puede cambiar. Si no se define de forma explícita ninguna codificación para la tabla, entonces Amazon Redshift asigna automáticamente las codificaciones de compresión de la siguiente manera:  
+ A las columnas que están definidas como claves de ordenación se les asigna una compresión RAW.
+ A las columnas que están definidas como tipos de datos BOOLEAN, REAL o DOUBLE PRECISION se les asigna una compresión RAW.
+ A las columnas que se definen como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ se les asigna la compresión AZ64.
+ Las columnas que se definen como CHAR o VARCHAR tienen asignada la compresión LZO.
Considere lo siguiente:  
+ Puede definir un máximo de 400 columnas para una clave de ordenación para cada tabla. 
+ Puede alterar una clave de ordenación intercalada por una clave de ordenación compuesta o por ninguna clave de ordenación. No obstante, no puede alterar una clave de ordenación compuesta por una clave de ordenación intercalada. 
+ Si la clave de ordenación se definió previamente como AUTO, la tabla ya no será candidata para la optimización automática de tablas. 
+ Amazon Redshift recomienda utilizar la codificación RAW (sin compresión) para columnas definidas como claves de ordenación. Cuando se modifica una columna para elegirla como clave de ordenación, la compresión de la columna se cambia a la compresión RAW (sin compresión). Esto puede aumentar la cantidad de almacenamiento que requiere la tabla. El aumento del tamaño de la tabla depende de la definición y el contenido específicos de la tabla. Para obtener más información acerca de la compresión, consulte . [Codificaciones de compresión](c_Compression_encodings.md) 
Cuando se cargan datos en un tabla, se cargan en el orden definido por la clave de ordenación. Cuando se modifica la clave de ordenación, Amazon Redshift reordena los datos. Para obtener más información acerca de SORTKEY, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md).

ALTER SORTKEY AUTO  
Se trata de una cláusula que modifica la clave de ordenación de la tabla de destino a AUTO o la agrega. ALTER SORTKEY AUTO no se admite en tablas temporales.   
Cuando se modifica una clave de ordenación a AUTO, Amazon Redshift conserva la clave de ordenación existente de la tabla.   
Si Amazon Redshift determina que una clave de ordenación nueva mejorará el rendimiento de las consultas, Amazon Redshift podría cambiar la clave de ordenación de la tabla en el futuro.   
Para obtener más información acerca de SORTKEY AUTO, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md).   
Para ver la clave de ordenación de una tabla, consulte la vista de catálogo del sistema SVV\$1TABLE\$1INFO. Para obtener más información, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Si desea ver las recomendaciones para tablas de Advisor de Amazon Redshift, consulte la vista de catálogo del sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Para obtener más información, consulte [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para ver las acciones llevadas a cabo por Amazon Redshift, consulte la vista de catálogo del sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obtener más información, consulte [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER SORTKEY NONE  
Se trata de una cláusula que quita la clave de ordenación de la tabla de destino.   
Si la clave de ordenación se definió previamente como AUTO, la tabla ya no será candidata para la optimización automática de tablas. 

ALTER ENCODE AUTO  
Se trata de una cláusula que cambia el tipo de codificación de las columnas de la tabla de destino a AUTO. Cuando se cambia la codificación a AUTO, Amazon Redshift conserva el tipo de codificación existente de las columnas de la tabla. Luego, si Amazon Redshift determina que un nuevo tipo de codificación puede mejorar el rendimiento de la consulta, Amazon Redshift puede cambiar el tipo de codificación de las columnas de la tabla.   
Si modifica una o más columnas para especificar una codificación, Amazon Redshift ya no ajustará de forma automática la codificación para todas las columnas de la tabla. Las columnas retienen la configuración de la codificación actual.  
Las siguientes acciones no afectan al ajuste ENCODE AUTO de la tabla:   
+ cambiar el nombre de la tabla
+ modificar el ajuste DISTSTYLE o SORTKEY de la tabla
+ agregar o soltar una columna con un ajuste ENCODE
+ utilizar la opción COMPUPDATE del comando COPY Para obtener más información, consulte [Operaciones de carga de datos](copy-parameters-data-load.md).
Para ver la codificación de una tabla, consulte la vista de catálogo del sistema SVV\$1TABLE\$1INFO. Para obtener más información, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md).

RENAME COLUMN *column\$1name* TO *new\$1name*   
Cláusula que cambia el nombre de una columna al valor especificado en *new\$1name*. La longitud máxima del nombre de la columna es de 127 bytes; los nombres más largos se truncan en 127 bytes. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

ADD [ COLUMN ] *column\$1name*   
Una cláusula que agrega una columna con el nombre especificado a la tabla. Solo se puede agregar una columna en cada instrucción ALTER TABLE.  
No se puede agregar una columna que sea la clave de distribución (DISTKEY) o la clave de ordenación (SORTKEY) de la tabla.  
 No se puede usar un comando ALTER TABLE ADD COLUMN para modificar los siguientes atributos de tabla y de columna:   
+ UNIQUE
+ PRIMARY KEY
+ REFERENCES (clave externa)
+ IDENTITY o GENERATED BY DEFAULT AS IDENTITY
La longitud máxima del nombre de la columna es de 127 bytes; los nombres más largos se truncan en 127 bytes. La cantidad máxima de columnas que se pueden definir en una única tabla es 1 600.  
Las restricciones siguientes se aplican al agregar una columna a una tabla externa:  
+ No se puede agregar una columna a una tabla externa con las restricciones de columna DEFAULT, ENCODE, NOT NULL o NULL. 
+ No se pueden agregar columnas a una tabla externa definida con el formato de archivo AVRO. 
+ Si están habilitadas las pseudocolumnas, el número máximo de columnas que se pueden definir en una única tabla externa es de 1 598. Si las pseudocolumnas no están habilitadas, el número máximo de columnas que se pueden definir en una única tabla es de 1 600. 
Para obtener más información, consulte [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md).

 *column\$1type*   
El tipo de datos de la columna que se agrega. Para las columnas CHAR y VARCHAR, puede usar la palabra clave MAX en lugar de declarar una longitud máxima. MAX establece la longitud máxima en 4 096 bytes para CHAR o 65 535 bytes para VARCHAR. El tamaño máximo del objeto GEOMETRY es 1 048 447 bytes.   
Para obtener información acerca de los tipos de datos compatibles con Amazon Redshift, consulte [Tipos de datos](c_Supported_data_types.md).

DEFAULT *default\$1expr*   <a name="alter-table-default"></a>
Una cláusula que asigna un valor de datos predeterminado para la columna. El tipo de datos de *default\$1expr* debe coincidir con el tipo de datos de la columna. El valor DEFAULT debe ser una expresión sin variables. No se permiten subconsultas, referencias cruzadas a otras columnas de la tabla actual ni funciones definidas por el usuario.  
El valor *default\$1expr* se utiliza en cualquier operación INSERT en la que no se especifica un valor para la columna. Si no se especifica un valor predeterminado, el valor predeterminado para la columna es nulo.  
Si una operación COPY se encuentra con un campo nulo en una columna que tiene un valor DEFAULT y una restricción NOT NULL, el comando COPY inserta el valor de *default\$1expr*.   
DEFAULT no se admite para las tablas externas.

ENCODE *encoding*   
La codificación de compresión de una columna. Si no se especifica la codificación de compresión para ninguna columna de una tabla o si se especifica la opción ENCODE AUTO para la tabla, Amazon Redshift administra automáticamente la codificación de compresión de todas las columnas de la tabla de manera predeterminada.  
Si se especifica la codificación de compresión para cualquier columna de la tabla o si no se especifica la opción ENCODE AUTO para esta, Amazon Redshift asigna automáticamente la codificación de compresión a las columnas para las cuales no se especifica dicha codificación, como se indica a continuación:  
+ Por defecto, se asigna una compresión RAW a todas las columnas de tablas temporales.
+ A las columnas que están definidas como claves de ordenación se les asigna una compresión RAW.
+ A las columnas que están definidas como tipos de datos BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY o GEOGRAPHY se les asigna una compresión RAW.
+ A las columnas que se definen como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ se les asigna la compresión AZ64.
+ A las columnas que se definen como CHAR, VARCHAR o VARBYTE se les asigna la compresión LZO.
Si no desea que una columna se comprima, especifique explícitamente la codificación RAW.
Se admiten los siguientes [compression encodings](c_Compression_encodings.md#compression-encoding-list):  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (sin comprimir)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD
ENCODE no se admite para las tablas externas.

NOT NULL \$1 NULL   
NOT NULL indica que la columna no puede contener valores nulos. NULL, el valor predeterminado, especifica que la columna acepta valores nulos.  
NOT NULL y NULL no se admiten para las tablas externas.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Una cláusula que especifica si la búsqueda o comparación de cadenas en la columna distingue entre mayúsculas y minúsculas o no. El valor predeterminado es el mismo que la configuración actual de distinción entre mayúsculas y minúsculas de la base de datos.  
Para encontrar información de la intercalación de bases de datos, utilice el siguiente comando:  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE y CS son intercambiables y producen los mismos resultados. Del mismo modo, CASE\$1INSENSITIVE y CI son intercambiables y producen los mismos resultados.

DROP [ COLUMN ] *column\$1name*   
El nombre de la columna que se debe eliminar de la tabla.  
No se puede eliminar la última columna de una tabla. Una tabla debe tener como mínimo una columna.  
No se puede eliminar una columna que sea la clave de distribución (DISTKEY) o la clave de ordenación (SORTKEY) de la tabla. El comportamiento predeterminado de DROP COLUMN es RESTRICT si la columna tiene objetos dependientes, como vista, clave principal, clave externa o restricción UNIQUE.  
Las restricciones siguientes se aplican al quitar una columna de una tabla externa:  
+ No se puede eliminar una columna de una tabla externa si la columna se utiliza como partición.
+ No se puede eliminar una columna de una tabla externa definida con el formato de archivo AVRO. 
+ RESTRICT y CASCADE no se tienen en cuenta para las tablas externas.
+ No puede eliminar las columnas de la tabla de políticas a la que se hace referencia dentro de la definición de política a menos que elimine o desactive la política. Esto también se aplica cuando se especifica la opción CASCADE. Puede eliminar otras columnas de la tabla de políticas.
Para obtener más información, consulte [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md).

RESTRICT   
Cuando se usa con DROP COLUMN, RESTRICT significa que la columna que se va a eliminar no se eliminará, en los siguientes casos:  
+ Si una vista definida hace referencia a la columna que desea eliminar
+ Si una clave externa hace referencia a la columna
+ Si la columna forma parte de una clave multiparte
RESTRICT no puede utilizarse con CASCADE.  
RESTRICT y CASCADE no se tienen en cuenta para las tablas externas.

CASCADE   
Cuando se usa con DROP COLUMN, elimina la columna especificada y todos los elementos que dependen de esa columna. CASCADE no puede utilizarse con RESTRICT.  
RESTRICT y CASCADE no se tienen en cuenta para las tablas externas.

Las siguientes opciones se aplican solo a tablas externas.

SET LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*' \$1  
Se trata de la ruta a la carpeta de Amazon S3 que contiene los archivos de datos o un archivo de manifiesto que incluye una lista de rutas de objetos de Amazon S3. Los buckets deben estar en la misma región de AWS que el clúster de Amazon Redshift. Para obtener una lista de las regiones de AWS admitidas, consulte [Limitaciones de Amazon Redshift Spectrum](c-spectrum-considerations.md). Para obtener más información acerca del uso de un archivo de manifiesto, consulte LOCATION en la sección [Parameters](r_CREATE_EXTERNAL_TABLE.md#r_CREATE_EXTERNAL_TABLE-parameters) de la documentación sobre el comando CREATE EXTERNAL TABLE.

SET FILE FORMAT *format*  
El formato de archivo para los archivos de datos externos.  
Los formatos válidos son los siguientes:  
+ AVRO 
+ PARQUET
+ RCFILE
+ SEQUENCEFILE
+ TEXTFILE 

SET TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*')   
Cláusula que establece la definición de las propiedades de una tabla externa.   
Las propiedades de tabla distinguen entre mayúsculas y minúsculas.  
'numRows'='*row\$1count*'   
Una propiedad que establece el valor de numRows para la definición de la tabla. Para actualizar de forma explícita las estadísticas de una tabla externa, establezca la propiedad numRows de manera que indique el tamaño de la tabla. Amazon Redshift no analiza las tablas externas para generar las estadísticas de las tablas que el optimizador de consultas emplea a la hora de crear un plan de consulta. Si no se establecen las estadísticas de la tabla que corresponden a una tabla externa, Amazon Redshift crea un plan de ejecución de consultas. El plan se basa en la suposición de que las tablas externas son las tablas más grandes y las tablas locales son las tablas más pequeñas  
'skip.header.line.count'='*line\$1count*'  
Una propiedad que establece el número de filas que se omiten al principio de cada archivo de código fuente.

PARTITION ( *partition\$1column*=*partition\$1value* [, ...] SET LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1  
Una cláusula que configura una nueva ubicación para una o más columnas de partición. 

ADD [ IF NOT EXISTS ] PARTITION ( *partition\$1column*=*partition\$1value* [, ...] ) LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1 [, ... ]  
Una cláusula que agrega una o más particiones. Puede especificar múltiples cláusulas PARTITION mediante una única instrucción ALTER TABLE … ADD.  
Si usa el catálogo de AWS Glue, puede agregar hasta 100 particiones mediante una única instrucción ALTER TABLE.
La cláusula IF NOT EXISTS indica que si la partición especificada ya existe, el comando no debería realizar ningún cambio. También indica que el comando debe devolver un mensaje en el que se indique que la tabla existe, en lugar de terminar con un error. Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si ALTER TABLE intenta agregar una partición que ya existe. 

DROP PARTITION (*partition\$1column*=*partition\$1value* [, ...] )   
Una cláusula que elimina la partición especificada. Eliminar una partición modifica solo los metadatos de la tabla externa. Los datos de Amazon S3 no se ven afectados.

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
Es una cláusula que activa o desactiva la seguridad de nivel de fila para una relación.  
Cuando la seguridad de nivel de fila está activada para una relación, solo puede leer las filas a las que la política de seguridad de nivel de fila le permite acceder. Si no hay ninguna política que le conceda acceso a la relación, no podrá ver ninguna fila de la relación. Solo los superusuarios y los usuarios o roles que tienen el rol `sys:secadmin` pueden establecer la cláusula ROW LEVEL SECURITY. Para obtener más información, consulte [Seguridad de nivel básico](t_rls.md). Esta instrucción se admite en la base de datos conectada o en una base de datos con permisos federados de Amazon Redshift. La cláusula FOR DATASHARES no se admite en bases de datos con permisos federados de Amazon Redshift.  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  Es una cláusula que le permite elegir el tipo de conjunción de la política de seguridad a nivel de fila para una relación. Si se asocian varias políticas de seguridad en el nivel de fila a una relación, puede combinarlas con la cláusula AND u OR. De forma predeterminada, Amazon Redshift combina las políticas de RLS con la cláusula AND. Los superusuarios, usuarios o roles que tienen el rol `sys:secadmin` pueden usar esta cláusula para definir el tipo de conjunción de la política de seguridad de nivel de fila para una relación. Para obtener más información, consulte [Combinación de varias políticas por usuario](t_rls_combine_policies.md). 
+ PARA RECURSOS COMPARTIDOS DE DATOS

  Es una cláusula que determina si se puede acceder a una relación protegida por RLS a través de recursos compartidos de datos. De forma predeterminada, no se puede acceder a una relación protegida por RLS a través de un recurso compartido de datos. Un comando ALTER TABLE ROW LEVEL SECURITY ejecutado con esta cláusula solo afecta a la propiedad de accesibilidad de recurso compartido de datos de la relación. La propiedad ROW LEVEL SECURITY no ha cambiado. 

   Si hace que una relación protegida por RLS sea accesible a través de recursos compartidos de datos, la relación no tendrá seguridad de nivel de fila en la base de datos de recurso compartido de datos del lado del consumidor. La relación conserva su propiedad RLS del lado del productor. 

MASKING \$1 ON \$1 OFF \$1 FOR DATASHARES  
Es una cláusula que determina si se puede acceder a una relación protegida por DDM a través de recursos compartidos de datos. De forma predeterminada, no se puede acceder a una relación protegida por DDM a través de un recurso compartido de datos. Si hace que una relación protegida por DDM sea accesible a través de recursos compartidos de datos, la relación no tendrá protección con enmascaramiento en la base de datos de recurso compartido de datos del lado del consumidor. La relación conserva su propiedad de enmascaramiento del lado del productor. Solo los superusuarios y los usuarios o roles que tengan el rol `sys:secadmin` pueden establecer la cláusula MASKING FOR DATASHARES. Para obtener más información, consulte [Enmascaramiento de datos dinámico](t_ddm.md). 

## Ejemplos
<a name="r_ALTER_TABLE-examples"></a>

Para ver ejemplos que muestran cómo utilizar el comando ALTER TABLE, consulte lo siguiente.
+ [Ejemplos de ALTER TABLE](r_ALTER_TABLE_examples_basic.md)
+ [Ejemplos de ALTER EXTERNAL TABLE](r_ALTER_TABLE_external-table.md)
+ [Ejemplos de ALTER TABLE ADD y DROP COLUMN](r_ALTER_TABLE_COL_ex-add-drop.md)

# Ejemplos de ALTER TABLE
<a name="r_ALTER_TABLE_examples_basic"></a>

En los siguientes ejemplos se muestra el uso básico del comando ALTER TABLE. 

## Cambiar el nombre de una tabla o una vista
<a name="r_ALTER_TABLE_examples_basic-rename-a-table"></a>

El siguiente comando cambia el nombre de la tabla USERS a USERS\$1BKUP: 

```
alter table users
rename to users_bkup;
```

 También puede utilizar este tipo de comando para cambiar el nombre de una vista. 

## Cambiar el propietario de una tabla o vista
<a name="r_ALTER_TABLE_examples_basic-change-the-owner-of-a-table-or-view"></a>

El siguiente comando cambia el propietario de la tabla VENUE al usuario DWUSER: 

```
alter table venue
owner to dwuser;
```

Los siguientes comandos crean una vista y, luego, cambian su propietario: 

```
create view vdate as select * from date;
alter table vdate owner to vuser;
```

## Cambiar el nombre de una columna
<a name="r_ALTER_TABLE_examples_basic-rename-a-column"></a>

El siguiente comando cambia el nombre de la columna VENUESEATS de la tabla VENUE a VENUESIZE: 

```
alter table venue
rename column venueseats to venuesize;
```

## Eliminar la restricción de una tabla
<a name="r_ALTER_TABLE_examples_drop-constraint"></a>

Para eliminar la restricción de una tabla, como clave principal, clave externa o restricción única, primero debe buscar el nombre interno de la restricción. Y, a continuación, especificar el nombre de la restricción en el comando ALTER TABLE. En el siguiente ejemplo, se buscan las restricciones de la tabla CATEGORY y, luego, se elimina la clave principal con el nombre `category_pkey`. 

```
select constraint_name, constraint_type
from information_schema.table_constraints
where constraint_schema ='public'
and table_name = 'category';

constraint_name | constraint_type
----------------+----------------
category_pkey   | PRIMARY KEY

alter table category
drop constraint category_pkey;
```

## Modificar una columna VARCHAR
<a name="r_ALTER_TABLE_examples_alter-column"></a>

Para ahorrar espacio de almacenamiento, puede definir inicialmente una tabla con columnas VARCHAR con el tamaño mínimo necesario para sus requisitos de datos actuales. Si más adelante, para dar cabida a cadenas más largas, puede modificar la tabla para aumentar el tamaño de la columna. 

En el siguiente ejemplo, se cambia el tamaño de la columna EVENTNAME a VARCHAR(300). 

```
alter table event alter column eventname type varchar(300);
```

## Modificar una columna VARBYTE
<a name="r_ALTER_TABLE_examples_alter-varbyte-column"></a>

Para ahorrar espacio de almacenamiento, puede definir inicialmente una tabla con columnas VARBYTE con el tamaño mínimo necesario para sus requisitos de datos actuales. Si más adelante, para dar cabida a cadenas más largas, puede modificar la tabla para aumentar el tamaño de la columna. 

En el siguiente ejemplo, se cambia el tamaño de la columna EVENTNAME a VARBYTE(300). 

```
alter table event alter column eventname type varbyte(300);
```

## Modificar la codificación de compresión de una columna
<a name="r_ALTER_TABLE_examples_alter-column-encoding"></a>

Puede modificar la codificación de compresión de una columna. A continuación, encontrará un conjunto de ejemplos que demuestran este enfoque. La definición de la tabla para estos ejemplos es la siguiente.

```
create table t1(c0 int encode lzo, c1 bigint encode zstd, c2 varchar(16) encode lzo, c3 varchar(32) encode zstd);
```

La siguiente instrucción modifica la codificación de compresión de la columna c0 de codificación LZO a AZ64. 

```
alter table t1 alter column c0 encode az64;
```

La siguiente instrucción modifica la codificación de compresión de la columna c1 de codificación Zstandard a AZ64. 

```
alter table t1 alter column c1 encode az64;
```

La siguiente instrucción modifica la codificación de compresión de la columna c2 de codificación LZO a codificación por diccionario de bytes. 

```
alter table t1 alter column c2 encode bytedict;
```

La siguiente instrucción modifica la codificación de compresión de la columna c3 de codificación Zstandard a Runlength. 

```
alter table t1 alter column c3 encode runlength;
```

## Modificar una columna DISTSTYLE KEY DISTKEY
<a name="r_ALTER_TABLE_examples_alter-distkey"></a>

Los siguientes ejemplos muestran cómo cambiar DISTSTYLE y DISTKEY en una tabla.

Crear una tabla con un estilo de distribución EVEN. LA vista SVV\$1TABLE\$1INFO muestra que DISTSYLE es EVEN. 

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

Altere la tabla DISTKEY a `inv_warehouse_sk`. La vista SVV\$1TABLE\$1INFO muestra la columna `inv_warehouse_sk` como la clave de distribución resultante. 

```
alter table inventory alter diststyle key distkey inv_warehouse_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_warehouse_sk)
```

Altere la tabla DISTKEY a `inv_item_sk`. La vista SVV\$1TABLE\$1INFO muestra la columna `inv_item_sk` como la clave de distribución resultante. 

```
alter table inventory alter distkey inv_item_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_item_sk)
```

## Modificar una tabla a DISTSTYLE ALL
<a name="r_ALTER_TABLE_examples_alter-diststyle-all"></a>

En los ejemplos siguientes se muestra cómo cambiar una tabla a DISTSTYLE ALL.

Crear una tabla con un estilo de distribución EVEN. LA vista SVV\$1TABLE\$1INFO muestra que DISTSYLE es EVEN. 

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

Cambie la tabla DISTSTYLE a ALL. La vista SVV\$1TABLE\$1INFO muestra el DISTSYTLE modificado. 

```
alter table inventory alter diststyle all;

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     ALL
```

## Modificar una tabla SORTKEY
<a name="r_ALTER_TABLE_examples_alter-sortkey"></a>

Puede modificar una tabla para que tenga una clave de ordenación compuesta o ninguna clave de ordenación.

En la siguiente definición de la tabla, la tabla `t1` se define con una sortkey intercalada.

```
create table t1 (c0 int, c1 int) interleaved sortkey(c0, c1);
```

El siguiente comando modifica la tabla de una clave de ordenación intercalada a una clave de ordenación compuesta.

```
alter table t1 alter sortkey(c0, c1);
```

El siguiente comando modifica la tabla para eliminar la clave de ordenación intercalada.

```
alter table t1 alter sortkey none;
```

En la siguiente definición de la tabla, la tabla `t1` se define con una columna `c0` como sortkey.

```
create table t1 (c0 int, c1 int) sortkey(c0);
```

El siguiente comando modifica la tabla `t1` a una clave de ordenación compuesta.

```
alter table t1 alter sortkey(c0, c1);
```

## Modificar una tabla para pasarla a ENCODE AUTO
<a name="r_ALTER_TABLE_examples_alter-encode-auto"></a>

En el siguiente ejemplo, se muestra cómo modificar una tabla para pasarla a ENCODE AUTO. 

A continuación, se muestra la definición de la tabla para este ejemplo. La columna `c0` se define con el tipo de codificación AZ64 y la columna `c1` se define con el tipo de codificación LZO.

```
create table t1(c0 int encode AZ64, c1 varchar encode LZO);
```

Para esta tabla, la siguiente instrucción modifica la codificación a AUTO.

```
alter table t1 alter encode auto;
```

En el siguiente ejemplo, se muestra cómo modificar una tabla para quitar el ajuste ENCODE AUTO. 

A continuación, se muestra la definición de la tabla para este ejemplo. Las columnas de la tabla se definen sin codificación. En este caso, la codificación adopta la opción ENCODE AUTO de manera predeterminada.

```
create table t2(c0 int, c1 varchar);
```

Para esta tabla, la siguiente instrucción modifica la codificación de la columna c0 a LZO. La codificación de la tabla ya no se establece en ENCODE AUTO.

```
alter table t2 alter column c0 encode lzo;;
```

## Modificar el control de seguridad de nivel de fila
<a name="r_ALTER_TABLE_examples_basic-rls"></a>

El siguiente comando desactiva la RLS de la tabla: 

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY OFF;
```

El siguiente comando activa la RLS para la tabla: 

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
```

El siguiente comando activa la RLS para la tabla y la hace accesible a través de recursos compartidos de datos: 

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES OFF;
```

El siguiente comando activa la RLS para la tabla y la hace inaccesible a través de recursos compartidos de datos: 

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES ON;
```

El siguiente comando activa la RLS y establece el tipo de conjunción RLS en OR para la tabla: 

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE OR;
```

El siguiente comando activa la RLS y establece el tipo de conjunción RLS en AND para la tabla: 

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE AND;
```

# Ejemplos de ALTER EXTERNAL TABLE
<a name="r_ALTER_TABLE_external-table"></a>

En los siguientes ejemplos, se utiliza un bucket de Amazon S3 situado en la región Este de EE.UU. (Norte de Virginia) (`us-east-1`) Región de AWS y las tablas de ejemplo creadas en [Ejemplos](r_CREATE_EXTERNAL_TABLE_examples.md) para CREATE TABLE. Para obtener más información acerca de cómo utilizar las particiones con tablas externas, consulte [Partición de tablas externas de Redshift Spectrum](c-spectrum-external-tables.md#c-spectrum-external-tables-partitioning). 

En los siguientes conjuntos de ejemplos se configura la propiedad numRows de la tabla para la tabla externa SPECTRUM.SALES en 170 000 filas.

```
alter table spectrum.sales
set table properties ('numRows'='170000');
```

En el siguiente ejemplo, se cambia la ubicación de la tabla externa SPECTRUM.SALES.

```
alter table spectrum.sales
set location 's3://redshift-downloads/tickit/spectrum/sales/';
```

En el siguiente ejemplo, se cambia el formato de la tabla externa SPECTRUM.SALES a Parquet.

```
alter table spectrum.sales
set file format parquet;
```

En el siguiente ejemplo, se agrega una partición para la tabla SPECTRUM.SALES\$1PART.

```
alter table spectrum.sales_part
add if not exists partition(saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/';
```

En el siguiente ejemplo, se agregan tres particiones para la tabla SPECTRUM.SALES\$1PART.

```
alter table spectrum.sales_part add if not exists
partition(saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/'
partition(saledate='2008-02-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/'
partition(saledate='2008-03-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
```

En el siguiente ejemplo, se modifica SPECTRUM.SALES\$1PART para eliminar la partición con `saledate='2008-01-01''`.

```
alter table spectrum.sales_part
drop partition(saledate='2008-01-01');
```

En el siguiente ejemplo, se establece una ruta nueva de Amazon S3 para la partición con `saledate='2008-01-01'`.

```
alter table spectrum.sales_part
partition(saledate='2008-01-01')
set location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01-01/';
```

En el siguiente ejemplo, se cambia el nombre de `sales_date` a `transaction_date`. 

```
alter table spectrum.sales rename column sales_date to transaction_date;
```

En el siguiente ejemplo, se establece una asignación de columna con una asignación de posición en una tabla externa que utiliza el formato ORC (Optimized Row Columnar).

```
alter table spectrum.orc_example
set table properties('orc.schema.resolution'='position');
```

En el siguiente ejemplo, se establece una asignación de columna con una asignación de nombre en una tabla externa que utiliza el formato ORC.

```
alter table spectrum.orc_example
set table properties('orc.schema.resolution'='name');
```

# Ejemplos de ALTER TABLE ADD y DROP COLUMN
<a name="r_ALTER_TABLE_COL_ex-add-drop"></a>

En los siguientes ejemplos se muestra cómo usar ALTER TABLE para agregar y eliminar la columna de una tabla básica y, también, cómo eliminar una columna con un objeto dependiente. 

## Utilizar ADD y, luego, DROP en una columna básica
<a name="r_ALTER_TABLE_COL_ex-add-then-drop-a-basic-column"></a>

En el siguiente ejemplo, se agrega una columna FEEDBACK\$1SCORE independiente a la tabla USERS. Esta columna contiene un valor entero, y el valor predeterminado de esta columna es NULL (no hay marcador de retroalimentación). 

En primer lugar, consulte la tabla de catálogos PG\$1TABLE\$1DEF para ver el esquema de la tabla USERS: 

```
column        | type                   | encoding | distkey | sortkey
--------------+------------------------+----------+---------+--------
userid        | integer                | delta    | true    |       1
username      | character(8)           | lzo      | false   |       0
firstname     | character varying(30)  | text32k  | false   |       0
lastname      | character varying(30)  | text32k  | false   |       0
city          | character varying(30)  | text32k  | false   |       0
state         | character(2)           | bytedict | false   |       0
email         | character varying(100) | lzo      | false   |       0
phone         | character(14)          | lzo      | false   |       0
likesports    | boolean                | none     | false   |       0
liketheatre   | boolean                | none     | false   |       0
likeconcerts  | boolean                | none     | false   |       0
likejazz      | boolean                | none     | false   |       0
likeclassical | boolean                | none     | false   |       0
likeopera     | boolean                | none     | false   |       0
likerock      | boolean                | none     | false   |       0
likevegas     | boolean                | none     | false   |       0
likebroadway  | boolean                | none     | false   |       0
likemusicals  | boolean                | none     | false   |       0
```

Ahora, agregue la columna feedback\$1score: 

```
alter table users
add column feedback_score int
default NULL;
```

Seleccione la columna FEEDBACK\$1SCORE de USERS para verificar que se haya agregado: 

```
select feedback_score from users limit 5;

feedback_score
----------------
NULL
NULL
NULL
NULL
NULL
```

Arrastre la columna para restablecer la DDL original: 

```
alter table users drop column feedback_score;
```

## Eliminación de una columna con un objeto dependiente
<a name="r_ALTER_TABLE_COL_ex-dropping-a-column-with-a-dependent-object"></a>

En el siguiente ejemplo, se elimina una columna que tiene un objeto dependiente. Como resultado, también se elimina el objeto dependiente. 

Para comenzar, agregue la columna FEEDBACK\$1SCORE a la tabla USERS nuevamente: 

```
alter table users
add column feedback_score int
default NULL;
```

Luego, cree una vista de la tabla USERS denominada USERS\$1VIEW: 

```
create view users_view as select * from users;
```

Ahora, pruebe eliminar la columna FEEDBACK\$1SCORE de la tabla USERS. Esta instrucción DROP usa el comportamiento predeterminado (RESTRICT): 

```
alter table users drop column feedback_score;
```

Amazon Redshift muestra un mensaje de error en el que se indica que la columna no puede eliminarse porque otro objeto depende de ella. 

Pruebe eliminar la columna FEEDBACK\$1SCORE nuevamente y, esta vez, especifique CASCADE para eliminar todos los objetos dependientes: 

```
alter table users
drop column feedback_score cascade;
```

# ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND"></a>

Adjunta filas en una tabla de destino al mover datos de una tabla de origen existente. Los datos de la tabla de origen se mueven a las columnas correspondientes de la tabla de destino. El orden de la columna no es importante. Después de que se agregan los datos correctamente a la tabla de destino, la tabla de origen queda vacía. Por lo general, ALTER TABLE APPEND es mucho más rápida que una operación [CREATE TABLE AS](r_CREATE_TABLE_AS.md) o [INSERT](r_INSERT_30.md) INTO similar debido a que los datos se mueven, no se duplican. 

**nota**  
ALTER TABLE APPEND mueve bloques de datos entre la tabla de origen y la tabla de destino. Para mejorar el rendimiento, ALTER TABLE APPEND no compacta el almacenamiento como parte de la operación APPEND. Como resultado, el uso del almacenamiento aumenta temporalmente. Parar reclamar el espacio, ejecute una operación [VACUUM](r_VACUUM_command.md).

Las columnas con los mismos nombres también deben tener atributos de columna idénticos. Si la tabla de origen o la tabla de destino contienen columnas que no existen en la otra tabla, use los parámetros IGNOREEXTRA o FILLTARGET para especificar cómo se deben administrar las columnas adicionales. 

No se puede agregar una columna de identidad. El comando fallará si ambas tablas incluyen una columna de identidad. Si solo una tabla tiene una columna de identidad, incluya el parámetro FILLTARGET o IGNOREEXTRA. Para obtener más información, consulte [Notas de uso acerca de ALTER TABLE APPEND](#r_ALTER_TABLE_APPEND_usage).

Puede anexar una columna GENERATED BY DEFAULT AS IDENTITY. Puede actualizar las columnas definidas como GENERATED BY DEFAULT AS IDENTITY con los valores proporcionados. Para obtener más información, consulte [Notas de uso acerca de ALTER TABLE APPEND](#r_ALTER_TABLE_APPEND_usage). 

La tabla de destino debe ser una tabla permanente. No obstante, el origen puede ser una tabla permanente o una vista materializada configurada para la ingesta de streaming. Ambos objetos deben usar el mismo estilo de distribución y la misma clave de distribución, si se ha definido una. Si los objetos están ordenados, ambos deben usar el mismo estilo de ordenación y definir las mismas columnas como claves de ordenación.

Un comando ALTER TABLE APPEND se confirma automáticamente apenas se completa la operación. No se puede revertir. No puede ejecutar ALTER TABLE APPEND en un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

## Privilegios necesarios
<a name="r_ALTER_TABLE_APPEND-privileges"></a>

Según el comando ALTER TABLE APPEND, se requiere uno de los siguientes privilegios:
+ Superusuario
+ Usuarios con el privilegio de sistema ALTER TABLE
+ Usuarios con los privilegios DELETE y SELECT en la tabla de origen y el privilegio INSERT en la tabla de destino

## Sintaxis
<a name="r_ALTER_TABLE_APPEND-synopsis"></a>

```
ALTER TABLE target_table_name APPEND FROM [ source_table_name | source_materialized_view_name ]
[ IGNOREEXTRA | FILLTARGET ]
```

La adición desde una vista materializada solo funciona en el caso en que la vista materializada esté configurada para [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md).

## Parameters
<a name="r_ALTER_TABLE_APPEND-parameters"></a>

 *target\$1table\$1name*   
El nombre de la tabla a la que se agregan las filas. Especifique solo el nombre de la tabla o use el formato *schema\$1name.table\$1name (nombre-de\$1esquema.nombre\$1de\$1tabla)* para usar un esquema específico. La tabla de destino debe ser una tabla permanente existente.

 FROM *source\$1table\$1name*   
El nombre de la tabla que proporciona las filas que se agregarán. Especifique solo el nombre de la tabla o use el formato *schema\$1name.table\$1name (nombre-de\$1esquema.nombre\$1de\$1tabla)* para usar un esquema específico. La tabla de origen debe ser una tabla permanente existente.

 FROM *source\$1materialized\$1view\$1name*   
El nombre de la vista materializada que proporciona las filas que se agregarán. La adición desde una vista materializada solo funciona en el caso en que la vista materializada esté configurada para [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md). La vista materializada de origen ya debe existir. 

IGNOREEXTRA   
Una palabra clave que especifica si la tabla de origen incluye columnas que no están presentes en la tabla de destino; los datos de las columnas adicionales deben descartarse. No puede utilizar IGNOREEXTRA con FILLTARGET. 

FILLTARGET   
Una palabra clave que especifica si la tabla de destino incluye columnas que no están presentes en la tabla de origen; las columnas deben completarse con el valor de la columna [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default), si se definió uno, o con el valor NULL. No puede utilizar IGNOREEXTRA con FILLTARGET. 

## Notas de uso acerca de ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND_usage"></a>
+ ALTER TABLE APPEND mueve solo las columnas idénticas de la tabla de origen a la tabla de destino. El orden de la columna no es importante. 
+  Si la tabla de origen o la tabla de destino contienen columnas adicionales, utilice FILLTARGET o IGNOREEXTRA según las siguientes reglas: 
  + Si la tabla de origen contiene columnas que no existen en la tabla de destino, incluya IGNOREEXTRA. El comando ignora las columnas adicionales de la tabla de origen.
  + Si la tabla de destino contiene columnas que no existen en la tabla de origen, incluya FILLTARGET. El comando rellena las columnas adicionales de la tabla de destino con el valor de columna predeterminado, con el valor IDENTITY, si se definió uno, o con NULL.
  + El comando fallará si ambas tablas, la de origen y la de destino, contienen columnas adicionales. No pueden utilizar ambos parámetros, FILLTARGET e IGNOREEXTRA. 
+ El comando fallará si hay una columna con el mismo nombre, pero con diferentes atributos, en ambas tablas. Las columnas con nombres similares deben tener los siguientes atributos en común: 
  + Tipo de datos
  + Tamaño de la columna
  + Codificación de compresión
  + Sin valores nulos
  + Estilo de ordenación
  + Columnas con clave de ordenación
  + Estilo de distribución
  + Columnas con clave de distribución
+ No se puede agregar una columna de identidad. El comando fallará si ambas tablas, la de origen y la de destino, tienen columnas de identidad. Si solo la tabla de origen tiene una columna de identidad, incluya el parámetro IGNOREEXTRA para ignorar la columna de identidad. Si solo la tabla de destino tiene una columna de identidad, incluya el parámetro FILLTARGET para completar la columna de identidad según la cláusula IDENTITY definida para la tabla. Para obtener más información, consulte [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default). 
+ Puede anexar una columna de identidad predeterminada con la instrucción ALTER TABLE APPEND. Para obtener más información, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md). 
+ Las operaciones ALTER TABLE APPEND mantienen bloqueos exclusivos cuando se ejecutan en vistas materializadas de streaming de Amazon Redshift conectadas a cualquiera de las siguientes opciones:
  +  Un flujo de datos de Amazon Kinesis 
  +  Una transmisión gestionada de Amazon para el tema de Apache Kafka 
  +  Una transmisión externa compatible, como un tema de Confluent Cloud Kafka 

  Para obtener más información, consulte [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md).

## Ejemplos de ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND_examples"></a>

Supongamos que su organización mantiene una tabla, SALES\$1MONTHLY, para capturar transacciones de venta actuales. Desea mover datos de la tabla de transacción a la tabla SALES, todos los meses. 

Puede utilizar los comandos INSERT INTO y TRUNCATE para llevar a cabo la tarea. 

```
insert into sales (select * from sales_monthly);
truncate sales_monthly;
```

No obstante, puede realizar la misma operación de una manera mucho más eficiente con el comando ALTER TABLE APPEND. 

Primero, consulte la tabla de catálogo del sistema [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md) para verificar que ambas tablas tengan las mismas columnas con atributos de columna idénticos. 

```
select trim(tablename) as table, "column", trim(type) as type,
encoding, distkey, sortkey, "notnull"
from pg_table_def where tablename like 'sales%';

table      | column     | type                        | encoding | distkey | sortkey | notnull
-----------+------------+-----------------------------+----------+---------+---------+--------
sales      | salesid    | integer                     | lzo      | false   |       0 | true
sales      | listid     | integer                     | none     | true    |       1 | true
sales      | sellerid   | integer                     | none     | false   |       2 | true
sales      | buyerid    | integer                     | lzo      | false   |       0 | true
sales      | eventid    | integer                     | mostly16 | false   |       0 | true
sales      | dateid     | smallint                    | lzo      | false   |       0 | true
sales      | qtysold    | smallint                    | mostly8  | false   |       0 | true
sales      | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
sales      | commission | numeric(8,2)                | delta32k | false   |       0 | false
sales      | saletime   | timestamp without time zone | lzo      | false   |       0 | false
salesmonth | salesid    | integer                     | lzo      | false   |       0 | true
salesmonth | listid     | integer                     | none     | true    |       1 | true
salesmonth | sellerid   | integer                     | none     | false   |       2 | true
salesmonth | buyerid    | integer                     | lzo      | false   |       0 | true
salesmonth | eventid    | integer                     | mostly16 | false   |       0 | true
salesmonth | dateid     | smallint                    | lzo      | false   |       0 | true
salesmonth | qtysold    | smallint                    | mostly8  | false   |       0 | true
salesmonth | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
salesmonth | commission | numeric(8,2)                | delta32k | false   |       0 | false
salesmonth | saletime   | timestamp without time zone | lzo      | false   |       0 | false
```

A continuación, observe el tamaño de cada tabla.

```
select count(*) from sales_monthly;
 count
-------
  2000
(1 row)

select count(*) from sales;
 count
-------
 412,214
(1 row)
```

Ahora ejecute el siguiente comando ALTER TABLE APPEND.

```
alter table sales append from sales_monthly;         
```

Observe el tamaño de cada tabla nuevamente. La tabla SALES\$1MONTHLY ahora tiene 0 filas, y la tabla SALES tiene 2 000 filas más.

```
select count(*) from sales_monthly;
 count
-------
     0
(1 row)

select count(*) from sales;
 count
-------
 414214
(1 row)
```

Si la tabla de origen contiene más columnas que la tabla de destino, especifique el parámetro IGNOREEXTRA. En el siguiente ejemplo, se usa el parámetro IGNOREEXTRA para ignorar las columnas adicionales de la tabla SALES\$1LISTING cuando agrega columnas en la tabla SALES.

```
alter table sales append from sales_listing ignoreextra;
```

Si la tabla de destino contiene más columnas que la tabla de origen, especifique el parámetro FILLTARGET. En el siguiente ejemplo, se usa el parámetro FILLTARGET para completar columnas en la tabla SALES\$1REPORT que no existen en la tabla SALES\$1MONTH.

```
alter table sales_report append from sales_month filltarget;
```

A continuación, se muestra un ejemplo de cómo utilizar ALTER TABLE APPEND con una vista materializada como origen.

```
ALTER TABLE target_tbl APPEND FROM my_streaming_materialized_view;
```

Los nombres de la tabla y de la vista materializada de este ejemplo son muestras. La adición desde una vista materializada solo funciona en el caso en que la vista materializada esté configurada para [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md). Mueve todos los registros de la vista materializada de origen a una tabla de destino con el mismo esquema que la vista materializada y deja la vista materializada intacta. Este es el mismo comportamiento que cuando el origen de los datos es una tabla.

# ALTER TEMPLATE
<a name="r_ALTER_TEMPLATE"></a>

Cambia la definición de una plantilla existente. Utilice este comando para cambiar el nombre de una plantilla, cambiar el propietario de una plantilla, añadir o eliminar parámetros de la definición de la plantilla, o establecer valores de parámetros.

## Privilegios necesarios
<a name="r_ALTER_TEMPLATE-privileges"></a>

Para modificar una plantilla, debe tener una de las siguientes opciones:
+ Privilegios de superusuario
+ Privilegio ALTER TEMPLATE y privilegio USAGE sobre el esquema que contiene la plantilla.

## Sintaxis
<a name="r_ALTER_TEMPLATE-synopsis"></a>

```
ALTER TEMPLATE [database_name.][schema_name.]template_name
{
RENAME TO new_name
| OWNER TO new_owner
| ADD  parameter [AS] [value]
| DROP parameter
| SET parameter TO value1 [, parameter2 TO value2 , ...]
};
```

## Parameters
<a name="r_ALTER_TEMPLATE-parameters"></a>

 *database\$1name*   
(Opcional) El nombre de la base de datos en la que se crea la plantilla. Si no se especifica, se utiliza la base de datos actual. 

 *schema\$1name*   
(Opcional) El nombre del esquema en el que se crea la plantilla. Si no se especifica, la plantilla se busca en la ruta de búsqueda actual. 

 *template\$1name*   
El nombre de la plantilla que se va a modificar. 

RENAME TO   
Una cláusula que cambia el nombre de la plantilla. 

 *new\$1name*   
El nuevo nombre de la plantilla. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md). 

OWNER TO   
Una cláusula que cambia el propietario de la plantilla. 

 *new\$1owner*   
El nuevo propietario de la plantilla. 

ADD *parameter* [AS] [*value*]  
Añade un nuevo parámetro a la plantilla.  
+ Para los parámetros que solo admiten palabras clave (como CSV o GZIP), especifique únicamente el nombre del parámetro.
+ Para los parámetros que requieren valores, especifique el nombre del parámetro seguido del valor. Si lo desea, puede incluir AS entre el parámetro y el valor. 

DROP *parameter*  
Quita el parámetro especificado de la plantilla. No se pueden eliminar varios parámetros con un solo comando DROP.

SET *parameter* TO *value1* [, *parameter2* TO *value2* , …]  
Actualiza los valores de los parámetros de plantilla existentes. Úselo solo para los parámetros que ya tienen valores. Se pueden actualizar varios parámetros en un mismo comando.

## Ejemplos
<a name="r_ALTER_TEMPLATE-examples"></a>

En el siguiente ejemplo, se cambia el nombre de la plantilla test\$1template a demo\$1template.

```
ALTER TEMPLATE test_template
RENAME TO demo_template;
```

En el siguiente ejemplo se otorga la propiedad del esquema demo\$1template al usuario bob.

```
ALTER TEMPLATE demo_template
OWNER TO bob;
```

En el siguiente ejemplo se agrega un parámetro `CSV` a la plantilla demo\$1template.

```
ALTER TEMPLATE demo_template
ADD CSV;
```

En el siguiente ejemplo se agrega un parámetro `TIMEFORMAT 'auto'` a la plantilla demo\$1template.

```
ALTER TEMPLATE demo_template
ADD TIMEFORMAT 'auto';
```

En el siguiente ejemplo se elimina el parámetro `ENCRYPTED` de la plantilla demo\$1template.

```
ALTER TEMPLATE demo_template
DROP ENCRYPTED;
```

En el siguiente ejemplo, se establece el parámetro `DELIMITER` en `'|'` y el parámetro `TIMEFORMAT` en `'epochsecs'`:

```
ALTER TEMPLATE demo_template
SET DELIMITER TO '|', TIMEFORMAT TO 'epochsecs';
```

# ALTER USER
<a name="r_ALTER_USER"></a>

Cambia un usuario de base de datos.

## Privilegios necesarios
<a name="r_ALTER_USER-privileges"></a>

Los siguientes privilegios son necesarios para ALTER USER:
+ Superusuario
+ Usuarios con el privilegio ALTER USER
+ Usuario actual que desea cambiar su propia contraseña

## Sintaxis
<a name="r_ALTER_USER-synopsis"></a>

```
ALTER USER username [ WITH ] option [, ... ]

where option is

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ VALID UNTIL 'expiration_date' ]
| RENAME TO new_name |
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit | RESET SESSION TIMEOUT
| SET parameter { TO | = } { value | DEFAULT }
| RESET parameter
| EXTERNALID external_id
```

## Parameters
<a name="r_ALTER_USER-parameters"></a>

 *username*   
Nombre del usuario. 

WITH   
Palabra clave opcional. 

CREATEDB \$1 NOCREATEDB   
La opción CREATEDB permite que el usuario cree nuevas bases de datos. NOCREATEDB es el valor predeterminado. 

CREATEUSER \$1 NOCREATEUSER   
La opción CREATEUSER crea un superusuario con todos los privilegios de base de datos, incluido CREATE USER. El valor predeterminado es NOCREATEUSER. Para obtener más información, consulte [Superusuarios](r_superusers.md).

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="alter-user-syslog-access"></a>
Se trata de una cláusula que especifica el nivel de acceso a las vistas y las tablas de sistema de Amazon Redshift que tiene el usuario.   
Los usuarios normales que tengan el permiso SYSLOG ACCESS RESTRICTED solo pueden ver las filas generadas por ese usuario en las tablas y vistas del sistema visibles para el usuario. El valor predeterminado es RESTRICTED.   
Los usuarios normales que tengan el permiso SYSLOG ACCESS UNRESTRICTED pueden ver todas las filas en las tablas y vistas del sistema visibles para el usuario, incluidas las filas generadas por otro usuario. UNRESTRICTED no permite que los usuarios normales puedan obtener acceso a las tablas visibles para los superusuarios. Solo los superusuarios pueden ver estas tablas.   
Al brindar a un usuario acceso sin restricciones a las tablas del sistema, le proporciona la visibilidad necesaria para ver los datos generados por otros usuarios. Por ejemplo, STL\$1QUERY y STL\$1QUERYTEXT contienen todo el texto de las instrucciones INSERT, UPDATE y DELETE, que podrían incluir datos confidenciales generados por los usuarios. 
Todas las filas de SVV\$1TRANSACTIONS son visibles para todos los usuarios.   
Para obtener más información, consulte [Visibilidad de datos en las tablas y vistas de sistema](cm_chap_system-tables.md#c_visibility-of-data).

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
Establece la contraseña del usuario.   
De manera predeterminada, los usuarios pueden cambiar sus propias contraseñas, a menos que la contraseña esté deshabilitada. Para deshabilitar la contraseña de un usuario, especifique DISABLE. Cuando se deshabilita la contraseña de un usuario, se elimina del sistema y el usuario solo puede iniciar sesión con credenciales de usuario de AWS Identity and Access Management IAM temporales. Para obtener más información, consulte [Uso de la autenticación de IAM para generar credenciales de usuario de base de datos](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html). Solo un superusuario puede habilitar o deshabilitar contraseñas. No puede deshabilitar la contraseña de un superusuario. Para habilitar una contraseña, ejecute ALTER USER y especifique una contraseña.  
Para obtener información acerca de cómo utilizar el parámetro PASSWORD, consulte [CREATE USER](r_CREATE_USER.md). 

VALID UNTIL '*expiration\$1date*'   
Especifica que la contraseña tiene una fecha de vencimiento. Use el valor `'infinity'` para evitar tener una fecha de vencimiento. El tipo de datos válido para este parámetro es timestamp (marca temporal).   
Solo los superusuarios pueden utilizar este parámetro.

RENAME TO   
Cambia el nombre del usuario. 

 *new\$1name*   
Nuevo nombre de usuario. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).  
Cuando cambia el nombre de un usuario, también debe restablecer la contraseña del usuario. La contraseña de restablecimiento no tiene por qué ser diferente de la contraseña anterior. Debido a que el nombre del usuario se utiliza como parte del cifrado de la contraseña, la contraseña se borra cada vez que se cambia el nombre de un usuario. El usuario no podrá iniciar sesión hasta que no se haya restablecido la contraseña. Por ejemplo:   

```
alter user newuser password 'EXAMPLENewPassword11'; 
```

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
La cantidad máxima de conexiones a la base de datos que el usuario puede 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 aplicar un límite en la cantidad de conexiones de cada base de datos. Para obtener más información, consulte [CREATE DATABASE](r_CREATE_DATABASE.md). El valor predeterminado es UNLIMITED. Para ver las conexiones actuales, consulte la vista del sistema [STV\$1SESSIONS](r_STV_SESSIONS.md).  
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.

SESSION TIMEOUT *limit* \$1 RESET SESSION TIMEOUT  
El tiempo máximo en segundos durante el cual una sesión permanece inactiva o en reposo. El rango es de 60 segundos (un minuto) a 1 728 000 segundos (20 días). Si no se establece el tiempo de espera de la sesión para el usuario, se aplica el ajuste del clúster. Para obtener más información, consulte [Cuotas y límites de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) en la *Guía de administración de Amazon Redshift*.  
Cuando se establece el tiempo de espera de la sesión, se aplica solo a las sesiones nuevas.  
Para ver información sobre las sesiones de usuario activas, incluidos la hora de inicio, el nombre de usuario y el tiempo de espera de la sesión, consulte la vista de sistema [STV\$1SESSIONS](r_STV_SESSIONS.md). Para ver información sobre el historial de sesiones del usuario, consulte la vista [STL\$1SESSIONS](r_STL_SESSIONS.md). Para recuperar información acerca de los usuarios de las bases de datos, incluidos los valores de tiempo de espera de la sesión, consulte la vista [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md).

SET   
Establece un parámetro de configuración a un nuevo valor predeterminado para todas las sesiones ejecutadas por el usuario especificado. 

RESET   
Restablece un parámetro de configuración al valor predeterminado original para el usuario especificado. 

 *parameter*   
Nombre del parámetro que se debe establecer o restablecer. 

 *valor de*   
Valor nuevo del parámetro. 

DEFAULT   
Establece el parámetro de configuración al valor predeterminado para todas las sesiones ejecutadas por el usuario especificado. 

EXTERNALID *external\$1id*   
El identificador del usuario, que está asociado a un proveedor de identidades. El usuario debe tener desactivada la contraseña. Para obtener más información, consulte [Federación de proveedores de identidades (IdP) nativos para Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

## Notas de uso
<a name="r_ALTER_USER_usage_notes"></a>
+ **Intento de modificar rdsdb**: no puede modificar al usuario denominado `rdsdb`.
+ **Creación de una contraseña desconocida**: cuando use la autenticación de AWS Identity and Access Management (IAM) para crear credenciales de usuario de la base de datos, es posible que quiera crear un superusuario que solo pueda iniciar sesión con credenciales temporales. Puede deshabilitar la contraseña de un superusuario, pero no puede crear una contraseña desconocida mediante una cadena hash MD5 generada aleatoriamente.

  ```
  alter user iam_superuser password 'md51234567890123456780123456789012';
  ```
+ **Configuración de search\$1path**: cuando establece el parámetro [search\$1path](r_search_path.md) con el comando ALTER USER, la modificación entra en vigor en el próximo inicio de sesión del usuario especificado. Si desea cambiar el valor search\$1path para la sesión y el usuario actuales, utilice un comando SET. 
+ **Configuración de la zona horaria**: cuando utilice ESTABLECER ZONA HORARIA con el comando ALTER USER, la modificación entra en vigor en el próximo inicio de sesión del usuario especificado.
+ **Trabajo con políticas de seguridad a nivel de fila y enmascaramiento de datos dinámico**: cuando el clúster o espacio de nombres sin servidor aprovisionado tiene políticas de enmascaramiento de datos dinámico o de seguridad en el nivel de fila, los siguientes comandos están bloqueados para los usuarios habituales: 

  ```
  ALTER <current_user> SET enable_case_sensitive_super_attribute/enable_case_sensitive_identifier/downcase_delimited_identifier
  ```

  Solo los superusuarios y los usuarios con el privilegio ALTER USER pueden establecer estas opciones de configuración. Para obtener información sobre seguridad de nivel de fila, consulte  [Seguridad de nivel básico](t_rls.md). Para obtener información sobre el enmascaramiento dinámico de datos, consulte [Enmascaramiento de datos dinámico](t_ddm.md). 

## Ejemplos
<a name="r_ALTER_USER-examples"></a>

En el siguiente ejemplo, se le otorga al usuario ADMIN el privilegio de crear bases de datos: 

```
alter user admin createdb;
```

En el siguiente ejemplo, se establece la contraseña del usuario ADMIN a `adminPass9` y se establece una fecha y hora de vencimiento para la contraseña: 

```
alter user admin password 'adminPass9'
valid until '2017-12-31 23:59';
```

En el siguiente ejemplo, se cambia el nombre del usuario ADMIN a SYSADMIN: 

```
alter user admin rename to sysadmin;
```

En el siguiente ejemplo, se actualiza el tiempo de espera de la sesión inactiva para un usuario a 300 segundos.

```
ALTER USER dbuser SESSION TIMEOUT 300;
```

Restablece el tiempo de espera de la sesión inactiva del usuario. Cuando lo restablece, se aplica el ajuste del clúster. Debe ser un superusuario de base de datos para ejecutar este comando. Para obtener más información, consulte [Cuotas y límites de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) en la *Guía de administración de Amazon Redshift*.

```
ALTER USER dbuser RESET SESSION TIMEOUT;
```

En el ejemplo siguiente se actualiza el ID externo de un usuario denominado `bob`. El espacio de nombres es `myco_aad`. Si el espacio de nombres no está asociado a un proveedor de identidades registrado, se produce un error.

```
ALTER USER myco_aad:bob EXTERNALID "ABC123" PASSWORD DISABLE;
```

En el siguiente ejemplo se establece la zona horaria para todas las sesiones ejecutadas por un usuario específico de la base de datos. Cambia la zona horaria para las sesiones posteriores, pero no para la actual.

```
ALTER USER odie SET TIMEZONE TO 'Europe/Zurich';
```

En el siguiente ejemplo, se establece el número máximo de conexiones a bases de datos que el usuario `bob` puede tener abiertas.

```
ALTER USER bob CONNECTION LIMIT 10;
```

# ANALYZE
<a name="r_ANALYZE"></a>

Actualiza las estadísticas de la tabla para que el planificador de consultas las utilice. 

## Privilegios necesarios
<a name="r_ANALYZE-privileges"></a>

Los siguientes privilegios son necesarios para ANALYZE:
+ Superusuario
+ Usuarios con el privilegio ANALYZE
+ Propietario de la relación
+ Propietario de la base de datos con quien se comparte la tabla

## Sintaxis
<a name="r_ANALYZE-synopsis"></a>

```
ANALYZE [ VERBOSE ]
[ [ table_name [ ( column_name [, ...] ) ] ]
[ PREDICATE COLUMNS | ALL  COLUMNS ]
```

## Parameters
<a name="r_ANALYZE-parameters"></a>

VERBOSE   
Una cláusula que devuelve mensajes de información de progreso acerca de la operación ANALYZE. Esta opción es útil cuando no se especifica una tabla.

 *table\$1name*   
Puede analizar tablas específicas, incluidas tablas temporales. Puede completar la tabla con el nombre de su esquema. Si lo desea, puede especificar un table\$1name para analizar una única tabla. No puede especificar más de un *table\$1name (nombre\$1de\$1tabla)* con una única instrucción ANALYZE *table\$1name (nombre\$1de\$1tabla)*. Si no se especifica un valor *table\$1name*, se analizan todas las tablas de la base de datos actualmente conectada, incluidas las tablas persistentes en el catálogo del sistema. Amazon Redshift omite el análisis de una tabla si el porcentaje de filas que se han modificado desde la última operación ANALYZE es inferior al límite de análisis. Para obtener más información, consulte [Umbral de análisis](#r_ANALYZE-threshold).  
No necesita analizar las tablas de sistema de Amazon Redshift (tablas STL y STV).

 *column\$1name*   
Si especifica un valor *table\$1name (nombre\$1de\$1tabla)*, también puede especificar una o varias columnas de la tabla (como una lista de valores separados por columnas entre paréntesis). Si se especifica una lista de columnas, solo se analizarán las columnas que aparecen en la lista.

 PREDICATE COLUMNS \$1 ALL COLUMNS   
Se trata de cláusulas que indican si ANALYZE debe incluir solo columnas de predicados. Especifique PREDICATE COLUMNS para analizar solamente las columnas utilizadas como predicados en consultas anteriores o que sean posibles candidatas para utilizarse como predicados. Especifique ALL COLUMNS para analizar todas las columnas. El valor predeterminado es ALL COLUMNS.   
Se incluye una columna en el conjunto de columnas de predicados si cualquiera de los siguientes es verdadero:  
+ La columna ha sido utilizada en una consulta como parte de un filtro, una condición de combinación o una cláusula de agrupación.
+ La columna es una clave de distribución.
+ La columna forma parte de una clave de ordenación.
Si no se marca ninguna columna como columna de predicado, por ejemplo porque la tabla aún no se ha consultado, se analizan todas las columnas incluso si PREDICATE COLUMNS está especificado. Cuando esto sucede, Amazon Redshift podría responder con un mensaje similar a No se han encontrado columnas de predicado para “*nombre-de-tabla*”. Analizando todas las columnas. Para obtener más información acerca de las columnas de predicados, consulte [Análisis de tablas](t_Analyzing_tables.md).

## Notas de uso
<a name="r_ANALYZE-usage-notes"></a>

Amazon Redshift ejecuta ANALYZE de manera automática en las tablas que usted crea con los siguientes comandos: 
+ CREATE TABLE AS
+ CREATE TEMP TABLE AS 
+ SELECT INTO

 No puede analizar una tabla externa.

No es necesario ejecutar el comando ANALYZE en estas tablas cuando se crean por primera vez. Si las modifica, debe analizarlas de la misma manera en que analiza las demás tablas.

### Umbral de análisis
<a name="r_ANALYZE-threshold"></a>

Para reducir el tiempo de procesamiento y mejorar el rendimiento general del sistema, Amazon Redshift omite la operación ANALYZE en una tabla si el porcentaje de filas que se han modificado desde que se ejecutó el comando ANALYZE por última vez es inferior al límite de análisis especificado por el parámetro [analyze\$1threshold\$1percent](r_analyze_threshold_percent.md). Por defecto, `analyze_threshold_percent` es 10. Si desea cambiar `analyze_threshold_percent` para la sesión actual, ejecute el comando [SET](r_SET.md). En el siguiente ejemplo, se cambia `analyze_threshold_percent` a 20 por ciento.

```
set analyze_threshold_percent to 20;
```

Para analizar las tablas cuando solo han cambiado unas pocas filas, establezca `analyze_threshold_percent` en un número pequeño elegido arbitrariamente. Por ejemplo, si establece `analyze_threshold_percent` como 0,01, las tablas con 100 000 000 filas no se omitirán si se han modificado al menos 10 000 filas. 

```
set analyze_threshold_percent to 0.01;
```

Si ANALYZE omite una tabla porque no cumple con el umbral de análisis, Amazon Redshift devuelve el siguiente mensaje.

```
ANALYZE SKIP
```

Para analizar todas las tablas, aunque no haya cambiado ninguna fila, establezca `analyze_threshold_percent` en 0.

Para ver los resultados de las operaciones ANALYZE, consulte la tabla del sistema [STL\$1ANALYZE](r_STL_ANALYZE.md). 

Para obtener más información acerca del análisis de tablas, consulte [Análisis de tablas](t_Analyzing_tables.md).

## Ejemplos
<a name="r_ANALYZE-examples"></a>

Analiza todas las tablas de la base de datos TICKIT y devolver la información de progreso.

```
analyze verbose;
```

Analiza solo la tabla LISTING.

```
analyze listing;
```

Analiza las columnas VENUEID y VENUENAME de la tabla VENUE. 

```
analyze venue(venueid, venuename);
```

Analiza solo columnas de predicado de la tabla VENUE.

```
analyze venue predicate columns;
```

# ANALYZE COMPRESSION
<a name="r_ANALYZE_COMPRESSION"></a>

Realiza un análisis de compresión y produce un informe con la codificación de compresión sugerida para las tablas analizadas. Para cada columna, el informe incluye un cálculo de la reducción potencial de espacio en disco en comparación con la codificación RAW.

## Sintaxis
<a name="r_ANALYZE_COMPRESSION-synopsis"></a>

```
ANALYZE COMPRESSION
[ [ table_name ]
[ ( column_name [, ...] ) ] ]
[COMPROWS numrows]
```

## Parameters
<a name="r_ANALYZE_COMPRESSION-parameters"></a>

 *table\$1name*   
Puede analizar la compresión para tablas específicas, incluidas tablas temporales. Puede completar la tabla con el nombre de su esquema. Si lo desea, puede especificar un *table\$1name (nombre\$1de\$1tabla)* para analizar una única tabla. Si no especifica *table\$1name (nombre\$1de\$1tabla)*, se analizarán todas las tablas de la base de datos que está conectada actualmente. No puede especificar varios valores *table\$1name (nombre\$1de\$1tabla)* con una única instrucción ANALYZE COMPRESSION.

 *column\$1name*   
Si especifica un valor *table\$1name (nombre\$1de\$1tabla)*, también puede especificar una o varias columnas de la tabla (como una lista de valores separados por columnas entre paréntesis).

COMPROWS  
Cantidad de filas que se usarán como el tamaño de muestra para el análisis de compresión. El análisis se ejecuta sobre las filas de cada sector de datos. Por ejemplo, si especifica COMPROWS 1000000 (1 000 000) y el sistema contiene 4 sectores totales, no se leen y analizan más de 250 000 filas por sector. Si no especifica COMPROWS, el tamaño de muestra se establecerá de manera predeterminada en 100 000 por sector. Los valores de COMPROWS inferiores al valor predeterminado de 100 000 filas por sector se actualizan automáticamente al valor predeterminado. No obstante, el análisis de compresión no produce recomendaciones si la cantidad de datos de la tabla no alcanza para producir una muestra significativa. Si el número de COMPROWS es superior a la cantidad de filas de la tabla, el comando ANALYZE COMPRESSION avanza y ejecuta el análisis de compresión contra todas las filas disponibles El uso de COMPROWS produce un error si no se especifica una tabla.

 *numrows*   
Cantidad de filas que se usarán como el tamaño de muestra para el análisis de compresión. El rango aceptado para *numrows (número\$1de\$1filas)* es un número comprendido entre 1000 y 1000000000 (1 000 000 000).

## Notas de uso
<a name="r_ANALYZE_COMPRESSION_usage_notes"></a>

ANALYZE COMPRESSION adquiere un bloqueo de tabla exclusivo, que previene lecturas y escrituras concurrentes en la tabla. Ejecute solo el comando ANALYZE COMPRESSION cuando la tabla esté inactiva.

Ejecute ANALYZE COMPRESSION para obtener recomendaciones para esquemas de codificación de columna, según una muestra del contenido de la tabla. ANALYZE COMPRESSION es una herramienta de consultoría y no modifica las codificaciones de columna de la tabla. Puede aplicar la codificación sugerida creando de nuevo la tabla o generando una nueva tabla con el mismo esquema. El espacio en disco se puede reducir significativamente creando de nuevo una tabla sin comprimir con los esquemas de codificación adecuados. Este enfoque ahorra espacio en disco y mejora el rendimiento de las consultas en las cargas de trabajo relacionadas con operaciones de E/S.

ANALYZE COMPRESSION omite la verdadera fase de análisis y devuelve directamente el tipo de codificación original de cualquier columna que se haya designado como SORTKEY. Esto se debe a que los análisis restringidos por rango pueden funcionar mal cuando las columnas SORTKEY están mucho más comprimidas que otras columnas.

## Ejemplos
<a name="r_ANALYZE_COMPRESSION-examples"></a>

En el siguiente ejemplo, se muestran la codificación y la reducción porcentual estimada para las columnas de la tabla LISTING únicamente:

```
analyze compression listing;
  
  Table  |     Column     | Encoding | Est_reduction_pct 
---------+----------------+----------+-------------------
 listing | listid         | az64     | 40.96
 listing | sellerid       | az64     | 46.92
 listing | eventid        | az64     | 53.37
 listing | dateid         | raw      | 0.00
 listing | numtickets     | az64     | 65.66
 listing | priceperticket | az64     | 72.94
 listing | totalprice     | az64     | 68.05
 listing | listtime       | az64     | 49.74
```

En el siguiente ejemplo, se analizan las columnas QTYSOLD, COMMISSION y SALETIME de la tabla SALES.

```
analyze compression sales(qtysold, commission, saletime);

 Table |   Column   | Encoding | Est_reduction_pct 
-------+------------+----------+-------------------
 sales | salesid    | N/A      | 0.00
 sales | listid     | N/A      | 0.00
 sales | sellerid   | N/A      | 0.00
 sales | buyerid    | N/A      | 0.00
 sales | eventid    | N/A      | 0.00
 sales | dateid     | N/A      | 0.00
 sales | qtysold    | az64     | 83.06
 sales | pricepaid  | N/A      | 0.00
 sales | commission | az64     | 71.85
 sales | saletime   | az64     | 49.63
```

# ATTACH MASKING POLICY
<a name="r_ATTACH_MASKING_POLICY"></a>

Adjunta una política de enmascaramiento dinámico de datos existente a una columna. Para obtener más información sobre el enmascaramiento dinámico de datos, consulte [Enmascaramiento de datos dinámico](t_ddm.md).

Los superusuarios y los usuarios o roles que tengan el rol sys:secadmin pueden adjuntar una política de enmascaramiento.

## Sintaxis
<a name="r_ATTACH_MASKING_POLICY-synopsis"></a>

```
ATTACH MASKING POLICY 
{
  policy_name ON relation_name
  | database_name.policy_name ON database_name.schema_name.relation_name
}
( { output_column_names | output_path } )
[ USING ( { input_column_names | input_path } ) ]
TO { user_name | ROLE role_name | PUBLIC }
[ PRIORITY priority ];
```

## Parameters
<a name="r_ATTACH_MASKING_POLICY-parameters"></a>

*policy\$1name*   
El nombre de la política de enmascaramiento que se va a adjuntar.

database\$1name  
El nombre de la base de datos a partir de la que se crea la política y la relación. La política y la relación deben estar en la misma base de datos. La base de datos puede ser la base de datos conectada o una base de datos que admita los permisos federados de Amazon Redshift.

schema\$1name  
El nombre del esquema al que pertenece la relación.

 *relation\$1name*   
Es el nombre de la relación a la que se asociará la política de enmascaramiento.

*output\$1column\$1names*   
Los nombres de las columnas a las que se aplicará la política de enmascaramiento.

*output\$1paths*   
Es la ruta completa del objeto SUPER al que se aplicará la política de enmascaramiento, incluido el nombre de la columna. Por ejemplo, para una relación con una columna de tipo SUPER llamada `person`, *output\$1path* podría ser `person.name.first_name`. 

*input\$1column\$1names*   
Los nombres de las columnas que la política de enmascaramiento tomará como entrada. Este parámetro es opcional. Si no se especifica, la política de enmascaramiento utiliza *output\$1column\$1names* como entradas.

*input\$1paths*   
Es la ruta completa del objeto SUPER que la política de enmascaramiento tomará como entrada. Este parámetro es opcional. Si no se especifica, la política de enmascaramiento utiliza *output\$1path* como entradas.

*user\$1name*   
El nombre del usuario al que se adjuntará la política de enmascaramiento. No puede adjuntar dos políticas a la misma combinación de usuario y columna o rol y columna. Puede adjuntar una política a un usuario y otra al rol del usuario. En este caso, se aplica la política de mayor prioridad.  
Solo puede establecer user\$1name, role\$1name o PUBLIC en un solo comando ATTACH MASKING POLICY. 

*role\$1name*   
El nombre del rol al que se adjuntará la política de enmascaramiento. No puede adjuntar dos políticas al mismo par de columna-rol. Puede adjuntar una política a un usuario y otra política al rol del usuario. En este caso, se aplica la política de mayor prioridad.  
Solo puede establecer user\$1name, role\$1name o PUBLIC en un solo comando ATTACH MASKING POLICY. 

*PUBLIC*   
Adjunta la política de enmascaramiento a todos los usuarios que acceden a la tabla. Para que se apliquen, debe dar a otras políticas de enmascaramiento adjuntas a pares de columna-usuario o columna-rol específicos una prioridad mayor que a la política PUBLIC.  
Solo puede establecer user\$1name, role\$1name o PUBLIC en un solo comando ATTACH MASKING POLICY. 

*priority*   
Prioridad de la política de enmascaramiento. Cuando se aplican varias políticas de enmascaramiento a la consulta de un usuario determinado, se aplica la de mayor prioridad.  
No puede asociar dos políticas diferentes a la misma columna con la misma prioridad, incluso si las dos políticas están asociadas a usuarios o roles diferentes. Puede asociar la misma política varias veces al mismo conjunto de parámetros de tabla, columna de salida, columna de entrada y prioridad, siempre que el usuario o rol al que se asocie la política sea diferente cada vez.   
No puede aplicar una política a una columna con la misma prioridad que otra política adjunta a esa columna, aunque sean para roles diferentes. Este campo es opcional. Si no especifica una prioridad, la política de enmascaramiento establece de forma predeterminada una prioridad de 0.

Para obtener información sobre el uso de ATTACH MASKING POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# ATTACH RLS POLICY
<a name="r_ATTACH_RLS_POLICY"></a>

Adjunte una política de seguridad de la fila en una tabla a uno o más usuarios o roles.

Los superusuarios y los usuarios o roles que tienen el rol `sys:secadmin` puede adjuntar una política.

## Sintaxis
<a name="r_ATTACH_RLS_POLICY-synopsis"></a>

```
ATTACH RLS POLICY 
{
  policy_name ON [TABLE] table_name [, ...]
  | database_name.policy_name ON [TABLE] database_name.schema_name.table_name [, ...]
}
TO { user_name | ROLE role_name | PUBLIC } [, ...]
```

## Parameters
<a name="r_ATTACH_RLS_POLICY-parameters"></a>

 *policy\$1name*   
El nombre de la política.

database\$1name  
El nombre de la base de datos a partir de la que se crea la política y la relación. La política y la relación deben estar en la misma base de datos. La base de datos puede ser la base de datos conectada o una base de datos que admita los permisos federados de Amazon Redshift.

schema\$1name  
El nombre del esquema al que pertenece la relación.

table\$1name  
Es la relación a la que se asocia la política de seguridad de nivel de fila.

TO \$1 *user\$1name* \$1 ROLE *role\$1name* \$1 PUBLIC\$1 [, ...]  
Especifica si la política se adjunta a uno o varios usuarios o roles especificados. 

Para obtener información sobre el uso de ATTACH RLS POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Notas de uso
<a name="r_ATTACH_RLS_POLICY-usage"></a>

Al trabajar con la instrucción ATTACH RLS POLICY, observe lo siguiente:
+ La tabla que se adjunta debe tener todas las columnas enumeradas en la cláusula WITH de la instrucción de creación de políticas.
+ Amazon Redshift RLS no permite asociar políticas de RLS a los siguientes objetos:
  +  Tablas 
  +  Vistas
  +  Vistas de enlace en tiempo de ejecución 
  +  Vistas materializadas
+ Amazon Redshift RLS no permite asociar políticas de RLS a los siguientes objetos:
  +  Tablas de catálogo 
  +  Relaciones entre bases de datos 
  +  tablas externas 
  +  Tablas temporales 
  +  Tablas de búsqueda de políticas
  + Tablas básicas de vistas materializadas
+ Las políticas de RLS que se asocian a los superusuarios o a los usuarios con el permiso `sys:secadmin` se omiten.

## Ejemplos
<a name="r_ATTACH_RLS_POLICY-examples"></a>

En el siguiente ejemplo, se adjunta una política de RLS a las combinaciones de tablas y roles especificadas. La política de RLS se aplica a los usuarios con el rol de `analyst` o `dbadmin` cuando acceden a la tabla tickit\$1category\$1redshift.

```
ATTACH RLS POLICY policy_concerts ON tickit_category_redshift TO ROLE analyst, ROLE dbadmin;
```

# BEGIN
<a name="r_BEGIN"></a>

Inicia una transacción. Sinónimo de START TRANSACTION.

Una transacción es una única unidad lógica de trabajo, independientemente de tener un comando o varios comandos. Por lo general, todos los comandos de una transacción se ejecutan en una instantánea de la base de datos cuya hora de inicio se determina con el valor establecido para el parámetro de configuración del sistema `transaction_snapshot_begin`.

De manera predeterminada, las operaciones individuales de Amazon Redshift (consultas, instrucciones DDL, cargas) se confirman de manera automática en la base de datos. Si desea suspender la confirmación de una operación hasta que se complete el trabajo subsiguiente, necesita abrir una transacción con la instrucción BEGIN, luego ejecutar los comandos requeridos y cerrar la transacción con una instrucción [COMMIT](r_COMMIT.md) o [END](r_END.md). Si es necesario, puede utilizar una instrucción [ROLLBACK](r_ROLLBACK.md) para detener una transacción en curso. Una excepción a este comportamiento es el comando [TRUNCATE](r_TRUNCATE.md), que confirma la transacción en la que se ejecuta y no puede revertirse.

## Sintaxis
<a name="r_BEGIN-synopsis"></a>

```
BEGIN [ WORK | TRANSACTION ] [ ISOLATION LEVEL option ] [ READ WRITE | READ ONLY ]

START TRANSACTION [ ISOLATION LEVEL option ] [ READ WRITE | READ ONLY ]

Where option is

SERIALIZABLE
| READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ

Note: READ UNCOMMITTED, READ COMMITTED, and REPEATABLE READ have no
operational impact and map to SERIALIZABLE in Amazon Redshift. You can see database isolation levels on your cluster 
by querying the stv_db_isolation_level table.
```

## Parameters
<a name="r_BEGIN-parameters"></a>

WORK   
Palabra clave opcional.

TRANSACTION   
Palabra clave opcional; WORK y TRANSACTION son sinónimos.

ISOLATION LEVEL SERIALIZABLE   
El aislamiento serializable es compatible de manera predeterminada, por lo que el comportamiento de la transacción es el mismo si la sintaxis está incluida o no en la instrucción. Para obtener más información, consulte [Administración de operaciones de escritura simultáneas](c_Concurrent_writes.md). No se admite otro nivel de aislamiento.  
El estándar de SQL define cuatro niveles de aislamiento de transacciones para prevenir *lecturas sucias* (donde una transacción lee los datos escritos por una transacción paralela sin confirmar), *lecturas no repetibles* (donde una transacción relee datos que leyó anteriormente y descubre que otra transacción que se confirmó después de la lectura inicial modificó los datos) y *lecturas fantasmas* (donde una transacción vuelve a ejecutar una consulta, devuelve un conjunto de filas que cumplen una condición de búsqueda y luego descubre que el conjunto de filas ha cambiado debido a otra transacción recientemente confirmada):  
+ Lectura sin confirmar: las lecturas sucias, lecturas no repetibles y lecturas fantasmas son posibles.
+ Lectura confirmada: las lecturas no repetibles y lecturas fantasmas son posibles.
+ Lectura repetible: las lecturas fantasmas son posibles.
+ Serializable: previene lecturas sucias, lecturas no repetibles y lecturas fantasmas.
Aunque puede utilizar cualquiera de los cuatro niveles de aislamiento de las transacciones, Amazon Redshift procesa todos los niveles de aislamiento como serializables.

READ WRITE   
Le otorga a la transacción permisos de lectura y escritura.

READ ONLY   
Le otorga a la transacción permisos de solo lectura.

## Ejemplos
<a name="r_BEGIN-examples"></a>

En el siguiente ejemplo, se inicia un bloque de transacción serializable: 

```
begin;
```

En el siguiente ejemplo, se inicia el bloque de transacción con un nivel de aislamiento serializable y permisos de lectura y escritura: 

```
begin read write;
```

# CALL
<a name="r_CALL_procedure"></a>

Ejecuta un procedimiento almacenado. El comando CALL debe incluir el nombre del procedimiento y los valores del argumento de entrada. Debe llamar a un procedimiento almacenado mediante la instrucción CALL.

**nota**  
CALL no puede formar parte de ninguna consultar normal.

## Sintaxis
<a name="r_CALL_procedure-synopsis"></a>

```
CALL sp_name ( [ argument ] [, ...] )
```

## Parameters
<a name="r_CALL_procedure-parameters"></a>

 *sp\$1name*   
El nombre del procedimiento que debe ejecutarse. 

 *argumento*   
El valor del argumento de entrada. Este parámetro también puede ser un nombre de función; por ejemplo `pg_last_query_id()`. No es posible utilizar consultas como argumentos de CALL. 

## Notas de uso
<a name="r_CALL_procedure-usage-notes"></a>

Los procedimientos almacenados de Amazon Redshift admiten llamadas anidadas y recursivas, tal y como se describe a continuación. Además, asegúrese de que el soporte de los controladores está al día, también se describe a continuación.

**Topics**
+ [Llamadas anidadas](#r_CALL_procedure-nested-calls)
+ [Soporte de los controladores](#r_CALL_procedure-driver-support)

### Llamadas anidadas
<a name="r_CALL_procedure-nested-calls"></a>

Los procedimientos almacenados de Amazon Redshift admiten llamadas anidadas y recursivas. El número máximo de niveles de agrupación permitido es 16. Las llamadas agrupadas pueden encapsular la lógica empresarial en procedimientos más pequeños que pueden compartir varios remitentes. 

Si llama a un procedimiento agrupado que tiene parámetros de salida, el procedimiento interior debe definir argumentos INOUT. En este caso, el procedimiento interior se pasa en una variable no constante. No se permiten argumentos OUT. Este comportamiento se produce porque se necesita una variable para retener la salida de la llamada interior.

La relación entre los procedimientos interior y exterior se registra en la columna `from_sp_call` de [SVL\$1STORED\$1PROC\$1CALL](r_SVL_STORED_PROC_CALL.md). 

El siguiente ejemplo muestra el paso de variable a una llamada de procedimientos agrupada a través de argumentos INOUT.

```
CREATE OR REPLACE PROCEDURE inner_proc(INOUT a int, b int, INOUT c int) LANGUAGE plpgsql
AS $$
BEGIN
  a := b * a;
  c := b * c;
END;
$$;

CREATE OR REPLACE PROCEDURE outer_proc(multiplier int) LANGUAGE plpgsql
AS $$
DECLARE
  x int := 3;
  y int := 4;
BEGIN
  DROP TABLE IF EXISTS test_tbl;
  CREATE TEMP TABLE test_tbl(a int, b varchar(256));
  CALL inner_proc(x, multiplier, y);
  insert into test_tbl values (x, y::varchar);
END;
$$;

CALL outer_proc(5);

SELECT * from test_tbl;
 a  | b
----+----
 15 | 20
(1 row)
```

### Soporte de los controladores
<a name="r_CALL_procedure-driver-support"></a>

Recomendamos actualizar los controladores Java Database Connectivity (JDBC) y Open Database Connectivity (ODBC) a la versión más reciente compatible con los procedimientos almacenados de Amazon Redshift. 

Es posible que pueda utilizar el controlador existente si la herramienta de su cliente utiliza operaciones de la API del controlador que pasa a través de la instrucción CALL al servidor. Los parámetros de salida, si los hubiere, se devuelven como un conjunto de resultados de una fila. 

Las versiones más recientes de los controladores de JDBC y ODBC de Amazon Redshift admiten los metadatos para el descubrimiento de procedimientos almacenados. También tienen soporte `CallableStatement` para aplicaciones Java personalizadas. Para obtener más información acerca de los controladores, consulte [Conexión a un clúster de Amazon Redshift mediante herramientas de cliente SQL](https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-to-cluster.html) en la *Guía de administración de Amazon Redshift.* 

Los siguientes ejemplos muestran cómo usar diferentes operaciones de la API del controlador JDBC para llamadas de procedimientos almacenadas.

```
void statement_example(Connection conn) throws SQLException {
  statement.execute("CALL sp_statement_example(1)");
}

void prepared_statement_example(Connection conn) throws SQLException {
  String sql = "CALL sp_prepared_statement_example(42, 84)";
  PreparedStatement pstmt = conn.prepareStatement(sql);
  pstmt.execute();
}

void callable_statement_example(Connection conn) throws SQLException {
  CallableStatement cstmt = conn.prepareCall("CALL sp_create_out_in(?,?)");
  cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
  cstmt.setInt(2, 42);
  cstmt.executeQuery();
  Integer out_value = cstmt.getInt(1);
}
```

## Ejemplos
<a name="r_CALL_procedure-examples"></a>

En el siguiente ejemplo, se llama al nombre del procedimiento `test_spl`.

```
call test_sp1(3,'book');
INFO:  Table "tmp_tbl" does not exist and will be skipped
INFO:  min_val = 3, f2 = book
```

En el siguiente ejemplo, se llama al nombre del procedimiento `test_spl2`.

```
call test_sp2(2,'2019');

         f2          | column2
---------------------+---------
 2019+2019+2019+2019 | 2
(1 row)
```

# CANCEL
<a name="r_CANCEL"></a>

Cancela una consulta de base de datos que está actualmente en ejecución.

El comando CANCEL requiere el ID de proceso o el ID de sesión de la consulta en ejecución y muestra un mensaje de confirmación para verificar que se canceló la consulta.

## Privilegios necesarios
<a name="r_CANCEL-privileges"></a>

Los siguientes privilegios son necesarios para CANCEL:
+ Superusuario que cancela su propia consulta
+ Superusuario que cancela la consulta de un usuario
+ Usuarios con el privilegio CANCEL que cancelan la consulta de un usuario
+ Usuario que cancela su propia consulta

## Sintaxis
<a name="r_CANCEL-synopsis"></a>

```
CANCEL process_id [ 'message' ]
```

## Parameters
<a name="r_CANCEL-parameters"></a>

 *process\$1id*   
Para cancelar una consulta que se esté ejecutando en un clúster de Amazon Redshift, utilice el `pid` (ID de proceso) de [STV\$1RECENTS](r_STV_RECENTS.md) que corresponda a la consulta que desee cancelar.  
Para cancelar una consulta que se esté ejecutando en un grupo de trabajo de Amazon Redshift sin servidor, utilice el `session_id` de [SYS\$1QUERY\$1HISTORY](SYS_QUERY_HISTORY.md) que corresponda a la consulta que desee cancelar.

'*message*'   
Un mensaje de confirmación opcional que se muestra cuando se completa la cancelación de la consulta. Si no especifica un mensaje, Amazon Redshift mostrará el mensaje predeterminado como verificación. Debe incluir el mensaje entre comillas simples.

## Notas de uso
<a name="r_CANCEL-usage-notes"></a>

No puede cancelar una consulta al especificar un *query ID*; debe especificar el *process ID* (PID) o *Session ID* de la consulta. Solo puede cancelar consultas que su usuario esté ejecutando actualmente. Los superusuarios pueden cancelar todas las consultas.

Si las consultas en varias sesiones mantienen bloqueos en la misma tabla, puede utilizar la función [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md) para terminar una de las sesiones. Esta acción obliga a las transacciones en curso de la sesión terminada a eliminar todos los bloqueos y revertir la transacción. Consulte la tabla de sistema [STV\$1LOCKS](r_STV_LOCKS.md) para ver los bloqueos actuales. 

Después de determinados eventos internos, Amazon Redshift podría reiniciar una sesión activa y asignar un PID nuevo. Si el PID ha cambiado, es posible que reciba el siguiente mensaje de error.

```
Session <PID> does not exist. The session PID might have changed. Check the stl_restarted_sessions system table for details.
```

Para buscar el nuevo PID, consulte la tabla del sistema [STL\$1RESTARTED\$1SESSIONS](r_STL_RESTARTED_SESSIONS.md) y el filtro en la columna `oldpid`.

```
select oldpid, newpid from stl_restarted_sessions where oldpid = 1234;
```

## Ejemplos
<a name="r_CANCEL-examples"></a>

Para cancelar una consulta que se esté ejecutando actualmente en un clúster de Amazon Redshift, primero recupere el ID de proceso para la consulta que desee cancelar. Para determinar los ID de proceso para todas las consultas en ejecución, escriba el siguiente comando: 

```
select pid, starttime, duration,
trim(user_name) as user,
trim (query) as querytxt
from stv_recents
where status = 'Running';

pid |         starttime          | duration |   user   |    querytxt
-----+----------------------------+----------+----------+-----------------
802 | 2008-10-14 09:19:03.550885 |      132 | dwuser | select
venuename from venue where venuestate='FL', where venuecity not in
('Miami' , 'Orlando');
834 | 2008-10-14 08:33:49.473585 |  1250414 | dwuser | select *
from listing;
964 | 2008-10-14 08:30:43.290527 |   326179 | dwuser | select
sellerid from sales where qtysold in (8, 10);
```

Revise el texto de la consulta para determinar cuál es el ID de proceso (PID) que corresponde a la consulta que desea cancelar.

Escriba el siguiente comando para usar PID 802 para cancelar esa consulta: 

```
cancel 802;
```

La sesión donde se estaba ejecutando la consulta muestra el siguiente mensaje: 

```
ERROR:  Query (168) cancelled on user's request
```

donde `168` es el ID de consulta (no el ID de proceso utilizado para cancelar la consulta).

De manera opcional, puede especificar un mensaje de confirmación personalizado para mostrar en lugar del mensaje predeterminado. Para especificar un mensaje personalizado, incluya el mensaje entre comillas simples al final del comando CANCEL: 

```
cancel 802 'Long-running query';
```

La sesión donde se estaba ejecutando la consulta muestra el siguiente mensaje: 

```
ERROR:  Long-running query
```

# CLOSE
<a name="close"></a>

(Opcional) Cierra todos los recursos libres que están asociados con un cursor abierto. [COMMIT](r_COMMIT.md), [END](r_END.md) y [ROLLBACK](r_ROLLBACK.md) cierran automáticamente el cursor, por lo que no es necesario utilizar el comando CLOSE para cerrarlo explícitamente. 

Para obtener más información, consulte [DECLARE](declare.md), [FETCH](fetch.md). 

## Sintaxis
<a name="close-synopsis"></a>

```
CLOSE cursor
```

## Parameters
<a name="close-parameters"></a>

*cursor*   
Nombre del cursor que se cerrará. 

## Ejemplo de CLOSE
<a name="close-example"></a>

Los siguientes comandos cierran el cursor y realizan una confirmación, que finaliza la transacción:

```
close movie_cursor;
commit;
```

# COMMENT
<a name="r_COMMENT"></a>

Crea o cambia un comentario acerca de un objeto de la base de datos.

## Sintaxis
<a name="r_COMMENT-synopsis"></a>

```
COMMENT ON
{
TABLE object_name |
COLUMN object_name.column_name |
CONSTRAINT constraint_name ON table_name |
DATABASE object_name |
VIEW object_name
}
IS 'text' | NULL
```

## Parameters
<a name="r_COMMENT-parameters"></a>

 *object\$1name*   
Nombre del objeto de la base de datos en el que se realiza un comentario. Puede agregar un comentario en los siguientes objetos:  
+ TABLE
+ COLUMN (también lleva un valor *column\$1name [nombre\$1de\$1columna]*).
+ CONSTRAINT (también lleva un valor *constraint\$1name [nombre\$1de\$1restricción]* y un valor *table\$1name [nombre\$1de\$1tabla]*).
+ DATABASE
+ VIEW
+ SCHEMA

IS "*texto*"\$1NULL  
El texto del comentario que desea agregar o sustituir para el objeto especificado. La cadena *texto* es el tipo de datos TEXT. Incluya el comentario entre comillas simples. Establezca el valor en NULL para eliminar el texto del comentario.

 *column\$1name*   
Nombre de la columna en la que se realiza un comentario. Parámetro de COLUMN. Sigue una tabla especificada en `object_name`.

 *constraint\$1name*   
Nombre de la restricción en la que se realiza un comentario. Parámetro de CONSTRAINT.

 *table\$1name*   
Nombre de una tabla que contiene la restricción. Parámetro de CONSTRAINT.

## Notas de uso
<a name="r_COMMENT-usage-notes"></a>

Para agregar o actualizar un comentario, debe ser un superusuario o el propietario de un objeto de base de datos.

Los comentarios en bases de datos solo pueden aplicarse a la base de datos actual. Se muestra un mensaje de advertencia si intenta comentar en una base de datos diferente. Aparece el mismo mensaje de advertencia sobre comentarios de bases de datos que no existen.

No se admiten comentarios en tablas externas, columnas externas ni columnas de vistas de enlace de tiempo de ejecución.

## Ejemplos
<a name="r_COMMENT-example"></a>

En el ejemplo siguiente se agrega un comentario a la tabla SALES. 

```
COMMENT ON TABLE sales IS 'This table stores tickets sales data';
```

En el siguiente ejemplo, se muestra el comentario de la tabla SALES. 

```
select obj_description('public.sales'::regclass);

obj_description
-------------------------------------
This table stores tickets sales data
```

En el siguiente ejemplo, se elimina un comentario de la tabla SALES. 

```
COMMENT ON TABLE sales IS NULL;
```

En el siguiente ejemplo, se agrega un comentario a la columna EVENTID de la tabla SALES. 

```
COMMENT ON COLUMN sales.eventid IS 'Foreign-key reference to the EVENT table.';
```

En el siguiente ejemplo, se muestra un comentario en la columna EVENTID (columna número 5) de la tabla SALES. 

```
select col_description( 'public.sales'::regclass, 5::integer );

col_description
-----------------------------------------
Foreign-key reference to the EVENT table.
```

En el siguiente ejemplo, se agrega un comentario descriptivo a la tabla EVENT. 

```
comment on table event is 'Contains listings of individual events.';
```

Consulte el catálogo del sistema PG\$1DESCRIPTION para ver una lista de comentarios. El siguiente ejemplo devuelve la descripción de la tabla EVENT.

```
select * from pg_catalog.pg_description
where objoid =
(select oid from pg_class where relname = 'event'
and relnamespace =
(select oid from pg_catalog.pg_namespace where nspname = 'public') );

objoid | classoid | objsubid | description
-------+----------+----------+----------------------------------------
116658 |     1259 |        0 | Contains listings of individual events.
```

# COMMIT
<a name="r_COMMIT"></a>

Confirma la transacción actual en la base de datos. Este comando hace que las actualizaciones de transacciones de la base de datos sean permanentes.

## Sintaxis
<a name="r_COMMIT-synopsis"></a>

```
COMMIT [ WORK | TRANSACTION ]
```

## Parameters
<a name="r_COMMIT-parameters"></a>

WORK  
Palabra clave opcional. Esta palabra clave no se admite en un proceso almacenado. 

TRANSACTION  
Palabra clave opcional. WORK y TRANSACTION son sinónimos. Ninguna de ellas se admite en un proceso almacenado. 

Para más información sobre el uso de COMMIT en un proceso almacenado, vea [Administración de transacciones](stored-procedure-transaction-management.md). 

## Ejemplos
<a name="r_COMMIT-examples"></a>

Cada uno de los siguientes ejemplos confirma la transacción actual en la base de datos:

```
commit;
```

```
commit work;
```

```
commit transaction;
```

# COPY
<a name="r_COPY"></a>


|  | 
| --- |
|  El cifrado del cliente para los comandos COPY y UNLOAD dejará de estar abierto a nuevos clientes a partir del 30 de abril de 2025. Si ha utilizado el cifrado del cliente con los comandos COPY y UNLOAD en los 12 meses anteriores al 30 de abril de 2025, puede seguir utilizando el cifrado del cliente con los comandos COPY o UNLOAD hasta el 30 de abril de 2026. Después del 30 de abril de 2026, no podrá utilizar el cifrado del cliente para COPY y UNLOAD. Le recomendamos que pase a utilizar el cifrado del servidor para COPY y UNLOAD lo antes posible. Si ya está utilizando el cifrado del servidor para COPY y UNLOAD, no hay ningún cambio y puede seguir utilizándolo sin alterar las consultas. Para obtener más información sobre el cifrado para COPY y UNLOAD, consulte el parámetro ENCRYPTED a continuación.  | 

Carga datos en una tabla desde archivos de datos o desde una tabla de Amazon DynamoDB. Los archivos pueden encontrarse en un bucket de Amazon Simple Storage Service (Amazon S3), un clúster de Amazon EMR o un alojamiento remoto al que se puede acceder mediante una conexión Secure Shell (SSH).

**nota**  
Las tablas externas de Amazon Redshift Spectrum solo se pueden leer. No puede aplicar COPY a una tabla externa.

El comando COPY anexa los datos de entrada como filas adicionales a la tabla.

El tamaño máximo de una fila de entrada única de cualquier origen es de 4 MB.

**Topics**
+ [Permisos necesarios](#r_COPY-permissions)
+ [Sintaxis de COPY](#r_COPY-syntax)
+ [Parámetros necesarios](#r_COPY-syntax-required-parameters)
+ [Parámetros opcionales](#r_COPY-syntax-overview-optional-parameters)
+ [Notas de uso y recursos adicionales para el comando COPY](#r_COPY-using-the-copy-command)
+ [Ejemplos del comando COPY](#r_COPY-using-the-copy-command-examples)
+ [COPY JOB](r_COPY-JOB.md)
+ [COPY con TEMPLATE](r_COPY-WITH-TEMPLATE.md)
+ [Referencia de parámetros de COPY](r_COPY-parameters.md)
+ [Notas de uso](r_COPY_usage_notes.md)
+ [Ejemplos de COPY](r_COPY_command_examples.md)

## Permisos necesarios
<a name="r_COPY-permissions"></a>

Para utilizar el comando COPY, debe tener el privilegio [INSERT](r_GRANT.md#grant-insert) para la tabla de Amazon Redshift.

## Sintaxis de COPY
<a name="r_COPY-syntax"></a>

```
COPY table-name 
[ column-list ]
FROM data_source
authorization
[ [ FORMAT ] [ AS ] data_format ] 
[ parameter [ argument ] [, ... ] ]
```

Puede realizar una operación COPY con un mínimo de tres parámetros: un nombre de tabla, un origen de datos y una autorización para obtener acceso a los datos. 

Amazon Redshift extiende la funcionalidad del comando COPY para permitir la carga de datos en varios formatos de datos de varios orígenes de datos, el control del acceso a los datos de carga, la administración de las transformaciones de datos y la administración de la operación de carga. 

Las siguientes secciones presentan los parámetros requeridos del comando COPY, mediante la agrupación de los parámetros opcionales por función. También describen cada parámetro y explican el funcionamiento conjunto de las distintas opciones. Puede ir directamente a la descripción de un parámetro mediante la lista alfabética de parámetros. 

## Parámetros necesarios
<a name="r_COPY-syntax-required-parameters"></a>

El comando COPY requiere tres elementos: 
+ [Table Name](#r_COPY-syntax-overview-table-name)
+ [Data Source](#r_COPY-syntax-overview-data-source)
+ [Authorization](#r_COPY-syntax-overview-credentials)

El comando COPY más sencillo utiliza el siguiente formato. 

```
COPY table-name 
FROM data-source
authorization;
```

En el siguiente ejemplo, se crea una tabla denominada CATDEMO y luego se carga la tabla con datos de ejemplo de un archivo de datos de Amazon S3 denominado `category_pipe.txt`. 

```
create table catdemo(catid smallint, catgroup varchar(10), catname varchar(10), catdesc varchar(50));
```

En el siguiente ejemplo, el origen de datos del comando COPY es un archivo de datos llamado `category_pipe.txt` que se encuentra en la carpeta `tickit` de un bucket de Amazon S3 denominado `redshift-downloads`. El comando COPY tiene autorización para acceder al bucket de Amazon S3 a través de un rol de AWS Identity and Access Management (IAM). Si el clúster tiene adjunto un rol de IAM ya existente con permiso para acceder a Amazon S3, puede sustituir el nombre de recurso de Amazon (ARN) del rol en el siguiente comando COPY y ejecutarlo.

```
copy catdemo
from 's3://redshift-downloads/tickit/category_pipe.txt'
iam_role 'arn:aws:iam::<aws-account-id>:role/<role-name>'
region 'us-east-1';
```

Para obtener instrucciones completas sobre cómo se utilizan los comandos COPY para cargar datos de muestra, incluidas las instrucciones para cargar datos de otras regiones de AWS, consulte [Cargar datos de muestra desde Amazon S3](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html) en la Guía de introducción a Amazon Redshift.

*table-name (nombre-tabla*  <a name="r_COPY-syntax-overview-table-name"></a>
El nombre de la tabla de destino para el comando COPY. La tabla ya debe existir en la base de datos. La tabla puede ser temporal o persistente. El comando COPY adjunta los nuevos datos de entrada a cualquier fila existente en la tabla.

FROM *data-source (origen-datos)*  <a name="r_COPY-syntax-overview-data-source"></a>
La ubicación de los datos de origen que se van a cargar en la tabla de destino. Puede especificarse un archivo de manifiesto con algunos orígenes de datos.   
El repositorio de datos más utilizado es un bucket de Amazon S3. También puede cargar datos de archivos de datos ubicados en un clúster de Amazon EMR, una instancia de Amazon EC2 o un alojamiento remoto al que el clúster puede acceder a través de una conexión SSH, o puede cargarlos directamente desde una tabla de DynamoDB.   
+ [COPY de Amazon S3](copy-parameters-data-source-s3.md)
+ [COPY de Amazon EMR](copy-parameters-data-source-emr.md) 
+ [COPY de hosts remotos (SSH)](copy-parameters-data-source-ssh.md)
+ [COPY de Amazon DynamoDB](copy-parameters-data-source-dynamodb.md)

Autorización  <a name="r_COPY-syntax-overview-credentials"></a>
Se trata de una cláusula que indica el método que el clúster utiliza para la autenticación y la autorización con objeto de acceder a otros recursos de AWS. El comando COPY necesita autorización para acceder a los datos de otro recurso de AWS, incluidos los recursos de Amazon S3, Amazon EMR, Amazon DynamoDB y Amazon EC2. Puede proporcionar esa autorización haciendo referencia a un rol de IAM que esté asociado al clúster o proporcionando el ID de clave de acceso y la clave de acceso secreta de un usuario de IAM.   
+ [Parámetros de autorización](copy-parameters-authorization.md) 
+ [Control de acceso con base en roles](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 
+ [Control de acceso basado en claves](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based) 

## Parámetros opcionales
<a name="r_COPY-syntax-overview-optional-parameters"></a>

De forma opcional, puede especificar el modo en que COPY asigna los datos de campo a las columnas de la tabla de destino, definir los atributos de datos de origen para permitir al comando COPY leer y analizar los datos de origen de forma correcta y administrar qué operaciones realiza el comando COPY durante el proceso de carga. 
+ [Opciones de mapeo de columnas](copy-parameters-column-mapping.md)
+ [Parámetros de formato de datos](#r_COPY-syntax-overview-data-format)
+ [Parámetros de conversión de datos](#r_COPY-syntax-overview-data-conversion)
+ [Operaciones de carga de datos](#r_COPY-syntax-overview-data-load)

### Mapeo de columnas
<a name="r_COPY-syntax-overview-column-mapping"></a>

De manera predeterminada, COPY inserta los valores de campo en las columnas de la tabla de destino en el mismo orden que aparecen los campos en los archivos de datos. Si el orden de columnas predeterminado no funcionará, puede especificar una lista de columnas o utilizar las expresiones JSONPath para asignar los campos de datos de origen a las columnas de destino. 
+ [Column List](copy-parameters-column-mapping.md#copy-column-list)
+ [JSONPaths File](copy-parameters-column-mapping.md#copy-column-mapping-jsonpaths)

### Parámetros de formato de datos
<a name="r_COPY-syntax-overview-data-format"></a>

Puede cargar datos de archivos de texto en formato JSON, de valores separados por coma (CSV), de ancho fijo o delimitados por caracteres, o de archivos de Avro.

De manera predeterminada, el comando COPY espera que los datos de origen estén en archivos de texto UTF-8 delimitados por caracteres. El delimitador predeterminado es el carácter de barra vertical ( \$1 ). Si los datos de origen están en otro formato, utilice los siguientes parámetros para especificar el formato de datos.
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter) 
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth) 
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile) 
+ [AVRO](copy-parameters-data-format.md#copy-avro) 
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json) 
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [GZIP](copy-parameters-file-compression.md#copy-gzip) 
+ [LZOP](copy-parameters-file-compression.md#copy-lzop) 
+ [PARQUET](copy-parameters-data-format.md#copy-parquet) 
+ [ORC](copy-parameters-data-format.md#copy-orc) 
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd) 

### Parámetros de conversión de datos
<a name="r_COPY-syntax-overview-data-conversion"></a>

A medida que carga la tabla, COPY intenta convertir de forma implícita las cadenas de los datos de origen al tipo de datos de la columna de destino. Si necesita especificar una conversión que sea diferente a la del comportamiento predeterminado, o si la conversión predeterminada da lugar a errores, puede administrar las conversiones de datos especificando los siguientes parámetros.
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate) 
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars) 
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull) 
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat) 
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull) 
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding) 
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape) 
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids) 
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord) 
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines) 
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader) 
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as) 
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes) 
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat) 
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks) 
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns) 

### Operaciones de carga de datos
<a name="r_COPY-syntax-overview-data-load"></a>

Administre el comportamiento predeterminado de la operación de carga para solucionar problemas o reducir los tiempos de carga especificando los siguientes parámetros. 
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows) 
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate) 
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors) 
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror) 
+ [NOLOAD](copy-parameters-data-load.md#copy-noload) 
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate) 

## Notas de uso y recursos adicionales para el comando COPY
<a name="r_COPY-using-the-copy-command"></a>

Para obtener más información acerca de cómo utilizar el comando COPY, consulte los siguientes temas: 
+ [Notas de uso](r_COPY_usage_notes.md)
+ [Tutorial: Carga de datos desde Amazon S3](tutorial-loading-data.md)
+ [Prácticas recomendadas de Amazon Redshift para la carga de datos](c_loading-data-best-practices.md)
+ [Carga de tablas con el comando COPY](t_Loading_tables_with_the_COPY_command.md)
  + [Carga de datos desde Amazon S3](t_Loading-data-from-S3.md)
  + [Carga de datos desde Amazon EMR](loading-data-from-emr.md)
  + [Carga de datos desde hosts remotos](loading-data-from-remote-hosts.md) 
  + [Carga de datos desde una tabla de Amazon DynamoDB](t_Loading-data-from-dynamodb.md)
+ [Solución de problemas en cargas de datos](t_Troubleshooting_load_errors.md)

## Ejemplos del comando COPY
<a name="r_COPY-using-the-copy-command-examples"></a>

Para ver más ejemplos que muestran cómo usar COPY desde varios orígenes, en formatos dispares y con diferentes opciones de COPY, consulte [Ejemplos de COPY](r_COPY_command_examples.md).

# COPY JOB
<a name="r_COPY-JOB"></a>

Para obtener más información acerca del uso de este comando, consulte [Creación de una integración de eventos de S3 para copiar automáticamente archivos desde buckets de Amazon S3](loading-data-copy-job.md).

Administra los comandos COPY que cargan datos en una tabla. El comando COPY JOB es una extensión del comando COPY y automatiza la carga de datos desde buckets de Amazon S3. Al crear un trabajo COPY, Amazon Redshift detecta cuándo se crean nuevos archivos de Amazon S3 en una ruta especificada y, a continuación, los carga automáticamente sin su intervención. Al cargar los datos se utilizan los mismos parámetros que en el comando COPY original. Amazon Redshift realiza un seguimiento de los archivos cargados (basándose en el nombre de archivo) para verificar que se cargan solo una vez.

**nota**  
Para obtener información sobre el comando COPY, como su uso, parámetros y permisos, consulte [COPY](r_COPY.md).

## Permiso necesario
<a name="r_COPY-JOB-privileges"></a>

Para utilizar el comando COPY JOB, debe tener uno de los siguientes permisos, además de todos los permisos necesarios para utilizar COPY:
+ Superusuario
+  Todos los siguientes: 
  +  El permiso CREATE, ALTER o DROP correspondiente con ámbito para COPY JOBS en la base de datos en la que desea utilizar COPY. 
  +  El permiso USAGE para el esquema en el que desea utilizar COPY o el permiso USAGE con ámbito para los esquemas de la base de datos en la que desea utilizar COPY. 
  +  El permiso INSERT para la tabla en el que desea utilizar COPY o el permiso INSERT con ámbito para las tablas del esquema o la base de datos en el que desea utilizar COPY. 

El rol de IAM especificado con el comando COPY debe tener permiso para acceder a los datos que se van a cargar. Para obtener más información, consulte [Permisos de IAM para COPY, UNLOAD y CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions).

## Sintaxis
<a name="r_COPY-JOB-syntax"></a>

Crear un trabajo de copia. Los parámetros del comando COPY se guardan con el trabajo de copia.

No puede ejecutar COPY JOB CREATE dentro del ámbito de un bloque de transacciones.

```
COPY copy-command JOB CREATE job-name
[AUTO ON | OFF]
```

Cambiar la configuración de un trabajo de copia.

```
COPY JOB ALTER job-name
[AUTO ON | OFF]
```

Ejecutar un trabajo de copia. Se utilizan los parámetros del comando COPY almacenados.

```
COPY JOB RUN job-name
```

Enumerar todos los trabajos de copia.

```
COPY JOB LIST
```

Mostrar los detalles de un trabajo de copia.

```
COPY JOB SHOW job-name
```

Eliminar un trabajo de copia.

No puede ejecutar COPY JOB DROP dentro del ámbito de un bloque de transacciones.

```
COPY JOB DROP job-name
```

## Parameters
<a name="r_COPY-JOB-parameters"></a>

*copy-command*  
Un comando COPY que carga datos desde Amazon S3 en Amazon Redshift. La cláusula contiene los parámetros COPY que definen el bucket de Amazon S3, la tabla de destino, el rol de IAM y otros parámetros que se utilizan al cargar datos. Se admiten todos los parámetros del comando COPY para una carga de datos de Amazon S3, con las siguientes excepciones:  
+ COPY JOB no ingiere archivos preexistentes en la carpeta a la que apunta el comando COPY. Solo se ingieren los archivos creados después de la marca de tiempo de creación de COPY JOB.
+ No puede especificar un comando COPY con las opciones MAXERROR o IGNOREALLERRORS.
+ No puede especificar un archivo de manifiesto. COPY JOB requiere una ubicación de Amazon S3 designada para supervisar los archivos recién creados.
+ No puede especificar un comando COPY con tipos de autorización como Acceso y Claves secretas. Solo se admiten los comandos COPY que utilizan el parámetro `IAM_ROLE` para la autorización. Para obtener más información, consulte [Parámetros de autorización](copy-parameters-authorization.md).
+ COPY JOB no admite el rol de IAM predeterminado asociado al clúster. Debe especificar `IAM_ROLE` en el comando COPY. 
Para obtener más información, consulte [COPY de Amazon S3](copy-parameters-data-source-s3.md).

*job-name*  
El nombre del trabajo que se usa para hacer referencia al trabajo COPY. El valor de *job-name* no puede contener un guion (‐).

 [AUTO ON \$1 OFF]   
Cláusula que indica si los datos de Amazon S3 se cargan automáticamente en las tablas de Amazon Redshift.  
+ Si es `ON`, Amazon Redshift supervisa la ruta de origen de Amazon S3 en busca de archivos recién creados y, si los encuentra, se ejecuta un comando COPY con los parámetros de COPY en la definición del trabajo. Esta es la opción predeterminada.
+ Si es `OFF`, Amazon Redshift no ejecuta COPY JOB automáticamente.

## Notas de uso
<a name="r_COPY-JOB-usage-notes"></a>

Las opciones del comando COPY no se validan hasta el momento de la ejecución. Por ejemplo, un `IAM_ROLE` no válido o un origen de datos de Amazon S3 provoca errores de ejecución cuando se inicia COPY JOB.

Si el clúster está en pausa, no se ejecutan los comandos COPY JOB.

Para consultar los archivos del comando COPY cargados y los errores de carga, consulte [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md), [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md) y [STL\$1LOADERROR\$1DETAIL](r_STL_LOADERROR_DETAIL.md). Para obtener más información, consulte [Comprobación de carga correcta de datos](verifying-that-data-loaded-correctly.md).

Los COPY JOBS no son compatibles con las bases de datos zero-ETL, ya que funcionan en modo de solo lectura.

## Ejemplos
<a name="r_COPY-JOB-examples"></a>

En el siguiente ejemplo se muestra la creación de un trabajo COPY JOB para cargar datos de un bucket de Amazon S3. 

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName' 
JOB CREATE my_copy_job_name
AUTO ON;
```

# COPY con TEMPLATE
<a name="r_COPY-WITH-TEMPLATE"></a>

Puede utilizar plantillas de Redshift con comandos COPY para simplificar la sintaxis de los comandos y garantizar la coherencia en todas las operaciones de carga de datos. En lugar de especificar los mismos parámetros de formato repetidamente, los define una vez en una plantilla y hace referencia a la plantilla en sus comandos COPY. Cuando utiliza una plantilla, el comando COPY combina los parámetros de la plantilla con cualquier parámetro especificado directamente en el comando. Si el mismo parámetro aparece tanto en la plantilla como en el comando, el parámetro del comando tiene prioridad. Para obtener más información, consulte [CREATE TEMPLATE](r_CREATE_TEMPLATE.md). 

Las plantillas para el comando COPY se pueden crear con:
+ [Parámetros de formato de datos](copy-parameters-data-format.md)
+ [Parámetros de compresión de archivos](copy-parameters-file-compression.md)
+ [Parámetros de conversión de datos](copy-parameters-data-conversion.md)
+ [Operaciones de carga de datos](copy-parameters-data-load.md)

Para obtener una lista completa de los parámetros admitidos, consulte el comando [COPY](r_COPY.md).

## Permiso necesario
<a name="r_COPY-WITH-TEMPLATE-privileges"></a>

Para utilizar una plantilla en un comando COPY, debe tener:
+ Todos los permisos necesarios para ejecutar el comando COPY (consulte [Permisos necesarios](r_COPY.md#r_COPY-permissions))
+ Uno de los permisos de plantilla siguientes:
  + Privilegios de superusuario
  + Privilegio USAGE sobre la plantilla y privilegio USAGE sobre el esquema que contiene la plantilla

## Sintaxis
<a name="r_COPY-WITH-TEMPLATE-syntax"></a>

```
COPY target_table FROM 's3://...'
authorization
[ option, ...]
USING TEMPLATE [database_name.][schema_name.]template_name;
```

## Parameters
<a name="r_COPY-WITH-TEMPLATE-parameters"></a>

 *database\$1name*   
(Opcional) El nombre de la base de datos donde se encuentra la plantilla. Si no se especifica, se utiliza la base de datos actual.

 *schema\$1name*   
(Opcional) El nombre del esquema donde se encuentra la plantilla. Si no se especifica, la plantilla se busca en la ruta de búsqueda actual.

 *template\$1name*   
El nombre de la plantilla que se utilizará en COPY. 

## Notas de uso
<a name="r_COPY-WITH_TEMPLATE-usage-notes"></a>
+ Los parámetros específicos del comando (origen, destino, autorización) deben seguir especificándose en el comando COPY.
+ Las plantillas no pueden contener especificaciones de archivos manifiestos para comandos COPY.

## Ejemplos
<a name="r_COPY-WITH-TEMPLATE-examples"></a>

Los ejemplos siguientes muestran cómo crear una plantilla y utilizarla en comandos COPY:

```
CREATE TEMPLATE public.test_template FOR COPY AS
CSV DELIMITER '|' IGNOREHEADER 1 MAXERROR 100;

COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
USING TEMPLATE public.test_template;
```

Cuando un parámetro existe tanto en la plantilla como en el comando, el parámetro del comando tiene prioridad. En este ejemplo, si la plantilla `public.test_template` contiene `DELIMITER '|'` pero el comando COPY especifica `DELIMITER ','`, se usará el delimitador de coma (`,`) del comando en lugar de la barra vertical (`|`) de la plantilla. 

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
DELIMITER ','
USING TEMPLATE public.test_template;
```

# Referencia de parámetros de COPY
<a name="r_COPY-parameters"></a>

COPY tiene muchos parámetros que se pueden utilizar en muchas situaciones. Sin embargo, no todos los parámetros son compatibles en cada situación. Por ejemplo, para cargar desde archivos ORC o PARQUET, se admite un número limitado de parámetros. Para obtener más información, consulte [Uso de COPY con formatos de datos de columnas](copy-usage_notes-copy-from-columnar.md).

**Topics**
+ [Orígenes de datos](copy-parameters-data-source.md)
+ [Parámetros de autorización](copy-parameters-authorization.md)
+ [Opciones de mapeo de columnas](copy-parameters-column-mapping.md)
+ [Parámetros de formato de datos](copy-parameters-data-format.md)
+ [Parámetros de compresión de archivos](copy-parameters-file-compression.md)
+ [Parámetros de conversión de datos](copy-parameters-data-conversion.md)
+ [Operaciones de carga de datos](copy-parameters-data-load.md)
+ [Lista alfabética de parámetros](r_COPY-alphabetical-parm-list.md)

# Orígenes de datos
<a name="copy-parameters-data-source"></a>

Puede cargar datos de archivos de texto en un bucket de Amazon S3, un clúster de Amazon EMR o un alojamiento remoto al cual el clúster pueda acceder a través de una conexión SSH. También puede cargar datos de forma directa desde una tabla de DynamoDB. 

El tamaño máximo de una fila de entrada única de cualquier origen es de 4 MB. 

Para exportar los datos de una tabla a un conjunto de archivos en Amazon S3, utilice el comando [UNLOAD](r_UNLOAD.md). 

**Topics**
+ [COPY de Amazon S3](copy-parameters-data-source-s3.md)
+ [COPY de Amazon EMR](copy-parameters-data-source-emr.md)
+ [COPY de hosts remotos (SSH)](copy-parameters-data-source-ssh.md)
+ [COPY de Amazon DynamoDB](copy-parameters-data-source-dynamodb.md)

# COPY de Amazon S3
<a name="copy-parameters-data-source-s3"></a>

Para cargar datos de archivos ubicados en uno o más buckets de S3, utilice la cláusula FROM para indicar el modo en que COPY localiza los archivos de Amazon S3. Puede proporcionar la ruta de objeto a los archivos de datos como parte de la cláusula FROM o puede proporcionar la ubicación de un archivo de manifiesto que contenga una lista de rutas de objetos de Amazon S3. COPY de Amazon S3 utiliza una conexión HTTPS. Asegúrese de que los rangos de IP de S3 estén agregados a la lista de permitidos. Para obtener más información acerca de los rangos de IP de S3 necesarios, consulte [Aislamiento de red](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation).

**importante**  
Si los buckets de Amazon S3 que contienen los archivos de datos no se encuentran en la misma región de AWS que el clúster, debe utilizar el parámetro [REGION](#copy-region) para especificar la región en la que se encuentran los datos. 

**Topics**
+ [Sintaxis](#copy-parameters-data-source-s3-syntax)
+ [Ejemplos](#copy-parameters-data-source-s3-examples)
+ [Parámetros opcionales](#copy-parameters-data-source-s3-optional-parms)
+ [Parámetros no admitidos](#copy-parameters-data-source-s3-unsupported-parms)

## Sintaxis
<a name="copy-parameters-data-source-s3-syntax"></a>

```
FROM { 's3://objectpath' | 's3://manifest_file' }
authorization
| MANIFEST
| ENCRYPTED
| REGION [AS] 'aws-region'
| optional-parameters
```

## Ejemplos
<a name="copy-parameters-data-source-s3-examples"></a>

En el siguiente ejemplo, se utiliza una ruta de objeto para cargar datos desde Amazon S3. 

```
copy customer
from 's3://amzn-s3-demo-bucket/customer' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

En el siguiente ejemplo, se utiliza un archivo de manifiesto para cargar datos desde Amazon S3. 

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

### Parameters
<a name="copy-parameters-data-source-s3-parameters"></a>

FROM  <a name="copy-parameters-from"></a>
El origen de los datos a cargar. Para obtener más información acerca de la codificación del archivo de Amazon S3, consulte [Parámetros de conversión de datos](copy-parameters-data-conversion.md).

's3://*copy\$1from\$1s3\$1objectpath*'   <a name="copy-s3-objectpath"></a>
Especifica la ruta a los objetos de Amazon S3 que contienen los datos; por ejemplo, `'s3://amzn-s3-demo-bucket/custdata.txt'`. El parámetro *s3://copy\$1from\$1s3\$1objectpath* puede hacer referencia a un único archivo o a un conjunto de objetos o carpetas que tienen el mismo prefijo de clave. Por ejemplo, el nombre `custdata.txt` es un prefijo de clave que hace referencia a un número de archivos físicos: `custdata.txt`, `custdata.txt.1`, `custdata.txt.2`, `custdata.txt.bak` y así sucesivamente. El prefijo de clave también puede hacer referencia a un número de carpetas. Por ejemplo, `'s3://amzn-s3-demo-bucket/custfolder'` hace referencia a las carpetas `custfolder`, `custfolder_1`, `custfolder_2` y así sucesivamente. Si un prefijo de clave hace referencia a varias carpetas, se cargan todos los archivos de esas carpetas. Si un prefijo de clave coincide con un archivo y, a su vez, con una carpeta, como `custfolder.log`, COPY también intenta cargar el archivo. Si un prefijo de clave puede dar lugar a que COPY intente cargar archivos no deseados, utilice un archivo de manifiesto. Para obtener más información, consulte [copy_from_s3_manifest_file](#copy-manifest-file), a continuación.   
Si el bucket de S3 que contiene los archivos de datos no se encuentra en la misma región de AWS que el clúster, debe utilizar el parámetro [REGION](#copy-region) para especificar la región en la que se encuentran los datos.
Para obtener más información, consulte [Carga de datos desde Amazon S3](t_Loading-data-from-S3.md).

's3://*copy\$1from\$1s3\$1manifest\$1file*'   <a name="copy-manifest-file"></a>
Especifica la clave de objeto de Amazon S3 para un archivo de manifiesto que muestra los archivos de datos que se cargarán. El argumento *'s3://*copy\$1from\$1s3\$1manifest\$1file'** debe referenciar de forma explícita un solo archivo; por ejemplo, `'s3://amzn-s3-demo-bucket/manifest.txt'`. No puede hacer referencia a un prefijo de clave.  
El manifiesto es un archivo de texto en formato JSON que muestra la dirección URL de cada archivo que se cargará desde Amazon S3. El URL incluye el nombre del bucket y la ruta de objeto completa para el archivo. Los archivos que se especifican en el manifiesto pueden estar en buckets diferentes, pero todos los buckets deben estar en la misma región de AWS que el clúster de Amazon Redshift. Si un archivo aparece dos veces, este se carga dos veces. En el siguiente ejemplo, se muestra el JSON para un manifiesto que carga tres archivos.   

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1","mandatory":false}
  ]
}
```
Se requieren caracteres de comillas dobles y estas deben ser las comillas simples (0x22), no las comillas inclinadas o “inteligentes”. Cada entrada en el manifiesto puede incluir opcionalmente una marca `mandatory`. Cuando `mandatory` está establecido en `true`, COPY termina si no encuentra el archivo de esa entrada. De lo contrario, COPY continúa. El valor predeterminado de `mandatory` es `false`.   
Cuando la carga se realiza a partir de archivos de datos con formato ORC o Parquet, se necesita un campo `meta`, tal y como se muestra en el siguiente ejemplo.  

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      },
      {  
         "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      }
   ]
}
```
El archivo de manifiesto no debe estar cifrado o comprimido, incluso si se especifican las opciones ENCRYPTED, GZIP, LZOP, BZIP2 o ZSTD. COPY devuelve un error si el archivo de manifiesto especificado no se encuentra o no se creó de forma correcta.   
Si se utiliza un archivo de manifiesto, se debe especificar el parámetro MANIFEST con el comando COPY. Si no se especifica el parámetro MANIFEST, COPY supone que el archivo especificado con FROM es un archivo de datos.   
Para obtener más información, consulte [Carga de datos desde Amazon S3](t_Loading-data-from-S3.md).

*authorization*  
El comando COPY necesita autorización para acceder a los datos de otro recurso de AWS, incluidos los recursos de Amazon S3, Amazon EMR, Amazon DynamoDB y Amazon EC2. Puede proporcionar esa autorización referenciando un rol de AWS Identity and Access Management (IAM) que esté adjunto al clúster (control de acceso basado en roles) o proporcionando las credenciales de acceso de un usuario (control de acceso basado en claves). Para mayor seguridad y flexibilidad, le recomendamos utilizar un control de acceso basado en roles de IAM. Para obtener más información, consulte [Parámetros de autorización](copy-parameters-authorization.md).

MANIFEST  <a name="copy-manifest"></a>
Especifica que se utiliza un manifiesto para identificar los archivos de datos que se cargarán desde Amazon S3. Si se utiliza el parámetro MANIFEST, COPY carga los datos de los archivos que se muestran en el manifiesto al que se hace referencia en *'s3://copy\$1from\$1s3\$1manifest\$1file'*. Si no se encuentra el archivo de manifiesto o no se creó de forma correcta, COPY no se ejecuta correctamente. Para obtener más información, consulte [Uso de un manifiesto para especificar archivos de datos](loading-data-files-using-manifest.md).

ENCRYPTED  <a name="copy-encrypted"></a>
Se trata de una cláusula que especifica que los archivos de entrada en Amazon S3 están cifrados con el cifrado del lado del cliente con claves administradas por el cliente. Para obtener más información, consulte [Carga de archivos de datos cifrados desde Amazon S3](c_loading-encrypted-files.md). No especifique ENCRYPTED si los archivos de entrada están cifrados con el cifrado de servidor de Amazon S3 (SSE-KMS o SSE-S3). COPY lee automáticamente los archivos con cifrados del servidor.  
Si especifica el parámetro ENCRYPTED, también debe especificar el parámetro [MASTER_SYMMETRIC_KEY](#copy-master-symmetric-key) o incluir el valor **master\$1symmetric\$1key** en la cadena [Uso del parámetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials).  
Si los archivos cifrados están en un formato comprimido, agregue el parámetro GZIP, LZOP, BZIP2 o ZSTD.  
Los archivos de manifiesto y los archivos JSONPaths no deben cifrarse aunque la opción ENCRYPTED esté especificada.

MASTER\$1SYMMETRIC\$1KEY '*root\$1key*'  <a name="copy-master-symmetric-key"></a>
Se trata de la clave raíz simétrica que se utilizó para cifrar los archivos de datos en Amazon S3. Si se especifica MASTER\$1SYMMETRIC\$1KEY, también se debe especificar el parámetro [ENCRYPTED](#copy-encrypted). MASTER\$1SYMMETRIC\$1KEY no puede utilizarse con el parámetro CREDENTIALS. Para obtener más información, consulte [Carga de archivos de datos cifrados desde Amazon S3](c_loading-encrypted-files.md).  
Si los archivos cifrados están en un formato comprimido, agregue el parámetro GZIP, LZOP, BZIP2 o ZSTD.

REGION [AS] '*aws\$1region*'  <a name="copy-region"></a>
Especifica la región de AWS en la que se encuentran los datos de origen. Cuando el recurso de AWS que contiene los datos no se encuentra en la misma región que el clúster de Amazon Redshift, se debe utilizar REGION para el comando COPY de un bucket de Amazon S3 o una tabla de DynamoDB   
El valor de *aws\$1region* debe coincidir con una de las regiones que aparecen en la tabla [Regiones y puntos de enlace de Amazon Redshift](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region).  
Si se especifica el parámetro REGION, todos los recursos, incluidos un archivo de manifiesto o varios buckets de Amazon S3, deben encontrarse en la región especificada.   
La transferencia de datos entre regiones genera cargos adicionales en el bucket de Amazon S3 o la tabla de DynamoDB que contiene los datos. Para obtener más información acerca de los precios, consulte **Transferencia OUT de datos de Amazon S3 a otra región de AWS** en la página [Precios de Amazon S3](https://aws.amazon.com/s3/pricing/) y **Transferencia OUT de datos** en la página [Precios de Amazon DynamoDB](https://aws.amazon.com/dynamodb/pricing/). 
De manera predeterminada, COPY supone que los datos se encuentran en la misma región que el clúster de Amazon Redshift. 

## Parámetros opcionales
<a name="copy-parameters-data-source-s3-optional-parms"></a>

Si lo prefiere, puede especificar los siguientes parámetros con COPY de Amazon S3: 
+ [Opciones de mapeo de columnas](copy-parameters-column-mapping.md)
+ [Parámetros de formato de datos](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parámetros de conversión de datos](copy-parameters-data-conversion.md)
+ [Operaciones de carga de datos](copy-parameters-data-load.md)

## Parámetros no admitidos
<a name="copy-parameters-data-source-s3-unsupported-parms"></a>

No puede utilizar los siguientes parámetros con COPY de Amazon S3: 
+ SSH
+ READRATIO

# COPY de Amazon EMR
<a name="copy-parameters-data-source-emr"></a>

Puede utilizar el comando COPY para cargar datos en paralelo desde un clúster de Amazon EMR configurado para escribir archivos de texto en el sistema de archivos Hadoop Distributed File System (HDFS) del clúster como archivos de ancho fijo, archivos delimitados por caracteres, archivos CSV, archivos con formato JSON o archivos Avro.

**Topics**
+ [Sintaxis](#copy-parameters-data-source-emr-syntax)
+ [Ejemplo](#copy-parameters-data-source-emr-example)
+ [Parameters](#copy-parameters-data-source-emr-parameters)
+ [Parámetros admitidos](#copy-parameters-data-source-emr-optional-parms)
+ [Parámetros no admitidos](#copy-parameters-data-source-emr-unsupported-parms)

## Sintaxis
<a name="copy-parameters-data-source-emr-syntax"></a>

```
FROM 'emr://emr_cluster_id/hdfs_filepath'  
authorization
[ optional_parameters ]
```

## Ejemplo
<a name="copy-parameters-data-source-emr-example"></a>

En el siguiente ejemplo, se cargan datos desde un clúster de Amazon EMR. 

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Parameters
<a name="copy-parameters-data-source-emr-parameters"></a>

FROM  
El origen de los datos a cargar. 

 'emr://*emr\$1cluster\$1id*/*hdfs\$1file\$1path*'  <a name="copy-emr"></a>
Se trata del identificador único para el clúster de Amazon EMR y la ruta del archivo de HDFS que referencia los archivos de datos para el comando COPY. Los nombres de los archivos de datos HDFS no deben contener los caracteres comodín de asterisco (\$1) ni de signos de interrogación (?).   
El clúster de Amazon EMR debe seguir en ejecución hasta que se complete la operación COPY. Si se cambia o se elimina cualquiera de los archivos de datos HDFS antes de que se complete la operación COPY, se pueden obtener resultados inesperados o la operación COPY puede fallar. 
Puede utilizar los caracteres comodín asterisco (\$1) y signo de puntuación (?) en el argumento *hdfs\$1file\$1path* para especificar que se carguen varios archivos. Por ejemplo, `'emr://j-SAMPLE2B500FC/myoutput/part*'` identifica los archivos `part-0000`, `part-0001` y así sucesivamente. Si la ruta de archivo no contiene caracteres comodín, se trata como si fuera un literal de cadena. Si solo especifica el nombre de una carpeta, COPY prueba cargar todos los archivos que se encuentran en ella.   
Si utiliza caracteres comodín o solo el nombre de la carpeta, verifique que no se cargarán archivos no deseados. Por ejemplo, algunos procesos podrían escribir un archivo de registro en la carpeta de salida.
Para obtener más información, consulte [Carga de datos desde Amazon EMR](loading-data-from-emr.md).

*authorization*  
El comando COPY necesita autorización para acceder a los datos de otro recurso de AWS, incluidos los recursos de Amazon S3, Amazon EMR, Amazon DynamoDB y Amazon EC2. Puede proporcionar esa autorización referenciando un rol de AWS Identity and Access Management (IAM) que esté adjunto al clúster (control de acceso basado en roles) o proporcionando las credenciales de acceso de un usuario (control de acceso basado en claves). Para mayor seguridad y flexibilidad, le recomendamos utilizar un control de acceso basado en roles de IAM. Para obtener más información, consulte [Parámetros de autorización](copy-parameters-authorization.md).

## Parámetros admitidos
<a name="copy-parameters-data-source-emr-optional-parms"></a>

Si lo prefiere, puede especificar los siguientes parámetros con COPY de Amazon EMR: 
+ [Opciones de mapeo de columnas](copy-parameters-column-mapping.md)
+ [Parámetros de formato de datos](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parámetros de conversión de datos](copy-parameters-data-conversion.md)
+ [Operaciones de carga de datos](copy-parameters-data-load.md)

## Parámetros no admitidos
<a name="copy-parameters-data-source-emr-unsupported-parms"></a>

No puede utilizar los siguientes parámetros con COPY de Amazon EMR: 
+ ENCRYPTED
+ MANIFEST
+ REGION
+ READRATIO
+ SSH

# COPY de hosts remotos (SSH)
<a name="copy-parameters-data-source-ssh"></a>

Puede utilizar el comando COPY para cargar datos en paralelo desde uno o más alojamientos remotos, como instancias de Amazon Elastic Compute Cloud (Amazon EC2) u otros equipos. COPY se conecta a los hosts remotos mediante Secure Shell (SSH) y ejecuta los comandos en los hosts remotos para generar la salida de texto. El alojamiento remoto puede ser una instancia EC2 de Linux u otro equipo Linux o Unix configurada para aceptar conexiones SSH. Amazon Redshift puede conectarse a varios alojamientos y puede establecer varias conexiones SSH en cada alojamiento. Amazon Redshift envía un comando único a través de cada conexión para generar una salida de texto que aparecerá en la salida estándar del alojamiento, la cual Amazon Redshift leerá después como si fuese cualquier otro archivo de texto.

Utilice la cláusula FROM para especificar la clave de objeto de Amazon S3 para el archivo de manifiesto que proporciona la información que COPY utilizará para establecer las conexiones SSH y ejecutar los comandos remotos. 

**Topics**
+ [Sintaxis](#copy-parameters-data-source-ssh-syntax)
+ [Ejemplos](#copy-parameters-data-source-ssh-examples)
+ [Parameters](#copy-parameters-data-source-ssh-parameters)
+ [Parámetros opcionales](#copy-parameters-data-source-ssh-optional-parms)
+ [Parámetros no admitidos](#copy-parameters-data-source-ssh-unsupported-parms)

**importante**  
 Si el bucket de S3 que contiene el archivo de manifiesto no se encuentra en la misma región de AWS que el clúster, debe utilizar el parámetro REGION para especificar la región en la que se encuentra el bucket. 

## Sintaxis
<a name="copy-parameters-data-source-ssh-syntax"></a>

```
FROM 's3://'ssh_manifest_file' }
authorization
SSH
| optional-parameters
```

## Ejemplos
<a name="copy-parameters-data-source-ssh-examples"></a>

En el siguiente ejemplo, se utiliza un archivo de manifiesto para cargar datos desde un host remoto mediante SSH. 

```
copy sales
from 's3://amzn-s3-demo-bucket/ssh_manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
ssh;
```

## Parameters
<a name="copy-parameters-data-source-ssh-parameters"></a>

FROM  
El origen de los datos a cargar. 

's3://*copy\$1from\$1ssh\$1manifest\$1file*'  <a name="copy-ssh-manifest"></a>
El comando COPY puede conectarse con distintos hosts mediante Secure Shell (SSH, Shell seguro) y puede crear distintas conexiones SSH a cada host. COPY ejecuta un comando a través de cada conexión al host y, luego, carga la salida en la tabla desde los comandos en paralelo. El argumento *s3://copy\$1from\$1ssh\$1manifest\$1file* especifica la clave de objeto de Amazon S3 del archivo de manifiesto que proporciona la información que COPY utiliza para establecer conexiones SSH y ejecutar los comandos remotos.  
El argumento *s3://copy\$1from\$1ssh\$1manifest\$1file* debe referenciar de forma explícita un solo archivo y no puede ser un prefijo de clave. A continuación se muestra un ejemplo:  

```
's3://amzn-s3-demo-bucket/ssh_manifest.txt'
```
El archivo de manifiesto es un archivo de texto con formato JSON que Amazon Redshift usa para conectarse al alojamiento. En el archivo de manifiesto, se especifican los puntos de conexión del host SSH y los comandos que se ejecutarán en los hosts para devolver datos a Amazon Redshift. De forma opcional, puede incluir la clave pública del host, el nombre de usuario de inicio de sesión y una marca obligatoria para cada entrada. En el siguiente ejemplo, se muestra un archivo de manifiesto que crea dos conexiones SSH:   

```
{ 
    "entries": [ 
	    {"endpoint":"<ssh_endpoint_or_IP>", 
           "command": "<remote_command>",
           "mandatory":true, 
           "publickey": "<public_key>", 
           "username": "<host_user_name>"}, 
	    {"endpoint":"<ssh_endpoint_or_IP>", 
           "command": "<remote_command>",
           "mandatory":true, 
           "publickey": "<public_key>", 
           "username": "<host_user_name>"} 
     ] 
}
```
El archivo de manifiesto contiene una construcción `"entries"` para cada conexión SSH. Puede tener distintas conexiones a un único host o distintas conexiones a distintos hosts. Se requieren caracteres de comillas dobles, como se muestra, para los valores y los nombres de campo. Las comillas deben ser las comillas simples (0x22), no las comillas inclinadas o “inteligentes”. El único valor que no necesita caracteres de comillas dobles es el valor booleano `true` o `false` del campo `"mandatory"`.   
En la siguiente lista se describen los campos del archivo de manifiesto.     
endpoint  <a name="copy-ssh-manifest-endpoint"></a>
Se trata de la dirección URL o la dirección IP del alojamiento; por ejemplo, `"ec2-111-222-333.compute-1.amazonaws.com"` o `"198.51.100.0"`.   
comando  <a name="copy-ssh-manifest-command"></a>
El comando que ejecutará el host para generar la salida de texto o la salida binaria en formato gzip, lzop, bzip2 o zstd. El comando puede ser cualquiera que el usuario *"host\$1user\$1name" (nombre\$1de\$1usuario\$1del\$1host)* tenga permiso para ejecutar. El comando puede ser tan sencillo como imprimir un archivo, o puede consultar una base de datos o lanzar un script. La salida (archivo de texto o archivos binarios gzip, lzop o bzip2) debe estar en un formato que el comando COPY de Amazon Redshift pueda capturar. Para obtener más información, consulte [Preparación de los datos de entrada](t_preparing-input-data.md).  
publickey  <a name="copy-ssh-manifest-publickey"></a>
(Opcional) La clave pública del host. Si se proporciona la clave pública, Amazon Redshift la usará para identificar el alojamiento. Si no se proporciona la clave pública, Amazon Redshift no intentará identificar el alojamiento. Por ejemplo, si la clave pública del host remoto es `ssh-rsa AbcCbaxxx…Example root@amazon.com`, escriba el siguiente texto en el campo de clave pública: `"AbcCbaxxx…Example"`.  
mandatory  <a name="copy-ssh-manifest-mandatory"></a>
(Opcional) Una cláusula que indica si el comando COPY debe fallar en caso de que el intento de conexión falle. El valor predeterminado es `false`. Si Amazon Redshift no logra establecer al menos una conexión, el comando COPY presentará error.  
nombre de usuario  <a name="copy-ssh-manifest-username"></a>
(Opcional) Se trata del nombre de usuario que se utilizará para iniciar sesión en el sistema de alojamiento y ejecutar el comando remoto. El nombre de inicio de sesión del usuario debe ser el mismo que se utilizó para agregar la clave pública del clúster de Amazon Redshift al archivo de claves autorizadas del alojamiento. El nombre de usuario predeterminado es `redshift`.
Para obtener más información acerca de la creación de un archivo de manifiesto, consulte [Proceso de carga de datos](loading-data-from-remote-hosts.md#load-from-host-process).  
Para utilizar COPY desde un host remoto, se debe especificar el parámetro SSH con el comando COPY. Si no se especifica el parámetro SSH, COPY supone que el archivo especificado con FROM es un archivo de datos y no se ejecutará correctamente.   
Si utiliza la compresión automática, el comando COPY realiza dos operaciones de lectura de los datos, lo que significa que ejecutará el comando remoto dos veces. La primera operación de lectura se realiza para proporcionar una muestra de datos para el análisis de compresión, la segunda operación de lectura es la que carga los datos. Si ejecutar el comando remoto dos veces puede producir un problema, debe deshabilitar la compresión automática. Para deshabilitar la compresión automática, ejecute el comando COPY con el parámetro COMPUPDATE establecido en OFF. Para obtener más información, consulte [Carga de tablas con compresión automática](c_Loading_tables_auto_compress.md).  
Para obtener los procedimientos detallados para utilizar COPY de SSH, consulte [Carga de datos desde hosts remotos](loading-data-from-remote-hosts.md).

*authorization*  
El comando COPY necesita autorización para acceder a los datos de otro recurso de AWS, incluidos los recursos de Amazon S3, Amazon EMR, Amazon DynamoDB y Amazon EC2. Puede proporcionar esa autorización referenciando un rol de AWS Identity and Access Management (IAM) que esté adjunto al clúster (control de acceso basado en roles) o proporcionando las credenciales de acceso de un usuario (control de acceso basado en claves). Para mayor seguridad y flexibilidad, le recomendamos utilizar un control de acceso basado en roles de IAM. Para obtener más información, consulte [Parámetros de autorización](copy-parameters-authorization.md).

SSH  <a name="copy-ssh"></a>
Una cláusula que especifica que los datos se van a cargar desde un host remoto mediante el protocolo SSH. Si especifica SSH, también debe proporcionar un archivo de manifiesto mediante el argumento [s3://copy_from_ssh_manifest_file](#copy-ssh-manifest).   
Si utiliza SSH para copiar datos de un host con una dirección IP privada en una VPC remota, la VPC debe tener habilitado el direccionamiento de VPC mejorado. Para obtener más información sobre el direccionamiento de VPC mejorado, consulte el artículo sobre el [direccionamiento de VPC mejorado en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html)

## Parámetros opcionales
<a name="copy-parameters-data-source-ssh-optional-parms"></a>

Opcionalmente, puede especificar los siguientes parámetros con COPY de SSH: 
+ [Opciones de mapeo de columnas](copy-parameters-column-mapping.md)
+ [Parámetros de formato de datos](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parámetros de conversión de datos](copy-parameters-data-conversion.md)
+ [Operaciones de carga de datos](copy-parameters-data-load.md)

## Parámetros no admitidos
<a name="copy-parameters-data-source-ssh-unsupported-parms"></a>

No puede utilizar los siguientes parámetros con COPY de SSH: 
+ ENCRYPTED
+ MANIFEST
+ READRATIO

# COPY de Amazon DynamoDB
<a name="copy-parameters-data-source-dynamodb"></a>

Si desea cargar datos de una tabla existente de DynamoDB, utilice la cláusula FROM para especificar el nombre de la tabla de DynamoDB.

**Topics**
+ [Sintaxis](#copy-parameters-data-source-dynamodb-syntax)
+ [Ejemplos](#copy-parameters-data-source-dynamodb-examples)
+ [Parámetros opcionales](#copy-parameters-data-source-dynamodb-optional-parms)
+ [Parámetros no admitidos](#copy-parameters-data-source-dynamodb-unsupported-parms)

**importante**  
Si la tabla de DynamoDB no se encuentra en la misma región que el clúster de Amazon Redshift, debe utilizar el parámetro REGION para especificar la región en la que se encuentran los datos. 

## Sintaxis
<a name="copy-parameters-data-source-dynamodb-syntax"></a>

```
FROM 'dynamodb://table-name' 
authorization
READRATIO ratio
| REGION [AS] 'aws_region'  
| optional-parameters
```

## Ejemplos
<a name="copy-parameters-data-source-dynamodb-examples"></a>

En el siguiente ejemplo, se cargan datos de una tabla de DynamoDB. 

```
copy favoritemovies from 'dynamodb://ProductCatalog'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
readratio 50;
```

### Parameters
<a name="copy-parameters-data-source-dynamodb-parameters"></a>

FROM  
El origen de los datos a cargar. 

'dynamodb://*table-name (nombre-tabla)*'  <a name="copy-dynamodb"></a>
Se trata del nombre de la tabla de DynamoDB que contiene los datos; por ejemplo, `'dynamodb://ProductCatalog'`. Para obtener detalles acerca de cómo se asignan los atributos de DynamoDB a las columnas de Amazon Redshift, consulte [Carga de datos desde una tabla de Amazon DynamoDB](t_Loading-data-from-dynamodb.md).  
El nombre de una tabla de DynamoDB es único para una cuenta de AWS, que se identifica con las credenciales de acceso de AWS.

*authorization*  
El comando COPY necesita autorización para acceder a los datos de otro recurso de AWS, incluidos los recursos de Amazon S3, Amazon EMR, DynamoDB y Amazon EC2. Puede proporcionar esa autorización referenciando un rol de AWS Identity and Access Management (IAM) que esté adjunto al clúster (control de acceso basado en roles) o proporcionando las credenciales de acceso de un usuario (control de acceso basado en claves). Para mayor seguridad y flexibilidad, le recomendamos utilizar un control de acceso basado en roles de IAM. Para obtener más información, consulte [Parámetros de autorización](copy-parameters-authorization.md).

READRATIO [AS] *ratio*  <a name="copy-readratio"></a>
Se trata del porcentaje del rendimiento aprovisionado de la tabla de DynamoDB para utilizar en la carga de datos. Se requiere READRATIO para utilizar COPY de DynamoDB. No se puede utilizar con COPY de Amazon S3. Le recomendamos encarecidamente establecer la ratio en un valor menor que el rendimiento provisionado sin utilizar promedio. Los valores válidos son números enteros que forman parte del rango 1-200.  
Si establece READRATIO en 100 o más permite a Amazon Redshift consumir la totalidad del rendimiento aprovisionado de la tabla de DynamoDB, lo que degrada seriamente el rendimiento de las operaciones de lectura simultáneas que se produzcan en la misma tabla durante la sesión de COPY. El tráfico de escritura no resulta afectado. Los valores superiores a 100 se permiten para solucionar problemas en situaciones raras por las que Amazon Redshift no cumple el rendimiento aprovisionado de la tabla. Si carga datos de DynamoDB en Amazon Redshift de forma continua, considere la posibilidad de organizar las tablas de DynamoDB como series temporales para separar el tráfico activo de la operación COPY.

## Parámetros opcionales
<a name="copy-parameters-data-source-dynamodb-optional-parms"></a>

Si lo prefiere, puede especificar los siguientes parámetros con COPY de Amazon DynamoDB: 
+ [Opciones de mapeo de columnas](copy-parameters-column-mapping.md)
+ Se admiten los siguientes parámetros de conversión de datos:
  + [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate) 
  + [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull) 
  + [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat) 
  + [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull) 
  + [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 
  + [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat) 
  + [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks) 
  + [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns) 
+ [Operaciones de carga de datos](copy-parameters-data-load.md)

## Parámetros no admitidos
<a name="copy-parameters-data-source-dynamodb-unsupported-parms"></a>

No se pueden utilizar los siguientes parámetros con COPY de DynamoDB: 
+ Todos los parámetros de formatos de datos
+ ESCAPE
+ FILLRECORD
+ IGNOREBLANKLINES
+ IGNOREHEADER
+ NULL
+ REMOVEQUOTES
+ ACCEPTINVCHARS
+ MANIFEST
+ ENCRYPTED

# Parámetros de autorización
<a name="copy-parameters-authorization"></a>

El comando COPY necesita autorización para acceder a los datos de otro recurso de AWS, incluidos los recursos de Amazon S3, Amazon EMR, Amazon DynamoDB y Amazon EC2. Puede proporcionar esa autorización si hace referencia a un [rol de (IAM) de AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) que esté asociado a su clúster (*role-based access control*). Puede cifrar los datos de carga en Amazon S3. 

En los siguientes temas se proporcionan más detalles y ejemplos de opciones de autenticación:
+ [Permisos de IAM para COPY, UNLOAD y CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)
+ [Control de acceso con base en roles](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)
+ [Control de acceso basado en claves](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based)

Utilice una de las siguientes opciones para brindar autorización al comando COPY: 
+ [Uso del parámetro IAM\$1ROLE](#copy-iam-role)Parámetro de 
+ [Uso de los parámetros ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY](#copy-access-key-id)Parámetros 
+ [Uso del parámetro CREDENTIALS](#copy-credentials)Cláusula 

## Uso del parámetro IAM\$1ROLE
<a name="copy-iam-role"></a>

### IAM\$1ROLE
<a name="copy-iam-role-iam"></a>

Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando COPY. 

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. Si especifica IAM\$1ROLE, no puede utilizar ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN ni CREDENTIALS.

A continuación, se muestra la sintaxis del parámetro IAM\$1ROLE. 

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

Para obtener más información, consulte [Control de acceso con base en roles](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

## Uso de los parámetros ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id"></a>

### ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id-access"></a>

No se recomienda este método de autorización. 

**nota**  
En lugar de proporcionar credenciales de acceso como texto sin formato, le recomendamos encarecidamente utilizar una autenticación basada en roles mediante la especificación del parámetro IAM\$1ROLE. Para obtener más información, consulte [Control de acceso con base en roles](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

### SESSION\$1TOKEN
<a name="copy-token"></a>

El token de sesión para utilizar con credenciales de acceso temporales. Cuando se especifica SESSION\$1TOKEN, también debe utilizar ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY para proporcionar credenciales temporales de clave de acceso. Si especifica SESSION\$1TOKEN, no puede utilizar IAM\$1ROLE ni CREDENTIALS. ‎Para obtener más información, consulte [Credenciales de seguridad temporales](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials) en la Guía del usuario de IAM.

**nota**  
En lugar de crear credenciales de seguridad temporales, le recomendamos encarecidamente utilizar una autenticación basada en roles. Cuando brinda autorización mediante un rol de IAM, Amazon Redshift crea de forma automática credenciales temporales de usuario para cada sesión. Para obtener más información, consulte [Control de acceso con base en roles](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

A continuación se muestra la sintaxis del parámetro SESSION\$1TOKEN con los parámetros ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY. 

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

Si especifica SESSION\$1TOKEN, no puede utilizar CREDENTIALS ni IAM\$1ROLE. 

## Uso del parámetro CREDENTIALS
<a name="copy-credentials"></a>

### CREDENTIALS
<a name="copy-credentials-cred"></a>

Se trata de una cláusula que indica el método que el clúster utilizará cuando obtenga acceso a otros recursos de AWS que contienen archivos de datos o archivos de manifiesto. No puede utilizar el parámetro CREDENTIALS con IAM\$1ROLE ni con ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY.

A continuación, se muestra la sintaxis del parámetro CREDENTIALS.

```
[WITH] CREDENTIALS [AS] 'credentials-args'
```

**nota**  
Para mayor flexibilidad, recomendamos utilizar el parámetro [IAM\$1ROLE](#copy-iam-role-iam) en lugar del parámetro CREDENTIALS.

De manera opcional, si se usa el parámetro [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted), la cadena *credentials-args (credenciales-argumentos)* también proporciona la clave de cifrado.

La cadena *credentials-args* distingue entre mayúsculas y minúsculas y no debe contener espacios.

Las palabras clave WITH y AS son opcionales y se ignoran.

Puede especificar [role-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based.phrase) o [key-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based.phrase). En ambos casos, el rol o el usuario de IAM deben tener los permisos necesarios para acceder a los recursos de AWS especificados. Para obtener más información, consulte [Permisos de IAM para COPY, UNLOAD y CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions). 

**nota**  
Para salvaguardar las credenciales de AWS y proteger la información confidencial, le recomendamos encarecidamente utilizar un control de acceso basado en roles. 

Para especificar un control de acceso basado en funciones, proporcione la cadena *credentials-args (credenciales-argumentos)* en el siguiente formato.

```
'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
```

Para usar las credenciales de token temporales, debe proporcionar el ID de clave de acceso temporal, la clave de acceso secreta temporal y el token temporal. La cadena *credentials-args* tiene el siguiente formato. 

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>'
```

Un comando COPY que utilice un control de acceso basado en roles con credenciales temporales se parecería a la siguiente instrucción de ejemplo: 

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key-id>;token=<temporary-token>'
```

 Para obtener más información, consulte [Credenciales de seguridad temporales](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials).

Si se utiliza el parámetro [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted), la cadena *credentials-args* tiene el siguiente formato, donde *<root-key>* es el valor de la clave raíz que se utilizó para cifrar los archivos.

```
CREDENTIALS
'<credentials-args>;master_symmetric_key=<root-key>'
```

Un comando COPY que utilice un control de acceso basado en roles con una clave de cifrado se parecería a la siguiente instrucción de ejemplo:

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
CREDENTIALS 
'aws_iam_role=arn:aws:iam::<account-id>:role/<role-name>;master_symmetric_key=<root-key>'
```

# Opciones de mapeo de columnas
<a name="copy-parameters-column-mapping"></a>

De manera predeterminada, COPY inserta los valores en las columnas de la tabla de destino en el mismo orden que aparecen los campos en los archivos de datos. Si el orden de columnas predeterminado no funcionará, puede especificar una lista de columnas o utilizar las expresiones JSONPath para asignar los campos de datos de origen a las columnas de destino. 
+ [Column List](#copy-column-list)
+ [JSONPaths File](#copy-column-mapping-jsonpaths)

## Lista de columnas
<a name="copy-column-list"></a>

Puede especificar una lista de nombres de columnas separada por comas para cargar los campos de datos de origen en columnas de destino específicas. Las columnas pueden estar en cualquier orden en la instrucción COPY, pero, cuando se cargan desde archivos sin formato, como en un bucket de Amazon S3, el orden debe coincidir con el de los datos de origen. 

Cuando se realiza la carga desde una tabla de Amazon DynamoDB, el orden no importa. El comando COPY establece una correspondencia entre los nombres de atributos de los elementos recuperados de la tabla de DynamoDB y los nombres de columnas de una tabla de Amazon Redshift. Para obtener más información, consulte [Carga de datos desde una tabla de Amazon DynamoDB](t_Loading-data-from-dynamodb.md)

 El formato para una lista de columnas es el siguiente.

```
COPY tablename (column1 [,column2, ...]) 
```

Si una columna de la tabla de destino se omite de la lista de columnas, COPY carga la expresión [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) de la columna de destino.

Si la columna de destino no tiene un valor predeterminado, COPY intenta cargar NULL.

Si COPY prueba asignar NULL a una columna que está definida como NOT NULL, el comando COPY falla. 

Si se incluye una columna [IDENTITY](r_CREATE_TABLE_NEW.md#identity-clause) en la lista de columnas, también se debe especificar [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids). Si se omite una columna IDENTITY, no se puede especificar EXPLICIT\$1IDS. Si no se especifica una lista de columnas, el comando se comporta como si se especificará una lista de columnas por orden completa, con la omisión de columnas IDENTITY si tampoco se especificó EXPLICIT\$1IDS.

Si una columna se define con GENERATED BY DEFAULT AS IDENTITY, se puede copiar. Los valores se generan o se actualizan con los que se proporcionan. La opción EXPLICIT\$1IDS no es obligatoria. COPY no actualiza el límite máximo de la identidad. Para obtener más información, consulte [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

## Archivo JSONPaths
<a name="copy-column-mapping-jsonpaths"></a>

Cuando se realiza una carga desde archivos de datos en formatos JSON o Avro, COPY asigna de forma automática los elementos de datos en los datos de origen Avro o JSON a las columnas de la tabla de destino. Logra esto al hacer coincidir los nombres de los campos del esquema de Avro con los nombres de las columnas de la lista de columnas o la tabla de destino.

En algunos casos, los nombres de las columnas y los nombres de los campos no coinciden, o bien, es necesario asignarlos a niveles más profundos en la jerarquía de los datos. En estos casos, puede utilizar un archivo JSONPaths para asignar de forma explícita los elementos de datos JSON o Avro a las columnas. 

Para obtener más información, consulte [Archivo JSONPaths](copy-parameters-data-format.md#copy-json-jsonpaths). 

# Parámetros de formato de datos
<a name="copy-parameters-data-format"></a>

De manera predeterminada, el comando COPY espera que los datos de origen estén en texto UTF-8 delimitado por caracteres. El delimitador predeterminado es el carácter de barra vertical ( \$1 ). Si los datos de origen están en otro formato, utilice los siguientes parámetros para especificar el formato de datos: 
+ [FORMAT](#copy-format)
+ [CSV](#copy-csv)
+ [DELIMITER](#copy-delimiter) 
+ [FIXEDWIDTH](#copy-fixedwidth) 
+ [SHAPEFILE](#copy-shapefile) 
+ [AVRO](#copy-avro) 
+ [JSON format for COPY](#copy-json) 
+ [PARQUET](#copy-parquet) 
+ [ORC](#copy-orc) 

Además de los formatos de datos estándar, COPY admite los siguientes formatos de datos en columnas para COPY de Amazon S3: 
+ [ORC](#copy-orc) 
+ [PARQUET](#copy-parquet) 

Existen ciertas restricciones para poder usar el comando COPY con el formato de columnas. Para obtener más información, consulte [Uso de COPY con formatos de datos de columnas](copy-usage_notes-copy-from-columnar.md). <a name="copy-data-format-parameters"></a>Parámetros de formato de datos

FORMAT [AS]  <a name="copy-format"></a>
(Opcional) Identifica palabras clave de los formatos de datos. Los argumentos FORMAT se describen a continuación.

CSV [ QUOTE [AS] *'quote\$1character'* ]  <a name="copy-csv"></a>
Permite el uso del formato CSV en los datos de entrada. Para aplicar escape de forma automática a los delimitadores, los caracteres de línea nueva y los retornos de carro, encierre el campo con el carácter especificado por el parámetro QUOTE. El carácter de comilla predeterminado es el de comilla doble ( " ). Cuando utilice el carácter de comilla dentro del campo, aplique escape al carácter con un carácter de comilla adicional. Por ejemplo, si los caracteres de comillas son comillas dobles, para insertar la cadena `A "quoted" word`, el archivo de entrada debe incluir la cadena `"A ""quoted"" word"`. Cuando se utiliza el parámetro CSV, el delimitador predeterminado es una coma ( , ). Puede especificar un delimitador diferente con el parámetro DELIMITER.   
Cuando se encierra un campo entre comillas, se ignora el espacio en blanco entre los delimitadores y los caracteres de comillas. Si el delimitador es un carácter de espacio en blanco, como un tabulador, el delimitador no se trata como un espacio en blanco.  
CSV no puede utilizarse con FIXEDWIDTH, REMOVEQUOTES ni ESCAPE.     
QUOTE [AS] *'quote\$1character'*  <a name="copy-csv-quote"></a>
Opcional. Especifica el carácter que se utilizará como carácter de comilla cuando se utilice el parámetro CSV. El carácter predeterminado es una comilla doble ( " ). Si utiliza el parámetro QUOTE para definir un carácter de comilla distinto al de comilla doble, no es necesario que aplique escape a las comillas dobles dentro del campo. El parámetro QUOTE solo puede utilizarse con el parámetro CSV. La palabra clave AS es opcional.

DELIMITER [AS] ['*delimiter\$1char*']   <a name="copy-delimiter"></a>
Especifica caracteres que se utilizan para separar campos en el archivo de entrada, como un carácter de barra vertical (`|`), una coma (`,`), una tabulación (`\t`) o varios caracteres, como `|~|`. Se admiten los caracteres no imprimibles. Los caracteres también se pueden representar en formato octal como unidades de código UTF-8. Para el formato octal, utilice el formato “\$1ddd”, donde “d” es un dígito octal (de 0 a 7). El delimitador predeterminado es un carácter de barra vertical (`|`), a menos que se utilice el parámetro CSV, en cuyo caso el delimitador predeterminado es una coma (`,`). La palabra clave AS es opcional. DELIMITER no se puede utilizar con FIXEDWIDTH.

FIXEDWIDTH '*fixedwidth\$1spec*'   <a name="copy-fixedwidth"></a>
Carga los datos de un archivo en el que el ancho de cada columna tiene una longitud fija, en lugar de que las columnas estén separadas por un delimitador. La cadena *fixedwidth\$1spec (especificación\$1de\$1ancho\$1fijo)* especifica una etiqueta de columnas definida por el usuario y el ancho de columnas. La etiqueta de columnas puede ser una cadena de texto o un número entero, según lo que decida el usuario. La etiqueta de columnas no tiene relación con el nombre de las columnas. El orden de los pares etiqueta/ancho debe coincidir con el orden de las columnas de la tabla de forma exacta. FIXEDWIDTH no se puede utilizar con CSV ni DELIMITER. En Amazon Redshift, la longitud de las columnas CHAR y VARCHAR se expresa en bytes, por lo que debe asegurarse de que el ancho de la columna que especifique se adapte a la longitud binaria de caracteres multibyte cuando prepare el archivo que se cargará. Para obtener más información, consulte [Tipos de caracteres](r_Character_types.md).   
A continuación, se muestra el formato para *fixedwidth\$1spec*:   

```
'colLabel1:colWidth1,colLabel:colWidth2, ...'
```

SHAPEFILE [ SIMPLIFY [AUTO] [*'tolerance'*] ]  <a name="copy-shapefile"></a>
Permite el uso del formato SHAPEFILE en los datos de entrada. De manera predeterminada, la primera columna del shapefile es una columna `GEOMETRY` o `IDENTITY`. Todas las columnas posteriores tienen el orden especificado en el shapefile.  
SHAPEFILE no puede utilizarse con FIXEDWIDTH, REMOVEQUOTES ni ESCAPE.   
Para utilizar objetos `GEOGRAPHY` con `COPY FROM SHAPEFILE`, primero captúrelos en una columna `GEOMETRY` y, a continuación, convierta los objetos en objetos `GEOGRAPHY`.    
SIMPLIFY [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(Opcional) Simplifica toda la geometría durante el proceso de ingesta mediante el algoritmo de Ramer-Douglas-Peucker y la tolerancia dada.   
SIMPLIFY AUTO [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(Opcional) Simplifica solo la geometría que sea más grandes que el tamaño máximo de geometría. Esta simplificación utiliza el algoritmo de Ramer-Douglas-Peucker y la tolerancia calculada de forma automática si no supera la tolerancia especificada. Este algoritmo calcula el tamaño para almacenar objetos en el marco de la tolerancia especificada. El valor *tolerance* es opcional.
Para ver ejemplos de carga de shapefiles, consulte [Carga de un shapefile en Amazon Redshift](r_COPY_command_examples.md#copy-example-spatial-copy-shapefile).

AVRO [AS] '*avro\$1option*'  <a name="copy-avro"></a>
Especifica que los datos de origen estén en formato de Avro.   
El formato de Avro se admite para COPY de estos servicios y protocolos:  
+ Amazon S3 
+ Amazon EMR 
+ Hosts remotos (SSH) 
Avro no es compatible con COPY de DynamoDB.   
Avro es un protocolo de serialización de datos. Un archivo de origen Avro incluye un esquema que define la estructura de los datos. El tipo de esquema de Avro debe ser `record`. COPY acepta archivos Avro creados mediante el códec predeterminado sin comprimir como también los códecs de compresión `deflate` y `snappy`. Para obtener más información acerca de Avro, visite [Apache Avro](https://avro.apache.org/).   
Los valores válidos para *avro\$1option* son los siguientes:  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
El valor predeterminado es `'auto'`.  
COPY asigna de forma automática los elementos de datos en los datos de origen Avro a las columnas de la tabla de destino. Logra esto al hacer coincidir los nombres de los campos del esquema de Avro con los nombres de las columnas de la tabla de destino. La coincidencia distingue entre letras mayúsculas y minúsculas en `'auto'`, y no distingue entre letras mayúsculas y minúsculas en `'auto ignorecase'`.   
Los nombres de las columnas de las tablas de Amazon Redshift están siempre en minúsculas; por lo tanto, cuando utilice la opción `'auto'`, los nombres de campos coincidentes también deben estar en minúsculas. Si los nombres de los campos no están en minúsculas por completo, puede utilizar la opción `'auto ignorecase'`. Con el argumento predeterminado `'auto'`, COPY solo reconoce el primer nivel de campos o los *campos externos* de la estructura.   
Para asignar explícitamente nombres de columnas a nombres de campos de Avro, puede utilizar [Archivo JSONPaths](#copy-json-jsonpaths).   
De manera predeterminada, COPY intenta hacer coincidir todas las columnas de la tabla de destino con los nombres de campos de Avro. Si lo desea, puede especificar una lista de columnas para cargar un subconjunto de las columnas. Si una columna de la tabla de destino se omite de la lista de columnas, COPY carga la expresión [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) de la columna de destino. Si la columna de destino no tiene un valor predeterminado, COPY intenta cargar NULL. Si se incluye una columna en la lista de columnas y COPY no encuentra un campo coincidente en los datos Avro, COPY intenta cargar NULL en la columna.   
Si COPY prueba asignar NULL a una columna que está definida como NOT NULL, el comando COPY falla.   
<a name="copy-avro-schema"></a>**Esquema de Avro**  
Un archivo de datos de origen Avro incluye un esquema que define la estructura de los datos. COPY lee el esquema que forma parte del archivo de datos de origen Avro para asignar elementos de datos a las columnas de la tabla de destino. En el siguiente ejemplo, se muestra un esquema de Avro.   

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"}]
}
```
El esquema de Avro se define mediante el formato JSON. El objeto JSON de nivel superior contiene tres pares de nombre-valor con los nombres o las *claves*: `"name"`, `"type"` y `"fields"`.   
Los pares de claves `"fields"` con una matriz de objetos que define el nombre y el tipo de datos de cada campo en la estructura de datos. De manera predeterminada, COPY automáticamente hace coincidir los nombres de los campos con los nombres de las columnas. Los nombres de las columnas están siempre en minúsculas, por lo que los nombres de los campos coincidentes también deben estar en minúsculas, a menos que se especifique la opción `‘auto ignorecase’`. Cualquier nombre de campo que no coincida con el nombre de una columna se ignora. El orden no es importante. En el ejemplo anterior, COPY asigna `id`, `guid`, `name` y `address` a los nombres de columnas.   
Con el argumento predeterminado `'auto'`, COPY hace coincidir con las columnas solo los objetos de primer nivel. Para asignar a niveles más profundos en el esquema, o si los nombres de los campos y los de las columnas no coinciden, utilice un archivo JSONPaths para definir el mapeo. Para obtener más información, consulte [Archivo JSONPaths](#copy-json-jsonpaths).   
Si el valor asociado a una clave es un tipo complejo de datos Avro, como byte, matriz, registro, mapeo o enlace, COPY carga el valor como una cadena. Aquí, la cadena es la representación JSON de los datos. COPY carga los tipos de datos enum de Avro como cadenas, donde el contenido es el nombre del tipo. Para ver un ejemplo, consulta [COPY de formato JSON](copy-usage_notes-copy-from-json.md).  
El tamaño máximo del encabezado del archivo de Avro, incluidos el esquema y los metadatos del archivo, es de 1 MB.     
El tamaño máximo de un solo bloque de datos de Avro es de 4 MB. Este es distinto al tamaño máximo de filas. Si se supera el tamaño máximo de un bloque de datos de Avro individual, aunque el tamaño de filas obtenido sea menor al límite de tamaño de filas de 4 MB, el comando COPY falla.   
Cuando se calcula el tamaño de las filas, Amazon Redshift cuenta de forma interna los caracteres de barra vertical ( \$1 ) dos veces. Si los datos de entrada contienen un número muy grande de caracteres de barra vertical, es posible que el tamaño de filas supere los 4 MB, aunque el bloque de datos sea menor a 4 MB.

JSON [AS] '*json\$1option (opción\$1json)*'  <a name="copy-json"></a>
Los datos de origen están en formato JSON.   
El formato JSON se admite para COPY de estos servicios y protocolos:  
+ Amazon S3
+ COPY de Amazon EMR
+ COPY de SSH
JSON no es compatible con COPY de DynamoDB.   
Los valores válidos para *json\$1option* son los siguientes:  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
+ `'noshred'` 
El valor predeterminado es `'auto'`. Amazon Redshift no fragmenta los atributos de las estructuras JSON en varias columnas mientras carga un documento JSON.  
De manera predeterminada, COPY intenta hacer coincidir todas las columnas de la tabla de destino con las claves de nombres de campos JSON. Si lo desea, puede especificar una lista de columnas para cargar un subconjunto de las columnas. Si las claves de los nombres de campos JSON no están en minúsculas por completo, puede utilizar la opción `'auto ignorecase'` o [Archivo JSONPaths](#copy-json-jsonpaths) para asignar de forma explícita los nombres de las columnas a las claves de los nombres de campos JSON.  
Si una columna de la tabla de destino se omite de la lista de columnas, COPY carga la expresión [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) de la columna de destino. Si la columna de destino no tiene un valor predeterminado, COPY intenta cargar NULL. Si se incluye una columna en la lista de columnas y COPY no encuentra un campo coincidente entre los datos JSON, COPY intenta cargar NULL en la columna.   
Si COPY prueba asignar NULL a una columna que está definida como NOT NULL, el comando COPY falla.   
COPY asigna los elementos de datos en los datos de origen JSON a las columnas de la tabla de destino. Logra esto al hacer coincidir las *claves de objetos*, o los nombres, en los pares de nombre-valor de origen con los nombres de las columnas de la tabla de destino.   
Consulte los siguientes detalles acerca de cada valor *json\$1option*:    
'auto'  <a name="copy-json-auto"></a>
Con esta opción, para la coincidencia, se distingue letras entre mayúsculas y minúsculas. Los nombres de las columnas de las tablas de Amazon Redshift están siempre en minúsculas; por lo tanto, cuando utilice la opción `'auto'`, los nombres de campos JSON coincidentes también deben estar en minúsculas.  
'auto ignorecase'  <a name="copy-json-auto-ignorecase"></a>
Con esta opción, para la coincidencia, no se distingue letras entre mayúsculas y minúsculas. Los nombres de las columnas de las tablas de Amazon Redshift están siempre en minúsculas; por lo tanto, cuando utilice la opción `'auto ignorecase'`, los nombres de campos JSON correspondientes pueden estar en minúsculas, mayúsculas, en minúsculas o en mayúsculas y minúsculas.   
's3://*jsonpaths\$1file*'  <a name="copy-json-pathfile"></a>
Con esta opción, COPY utiliza el archivo JSONPaths mencionado para asignar los elementos de datos en los datos de origen JSON a las columnas de la tabla de destino. El argumento *`s3://jsonpaths_file`* debe ser una clave de objeto de Amazon S3 que referencie de forma explícita un solo archivo. Un ejemplo es . `'s3://amzn-s3-demo-bucket/jsonpaths.txt`'. El argumento no puede ser un prefijo de clave. Para obtener más información acerca del uso de un archivo JSONPaths, consulte [Archivo JSONPaths](#copy-json-jsonpaths).  
En algunos casos, el archivo especificado por `jsonpaths_file` tiene el mismo prefijo que la ruta especificada por `copy_from_s3_objectpath` para los archivos de datos. En tal caso, COPY lee el archivo JSONPaths como un archivo de datos y devuelve errores. Por ejemplo, supongamos que los archivos de datos utilizan la ruta de objeto `s3://amzn-s3-demo-bucket/my_data.json`, y el archivo JSONPaths es `s3://amzn-s3-demo-bucket/my_data.jsonpaths`. En este caso, COPY intenta cargar `my_data.jsonpaths` como un archivo de datos.  
'noshred'  <a name="copy-json-noshred"></a>
Con esta opción, Amazon Redshift no fragmenta los atributos de las estructuras JSON en varias columnas mientras carga un documento JSON.

## Archivo de datos JSON
<a name="copy-json-data-file"></a>

El archivo de datos JSON contiene un conjunto de objetos o matrices. COPY carga cada objeto o matriz JSON en una fila de la tabla de destino. Cada objeto o matriz correspondiente a una fila debe ser una estructura independiente en el nivel raíz, es decir, no debe ser miembro de otra estructura JSON.

Un *objeto* JSON comienza y termina con llaves ( \$1 \$1 ), y contiene una colección de pares de nombre-valor desordenada. Cada valor y nombre de los pares están separados por dos puntos y los pares están separados por comas. De manera predeterminada, la *clave de objeto*, o el nombre, en los pares de nombre-valor debe coincidir con el nombre de la columna correspondiente en la tabla. Los nombres de las columnas de las tablas de Amazon Redshift están siempre en minúsculas; por lo tanto, las claves de los nombres de los campos JSON coincidentes también deben estar en minúsculas. Si los nombres de las columnas y las claves JSON no coinciden, utilice [Archivo JSONPaths](#copy-json-jsonpaths) para asignar de forma explícita las columnas a las claves. 

El orden de los objetos JSON no importa. Cualquier nombre que no coincida con el nombre de una columna se ignora. A continuación, se muestra la estructura de un objeto JSON simple.

```
{
  "column1": "value1",
  "column2": value2,
  "notacolumn" : "ignore this value"
}
```

Una *matriz* JSON comienza y termina con corchetes ( [ ] ) y contiene una colección ordenada de valores separados por comas. Si los archivos de datos utilizan matrices, debe especificar un archivo JSONPaths para hacer coincidir los valores con las columnas. A continuación, se muestra la estructura de una matriz JSON simple. 

```
["value1", value2]
```

El JSON debe tener un formato correcto. Por ejemplo, los objetos o las matrices no pueden separarse con comas o cualquier otro carácter, a excepción de un espacio en blanco. Las cadenas se deben encerrar entre caracteres de comilla doble. Los caracteres de comillas deben ser las comillas comunes (0x22), no las inclinadas ni las "inteligentes".

El tamaño máximo de un objeto o matriz JSON individual, incluidas las llaves o los corchetes, es de 4 MB. Este es distinto al tamaño máximo de filas. Si se supera el tamaño máximo de un objeto o matriz JSON individual, aunque el tamaño de filas obtenido sea menor al límite de tamaño de filas de 4 MB, el comando COPY falla. 

Cuando se calcula el tamaño de las filas, Amazon Redshift cuenta de forma interna los caracteres de barra vertical ( \$1 ) dos veces. Si los datos de entrada contienen un número muy grande de caracteres de barra vertical, es posible que el tamaño de filas supere los 4 MB, aunque el tamaño del objeto sea menor a 4 MB.

COPY carga `\n` como un carácter de línea nueva y `\t` como un tabulador. Para cargar una barra inversa, aplique escape con una barra inversa ( `\\` ).

COPY busca el origen de JSON especificado para obtener un objeto o matriz JSON válido con un formato correcto. Si COPY encuentra caracteres que no sean de espacios en blanco antes de localizar una estructura JSON utilizable o entre objetos o matrices JSON válidos, COPY devuelve un error para cada instancia. Estos errores cuentan para el recuento de errores MAXERROR. Cuando el recuento de errores iguala o supera MAXERROR, COPY falla. 

Por cada error, Amazon Redshift registra una fila en la tabla de sistema STL\$1LOAD\$1ERRORS. La columna LINE\$1NUMBER registra la última línea del objeto JSON que provocó el error. 

Si se especifica IGNOREHEADER, COPY ignora el número de líneas especificado en los datos JSON. Los caracteres de línea nueva en los datos JSON siempre se cuentan para los cálculos IGNOREHEADER. 

De manera predeterminada, COPY carga las cadenas vacías como campos vacíos. Si se especifica EMPTYASNULL, COPY carga las cadenas vacías para los campos CHAR y VARCHAR como NULL. Las cadenas vacías para otros tipos de datos, como INT, siempre se cargan con NULL. 

Las siguientes opciones no son compatibles con JSON: 
+ CSV
+ DELIMITER 
+ ESCAPE
+ FILLRECORD 
+ FIXEDWIDTH
+ IGNOREBLANKLINES
+ NULL AS
+ READRATIO
+ REMOVEQUOTES 

Para obtener más información, consulte [COPY de formato JSON](copy-usage_notes-copy-from-json.md). Para obtener más información acerca de las estructuras de datos JSON, visite [www.json.org](https://www.json.org/). 

## Archivo JSONPaths
<a name="copy-json-jsonpaths"></a>

Si el usuario carga datos de origen Avro o en formato JSON, de manera predeterminada, COPY asigna los elementos de datos de primer nivel en los datos de origen a las columnas de la tabla de destino. Logra esto al hacer coincidir cada nombre, o clave de objeto, en un par de nombre-valor con el nombre de una columna de la tabla de destino. 

Si los nombres de las columnas y las claves de objeto no coinciden, o si desea asignar a niveles más profundos en la jerarquía de datos, puede utilizar un archivo JSONPaths para asignar de forma explícita elementos de datos JSON o de Avro a las columnas. El archivo JSONPaths asigna los elementos de datos JSON a las columnas haciendo coincidir el orden de columnas en la lista de columnas o tabla de destino.

El archivo JSONPaths debe contener solo un objeto JSON (no una matriz). El objeto JSON es un par de nombre-valor. La *clave de objeto*, que es el nombre del par de nombre-valor, debe ser `"jsonpaths"`. El *valor* del par de nombre-valor es una matriz de *expresiones JSONPath*. Cada expresión JSONPath hace referencia a un elemento individual en la jerarquía de datos JSON o el esquema de Avro, de forma parecida al modo en que una expresión XPath hace referencia a los elementos de un documento XML. Para obtener más información, consulte [Expresiones JSONPath](#copy-json-jsonpath-expressions).

Para utilizar un archivo JSONPaths, agregue la palabra clave AVRO o JSON al comando COPY. Especifique el nombre del bucket de S3 y la ruta de objeto del archivo JSONPaths con el siguiente formato.

```
COPY tablename 
FROM 'data_source' 
CREDENTIALS 'credentials-args' 
FORMAT AS { AVRO | JSON } 's3://jsonpaths_file';
```

El valor `s3://jsonpaths_file` debe ser una clave de objeto de Amazon S3 que referencie de forma explícita un solo archivo, como `'s3://amzn-s3-demo-bucket/jsonpaths.txt'`. No puede ser un prefijo de clave. 

En algunos casos, si la carga se realiza desde Amazon S3, el archivo especificado por `jsonpaths_file` tiene el mismo prefijo que la ruta especificada por `copy_from_s3_objectpath` para los archivos de datos. En tal caso, COPY lee el archivo JSONPaths como un archivo de datos y devuelve errores. Por ejemplo, supongamos que los archivos de datos utilizan la ruta de objeto `s3://amzn-s3-demo-bucket/my_data.json`, y el archivo JSONPaths es `s3://amzn-s3-demo-bucket/my_data.jsonpaths`. En este caso, COPY intenta cargar `my_data.jsonpaths` como un archivo de datos.

 Si el nombre de clave es una cadena distinta de `"jsonpaths"`, el comando COPY no devuelve un error, pero omite *jsonpaths\$1file* y utiliza el argumento `'auto'` en su lugar. 

Si sucede alguna de las siguientes situaciones, el comando COPY falla:
+ El JSON tiene un formato incorrecto.
+ Existe más de un objeto JSON.
+ Algún carácter a excepción del espacio en blanco existe fuera del objeto.
+ Un elemento de la matriz es una cadena vacía o no es una cadena.

MAXERROR no se aplica al archivo JSONPaths. 

El archivo JSONPaths no debe cifrarse aunque la opción [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) esté especificada.

Para obtener más información, consulte [COPY de formato JSON](copy-usage_notes-copy-from-json.md). 

## Expresiones JSONPath
<a name="copy-json-jsonpath-expressions"></a>

El archivo JSONPaths utiliza expresiones JSONPath para asignar los campos de datos a las columnas de destino. Cada expresión JSONPath corresponde a una columna de la tabla de destino de Amazon Redshift. El orden de los elementos de la matriz JSONPath debe coincidir con el orden de las columnas de la tabla de destino o de la lista de columnas, si se utiliza una. 

Se requieren caracteres de comillas dobles, como se muestra, para los valores y los nombres de campo. Las comillas deben ser las comillas simples (0x22), no las comillas inclinadas o “inteligentes”.

Si un elemento de objeto indicado por una expresión JSONPath no se encuentra en los datos JSON, COPY intenta cargar un valor NULL. Si el objeto indicado tiene un formato incorrecto, COPY devuelve un error de carga. 

Si un elemento de la matriz al que se hace referencia en la expresión JSONPath no se encuentra en los datos de Avro o JSON, COPY registra el siguiente error: `Invalid JSONPath format: Not an array or index out of range.` Elimine de JSONPaths todos los elementos de la matriz que no existan en los datos de origen y verifique que las matrices de los datos de origen tienen el formato correcto.  

Las expresiones JSONPath pueden utilizar notaciones con corchetes o con puntos, pero las notaciones no se pueden combinar. En el siguiente ejemplo, se muestran expresiones JSONPath que utilizan la notación con corchetes. 

```
{
    "jsonpaths": [
        "$['venuename']",
        "$['venuecity']",
        "$['venuestate']",
        "$['venueseats']"
    ]
}
```

En el siguiente ejemplo, se muestran expresiones JSONPath que utilizan la notación con puntos. 

```
{
    "jsonpaths": [
        "$.venuename",
        "$.venuecity",
        "$.venuestate",
        "$.venueseats"
    ]
}
```

En el contexto de la sintaxis de COPY de Amazon Redshift, una expresión JSONPath debe especificar la ruta explícita a un elemento de nombre único en una estructura de datos jerárquica de Avro o JSON. Amazon Redshift no admite ningún elemento de JSONPath, como caracteres comodín o expresiones de filtro, que pueda resolverse como una ruta ambigua o como varios elementos de nombre.

Para obtener más información, consulte [COPY de formato JSON](copy-usage_notes-copy-from-json.md). 

## Uso de JSONPaths con datos de Avro
<a name="using-jsonpath-with-avro"></a>

En el siguiente ejemplo, se muestra un esquema de Avro con varios niveles.

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "isActive", "type": "boolean"},
        {"name": "age", "type": "int"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"},
        {"name": "latitude", "type": "double"},
        {"name": "longitude", "type": "double"},
        {
            "name": "tags",
            "type": {
                        "type" : "array",
                        "name" : "inner_tags",
                        "items" : "string"
                    }
        },
        {
            "name": "friends",
            "type": {
                        "type" : "array",
                        "name" : "inner_friends",
                        "items" : {
                                    "name" : "friends_record",
                                    "type" : "record",
                                    "fields" : [
                                                 {"name" : "id", "type" : "int"},
                                                 {"name" : "name", "type" : "string"}
                                               ]
                                  }
                    }
        },
        {"name": "randomArrayItem", "type": "string"}
    ]
}
```

En el siguiente ejemplo, se muestra un archivo JSONPaths que utiliza las expresiones AvroPath para hacer referencia al esquema anterior. 

```
{
    "jsonpaths": [
        "$.id",
        "$.guid",
        "$.address",
        "$.friends[0].id"
    ]
}
```

El ejemplo de JSONPaths incluye los siguientes elementos:

jsonpaths  
El nombre del objeto JSON que contiene las expresiones AvroPath.

[ … ]  
Los corchetes encierran la matriz JSON que contiene los elementos de la ruta.

\$1  
El símbolo de dólar hace referencia al elemento raíz en el esquema de Avro, que es la matriz `"fields"`.

"\$1.id",  
El destino de la expresión AvroPath. En esta instancia, el destino es el elemento de la matriz `"fields"` con el nombre `"id"`. Las expresiones están separadas por comas.

"\$1.friends[0].id"  
Los corchetes indican un índice de matriz. Las expresiones JSONPath utilizan una indexación de base cero, por lo que esta expresión hace referencia al primer elemento de la matriz `"friends"` con el nombre `"id"`.

La sintaxis del esquema de Avro requiere el uso de *campos internos* para definir la estructura de registro y los tipos de datos de matriz. Las expresiones AvroPath ignoran los campos internos. Por ejemplo, el campo `"friends"` define una matriz denominada `"inner_friends"`, que a su vez define un registro denominado `"friends_record"`. La expresión AvroPath que hace referencia al campo `"id"` puede ignorar los campos adicionales para hacer referencia directamente al campo de destino. Las siguientes expresiones AvroPath hacen referencia a los dos campos que pertenecen a la matriz `"friends"`.

```
"$.friends[0].id"
"$.friends[0].name"
```

## Parámetros de formatos de datos en columnas
<a name="copy-parameters-columnar-data"></a>

Además de los formatos de datos estándar, COPY admite los siguientes formatos de datos en columnas para COPY de Amazon S3. Existen ciertas restricciones para poder usar el comando COPY con el formato de columnas. Para obtener más información, consulte [Uso de COPY con formatos de datos de columnas](copy-usage_notes-copy-from-columnar.md). 

ORC  <a name="copy-orc"></a>
Carga los datos desde un archivo que utiliza el formato Optimized Row Columnar (ORC). 

PARQUET  <a name="copy-parquet"></a>
Carga los datos desde un archivo que utiliza el formato Parquet. 

# Parámetros de compresión de archivos
<a name="copy-parameters-file-compression"></a>

Especifique los siguientes parámetros para cargar desde archivos de datos comprimidos. Parámetros de compresión de archivos

BZIP2   <a name="copy-bzip2"></a>
Un valor que especifica que el o los archivos de entrada están en el formato comprimido bzip2 (archivos .bz2). La operación COPY lee cada archivo comprimido y descomprime los datos a medida que los carga.

GZIP   <a name="copy-gzip"></a>
Un valor que especifica que el o los archivos de entrada están en el formato comprimido gzip (archivos .gz). La operación COPY lee cada archivo comprimido y descomprime los datos a medida que los carga.

LZOP   <a name="copy-lzop"></a>
Un valor que especifica que el o los archivos de entrada están en el formato comprimido lzop (archivos .lzo). La operación COPY lee cada archivo comprimido y descomprime los datos a medida que los carga.  
COPY no admite archivos que estén comprimidos con la opción *--filter* de lzop.

ZSTD   <a name="copy-zstd"></a>
Un valor que especifica que el o los archivos de entrada están en el formato comprimido Zstandard (archivos .zst). La operación COPY lee cada archivo comprimido y descomprime los datos a medida que los carga.  
ZSTD solo es compatible con COPY de Amazon S3.

# Parámetros de conversión de datos
<a name="copy-parameters-data-conversion"></a>

A medida que carga la tabla, COPY intenta convertir de forma implícita las cadenas de los datos de origen al tipo de datos de la columna de destino. Si necesita especificar una conversión que sea diferente a la del comportamiento predeterminado, o si la conversión predeterminada da lugar a errores, puede administrar las conversiones de datos especificando los siguientes parámetros. Para obtener más información sobre la sintaxis de estos parámetros, consulte [Sintaxis de COPY](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html#r_COPY-syntax).
+ [ACCEPTANYDATE](#copy-acceptanydate) 
+ [ACCEPTINVCHARS](#copy-acceptinvchars) 
+ [BLANKSASNULL](#copy-blanksasnull) 
+ [DATEFORMAT](#copy-dateformat) 
+ [EMPTYASNULL](#copy-emptyasnull) 
+ [ENCODING](#copy-encoding) 
+ [ESCAPE](#copy-escape) 
+ [EXPLICIT_IDS](#copy-explicit-ids) 
+ [FILLRECORD](#copy-fillrecord) 
+ [IGNOREBLANKLINES](#copy-ignoreblanklines) 
+ [IGNOREHEADER](#copy-ignoreheader) 
+ [NULL AS](#copy-null-as) 
+ [REMOVEQUOTES](#copy-removequotes) 
+ [ROUNDEC](#copy-roundec) 
+ [TIMEFORMAT](#copy-timeformat) 
+ [TRIMBLANKS](#copy-trimblanks) 
+ [TRUNCATECOLUMNS](#copy-truncatecolumns) <a name="copy-data-conversion-parameters"></a>Parámetros de conversión de datos

ACCEPTANYDATE   <a name="copy-acceptanydate"></a>
Permite que se cargue cualquier formato de fecha, incluidos los formatos no válidos como `00/00/00 00:00:00`, sin generar un error. Este parámetro aplica solo para las columnas TIMESTAMP y DATE. Siempre utilice ACCEPTANYDATE con el parámetro DATEFORMAT. Si el formato de fecha de los datos no coincide con la especificación DATEFORMAT, Amazon Redshift inserta un valor NULL en ese campo.

ACCEPTINVCHARS [AS] ['*replacement\$1char*']   <a name="copy-acceptinvchars"></a>
Permite cargar datos en las columnas VARCHAR, aunque los datos contengan caracteres UTF-8 no válidos. Cuando se especifica ACCEPTINVCHARS, COPY sustituye todos los caracteres UTF-8 no válidos por una cadena de la misma longitud que se compone del carácter especificado en *replacement\$1char (carácter\$1de\$1sustitución)*. Por ejemplo, si el carácter de sustitución es "`^`", un carácter de tres bytes no válido será sustituido por "`^^^`".  
 El carácter de sustitución puede ser cualquier carácter ASCII, excepto NULL. El carácter predeterminado es un signo de interrogación (?). Para obtener más información acerca de los caracteres UTF-8 no válidos, consulte [Errores de carga de caracteres multibyte](multi-byte-character-load-errors.md).  
COPY devuelve el número de filas que contienen caracteres UTF-8 no válidos y agrega una entrada a la tabla de sistema [STL\$1REPLACEMENTS](r_STL_REPLACEMENTS.md) por cada fila afectada, hasta un máximo de 100 filas por cada sector del nodo. También se sustituyen otros caracteres UTF-8 no válidos, pero esos eventos de sustitución no se registran.  
Si no se especifica ACCEPTINVCHARS, COPY devuelve un error siempre que encuentra un carácter UTF-8 no válido.   
ACCEPTINVCHARS es válido solo para las columnas VARCHAR.

BLANKSASNULL   <a name="copy-blanksasnull"></a>
Carga los campos en blanco, que estén compuestos solo por caracteres de espacios en blanco, como NULL. Esta opción aplica solo para las columnas CHAR y VARCHAR. Los campos en blanco para otros tipos de datos, como INT, siempre se cargan con NULL. Por ejemplo, una cadena que contiene tres caracteres de espacio de forma sucesiva (y ningún otro carácter) se carga como NULL. El comportamiento predeterminado, sin esta opción, es cargar los caracteres de espacio como están. 

DATEFORMAT [AS] \$1'*dateformat\$1string*' \$1 'auto' \$1  <a name="copy-dateformat"></a>
Si no se especifica DATEFORMAT, el formato predeterminado es `'YYYY-MM-DD'`. Por ejemplo, una alternativa de formato válida sería `'MM-DD-YYYY'`.   
Si el comando COPY no reconoce el formato de los valores de fecha u hora, o si los valores de fecha u hora usan formatos diferentes, utilice el argumento `'auto'` con el parámetro DATEFORMAT o TIMEFORMAT. El argumento `'auto'` reconoce varios formatos que no se admiten cuando se utiliza una cadena DATEFORMAT y TIMEFORMAT. La palabra clave `'auto'` distingue entre mayúsculas y minúsculas. Para obtener más información, consulte [Utilización del reconocimiento automático con DATEFORMAT y TIMEFORMAT](automatic-recognition.md).   
El formato de fecha puede incluir información de hora (hora, minutos, segundos), pero esta información se ignora. La palabra clave AS es opcional. Para obtener más información, consulte [Cadenas TIMEFORMAT y DATEFORMATEjemplo](r_DATEFORMAT_and_TIMEFORMAT_strings.md).

EMPTYASNULL   <a name="copy-emptyasnull"></a>
Indica que Amazon Redshift debe cargar los campos CHAR y VARCHAR vacíos como NULL. Los campos vacíos para otros tipos de datos, como INT, siempre se cargan con NULL. Los campos vacíos se producen cuando los datos contienen dos delimitadores de forma sucesiva sin caracteres entre los delimitadores. EMPTYASNULL y NULL AS '' (cadena vacía) producen el mismo comportamiento.

ENCODING [AS] *file\$1encoding*  <a name="copy-encoding"></a>
Especifica el tipo de codificación de los datos de carga. El comando COPY convierte los datos de la codificación especificada a UTF-8 durante la carga.   
Los valores válidos de *file\$1encoding* son los siguientes:  
+ `UTF8`
+ `UTF16`
+ `UTF16LE`
+ `UTF16BE`
+ `ISO88591`
El valor predeterminado es `UTF8`.  
Los nombres de archivo de origen deben utilizar la codificación UTF-8.  
Los siguientes archivos deben utilizar la codificación UTF-8, aunque se especifique una codificación diferente para los datos de carga:  
+ Archivos de manifiesto
+ Archivos JSONPaths
La cadena de argumentos proporcionada con los siguientes parámetros debe utilizar UTF-8:  
+ FIXEDWIDTH '*fixedwidth\$1spec*'
+ ACCEPTINVCHARS '*replacement\$1char*'
+ DATEFORMAT '*dateformat\$1string*'
+ TIMEFORMAT '*timeformat\$1string*'
+ NULL AS '*null\$1string*'
Los archivos de datos de ancho fijo deben utilizar la codificación UTF-8. Los anchos de campo se basan en la cantidad de caracteres, no en el número de bytes.   
Todos los datos de carga deben utilizar la codificación especificada. Si COPY encuentra una codificación diferente, omite el archivo y devuelve un error.   
Si especifica `UTF16`, los datos deben tener una marca de orden de bytes (BOM). Si sabe si los datos UTF-16 tienen el formato little-endian (LE) o big-endian (BE), puede utilizar `UTF16LE` o `UTF16BE`, independientemente de la presencia de una BOM.   
Para utilizar la codificación ISO-8859-1, especifique `ISO88591`. Para obtener más información, consulte [ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1) en *Wikipedia*.

ESCAPE   <a name="copy-escape"></a>
Cuando se especifica este parámetro, el carácter de barra oblicua inversa (`\`) en los datos de entrada se trata como un carácter de escape. El carácter que sigue inmediatamente al carácter de barra oblicua inversa se carga en la tabla como parte del valor actual de la columna, aunque sea un carácter que por lo general tiene un propósito especial. Por ejemplo, puede utilizar este parámetro para aplicar escape al carácter delimitador, a una comilla, a un carácter de línea nueva incrustado o al carácter de escape en sí cuando cualquiera de estos caracteres es una parte legítima del valor de una columna.  
Si especifica el parámetro ESCAPE en combinación con el parámetro REMOVEQUOTES, puede aplicar escape y conservar las comillas (`'` o `"`) que, de otro modo, se podrían eliminar. La cadena nula predeterminada, `\N`, funciona como está, pero también se le puede aplicar escape en los datos de entrada como `\\N`. Mientras no especifique una cadena nula alternativa con el parámetro NULL AS, `\N` y `\\N` producirán los mismos resultados.  
Al carácter de control `0x00` (NUL) no se le puede aplicar escape y se debe eliminar de los datos de entrada o se debe convertir. Este carácter se trata como un marcador de fin de registro (EOR), lo que provoca que el resto del registro se trunque.
No se puede utilizar el parámetro ESCAPE para las cargas FIXEDWIDTH y no se puede especificar el carácter de escape en sí. El carácter de escape es siempre la barra inversa. También, debe asegurarse de que los datos de entrada contengan el carácter de escape en los lugares adecuados.  
Estos son algunos ejemplos de los datos de entrada y los datos cargados que se obtienen cuando se especifica el parámetro ESCAPE. El resultado de la fila 4 supone que también se especifica el parámetro REMOVEQUOTES. Los datos de entrada se componen por dos campos delimitados por barras verticales:   

```
1|The quick brown fox\[newline]
jumped over the lazy dog.
2| A\\B\\C
3| A \| B \| C
4| 'A Midsummer Night\'s Dream'
```
Los datos cargados en la columna 2 tendrán este aspecto:   

```
The quick brown fox
jumped over the lazy dog.
A\B\C
A|B|C
A Midsummer Night's Dream
```
La aplicación del carácter de escape a los datos de entrada para una carga es responsabilidad del usuario. Existe una excepción a este requisito cuando vuelve a cargar datos que se descargaron anteriormente con el parámetro ESCAPE. En este caso, los datos ya contendrán los caracteres de escape necesarios.
El parámetro ESCAPE no interpreta los códigos octal, hexadecimal, Unicode ni otras notaciones de secuencias de escape. Por ejemplo, si los datos de origen contienen el valor de salto de línea octal (`\012`) e intenta cargar estos datos con el parámetro ESCAPE, Amazon Redshift cargará el valor `012` en la tabla y no interpretará este valor como un salto de línea al que se le está aplicando escape.  
Para poder aplicar escape a los caracteres de línea nueva en datos que se originan en plataformas de Microsoft Windows, es posible que necesite utilizar dos caracteres de escape: uno para el retorno de carro y otro para el salto de línea. También puede eliminar los retornos de carro antes de cargar el archivo (por ejemplo, mediante la utilidad dos2unix).

EXPLICIT\$1IDS   <a name="copy-explicit-ids"></a>
Utilice EXPLICIT\$1IDS con tablas que tengan columnas IDENTITY si desea sustituir los valores autogenerados con valores explícitos de los archivos de datos de origen para las tablas. Si el comando incluye una lista de columnas, esa lista debe incluir las columnas IDENTITY para utilizar este parámetro. El formato de datos para los valores EXPLICIT\$1IDS debe coincidir con el formato de IDENTITY especificado por la definición CREATE TABLE.  
Cuando ejecute un comando COPY en una tabla con la opción EXPLICIT\$1IDS, Amazon Redshift no comprueba la singularidad de las columnas IDENTITY de la tabla.  
Si una columna se define con GENERATED BY DEFAULT AS IDENTITY, se puede copiar. Los valores se generan o se actualizan con los que se proporcionan. La opción EXPLICIT\$1IDS no es obligatoria. COPY no actualiza el límite máximo de la identidad.  
 Para ver un ejemplo de un comando COPY que utiliza EXPLICIT\$1IDS, consulte [Carga de VENUE con valores explícitos para una columna IDENTITY](r_COPY_command_examples.md#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column).

FILLRECORD   <a name="copy-fillrecord"></a>
Permite que se carguen los archivos de datos cuando faltan columnas contiguas al final de alguno de los registros. Las columnas que faltan se cargan como NULL. Para los formatos de texto y CSV, si la columna que falta es una columna VARCHAR, se cargan cadenas de longitud cero en lugar de NULL. Para cargar columnas NULL en columnas VARCHAR mediante texto y CSV, especifique la palabra clave EMPTYASNULL. La sustitución por NULL solo funciona si la definición de la columna permite NULL.  
Por ejemplo, si la definición de la tabla contiene cuatro columnas CHAR con valores nulos y un registro contiene los valores `apple, orange, banana, mango`, el comando COPY podría cargar y completar un registro que solo contenga los valores `apple, orange`. Los valores CHAR faltantes se cargarían como valores NULL.

IGNOREBLANKLINES   <a name="copy-ignoreblanklines"></a>
Ignora las líneas en blanco que solo contienen un salto de línea en un archivo de datos y no prueba cargarlos.

IGNOREHEADER [ AS ] *number\$1rows*   <a name="copy-ignoreheader"></a>
Trata los valores *number\$1rows* (número\$1de\$1filas) especificados como un encabezado de archivo y no los carga. Utilice IGNOREHEADER para omitir encabezados de archivos de todos los archivos en una carga paralela.

NULL AS '*null\$1string*'   <a name="copy-null-as"></a>
Carga los campos en los que el valor de *null\$1string* es NULL, donde *null\$1string* puede ser cualquier cadena. Si los datos incluyen un carácter nulo, también denominado NUL (UTF-8 0000) o cero binario (0x000), COPY lo trata como cualquier otro carácter. Por ejemplo, un registro que contiene '1' \$1\$1 NUL \$1\$1 '2' se copia como cadena de 3 bytes de longitud. Si un campo solo contiene NUL, puede utilizar NULL AS para reemplazar el carácter nulo con NULL mediante la especificación de `'\0'` o `'\000'`; por ejemplo, `NULL AS '\0'` o `NULL AS '\000'`. Si un campo contiene una cadena que termina con NUL y se especifica NULL AS, la cadena se inserta con NUL al final. No utilice '\$1n' (línea nueva) para el valor de *null\$1string*. Amazon Redshift reserva '\$1n' para utilizarlo como delimitador de línea. El valor de *null\$1string* predeterminado es `'\N`'.  
Si intenta cargar valores nulos en una columna definida como NOT NULL, el comando COPY producirá un error.

REMOVEQUOTES   <a name="copy-removequotes"></a>
Elimina las comillas circundantes de las cadenas en los datos entrantes. Todos los caracteres dentro de las comillas, incluidos los delimitadores, se conservan. Si una cadena tiene una comilla de apertura simple o doble pero no su signo de cierre correspondiente, el comando COPY no puede cargar esa fila y devuelve un error. En la siguiente tabla, se muestran algunos ejemplos simples de cadenas que contienen comillas y los valores cargados que se obtienen.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/copy-parameters-data-conversion.html)

ROUNDEC   <a name="copy-roundec"></a>
Redondea hacia arriba los valores numéricos cuando la escala del valor de entrada es mayor que la escala de la columna. De manera predeterminada, COPY trunca los valores cuando sea necesario ajustar la escala de la columna. Por ejemplo, si un valor de `20.259` se carga en una columna DECIMAL(8,2), COPY trunca el valor a `20.25` de manera predeterminada. Si se especifica ROUNDEC, COPY redondea el valor a `20.26`. El comando INSERT siempre redondea los valores cuando es necesario que coincidan con la escala de la columna, por lo que un comando COPY con el parámetro ROUNDEC se comporta igual que un comando INSERT.

TIMEFORMAT [AS] \$1'*timeformat\$1string*' \$1 'auto' \$1 'epochsecs' \$1 'epochmillisecs' \$1  <a name="copy-timeformat"></a>
Especifica el formato de hora. Si no se especifica TIMEFORMAT, el formato predeterminado es `YYYY-MM-DD HH:MI:SS` para las columnas TIMESTAMP o `YYYY-MM-DD HH:MI:SSOF` para las columnas TIMESTAMPTZ, donde `OF` es el desplazamiento de la hora universal coordinada (UTC). No puede incluir un especificador de zona horaria en *timeformat\$1string*. Para cargar datos TIMESTAMPTZ que estén en un formato diferente al predeterminado, especifique 'auto'. Para obtener más información, consulte [Utilización del reconocimiento automático con DATEFORMAT y TIMEFORMAT](automatic-recognition.md). Para obtener más información acerca de *timeformat\$1string*, consulte [Cadenas TIMEFORMAT y DATEFORMATEjemplo](r_DATEFORMAT_and_TIMEFORMAT_strings.md).  
El argumento `'auto'` reconoce varios formatos que no se admiten cuando se utiliza una cadena DATEFORMAT y TIMEFORMAT. Si el comando COPY no reconoce el formato de los valores de fecha u hora, o si los valores de fecha y hora usan formatos diferentes entre sí, utilice el argumento `'auto'` con el parámetro DATEFORMAT o TIMEFORMAT. Para obtener más información, consulte [Utilización del reconocimiento automático con DATEFORMAT y TIMEFORMAT](automatic-recognition.md).   
Si los datos de origen se representan como un tiempo de fecha de inicio, que es el número de segundos o milisegundos desde las 00:00:00 UTC del 1 de enero de 1970, especifique `'epochsecs'` o `'epochmillisecs'`.   
Las palabras clave `'auto'`, `'epochsecs'` y `'epochmillisecs'` distinguen entre mayúsculas y minúsculas.  
La palabra clave AS es opcional.

TRIMBLANKS   <a name="copy-trimblanks"></a>
Elimina los caracteres de espacio en blanco del final de una cadena VARCHAR. Este parámetro aplica solo para las columnas con un tipo de datos VARCHAR.

TRUNCATECOLUMNS   <a name="copy-truncatecolumns"></a>
Trunca los datos de las columnas al número adecuado de caracteres de modo que se ajuste a la especificación de la columna. Aplica solo para las columnas con un tipo de datos CHAR o VARCHAR y filas de 4 MB de tamaño, o menos.

# Operaciones de carga de datos
<a name="copy-parameters-data-load"></a>

Administre el comportamiento predeterminado de la operación de carga para solucionar problemas o reducir los tiempos de carga especificando los siguientes parámetros. 
+ [COMPROWS](#copy-comprows) 
+ [COMPUPDATE](#copy-compupdate) 
+ [IGNOREALLERRORS](#copy-ignoreallerrors) 
+ [MAXERROR](#copy-maxerror) 
+ [NOLOAD](#copy-noload) 
+ [STATUPDATE](#copy-statupdate) <a name="copy-data-load-parameters"></a>Parameters

COMPROWS *numrows*   <a name="copy-comprows"></a>
Especifica la cantidad de filas que se usarán como el tamaño de muestra para el análisis de compresión. El análisis se ejecuta sobre las filas de cada sector de datos. Por ejemplo, si especifica `COMPROWS 1000000` (1 000 000) y el sistema contiene cuatro sectores totales, se leen y analizan no más de 250 000 filas por cada sector.  
Si no se especifica COMPROWS, el tamaño de muestra se establece de manera predeterminada en 100 000 en cada sector. Los valores de COMPROWS inferiores al valor predeterminado de 100 000 filas por cada sector se actualizan automáticamente al valor predeterminado. No obstante, la compresión automática no tendrá lugar si la cantidad de datos que se carga es insuficiente para producir una muestra significativa.  
Si el número de COMPROWS es superior a la cantidad de filas del archivo de entrada, el comando COPY avanza y ejecuta el análisis de compresión en todas las filas disponibles. El rango aceptado para este argumento es un número entre 1000 y 2147483647 (2 147 483 647).

COMPUPDATE [PRESET \$1 \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-compupdate"></a>
Controla que las codificaciones de compresión se apliquen automáticamente durante un comando COPY.   
Cuando COMPUPDATE está preestablecido, el comando COPY selecciona la codificación de compresión para cada columna si la tabla de destino está vacía, incluso si las columnas ya tienen codificaciones distintas de RAW. Actualmente, es posible reemplazar las codificaciones de las columnas especificadas. La codificación de cada columna se basa en el tipo de dato de la columna. No se realiza un muestreo de los datos. Amazon Redshift asigna de forma automática la codificación de compresión de la siguiente manera:  
+ A las columnas que están definidas como claves de ordenación se les asigna una compresión RAW.
+ A las columnas que están definidas como tipos de datos BOOLEAN, REAL o DOUBLE PRECISION se les asigna una compresión RAW.
+ Las columnas que se definen como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP o TIMESTAMPTZ tienen asignada la compresión AZ64.
+ Las columnas que se definen como CHAR o VARCHAR tienen asignada la compresión LZO.
Cuando se omite COMPUPDATE, el comando COPY elige la codificación de compresión de cada columna solo si la tabla de destino está vacía y no se ha especificado una codificación (distinta de RAW) para ninguna de las columnas. Amazon Redshift determina la codificación de cada columna. No se realiza un muestreo de los datos.   
Cuando COMPUPDATE está establecido en ON (o TRUE), o cuando se especifica COMPUDATE sin una opción, el comando COPY aplica la compresión automática si la tabla está vacía, aunque las columnas de la tabla ya tengan codificaciones diferentes a RAW. Actualmente, es posible reemplazar las codificaciones de las columnas especificadas. La codificación de cada columna se basa en un análisis de los datos de muestra. Para obtener más información, consulte [Carga de tablas con compresión automática](c_Loading_tables_auto_compress.md).  
Cuando COMPUPDATE está establecido en OFF (o FALSE), se deshabilita la compresión automática. Las codificaciones de las columnas no cambian.  
Para obtener información sobre la tabla del sistema para analizar la compresión, consulte [STL\$1ANALYZE\$1COMPRESSION](r_STL_ANALYZE_COMPRESSION.md). 

IGNOREALLERRORS   <a name="copy-ignoreallerrors"></a>
Puede especificar esta opción para ignorar todos los errores que se produzcan durante la operación de carga.   
No se puede especificar la opción IGNOREALLERRORS si ya se ha especificado la opción MAXERROR. No se puede especificar la opción IGNOREALLERRORS para formatos de columnas, tales como ORC y Parquet.

MAXERROR [AS] *error\$1count*   <a name="copy-maxerror"></a>
Si la carga devuelve la cantidad de errores especificada en *error\$1count* (número\$1de\$1errores) o una cantidad mayor, la carga no se realiza correctamente. Si la carga devuelve menos errores, continúa y devuelve un mensaje INFO que establece el número de filas que no se pudieron cargar. Utilice este parámetro para permitir que las cargas continúen cuando determinadas filas no puedan cargarse en la tabla a causa de errores de formato u otras inconsistencias de los datos.   
Establezca este valor en `0` o `1` si desea que la carga falle en el momento que suceda el primer error. La palabra clave AS es opcional. El valor predeterminado de MAXERROR es `0` y el límite `100000`.  
 El número real de errores notificados puede ser mayor que el MAXERROR especificado debido a la naturaleza paralela de Amazon Redshift. Si algún nodo del clúster de Amazon Redshift detecta que MAXERROR se ha superado, cada nodo notifica todos los errores que ha encontrado.

NOLOAD   <a name="copy-noload"></a>
Verifica la validez de los archivos de datos sin cargar los datos realmente. Utilice el parámetro NOLOAD para asegurar que los archivos de datos se cargan sin errores antes de ejecutar la carga de datos real. La ejecución de COPY con el parámetro NOLOAD es mucho más rápida que la carga de datos ya que solo analiza los archivos.

STATUPDATE [ \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-statupdate"></a>
Controla la actualización y los cálculos automáticos de las estadísticas del optimizador al final de un COPY correcto. De manera predeterminada, cuando el parámetro STATUPDATE no se utiliza, las estadísticas se actualizan de forma automática si inicialmente la tabla está vacía.  
Siempre que una inserción de datos en una tabla que no esté vacía cambie el tamaño de la tabla significativamente, le recomendamos actualizar las estadísticas con la ejecución de un comando [ANALYZE](r_ANALYZE.md) o mediante el argumento STATUPDATE ON.  
Con STATUPDATE ON (o TRUE), las estadísticas se actualizan de forma automática independientemente de si la tabla está vacía inicialmente. Si se utiliza STATUPDATE, el usuario actual debe ser el propietario de la tabla o un super usuario. Si no se especifica STATUPDATE, solo se requiere el permiso INSERT.  
Con STATUPDATE OFF (o FALSE), las estadísticas nunca se actualizan.  
Para obtener información adicional, consulta [Análisis de tablas](t_Analyzing_tables.md).

# Lista alfabética de parámetros
<a name="r_COPY-alphabetical-parm-list"></a>

La siguiente lista proporciona los enlaces a cada descripción de parámetros del comando COPY, ordenadas alfabéticamente.
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate)
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)
+ [ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id-access)
+ [AVRO](copy-parameters-data-format.md#copy-avro)
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull)
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows)
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate)
+ [CREDENTIALS](copy-parameters-authorization.md#copy-credentials-cred)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter)
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull)
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding)
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted)
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape)
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth)
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [FROM](copy-parameters-data-source-s3.md#copy-parameters-from)
+ [GZIP](copy-parameters-file-compression.md#copy-gzip)
+ [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role-iam)
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors)
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines)
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader)
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json)
+ [LZOP](copy-parameters-file-compression.md#copy-lzop)
+ [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
+ [MASTER_SYMMETRIC_KEY](copy-parameters-data-source-s3.md#copy-master-symmetric-key)
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror)
+ [NOLOAD](copy-parameters-data-load.md#copy-noload)
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as)
+ [READRATIO](copy-parameters-data-source-dynamodb.md#copy-readratio)
+ [REGION](copy-parameters-data-source-s3.md#copy-region)
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes)
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec)
+ [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token)
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile)
+ [SSH](copy-parameters-data-source-ssh.md#copy-ssh)
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate)
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat)
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks)
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns)
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd)

# Notas de uso
<a name="r_COPY_usage_notes"></a>

**Topics**
+ [Permisos para acceder a otros recursos de AWS](copy-usage_notes-access-permissions.md)
+ [Uso de COPY con alias de puntos de acceso de Amazon S3](copy-usage_notes-s3-access-point-alias.md)
+ [Carga de datos multibyte desde Amazon S3](copy-usage_notes-multi-byte.md)
+ [Carga de una columna de tipo de datos GEOMETRY o GEOGRAPHY](copy-usage_notes-spatial-data.md)
+ [Carga del tipo de datos HLLSKETCH](copy-usage_notes-hll.md)
+ [Carga de una columna de tipo de datos VARBYTE](copy-usage-varbyte.md)
+ [Errores al leer varios archivos](copy-usage_notes-multiple-files.md)
+ [COPY de formato JSON](copy-usage_notes-copy-from-json.md)
+ [Uso de COPY con formatos de datos de columnas](copy-usage_notes-copy-from-columnar.md)
+ [Cadenas TIMEFORMAT y DATEFORMAT](r_DATEFORMAT_and_TIMEFORMAT_strings.md)
+ [Utilización del reconocimiento automático con DATEFORMAT y TIMEFORMAT](automatic-recognition.md)

# Permisos para acceder a otros recursos de AWS
<a name="copy-usage_notes-access-permissions"></a>

 Para trasladar datos entre el clúster y otro recurso de AWS, como Amazon S3, Amazon DynamoDB, Amazon EMR o Amazon EC2, el clúster debe tener permiso para acceder al recurso y realizar las acciones necesarias. Por ejemplo, para cargar datos de Amazon S3, COPY debe tener acceso LIST para el bucket y acceso GET para los objetos del bucket. Para obtener información acerca de los permisos mínimos, consulte [Permisos de IAM para COPY, UNLOAD y CREATE LIBRARY](#copy-usage_notes-iam-permissions).

Para obtener la autorización para acceder al recurso, el clúster debe estar autenticado. Puede seleccionar uno de los siguientes métodos de autenticación: 
+ [Control de acceso con base en roles](#copy-usage_notes-access-role-based): en el caso del control de acceso basado en roles, se especifica un rol de AWS Identity and Access Management (IAM) que el clúster utiliza para la autenticación y la autorización. Para salvaguardar las credenciales de AWS y la información confidencial, le recomendamos encarecidamente utilizar una autenticación basada en roles.
+ [Control de acceso basado en claves](#copy-usage_notes-access-key-based): en el caso del control de acceso basado en claves, se proporcionan las credenciales de acceso de AWS (ID de clave de acceso y clave de acceso secreta) de un usuario como texto sin formato.

## Control de acceso con base en roles
<a name="copy-usage_notes-access-role-based"></a>

Con el <a name="copy-usage_notes-access-role-based.phrase"></a>control de acceso basado en roles, el clúster adopta de forma temporal un rol de IAM en su nombre. Luego, en función de las autorizaciones que se otorgaron al rol, su clúster puede acceder a los recursos de AWS requeridos.

La creación de un *rol* de IAM es similar a la concesión de permisos a un usuario, en el sentido de que se trata de una identidad de AWS con políticas de permisos que determinan lo que la identidad puede y no puede hacer en AWS. No obstante, en lugar de asociarse exclusivamente a un usuario, cualquier entidad puede asumir un rol cuando lo necesite. Además, un rol no tiene ninguna credencial (una contraseña o claves de acceso) asociada a él. En cambio, si se asocia un rol a un clúster, se crean de forma dinámica claves de acceso y se proporcionan al clúster.

Recomendamos el uso de control de acceso basado en roles porque ofrece un control más preciso y seguro del acceso a los recursos de AWS y a la información confidencial de los usuarios, además de salvaguardar las credenciales de AWS.

La autenticación basada en roles brinda los siguientes beneficios:
+ Puede utilizar las herramientas de IAM estándar de AWS para definir un rol de IAM y asociarlo a varios clústeres. Cuando se modifica una política de acceso de un rol, los cambios se aplican automáticamente a todos los clústeres que utilicen ese rol.
+ Puede definir políticas de IAM pormenorizadas que concedan permisos para que clústeres y usuarios de bases de datos específicos puedan acceder a determinadas acciones y recursos de AWS.
+ El clúster obtiene credenciales de sesión temporales en tiempo de ejecución y actualiza las credenciales según se necesite hasta que se complete la operación. En el caso de que utilice credenciales temporales basadas en claves, si estas vencen antes de completarse la operación, la operación falla.
+ El ID de clave de acceso y el ID de clave de acceso secreta no se almacenan ni se transmiten en el código SQL.

Para utilizar el control de acceso basado en roles, primero debe crear un rol de IAM mediante el tipo de función del servicio de Amazon Redshift y, luego, debe adjuntarlo al clúster. Como mínimo, el rol debe tener los permisos especificados en [Permisos de IAM para COPY, UNLOAD y CREATE LIBRARY](#copy-usage_notes-iam-permissions). Para conocer los pasos que se deben realizar para crear un rol de IAM y adjuntarlo a un clúster, consulte [Autorización a Amazon Redshift para acceder a otros servicios de AWS en su nombre](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html) en la *Guía de administración de Amazon Redshift*.

Puede agregar un rol a un clúster o ver los roles asociados a un clúster mediante la consola de administración, la CLI o la API de Amazon Redshift. Para obtener más información, consulte [Asociación de un rol de IAM a un clúster](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) en la *Guía de administración de Amazon Redshift*.

Al crear un rol de IAM, IAM devuelve el Amazon Resource Name (ARN, Nombre de recurso de Amazon) del rol. Para especificar un rol de IAM, proporcione el ARN del rol con el parámetro [Uso del parámetro IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role) o el parámetro [Uso del parámetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials). 

Por ejemplo, suponga que se asocia el siguiente rol al clúster.

```
"IamRoleArn": "arn:aws:iam::0123456789012:role/MyRedshiftRole"
```

En el siguiente ejemplo, el comando COPY utiliza el parámetro IAM\$1ROLE con el ARN del ejemplo anterior para la autenticación y el acceso a Amazon S3.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata'  
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

En el siguiente ejemplo de comando COPY se utiliza el parámetro CREDENTIALS para especificar el rol de IAM.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata' 
credentials 
'aws_iam_role=arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Además, un superusuario puede conceder el privilegio ASSUMEROLE a los usuarios y los grupos de bases de datos con objeto de proporcionar acceso a un rol para las operaciones COPY. Para obtener más información, consulte [GRANT](r_GRANT.md).

## Control de acceso basado en claves
<a name="copy-usage_notes-access-key-based"></a>

Con el <a name="copy-usage_notes-access-key-based.phrase"></a>control de acceso basado en claves, se proporciona el ID de clave de acceso y la clave de acceso secreta de un usuario de IAM que está autorizado a acceder a los recursos de AWS que contienen los datos. Puede utilizar los parámetros [Uso de los parámetros ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id) juntos o el parámetro [Uso del parámetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials).

**nota**  
Recomendamos encarecidamente que use un rol de IAM para su autenticación, en lugar de brindar un ID de clave de acceso y una clave de acceso secreta como texto sin formato. Si elige el control de acceso basado en claves, nunca utilice las credenciales (raíz) de su cuenta de AWS. Siempre cree un usuario de IAM y proporcione el ID de clave de acceso y la clave de acceso secreta de ese usuario. Si desea conocer los pasos necesarios para crear un usuario de IAM, consulte [Creación de un usuario de IAM en su cuenta de AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html).

Para realizar la autenticación con ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY, sustituya *<access-key-id>* y *<secret-access-key>* por el ID de clave de acceso de un usuario autorizado y la clave de acceso secreta completa, tal y como se muestra a continuación. 

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>';
```

Para realizar la autenticación con el parámetro CREDENTIALS, sustituya *<access-key-id>* y *<secret-access-key>* por el ID de clave de acceso de un usuario autorizado y la clave de acceso secreta completa, tal y como se muestra a continuación.

```
CREDENTIALS
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>';
```

Como mínimo, el usuario de IAM debe tener los permisos que se indican en [Permisos de IAM para COPY, UNLOAD y CREATE LIBRARY](#copy-usage_notes-iam-permissions).

### Credenciales de seguridad temporales
<a name="r_copy-temporary-security-credentials"></a>

 Si utiliza el control de acceso basado en claves, puede limitar más el acceso que los usuarios tienen a los datos mediante el uso de credenciales de seguridad temporales. La autenticación basada en roles utiliza de forma automática credenciales temporales. 

**nota**  
Le recomendamos encarecidamente utilizar [role-based access control](#copy-usage_notes-access-role-based.phrase) en lugar de crear credenciales temporales y proporcionar el ID de clave de acceso y la clave de acceso secreta como texto sin formato. El control de acceso basado en roles utiliza de forma automática credenciales temporales. 

Las credenciales de seguridad temporales proporcionan más seguridad debido a su breve vigencia y al hecho de que no se pueden reutilizar cuando vencen. El ID de clave de acceso y la clave de acceso secreta generados con el token no pueden utilizarse sin el token, y un usuario que tenga estas credenciales de seguridad temporales puede acceder a los recursos solo hasta que estas venzan.

Para conceder a los usuarios acceso temporal a los recursos, debe llamar a las operaciones de API de AWS Security Token Service (AWS STS). Las operaciones de API de AWS STS devuelven credenciales de seguridad temporales compuestas por un token de seguridad, un ID de clave de acceso y una clave de acceso secreta. Emita las credenciales de seguridad temporales a los usuarios que necesiten obtener acceso temporalmente a los recursos. Estos usuarios pueden ser usuarios de IAM existentes o pueden ser usuarios que no utilizan AWS. Para obtener más información acerca de la creación de credenciales de seguridad temporales, consulte [Uso de credenciales de seguridad temporales](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html) en la Guía del usuario de IAM.

Puede utilizar los parámetros [Uso de los parámetros ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id) junto con el parámetro [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token) o el parámetro [Uso del parámetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials). También debe suministrar el ID de clave de acceso y la clave de acceso secreta que se proporcionaron con el token.

Para realizar la autenticación con ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY y SESSION\$1TOKEN, sustituya *<temporary-access-key-id>*, *<temporary-secret-access-key>* y *<temporary-token>*, tal y como se muestra a continuación. 

```
ACCESS_KEY_ID '<temporary-access-key-id>'
SECRET_ACCESS_KEY '<temporary-secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

Para autenticar con CREDENTIALS, incluya `session_token=<temporary-token>` en la cadena de credenciales, como se muestra a continuación. 

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>';
```

En el siguiente ejemplo, se muestra un comando COPY con credenciales de seguridad temporales.

```
copy table-name
from 's3://objectpath'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>';
```

En el siguiente ejemplo, se carga la tabla LISTING con credenciales temporales y cifrado de archivos.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>'
master_symmetric_key '<root-key>'
encrypted;
```

En el siguiente ejemplo, se carga la tabla LISTING mediante el parámetro CREDENTIALS con credenciales temporales y cifrado de archivos.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt'
credentials 
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>;master_symmetric_key=<root-key>'
encrypted;
```

**importante**  
Las credenciales de seguridad temporales deben ser válidas durante toda la operación COPY o UNLOAD. Si las credenciales de seguridad temporales vencen durante la operación, el comando falla y se revierte la transacción. Por ejemplo, si las credenciales de seguridad temporales vencen después de 15 minutos y la operación COPY requiere una hora, el comando COPY falla antes de completarse. Si utiliza un acceso basado en roles, las credenciales de seguridad temporales se actualizan de forma automática hasta que se complete la operación.

## Permisos de IAM para COPY, UNLOAD y CREATE LIBRARY
<a name="copy-usage_notes-iam-permissions"></a>

El rol o usuario de IAM indicado por el parámetro CREDENTIALS debe tener, como mínimo, los siguientes permisos:
+ Para utilizar COPY de Amazon S3, debe tener permiso para utilizar LIST sobre el bucket de Amazon S3 y GET sobre los objetos de Amazon S3 que se están cargando y el archivo de manifiesto, si se utiliza alguno.
+ Para utilizar COPY de Amazon S3, Amazon EMR y los alojamientos remotos (SSH) con datos en formato JSON deben tener permiso para utilizar LIST y GET con el archivo JSONPaths de Amazon S3, si se utiliza uno. 
+ Para utilizar COPY de DynamoDB, debe tener permiso para utilizar SCAN y DESCRIBE en la tabla de DynamoDB que se está cargando. 
+ Para utilizar COPY desde un clúster de Amazon EMR, debe tener permiso para la acción `ListInstances` en el clúster de Amazon EMR. 
+ Para utilizar UNLOAD en Amazon S3, debe tener permisos para usar GET, LIST y PUT sobre el bucket de Amazon S3 en que se están descargando los archivos de datos.
+ Para utilizar CREATE LIBRARY de Amazon S3, debe tener permiso para usar LIST sobre el bucket de Amazon S3 y GET sobre los objetos de Amazon S3 que se están importando.

**nota**  
Si recibe el mensaje de error `S3ServiceException: Access Denied` cuando ejecuta un comando COPY, UNLOAD o CREATE LIBRARY, el clúster no dispone de los permisos de acceso adecuados para Amazon S3.

Puede administrar los permisos de IAM si asocia una política de IAM a un rol de IAM que esté asociado a su clúster, a un usuario o al grupo al que pertenezca su usuario. Por ejemplo, la política administrada `AmazonS3ReadOnlyAccess` concede permisos para utilizar LIST y GET sobre los recursos de Amazon S3. Para obtener más información acerca de las políticas de IAM, consulte [Administración de las políticas de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html) en la *Guía del usuario de IAM*. 

# Uso de COPY con alias de puntos de acceso de Amazon S3
<a name="copy-usage_notes-s3-access-point-alias"></a>

COPY admite alias de puntos de acceso de Amazon S3. Para obtener más información, consulte [Uso de un alias de estilo bucket en su punto de acceso](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html) en la *Guía del usuario de Amazon Simple Storage Service*.

# Carga de datos multibyte desde Amazon S3
<a name="copy-usage_notes-multi-byte"></a>

Si los datos incluyen caracteres multibyte no ASCII (como caracteres cirílicos o chinos) debe cargar los datos en columnas VARCHAR. El tipo de datos VARCHAR admite caracteres UTF-8 de cuatro bytes, pero el tipo de datos CHAR solo acepta caracteres ASCII de un solo byte. No se pueden cargar caracteres de cinco bytes o más en las tablas de Amazon Redshift. Para obtener más información, consulte [Caracteres multibyte](c_Supported_data_types.md#c_Supported_data_types-multi-byte-characters). 

# Carga de una columna de tipo de datos GEOMETRY o GEOGRAPHY
<a name="copy-usage_notes-spatial-data"></a>

Solo se puede utilizar COPY en columnas `GEOMETRY` o `GEOGRAPHY` a partir de datos de un archivo de texto delimitado por caracteres, como un archivo CSV. Los datos deben tener la forma hexadecimal del formato well-known binary format (ya sea WKB o EWKB) o el formato well-known text format (ya sea WKT o EWKT) y deben caber dentro del tamaño máximo de una sola fila de entrada al comando COPY. Para obtener más información, consulte [COPY](r_COPY.md). 

Para obtener información sobre cómo cargar desde un shapefile, consulte [Carga de un shapefile en Amazon Redshift](spatial-copy-shapefile.md).

Para obtener más información acerca del tipo de datos `GEOMETRY` o `GEOGRAPHY`, consulte [Consulta de datos espaciales en Amazon Redshift](geospatial-overview.md).

# Carga del tipo de datos HLLSKETCH
<a name="copy-usage_notes-hll"></a>

Los bocetos HLL solo se pueden copiar en formato disperso o denso compatible con Amazon Redshift. Para utilizar el comando COPY en bocetos de HyperLogLog, use el formato Base64 para bocetos de HyperLogLog densos y el formato JSON para bocetos de HyperLogLog dispersos. Para obtener más información, consulte [Funciones HyperLogLog](hyperloglog-functions.md). 

En el siguiente ejemplo, se importan datos de un archivo CSV a una tabla mediante CREATE TABLE y COPY. Primero, el ejemplo crea la tabla `t1` con CREATE TABLE.

```
CREATE TABLE t1 (sketch hllsketch, a bigint);
```

Luego, utiliza COPY para importar datos de un archivo CSV a la tabla `t1`. 

```
COPY t1 FROM s3://amzn-s3-demo-bucket/unload/' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' CSV;
```

# Carga de una columna de tipo de datos VARBYTE
<a name="copy-usage-varbyte"></a>

Puede cargar datos desde un archivo en formato CSV, Parquet y ORC. Para CSV, los datos se cargan desde un archivo en representación hexadecimal de los datos VARBYTE. No se pueden cargar datos VARBYTE con la opción `FIXEDWIDTH`. No se admiten las opciones `ADDQUOTES` ni `REMOVEQUOTES` de COPY. Una columna VARBYTE no se puede utilizar como columna de partición. 

# Errores al leer varios archivos
<a name="copy-usage_notes-multiple-files"></a>

El comando COPY es atómico y de transacciones. En otras palabras, aunque el comando COPY lee datos de varios archivos, todo el proceso se trata como una sola transacción. Si COPY enfrenta un error cuando lee un archivo, vuelve a ejecutarse de forma automática hasta que se agota el tiempo de espera del proceso (consulte [statement\$1timeout](r_statement_timeout.md)) o si los datos no se pueden descargar de Amazon S3 durante un periodo prolongado (entre 15 y 30 minutos), lo que garantiza que cada archivo se cargue solo una vez. Si el comando COPY falla, se anula toda la transacción y se revierten todos los cambios. Para obtener más información acerca de la administración de errores de carga, consulte [Solución de problemas en cargas de datos](t_Troubleshooting_load_errors.md). 

Cuando un comando COPY se ha iniciado de forma correcta, no deja de ejecutarse correctamente aunque termine la sesión; por ejemplo, si el cliente se desconecta. No obstante, si el comando COPY está en un bloque de transacción BEGIN ... END que no se completa porque termina la sesión, se revierte toda la transacción, incluida la instrucción COPY. Para obtener más información acerca de las transacciones, consulte [BEGIN](r_BEGIN.md).

# COPY de formato JSON
<a name="copy-usage_notes-copy-from-json"></a>

La estructura de datos JSON se compone de un conjunto de objetos o matrices. Un *objeto* JSON comienza y termina con llaves, y contiene una colección desordenada de pares de nombre-valor. Cada nombre y valor está separado por dos puntos y los pares están separados por comas. El nombre es una cadena entre comillas dobles. Los caracteres de comillas deben ser comillas simples (0x22), no las comillas inclinadas o “inteligentes”. 

Una *matriz* JSON comienza y termina con corchetes y contiene una colección ordenada de valores separados por comas. Un valor puede ser una cadena entre comillas dobles, un número, un booleano true o false, nulo, un objeto JSON o una matriz. 

Los objetos y las matrices JSON se pueden anidar, lo que habilita una estructura jerárquica de datos. En el siguiente ejemplo, se muestra una estructura de datos JSON con dos objetos válidos. 

```
{
    "id": 1006410,
    "title": "Amazon Redshift Database Developer Guide"
}
{
    "id": 100540,
    "name": "Amazon Simple Storage Service User Guide"
}
```

En el siguiente se muestran los mismos datos como dos matrices JSON.

```
[
    1006410,
    "Amazon Redshift Database Developer Guide"
]
[
    100540,
    "Amazon Simple Storage Service User Guide"
]
```

## Opciones de COPY para JSON
<a name="copy-usage-json-options"></a>

Cuando utilice COPY con datos en formato JSON, puede especificar las siguientes opciones: 
+ `'auto' `: COPY carga de forma automática los campos del archivo JSON. 
+ `'auto ignorecase'`: COPY carga de forma automática los campos del archivo JSON mientras ignora las mayúsculas y las minúsculas de los nombres de los campos.
+ `s3://jsonpaths_file`: COPY utiliza un archivo JSONPaths para analizar los datos de origen JSON. Un *archivo JSONPaths* es un archivo de texto que contiene un solo objeto JSON con el nombre `"jsonpaths"` combinado con una matriz de expresiones JSONPath. Si el nombre es cualquier cadena diferente a `"jsonpaths"`, COPY utiliza el argumento `'auto'` en lugar de utilizar el archivo JSONPaths. 

Por obtener ejemplos que muestren cómo cargar datos mediante `'auto'`, `'auto ignorecase'` o un archivo JSONPaths, y mediante matrices y objetos JSON, consulte [Ejemplos de Copy de JSON](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json). 

## Opción JSONPath
<a name="copy-usage-json-options"></a>

En la sintaxis de COPY de Amazon Redshift, una expresión JSONPath especifica la ruta explícita a un elemento de nombre único en una estructura de datos jerárquica JSON, mediante notaciones con corchetes o con puntos. Amazon Redshift no admite ningún elemento de JSONPath, como caracteres comodín o expresiones de filtro, que pueda resolverse como una ruta ambigua o como varios elementos de nombre. Por este motivo, Amazon Redshift no puede analizar estructuras de datos complejas de varios niveles.

El siguiente es un ejemplo de un archivo JSONPaths con expresiones JSONPath que utilizan la notación con corchetes. El símbolo de dólar (\$1) representa la estructura de nivel raíz. 

```
{
    "jsonpaths": [
       "$['id']",
       "$['store']['book']['title']",
	"$['location'][0]" 
    ]
}
```

 En el ejemplo anterior, `$['location'][0]` hace referencia al primer elemento de una matriz. JSON utiliza la indexación de matrices de base cero. Los índices de matriz deben ser números enteros positivos (igual o mayor que cero).

En el siguiente ejemplo, se muestra el archivo JSONPaths anterior que utiliza la notación con puntos. 

```
{
    "jsonpaths": [
       "$.id",
       "$.store.book.title",
	"$.location[0]"
    ]
}
```

No puede combinar las notaciones con corchetes y con puntos en la matriz `jsonpaths`. Los corchetes se pueden utilizar en la notación con corchetes y en la notación con puntos para hacer referencia a un elemento de matriz. 

Cuando se utiliza la notación con puntos, las expresiones JSONPath no pueden contener los siguientes caracteres: 
+ Comilla simple recta ( ' ) 
+ Punto (.) 
+ Corchetes ( [ ] ), a menos que se utilice para hacer referencia a una elemento de matriz 

Si el valor del par de nombre-valor indicado por una expresión JSONPath es un objeto o una matriz, todo el objeto o la matriz se carga como una cadena, incluidos los corchetes o las llaves. Por ejemplo, suponga que los datos JSON contienen el siguiente objeto. 

```
{
    "id": 0,
    "guid": "84512477-fa49-456b-b407-581d0d851c3c",
    "isActive": true,
    "tags": [
        "nisi",
        "culpa",
        "ad",
        "amet",
        "voluptate",
        "reprehenderit",
        "veniam"
    ],
    "friends": [
        {
            "id": 0,
            "name": "Martha Rivera"
        },
        {
            "id": 1,
            "name": "Renaldo"
        }
    ]
}
```

La expresión JSONPath `$['tags']` luego devuelve el siguiente valor. 

```
"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]" 
```

La expresión JSONPath `$['friends'][1]` luego devuelve el siguiente valor. 

```
"{"id": 1,"name": "Renaldo"}" 
```

Cada expresión JSONPath de la matriz `jsonpaths` corresponde a una columna de la tabla de destino de Amazon Redshift. El orden de los elementos de la matriz `jsonpaths` debe coincidir con el orden de las columnas en la tabla de destino o en la lista de columnas, si se utiliza una. 

Por obtener ejemplos que muestren cómo cargar datos utilizando un argumento `'auto'` o un archivo JSONPaths y cómo utilizar los objetos y matrices JSON, consulte [Ejemplos de Copy de JSON](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json). 

Para obtener información sobre cómo copiar varios archivos JSON, consulte [Uso de un manifiesto para especificar archivos de datos](loading-data-files-using-manifest.md).

## Caracteres de escape en JSON
<a name="copy-usage-json-escape-characters"></a>

COPY carga `\n` como un carácter de línea nueva y `\t` como un tabulador. Para cargar una barra inversa, aplique escape con una barra inversa ( `\\` ).

Suponga, por ejemplo, que tiene el siguiente JSON en un archivo denominado `escape.json` en el bucket `s3://amzn-s3-demo-bucket/json/`.

```
{
  "backslash": "This is a backslash: \\",
  "newline": "This sentence\n is on two lines.",
  "tab": "This sentence \t contains a tab."
}
```

Ejecute los siguientes comandos para crear la tabla ESCAPES y cargar el JSON.

```
create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35));

copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as json 'auto';
```

Consulte la tabla ESCAPES para ver los resultados.

```
select * from escapes;

       backslash        |      newline      |               tab
------------------------+-------------------+----------------------------------
 This is a backslash: \ | This sentence     | This sentence    contains a tab.
                        :  is on two lines.
(1 row)
```

## Pérdida de precisión numérica
<a name="copy-usage-json-rounding"></a>

Puede perder precisión al cargar números de archivos de datos en formato JSON a una columna definida como tipo de datos numéricos. Algunos valores de coma flotante no se representan exactamente igual en distintos sistemas informáticos. Por ello, es posible que los datos que copie de un archivo JSON no se redondeen según lo esperado. Para evitar una pérdida de precisión, le recomendamos que utilice una de las siguientes alternativas:
+ Represente el número como una cadena encerrando el valor entre comillas dobles.
+ Use [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) para redondear el número en lugar de truncarlo.
+ En vez de utilizar archivos JSON o Avro, use archivos CSV, de ancho fijo o delimitados por caracteres.

# Uso de COPY con formatos de datos de columnas
<a name="copy-usage_notes-copy-from-columnar"></a>

El comando COPY puede cargar datos de Amazon S3 en los siguientes formatos en columnas:
+ ORC
+ Parquet

Para ver ejemplos del uso de COPY a partir de formatos de datos en columnas, consulte[Ejemplos de COPY](r_COPY_command_examples.md).

COPY admite los datos que tienen formato de columna con las siguientes consideraciones:
+ El bucket de Amazon S3 debe estar en la misma región de AWS que la base de datos de Amazon Redshift. 
+ Para acceder a los datos de Amazon S3 a través de un punto de conexión de VPC, configure el acceso mediante políticas de IAM y roles de IAM como se describe en [Uso de Amazon Redshift Spectrum con el enrutamiento de VPC mejorado](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html) en la *Guía de administración de Amazon Redshift*. 
+ El comando COPY no aplica automáticamente codificaciones de compresión. 
+ Solo se admiten los siguientes parámetros de COPY: 
  + [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars) al copiar desde un archivo ORC o Parquet.
  + [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
  + [FROM](copy-parameters-data-source-s3.md#copy-parameters-from)
  + [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role)
  + [CREDENTIALS](copy-parameters-authorization.md#copy-credentials)
  + [STATUPDATE ](copy-parameters-data-load.md#copy-statupdate)
  + [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
  + [EXPLICIT\$1IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ Si COPY encuentra un error al cargar, el comando no se ejecuta correctamente. Los tipos de datos en columnas no aceptan ACCEPTANYDATE y MAXERROR.
+ Los mensajes de error se envían al cliente de SQL. Algunos errores se registran en STL\$1LOAD\$1ERRORS y STL\$1ERROR.
+ De manera predeterminada, COPY inserta los valores en las columnas de la tabla de destino en el mismo orden en que las columnas aparecen en los archivos de datos con formato de columna. La tabla de destino y el archivo de datos deben tener el mismo número de columnas.
+ Si el archivo que especifica para la operación COPY incluye una de las siguientes extensiones, descomprimimos los datos sin necesidad de agregar ningún parámetro: 
  + `.gz`
  + `.snappy`
  + `.bz2`
+ COPY con los formatos de archivos Parquet y ORC utiliza Redshift Spectrum y el acceso al bucket. Para utilizar COPY para estos formatos, asegúrese de que no haya ninguna política de IAM que bloquee el uso de direcciones URL prefirmadas de Amazon S3. Las URL prefirmadas generadas por Amazon Redshift son válidas durante 1 hora para que Amazon Redshift tenga tiempo suficiente para cargar todos los archivos del bucket de Amazon S3. Se genera una URL prefirmada única para cada archivo escaneado mediante COPY a partir de formatos de datos en columnas. Para las políticas de bucket que incluyen una acción `s3:signatureAge`, asegúrese de establecer el valor en al menos 3 600 000 milisegundos. Para obtener más información, consulte [Uso de Amazon Redshift Spectrum con el enrutamiento de VPC mejorado](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html).
+ El parámetro REGION no se admite con COPY a partir de formatos de datos en columnas. Aunque su bucket de Amazon S3 y su base de datos estén en la misma Región de AWS, puede producirse un error como, por ejemplo, REGION argument is not supported for PARQUET based COPY.
+ COPY desde formatos de columnas ahora admite el escalado simultáneo. Para habilitar el escalado simultáneo, consulte [Configuración de colas de escalado de simultaneidad](https://docs.aws.amazon.com/redshift/latest/dg/concurrency-scaling.html#concurrency-scaling-queues).

# Cadenas TIMEFORMAT y DATEFORMAT
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings"></a>

El comando COPY utiliza las opciones DATEFORMAT y TIMEFORMAT para analizar los valores de fecha y hora de sus datos de origen. DATEFORMAT y TIMEFORMAT son cadenas formateadas que deben coincidir con el formato de los valores de fecha y hora de sus datos de origen. Por ejemplo, un comando COPY que cargue datos de origen con el valor de fecha `Jan-01-1999` debe incluir la siguiente cadena DATEFORMAT:

```
COPY ...
            DATEFORMAT AS 'MON-DD-YYYY'
```

Para obtener más información sobre cómo administrar las conversiones de datos de COPY, consulte [Parámetros de conversión de datos](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-conversion.html). 

Las cadenas DATEFORMAT y TIMEFORMAT pueden contener separadores de fecha y hora (como “`-`”, “`/`” o “`:`”), así como los formatos datepart y timepart de la tabla siguiente.

**nota**  
Si no puede hacer coincidir el formato de sus valores de fecha u hora con los siguientes formatos de datepart y timepart, o si tiene valores de fecha y hora que utilizan formatos diferentes entre sí, utilice el argumento `'auto'` con el parámetro DATEFORMAT o TIMEFORMAT. El argumento `'auto'` reconoce varios formatos que no se admiten cuando se utiliza una cadena DATEFORMAT o TIMEFORMAT. Para obtener más información, consulte [Utilización del reconocimiento automático con DATEFORMAT y TIMEFORMAT](automatic-recognition.md).

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

El formato de fecha predeterminado es YYYY-MM-DD. El formato predeterminado de marca temporal sin zona horaria (TIMESTAMP) es AAAA-MM-DD HH:MI:SS. El formato predeterminado de marca temporal con zona horaria (TIMESTAMPTZ) es AAAA-MM-DD HH:MI:SSOF, donde OF es el desplazamiento de UTC (por ejemplo, - 8:00). No puede incluir un especificador de zona horaria (TZ, tz u OF) en timeformat\$1string. El campo de segundos (SS) también admite fracciones de segundos hasta un nivel de detalle de microsegundos. Para cargar datos TIMESTAMPTZ que estén en un formato diferente al predeterminado, especifique 'auto'.

A continuación, encontrará algunos ejemplos de fechas u horas que puede encontrar en sus datos de origen, así como las cadenas DATEFORMAT o TIMEFORMAT correspondientes.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

## Ejemplo
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings-examples"></a>

Para ver un ejemplo del uso de TIMEFORMAT, consulte [Carga de una marca temporal o de fecha](r_COPY_command_examples.md#r_COPY_command_examples-load-a-time-datestamp).

# Utilización del reconocimiento automático con DATEFORMAT y TIMEFORMAT
<a name="automatic-recognition"></a>

Si especifica `'auto'` como argumento del parámetro DATEFORMAT o TIMEFORMAT, Amazon Redshift reconocerá y convertirá de forma automática el formato de fecha o de hora en los datos de origen. A continuación se muestra un ejemplo.

```
copy favoritemovies from 'dynamodb://ProductCatalog' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
dateformat 'auto';
```

Cuando se utiliza con el argumento `'auto'` para DATEFORMAT y TIMEFORMAT, COPY reconoce y convierte los formatos de fecha y hora enumerados en la tabla en [Cadenas TIMEFORMAT y DATEFORMATEjemplo](r_DATEFORMAT_and_TIMEFORMAT_strings.md). Además, el argumento `'auto'` reconoce los siguientes formatos, que no se admiten cuando se utiliza una cadena DATEFORMAT y TIMEFORMAT.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/automatic-recognition.html)

El reconocimiento automático no admite epochsecs ni epochmillisecs.

Para probar si un valor de marca temporal o fecha se convertirá automáticamente, utilice una función CAST para intentar convertir la cadena en un valor de marca temporal o fecha. Por ejemplo, los siguientes comandos prueban el valor de marca temporal `'J2345678 04:05:06.789'`:

```
create table formattest (test char(21));
insert into formattest values('J2345678 04:05:06.789');
select test, cast(test as timestamp) as timestamp, cast(test as date) as date from formattest;

        test          |      timestamp      |	date
----------------------+---------------------+------------
J2345678 04:05:06.789   1710-02-23 04:05:06	1710-02-23
```

Si los datos de origen para una columna DATE incluyen información de la hora, se trunca el componente de tiempo. Si los datos de origen para una columna TIMESTAMP omiten la información de la hora, se usa 00:00:00 para el componente de tiempo.

# Ejemplos de COPY
<a name="r_COPY_command_examples"></a>

**nota**  
Estos ejemplos contienen saltos de línea por motivos de legibilidad. No incluya saltos de líneas ni espacios en la cadena *credentials-args (credenciales-argumentos)*.

**Topics**
+ [Carga de FAVORITEMOVIES de una tabla de DynamoDB](#r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table)
+ [Carga de LISTING desde un bucket de Amazon S3](#r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket)
+ [Carga de LISTING desde un clúster de Amazon EMR](#copy-command-examples-emr)
+ [Example: COPY from Amazon S3 using a manifest](#copy-command-examples-manifest)
+ [Carga de LISTING de un archivo delimitado por la barra vertical (delimitador predeterminado)](#r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter)
+ [Carga de LISTING utilizando datos en columnas con el formato de Parquet](#r_COPY_command_examples-load-listing-from-parquet)
+ [Carga de LISTING utilizando datos en columnas con el formato de ORC](#r_COPY_command_examples-load-listing-from-orc)
+ [Carga de EVENT con opciones](#r_COPY_command_examples-load-event-with-options)
+ [Carga de VENUE de un archivo de datos de ancho fijo](#r_COPY_command_examples-load-venue-from-a-fixed-width-data-file)
+ [Carga de CATEGORY de un archivo CSV](#load-from-csv)
+ [Carga de VENUE con valores explícitos para una columna IDENTITY](#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)
+ [Carga de TIME de un archivo GZIP delimitado por la barra vertical](#r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file)
+ [Carga de una marca temporal o de fecha](#r_COPY_command_examples-load-a-time-datestamp)
+ [Carga de datos de un archivo con valores predeterminados](#r_COPY_command_examples-load-data-from-a-file-with-default-values)
+ [Uso de COPY de datos con la opción ESCAPE](#r_COPY_command_examples-copy-data-with-the-escape-option)
+ [Ejemplos de Copy de JSON](#r_COPY_command_examples-copy-from-json)
+ [Ejemplos de Copy de Avro](#r_COPY_command_examples-copy-from-avro)
+ [Preparación de archivos para utilizar COPY con la opción ESCAPE](#r_COPY_preparing_data)
+ [Carga de un shapefile en Amazon Redshift](#copy-example-spatial-copy-shapefile)
+ [Comando COPY con la opción NOLOAD](#r_COPY_command_examples-load-noload-option)
+ [Comando COPY con un delimitador multibyte y la opción ENCODING](#r_COPY_command_examples-load-encoding-multibyte-delimiter-option)

## Carga de FAVORITEMOVIES de una tabla de DynamoDB
<a name="r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table"></a>

Los AWS SDK incluyen un ejemplo sencillo de la creación de una tabla de DynamoDB denominada *Movies* (Películas). (Para obtener información sobre este ejemplo, consulte [Introducción a DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.html)). En el siguiente ejemplo, se carga la tabla MOVIES de Amazon Redshift con los datos de la tabla de DynamoDB. La tabla de Amazon Redshift ya debe existir en la base de datos.

```
copy favoritemovies from 'dynamodb://Movies'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
readratio 50;
```

## Carga de LISTING desde un bucket de Amazon S3
<a name="r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket"></a>

En el siguiente ejemplo, se carga LISTING desde un bucket de Amazon S3. El comando COPY carga todos los archivos en la carpeta `/data/listing/`.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listing/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Carga de LISTING desde un clúster de Amazon EMR
<a name="copy-command-examples-emr"></a>

En el siguiente ejemplo, se carga la tabla SALES con datos delimitados por tabuladores de archivos comprimidos con lzop en un clúster de Amazon EMR. COPY carga cada archivo en la carpeta `myoutput/` que comienza con `part-`.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '\t' lzop;
```

En el siguiente ejemplo, se carga la tabla SALES con datos en formato JSON en un clúster de Amazon EMR. COPY carga cada archivo en la carpeta `myoutput/json/`.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/json/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
JSON 's3://amzn-s3-demo-bucket/jsonpaths.txt';
```

## Uso de un manifiesto para especificar archivos de datos
<a name="copy-command-examples-manifest"></a>

Puede utilizar un manifiesto para asegurarse de que el comando COPY cargue todos los archivos requeridos, y solo esos, de Amazon S3. También puede utilizar un manifiesto cuando necesite cargar varios archivos de diferentes buckets o archivos que no compartan el mismo prefijo. 

Por ejemplo, suponga que necesita cargar los siguientes tres archivos: `custdata1.txt`, `custdata2.txt` y `custdata3.txt`. Puede utilizar el siguiente comando para cargar todos los archivos de `amzn-s3-demo-bucket` que comienzan con `custdata` especificando un prefijo: 

```
copy category
from 's3://amzn-s3-demo-bucket/custdata' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Si debido a un error solo existen dos de los archivos, COPY carga solo esos dos archivos y termina su ejecución correctamente, lo que se traduce en una carga de datos incompleta. Si el bucket también contiene un archivo no deseado que utiliza el mismo prefijo, como un archivo denominado `custdata.backup`, por ejemplo, COPY también carga ese archivo, lo que se traduce en una carga de datos no deseados.

Para asegurar que se carguen todos los archivos requeridos y evitar que se carguen archivos no deseados, puede utilizar un archivo de manifiesto. El manifiesto es un archivo de texto con formato JSON que enumera los archivos a procesarse por el comando COPY. Por ejemplo, el siguiente manifiesto carga los tres archivos del ejemplo anterior.

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.1",
         "mandatory":true
      },
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.2",
         "mandatory":true
      },
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.3",
         "mandatory":true
      }
   ]
}
```

La marca opcional `mandatory` indica si COPY debe terminar en caso de que el archivo no exista. El valor predeterminado es `false`. Independientemente de cualquier configuración obligatoria, COPY termina si no se encuentran archivos. En este ejemplo, COPY devuelve un error si no se encuentra alguno de los archivos. Los archivos no deseados que podrían haberse seleccionado si se especificó solo un prefijo de clave, como `custdata.backup`, se ignoran, ya que no están en el manifiesto. 

Cuando la carga se realiza a partir de archivos de datos con formato ORC o Parquet, se necesita un campo `meta`, tal y como se muestra en el siguiente ejemplo.

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      },
      {  
         "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      }
   ]
}
```

En el siguiente ejemplo, se utiliza un manifiesto llamado `cust.manifest`. 

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc
manifest;
```

Puede usar un manifiesto para cargar archivos de diferentes buckets o archivos que no compartan el mismo prefijo. En el siguiente ejemplo, se muestra el JSON para cargar datos con archivos cuyos nombres comiencen con una marca de fecha.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/2013-10-04-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-05-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-06-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-07-custdata.txt","mandatory":true}
  ]
}
```

El manifiesto puede enumerar los archivos que se encuentran en buckets diferentes, siempre que los buckets estén en la misma región de AWS que el clúster. 

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata1.txt","mandatory":false},
    {"url":"s3://amzn-s3-demo-bucket2/custdata1.txt","mandatory":false},
    {"url":"s3://amzn-s3-demo-bucket2/custdata2.txt","mandatory":false}
  ]
}
```

## Carga de LISTING de un archivo delimitado por la barra vertical (delimitador predeterminado)
<a name="r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter"></a>

En el siguiente ejemplo, se muestra un caso muy simple en el que no se especifican opciones y el archivo de entrada contiene el delimitador predeterminado, una barra vertical ("\$1"). 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Carga de LISTING utilizando datos en columnas con el formato de Parquet
<a name="r_COPY_command_examples-load-listing-from-parquet"></a>

En el siguiente ejemplo, se cargan datos desde una carpeta de Amazon S3 denominada parquet. 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/parquet/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as parquet;
```

## Carga de LISTING utilizando datos en columnas con el formato de ORC
<a name="r_COPY_command_examples-load-listing-from-orc"></a>

En el siguiente ejemplo, se cargan datos desde una carpeta de Amazon S3 denominada `orc`. 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/orc/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc;
```

## Carga de EVENT con opciones
<a name="r_COPY_command_examples-load-event-with-options"></a>

En el siguiente ejemplo, se cargan datos delimitados por llaves en la tabla EVENT y se aplican las siguientes reglas: 
+ Si se utilizan pares de comillas para rodear cualquier cadena de caracteres, estos se eliminan.
+ Las cadenas vacías y las que contienen espacios en blanco se cargan como valores NULL.
+ La carga falla si se devuelven más de 5 errores.
+ Los valores de marca temporal deben cumplir con el formato especificado; por ejemplo, una marca temporal válida es `2008-09-26 05:43:12`.

```
copy event
from 's3://amzn-s3-demo-bucket/data/allevents_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
removequotes
emptyasnull
blanksasnull
maxerror 5
delimiter '|'
timeformat 'YYYY-MM-DD HH:MI:SS';
```

## Carga de VENUE de un archivo de datos de ancho fijo
<a name="r_COPY_command_examples-load-venue-from-a-fixed-width-data-file"></a>

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue_fw.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';
```

En el ejemplo anterior se supone un archivo de datos con el mismo formato que muestran los datos de ejemplo. En la siguiente muestra, los espacios actúan como marcadores de posición para que todas las columnas tengan el mismo ancho que se indicó en la especificación: 

```
1  Toyota Park              Bridgeview  IL0
2  Columbus Crew Stadium    Columbus    OH0
3  RFK Stadium              Washington  DC0
4  CommunityAmerica BallparkKansas City KS0
5  Gillette Stadium         Foxborough  MA68756
```

## Carga de CATEGORY de un archivo CSV
<a name="load-from-csv"></a>

Suponga que desea cargar CATEGORY con los valores que se muestran en la siguiente tabla.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_COPY_command_examples.html)

En el siguiente ejemplo, se muestra el contenido de un archivo de texto con los valores de campo separados por comas.

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,All "non-musical" theatre  
14,Shows,Opera,All opera, light, and "rock" opera
15,Concerts,Classical,All symphony, concerto, and choir concerts
```

Si carga el archivo con el parámetro DELIMITER para especificar una entrada delimitada por comas, el comando COPY falla debido a que algunos campos de entrada contienen comas. Puede evitar ese problema si utiliza el parámetro CSV y encierra los campos que contienen comas entre comillas. Si los caracteres de comillas aparecen dentro de una cadena entre comillas, deberá aplicar escape duplicando las comillas. El carácter de comilla predeterminado es la comilla doble, por lo que debe aplicar escape a cada comilla doble con una comilla doble adicional. El archivo de entrada nuevo tiene el aspecto siguiente. 

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,"All ""non-musical"" theatre"
14,Shows,Opera,"All opera, light, and ""rock"" opera"
15,Concerts,Classical,"All symphony, concerto, and choir concerts"
```

Si el nombre del archivo es `category_csv.txt`, puede cargarlo con el siguiente comando COPY:

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv;
```

Además, para evitar la necesidad de aplicar escape a las comillas dobles de la entrada, puede especificar un carácter de comilla diferente con el parámetro QUOTE AS. Por ejemplo, la siguiente versión de `category_csv.txt` utiliza “`%`” como el carácter de comilla.

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,%All "non-musical" theatre%
14,Shows,Opera,%All opera, light, and "rock" opera%
15,Concerts,Classical,%All symphony, concerto, and choir concerts%
```

El siguiente comando COPY utiliza QUOTE AS para cargar `category_csv.txt`:

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv quote as '%';
```

## Carga de VENUE con valores explícitos para una columna IDENTITY
<a name="r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column"></a>

En el siguiente ejemplo, se supone que en el momento que se creó la tabla VENUE se especificó al menos una columna (como la columna `venueid`) para que sea una columna de IDENTITY. Este comando anula el comportamiento predeterminado de IDENTITY, que genera automáticamente valores para una columna IDENTITY, y en su lugar carga los valores explícitos del archivo venue.txt. Amazon Redshift no comprueba si se cargan valores IDENTITY duplicados en la tabla al utilizar la opción EXLICIT\$1IDS. 

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
explicit_ids;
```

## Carga de TIME de un archivo GZIP delimitado por la barra vertical
<a name="r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file"></a>

En el siguiente ejemplo, se carga la tabla TIME desde un archivo GZIP delimitado por la barra vertical:

```
copy time
from 's3://amzn-s3-demo-bucket/data/timerows.gz' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
gzip
delimiter '|';
```

## Carga de una marca temporal o de fecha
<a name="r_COPY_command_examples-load-a-time-datestamp"></a>

En el siguiente ejemplo, se cargan datos con una marca temporal con formato.

**nota**  
El TIMEFORMAT de `HH:MI:SS` también puede admitir fracciones de segundos que sobrepasen `SS` hasta un nivel de detalle de microsegundos. El archivo `time.txt` utilizado en este ejemplo contiene una fila, `2009-01-12 14:15:57.119568`.

```
copy timestamp1 
from 's3://amzn-s3-demo-bucket/data/time.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
timeformat 'YYYY-MM-DD HH:MI:SS';
```

El resultado de este copy es el siguiente: 

```
select * from timestamp1;
c1
----------------------------
2009-01-12 14:15:57.119568
(1 row)
```

## Carga de datos de un archivo con valores predeterminados
<a name="r_COPY_command_examples-load-data-from-a-file-with-default-values"></a>

En el siguiente ejemplo, se utiliza una variación de la tabla VENUE de la base de datos TICKIT. Piense en una tabla VENUE\$1NEW definida con la siguiente instrucción: 

```
create table venue_new(
venueid smallint not null,
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
```

Piense en un archivo de datos venue\$1noseats.txt que no contenga valores para la columna VENUESEATS, como se muestra en el siguiente ejemplo: 

```
1|Toyota Park|Bridgeview|IL|
2|Columbus Crew Stadium|Columbus|OH|
3|RFK Stadium|Washington|DC|
4|CommunityAmerica Ballpark|Kansas City|KS|
5|Gillette Stadium|Foxborough|MA|
6|New York Giants Stadium|East Rutherford|NJ|
7|BMO Field|Toronto|ON|
8|The Home Depot Center|Carson|CA|
9|Dick's Sporting Goods Park|Commerce City|CO|
10|Pizza Hut Park|Frisco|TX|
```

La siguiente instrucción COPY cargará correctamente la tabla del archivo y aplicará el valor DEFAULT ("1000") a la columna omitida: 

```
copy venue_new(venueid, venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_noseats.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

Ahora observe la tabla cargada: 

```
select * from venue_new order by venueid;
venueid |         venuename          |    venuecity    | venuestate | venueseats
---------+----------------------------+-----------------+------------+------------
1 | Toyota Park                | Bridgeview      | IL         |       1000
2 | Columbus Crew Stadium      | Columbus        | OH         |       1000
3 | RFK Stadium                | Washington      | DC         |       1000
4 | CommunityAmerica Ballpark  | Kansas City     | KS         |       1000
5 | Gillette Stadium           | Foxborough      | MA         |       1000
6 | New York Giants Stadium    | East Rutherford | NJ         |       1000
7 | BMO Field                  | Toronto         | ON         |       1000
8 | The Home Depot Center      | Carson          | CA         |       1000
9 | Dick's Sporting Goods Park | Commerce City   | CO         |       1000
10 | Pizza Hut Park             | Frisco          | TX         |       1000
(10 rows)
```

Para el siguiente ejemplo, además de suponer que no se incluyen datos de VENUESEATS en el archivo, también se supone que no se incluyen datos de VENUENAME: 

```
1||Bridgeview|IL|
2||Columbus|OH|
3||Washington|DC|
4||Kansas City|KS|
5||Foxborough|MA|
6||East Rutherford|NJ|
7||Toronto|ON|
8||Carson|CA|
9||Commerce City|CO|
10||Frisco|TX|
```

 Al usar la misma definición de tabla, la siguiente instrucción COPY falla ya que no se especificó ningún valor DEFAULT para VENUENAME y esta es una columna NOT NULL: 

```
copy venue(venueid, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

Ahora piense en una variación de la tabla VENUE que utilice una columna IDENTITY: 

```
create table venue_identity(
venueid int identity(1,1),
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
```

Como en el ejemplo anterior, se supone que la columna VENUESEATS no tiene valores correspondientes en el archivo de origen. La siguiente instrucción COPY carga la tabla correctamente, incluidos los valores de datos IDENTITY predefinidos en lugar de autogenerar esos valores: 

```
copy venue(venueid, venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|' explicit_ids;
```

Esta instrucción falla porque no contiene la columna IDENTITY (falta VENUEID en la lista de columnas), pero incluye un parámetro EXPLICIT\$1IDS: 

```
copy venue(venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|' explicit_ids;
```

Esta instrucción falla porque no contiene un parámetro EXPLICIT\$1IDS: 

```
copy venue(venueid, venuename, venuecity, venuestate)
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

## Uso de COPY de datos con la opción ESCAPE
<a name="r_COPY_command_examples-copy-data-with-the-escape-option"></a>

En el siguiente ejemplo, se muestra cómo cargar caracteres que coincidan con el carácter delimitador (en este caso, la barra vertical). En el archivo de entrada, asegúrese de que a todos los caracteres de barra vertical (\$1) que desea cargar se les aplicó el carácter de escape de barra oblicua inversa (\$1). Luego cargue el archivo con el parámetro ESCAPE. 

```
$ more redshiftinfo.txt
1|public\|event\|dwuser
2|public\|sales\|dwuser

create table redshiftinfo(infoid int,tableinfo varchar(50));

copy redshiftinfo from 's3://amzn-s3-demo-bucket/data/redshiftinfo.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
delimiter '|' escape;

select * from redshiftinfo order by 1;
infoid |       tableinfo
-------+--------------------
1      | public|event|dwuser
2      | public|sales|dwuser
(2 rows)
```

Sin el parámetro ESCAPE, este comando COPY producirá un error `Extra column(s) found`.

**importante**  
Si carga los datos a través de un comando COPY con el parámetro ESCAPE, también debe especificar el parámetro ESCAPE con el comando UNLOAD para generar el archivo de salida recíproco. De forma similar, si utiliza UNLOAD con el parámetro ESCAPE, necesita usar ESCAPE cuando utilice COPY con los mismos datos.

## Ejemplos de Copy de JSON
<a name="r_COPY_command_examples-copy-from-json"></a>

En el siguiente ejemplo, cargue la tabla CATEGORY con los siguientes datos. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ [Carga desde datos JSON con la opción 'auto'](#copy-from-json-examples-using-auto)
+ [Carga desde datos JSON con la opción 'auto ignorecase'](#copy-from-json-examples-using-auto-ignorecase)
+ [Carga desde datos JSON con un archivo JSONPaths](#copy-from-json-examples-using-jsonpaths)
+ [Carga desde matrices de JSON con un archivo JSONPaths](#copy-from-json-examples-using-jsonpaths-arrays)

### Carga desde datos JSON con la opción 'auto'
<a name="copy-from-json-examples-using-auto"></a>

Para cargar desde datos JSON con la opción `'auto'`, los datos JSON deben estar compuestos por un conjunto de objetos. Los nombres de clave deben coincidir con los nombres de las columnas, pero el orden no importa. A continuación se muestra el contenido de un archivo denominado `category_object_auto.json`.

```
{
    "catdesc": "Major League Baseball",
    "catid": 1,
    "catgroup": "Sports",
    "catname": "MLB"
}
{
    "catgroup": "Sports",
    "catid": 2,
    "catname": "NHL",
    "catdesc": "National Hockey League"
}
{
    "catid": 3,
    "catname": "NFL",
    "catgroup": "Sports",
    "catdesc": "National Football League"
}
{
    "bogus": "Bogus Sports LLC",
    "catid": 4,
    "catgroup": "Sports",
    "catname": "NBA",
    "catdesc": "National Basketball Association"
}
{
    "catid": 5,
    "catgroup": "Shows",
    "catname": "Musicals",
    "catdesc": "All symphony, concerto, and choir concerts"
}
```

Para cargar contenido desde los archivos de datos JSON del ejemplo anterior, ejecute el siguiente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto';
```

### Carga desde datos JSON con la opción 'auto ignorecase'
<a name="copy-from-json-examples-using-auto-ignorecase"></a>

Para cargar desde datos JSON con la opción `'auto ignorecase'`, los datos JSON deben estar compuestos por un conjunto de objetos. No es necesario que las mayúsculas y las minúsculas de los nombres de clave coincidan con los nombres de las columnas y el orden no importa. A continuación se muestra el contenido de un archivo denominado `category_object_auto-ignorecase.json`.

```
{
    "CatDesc": "Major League Baseball",
    "CatID": 1,
    "CatGroup": "Sports",
    "CatName": "MLB"
}
{
    "CatGroup": "Sports",
    "CatID": 2,
    "CatName": "NHL",
    "CatDesc": "National Hockey League"
}
{
    "CatID": 3,
    "CatName": "NFL",
    "CatGroup": "Sports",
    "CatDesc": "National Football League"
}
{
    "bogus": "Bogus Sports LLC",
    "CatID": 4,
    "CatGroup": "Sports",
    "CatName": "NBA",
    "CatDesc": "National Basketball Association"
}
{
    "CatID": 5,
    "CatGroup": "Shows",
    "CatName": "Musicals",
    "CatDesc": "All symphony, concerto, and choir concerts"
}
```

Para cargar contenido desde los archivos de datos JSON del ejemplo anterior, ejecute el siguiente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto ignorecase.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto ignorecase';
```

### Carga desde datos JSON con un archivo JSONPaths
<a name="copy-from-json-examples-using-jsonpaths"></a>

Si los objetos de datos JSON no corresponden directamente con los nombres de las columnas, puede utilizar un archivo JSONPaths para asignar los elementos JSON a las columnas. El orden de los datos de origen JSON no importa, pero el orden de las expresiones del archivo JSONPaths debe coincidir con el orden de las columnas. Suponga que tiene el siguiente archivo de datos, denominado `category_object_paths.json`.

```
{
    "one": 1,
    "two": "Sports",
    "three": "MLB",
    "four": "Major League Baseball"
}
{
    "three": "NHL",
    "four": "National Hockey League",
    "one": 2,
    "two": "Sports"
}
{
    "two": "Sports",
    "three": "NFL",
    "one": 3,
    "four": "National Football League"
}
{
    "one": 4,
    "two": "Sports",
    "three": "NBA",
    "four": "National Basketball Association"
}
{
    "one": 6,
    "two": "Shows",
    "three": "Musicals",
    "four": "All symphony, concerto, and choir concerts"
}
```

El siguiente archivo JSONPaths, denominado `category_jsonpath.json`, asigna los datos de origen a las columnas de la tabla.

```
{
    "jsonpaths": [
        "$['one']",
        "$['two']",
        "$['three']",
        "$['four']"
    ]
}
```

Para cargar contenido desde los archivos de datos JSON del ejemplo anterior, ejecute el siguiente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_jsonpath.json';
```

### Carga desde matrices de JSON con un archivo JSONPaths
<a name="copy-from-json-examples-using-jsonpaths-arrays"></a>

Para cargar desde datos JSON que están compuestos por un conjunto de matrices, debe utilizar un archivo JSONPaths para asignar los elementos de las matrices a las columnas. Suponga que tiene el siguiente archivo de datos, denominado `category_array_data.json`.

```
[1,"Sports","MLB","Major League Baseball"]
[2,"Sports","NHL","National Hockey League"]
[3,"Sports","NFL","National Football League"]
[4,"Sports","NBA","National Basketball Association"]
[5,"Concerts","Classical","All symphony, concerto, and choir concerts"]
```

El siguiente archivo JSONPaths, denominado `category_array_jsonpath.json`, asigna los datos de origen a las columnas de la tabla.

```
{
    "jsonpaths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]"
    ]
}
```

Para cargar contenido desde los archivos de datos JSON del ejemplo anterior, ejecute el siguiente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_array_data.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_array_jsonpath.json';
```

## Ejemplos de Copy de Avro
<a name="r_COPY_command_examples-copy-from-avro"></a>

En el siguiente ejemplo, cargue la tabla CATEGORY con los siguientes datos. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ [Carga desde datos de Avro con la opción 'auto'](#copy-from-avro-examples-using-auto)
+ [Carga desde datos Avro con la opción 'auto ignorecase'](#copy-from-avro-examples-using-auto-ignorecase)
+ [Carga desde datos de Avro con un archivo JSONPaths](#copy-from-avro-examples-using-avropaths)

### Carga desde datos de Avro con la opción 'auto'
<a name="copy-from-avro-examples-using-auto"></a>

Para cargar desde datos de Avro con el argumento `'auto'`, los nombres de campo del esquema de Avro deben coincidir con los nombres de las columnas. Cuando se utiliza el argumento `'auto'`, el orden no importa. A continuación se muestra el esquema para un archivo denominado `category_auto.avro`.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "catid", "type": "int"},
        {"name": "catdesc", "type": "string"},
        {"name": "catname", "type": "string"},
        {"name": "catgroup", "type": "string"},
}
```

Los datos del archivo de Avro están en formato binario, por lo que no son legibles. A continuación se muestra una representación de JSON de los datos del archivo `category_auto.avro`. 

```
{
   "catid": 1,
   "catdesc": "Major League Baseball",
   "catname": "MLB",
   "catgroup": "Sports"
}
{
   "catid": 2,
   "catdesc": "National Hockey League",
   "catname": "NHL",
   "catgroup": "Sports"
}
{
   "catid": 3,
   "catdesc": "National Basketball Association",
   "catname": "NBA",
   "catgroup": "Sports"
}
{
   "catid": 4,
   "catdesc": "All symphony, concerto, and choir concerts",
   "catname": "Classical",
   "catgroup": "Concerts"
}
```

Para cargar contenido desde los archivos de datos Avro del ejemplo anterior, ejecute el siguiente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto';
```

### Carga desde datos Avro con la opción 'auto ignorecase'
<a name="copy-from-avro-examples-using-auto-ignorecase"></a>

Para cargar contenido desde datos Avro con el argumento `'auto ignorecase'`, no es necesario que las mayúsculas y las minúsculas de los nombres de campo del esquema de Avro coincidan con las mayúsculas y las minúsculas de los nombres de las columnas. Cuando se utiliza el argumento `'auto ignorecase'`, el orden no importa. A continuación se muestra el esquema para un archivo denominado `category_auto-ignorecase.avro`.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "CatID", "type": "int"},
        {"name": "CatDesc", "type": "string"},
        {"name": "CatName", "type": "string"},
        {"name": "CatGroup", "type": "string"},
}
```

Los datos del archivo de Avro están en formato binario, por lo que no son legibles. A continuación se muestra una representación de JSON de los datos del archivo `category_auto-ignorecase.avro`. 

```
{
   "CatID": 1,
   "CatDesc": "Major League Baseball",
   "CatName": "MLB",
   "CatGroup": "Sports"
}
{
   "CatID": 2,
   "CatDesc": "National Hockey League",
   "CatName": "NHL",
   "CatGroup": "Sports"
}
{
   "CatID": 3,
   "CatDesc": "National Basketball Association",
   "CatName": "NBA",
   "CatGroup": "Sports"
}
{
   "CatID": 4,
   "CatDesc": "All symphony, concerto, and choir concerts",
   "CatName": "Classical",
   "CatGroup": "Concerts"
}
```

Para cargar contenido desde los archivos de datos Avro del ejemplo anterior, ejecute el siguiente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto-ignorecase.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto ignorecase';
```

### Carga desde datos de Avro con un archivo JSONPaths
<a name="copy-from-avro-examples-using-avropaths"></a>

Si los nombres de campo del esquema de Avro no corresponden directamente con los nombres de las columnas, puede utilizar un archivo JSONPaths para asignar los elementos del esquema a las columnas. El orden de las expresiones del archivo JSONPaths debe coincidir con el orden de las columnas. 

Suponga que tiene un archivo de datos denominado `category_paths.avro` que contiene los mismos datos que el ejemplo anterior, pero con el siguiente esquema.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "desc", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "group", "type": "string"},
        {"name": "region", "type": "string"} 
     ]
}
```

El siguiente archivo JSONPaths, denominado `category_path.avropath`, asigna los datos de origen a las columnas de la tabla.

```
{
    "jsonpaths": [
        "$['id']",
        "$['group']",
        "$['name']",
        "$['desc']"
    ]
}
```

Para cargar contenido desde los archivos de datos Avro del ejemplo anterior, ejecute el siguiente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
format avro 's3://amzn-s3-demo-bucket/category_path.avropath ';
```

## Preparación de archivos para utilizar COPY con la opción ESCAPE
<a name="r_COPY_preparing_data"></a>

En el siguiente ejemplo, se describe cómo puede preparar datos para “aplicar escape” a los caracteres de línea nueva antes de importar los datos a una tabla de Amazon Redshift mediante el comando COPY con el parámetro ESCAPE. Sin la preparación de los datos para delimitar los caracteres de línea nueva, Amazon Redshift devuelve errores de carga cuando ejecuta el comando COPY, ya que el carácter de línea nueva, por lo general, se utiliza como un separador de registros. 

Por ejemplo, piense en un archivo o una columna de una tabla externa que desea copiar a una tabla de Amazon Redshift. Si el archivo o la columna tiene contenido con formato XML o datos similares, debe asegurarse de que a todos los caracteres de línea nueva (\$1n) que forman parte del contenido se les aplique escape con la barra oblicua inversa (\$1). 

Un archivo o una tabla que contienen caracteres de línea nueva insertados proporcionan un patrón relativamente fácil para el cual buscar coincidencias. Lo más probable es que cada carácter de línea nueva insertado siga siempre a un carácter `>` con algunos caracteres de espacio en blanco potenciales (`' '` o tabulación) en el medio, como se puede observar en el siguiente ejemplo de un archivo de texto denominado `nlTest1.txt`. 

```
$ cat nlTest1.txt
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>|1000
<xml>
</xml>|2000
```

Con el siguiente ejemplo, puede ejecutar un procesador de textos para procesar previamente el archivo de origen e insertar caracteres de escape cuando los necesite. (El carácter `|` está pensado para utilizarse como delimitador para separar datos de columnas cuando se copian en una tabla de Amazon Redshift). 

```
$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g' nlTest1.txt > nlTest2.txt
```

Del mismo modo, puede utilizar Perl para realizar una operación similar: 

```
cat nlTest1.txt | perl -p -e 's/>\s*\n/>\\\n/g' > nlTest2.txt
```

Para adaptar la carga de datos del archivo `nlTest2.txt` en Amazon Redshift, creamos una tabla con dos columnas en dicho servicio. La primera columna c1, es una columna de caracteres que tiene el contenido con formato XML del archivo `nlTest2.txt`. La segunda columna c2 contiene los valores enteros cargados desde el mismo archivo. 

Después de ejecutar el comando `sed`, puede cargar correctamente los datos del archivo `nlTest2.txt` en una tabla de Amazon Redshift mediante el parámetro ESCAPE. 

**nota**  
Cuando incluya el parámetro ESCAPE con el comando COPY, se aplica escape a un número de caracteres especiales que incluyen la barra oblicua inversa (incluida la línea nueva). 

```
copy t2 from 's3://amzn-s3-demo-bucket/data/nlTest2.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'  
escape
delimiter as '|';

select * from t2 order by 2;

c1           |  c2
-------------+------
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>
| 1000
<xml>
</xml>       | 2000
(2 rows)
```

Puede preparar los archivos de datos exportados de bases de datos externas de forma similar. Por ejemplo, con una base de datos de Oracle, puede utilizar la función REPLACE en cada columna afectada de una tabla que desee copiar en Amazon Redshift. 

```
SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml
```

Además, varias herramientas de extracción, transformación y carga (ETL) y de exportación de bases de datos que generalmente procesan grandes cantidades de datos brindan opciones para especificar caracteres delimitadores y de escape. 

## Carga de un shapefile en Amazon Redshift
<a name="copy-example-spatial-copy-shapefile"></a>

En los siguientes ejemplos, se muestra cómo cargar un ESRI shapefile con COPY. Para obtener más información sobre cómo cargar shapefiles, consulte [Carga de un shapefile en Amazon Redshift](spatial-copy-shapefile.md). 

### Carga de un shapefile
<a name="copy-example-spatial-copy-shapefile-loading-copy"></a>

Los siguientes pasos muestran cómo capturar datos de OpenStreetMap desde Amazon S3 a través del comando COPY. Este ejemplo asume que el archivo shapefile de Noruega del [sitio de descarga de Geofabrik](https://download.geofabrik.de/europe.html) se cargó en un bucket de Amazon S3 privado en su región de AWS. Los archivos `.shp`, `.shx` y `.dbf` deben compartir el mismo prefijo y nombre de archivo de Amazon S3.

#### Ingesta de datos sin simplificación
<a name="spatial-copy-shapefile-loading-copy-fits"></a>

Los siguientes comandos crean tablas y capturan datos que caben en el tamaño máximo de geometría sin ninguna simplificación. Abra `gis_osm_natural_free_1.shp` en su software de SIG preferido e inspeccione las columnas de esta capa. De manera predeterminada, las columnas IDENTITY o GEOMETRY son las primeras. Cuando una columna GEOMETRY es la primera, puede crear la tabla como se muestra a continuación.

```
CREATE TABLE norway_natural (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Cuando una columna IDENTITY es la primera, puede crear la tabla como se muestra a continuación.

```
CREATE TABLE norway_natural_with_id (
   fid INT IDENTITY(1,1),
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Ahora, puede capturar los datos mediante COPY.

```
COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO: Load into table 'norway_natural' completed, 83891 record(s) loaded successfully
```

También puede capturar los datos como se muestra a continuación. 

```
COPY norway_natural_with_id FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO: Load into table 'norway_natural_with_id' completed, 83891 record(s) loaded successfully.
```

#### Ingesta de datos con simplificación
<a name="spatial-copy-shapefile-loading-copy-no-fit"></a>

Los siguientes comandos crean una tabla e intentan capturar datos que no caben en el tamaño máximo de la geometría sin ninguna simplificación. Inspeccione el shapefile `gis_osm_water_a_free_1.shp` y cree la tabla adecuada como se muestra a continuación.

```
CREATE TABLE norway_water (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Cuando se ejecuta el comando COPY, se produce un error.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
ERROR:  Load into table 'norway_water' failed.  Check 'stl_load_errors' system table for details.
```

La consulta de `STL_LOAD_ERRORS` muestra que la geometría es demasiado grande. 

```
SELECT line_number, btrim(colname), btrim(err_reason) FROM stl_load_errors WHERE query = pg_last_copy_id();
 line_number |    btrim     |                                 btrim
-------------+--------------+-----------------------------------------------------------------------
     1184705 | wkb_geometry | Geometry size: 1513736 is larger than maximum supported size: 1048447
```

Para superar esto, el parámetro `SIMPLIFY AUTO` se agrega al comando COPY para simplificar la geometría.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
SIMPLIFY AUTO
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';

INFO:  Load into table 'norway_water' completed, 1989196 record(s) loaded successfully.
```

Para ver las filas y las geometrías que se simplificaron, consulte `SVL_SPATIAL_SIMPLIFY`.

```
SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id();
 query | line_number | maximum_tolerance | initial_size | simplified | final_size |   final_tolerance
-------+-------------+-------------------+--------------+------------+------------+----------------------
    20 |     1184704 |                -1 |      1513736 | t          |    1008808 |   1.276386653895e-05
    20 |     1664115 |                -1 |      1233456 | t          |    1023584 | 6.11707814796635e-06
```

El uso de SIMPLIFY AUTO *max\$1tolerance* con una tolerancia inferior a las calculadas de manera automática probablemente resulte en un error de ingesta. En este caso, utilice MAXERROR para ignorar los errores.

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
SIMPLIFY AUTO 1.1E-05
MAXERROR 2
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';

INFO:  Load into table 'norway_water' completed, 1989195 record(s) loaded successfully.
INFO:  Load into table 'norway_water' completed, 1 record(s) could not be loaded.  Check 'stl_load_errors' system table for details.
```

Consulte `SVL_SPATIAL_SIMPLIFY` de nuevo para identificar el registro que COPY no logró cargar.

```
SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id();
 query | line_number | maximum_tolerance | initial_size | simplified | final_size | final_tolerance
-------+-------------+-------------------+--------------+------------+------------+-----------------
    29 |     1184704 |           1.1e-05 |      1513736 | f          |          0 |               0
    29 |     1664115 |           1.1e-05 |      1233456 | t          |     794432 |         1.1e-05
```

En este ejemplo, el primer registro no logró ajustarse; por lo tanto, la columna `simplified` se muestra como false. El segundo registro se cargó en el marco de la tolerancia determinada. No obstante, el tamaño final es mayor que si se utiliza la tolerancia calculada automáticamente sin especificar la tolerancia máxima. 

### Carga desde un shapefile comprimido
<a name="copy-example-spatial-copy-shapefile-compressed"></a>

COPY de Amazon Redshift admite la ingesta de datos de un shapefile comprimido. Todos los componentes de shapefile deben tener el mismo prefijo de Amazon S3 y el mismo sufijo de compresión. Por ejemplo, supongamos que desea cargar los datos del ejemplo anterior. En este caso, los archivos `gis_osm_water_a_free_1.shp.gz`, `gis_osm_water_a_free_1.dbf.gz` y `gis_osm_water_a_free_1.shx.gz` deben compartir el directorio de Amazon S3. El comando COPY requiere la opción GZIP, y la cláusula FROM debe especificar el archivo comprimido correcto, como se muestra a continuación.

```
COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/compressed/gis_osm_natural_free_1.shp.gz'
FORMAT SHAPEFILE
GZIP
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO:  Load into table 'norway_natural' completed, 83891 record(s) loaded successfully.
```

### Carga de datos en una tabla con un orden de columnas diferente
<a name="copy-example-spatial-copy-shapefile-column-order"></a>

Si tiene una tabla en la que `GEOMETRY` no es la primera columna, puede utilizar el mapeo de columnas para asignar columnas a la tabla de destino. Por ejemplo, cree una tabla con `osm_id` especificado como primera columna.

```
CREATE TABLE norway_natural_order (
   osm_id BIGINT,
   wkb_geometry GEOMETRY,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Luego, capture un shapefile mediante el mapeo de columnas.

```
COPY norway_natural_order(wkb_geometry, osm_id, code, fclass, name) 
FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO:  Load into table 'norway_natural_order' completed, 83891 record(s) loaded successfully.
```

### Carga de datos en una tabla con una columna geography
<a name="copy-example-spatial-copy-shapefile-geography"></a>

Si tiene una tabla con una columna `GEOGRAPHY`, primero captúrela en una columna `GEOMETRY` y, a continuación, convierta los objetos en objetos `GEOGRAPHY`. Por ejemplo, después de copiar el shapefile en una columna `GEOMETRY`, modifique la tabla para agregar una columna de tipo de datos `GEOGRAPHY`.

```
ALTER TABLE norway_natural ADD COLUMN wkb_geography GEOGRAPHY;
```

A continuación, convierta las columnas geometry en geography.

```
UPDATE norway_natural SET wkb_geography = wkb_geometry::geography;
```

De forma opcional, puede eliminar la columna `GEOMETRY`.

```
ALTER TABLE norway_natural DROP COLUMN wkb_geometry;
```

## Comando COPY con la opción NOLOAD
<a name="r_COPY_command_examples-load-noload-option"></a>

Para validar los archivos de datos antes de que los datos se carguen, use la opción NOLOAD con el comando COPY. Amazon Redshift analiza el archivo de entrada y muestra los errores que se producen. En el siguiente ejemplo se utiliza la opción NOLOAD donde no se carga ninguna fila en la tabla.

```
COPY public.zipcode1
FROM 's3://amzn-s3-demo-bucket/mydata/zipcode.csv' 
DELIMITER ';' 
IGNOREHEADER 1 REGION 'us-east-1'
NOLOAD
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/myRedshiftRole';

Warnings:
Load into table 'zipcode1' completed, 0 record(s) loaded successfully.
```

## Comando COPY con un delimitador multibyte y la opción ENCODING
<a name="r_COPY_command_examples-load-encoding-multibyte-delimiter-option"></a>

En el siguiente ejemplo, se carga LATIN1 desde un archivo de Amazon S3 que contiene datos multibyte. El comando COPY especifica el delimitador en formato octal `\302\246\303\254` para separar los campos del archivo de entrada, que está codificado como ISO-8859-1. Para especificar el mismo delimitador en UTF-8, indique `DELIMITER '¦ì'`.

```
COPY latin1
FROM 's3://amzn-s3-demo-bucket/multibyte/myfile' 
IAM_ROLE 'arn:aws:iam::123456789012:role/myRedshiftRole'
DELIMITER '\302\246\303\254'
ENCODING ISO88591
```

# CREATE DATABASE
<a name="r_CREATE_DATABASE"></a>

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 [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

## Sintaxis
<a name="r_CREATE_DATABASE-synopsis"></a>

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

## Parameters
<a name="r_CREATE_DATABASE-parameters"></a>

 *database\$1name*   
Nombre de la nueva base de datos. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

FROM INTEGRATION '<id\$1de\$1integración>' [ DATABASE '<base\$1de\$1datos\$1de\$1origen>' ]   
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\$1INTEGRATION. Para las integraciones sin ETL de Aurora PostgreSQL, también debe especificar el nombre de `source_database`, que también se puede recuperar de SVV\$1INTEGRATION.  
Para ver un ejemplo, consulta [Creación de bases de datos para recibir los resultados de las integraciones sin ETL](#r_CREATE_DATABASE-integration). 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](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html) en la *Guía de administración de Amazon Redshift*.

SET  
Palabra clave opcional.

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
La cláusula ACCEPTINVCHARS establece si las tablas de integración sin ETL continúan con la ingesta cuando se detectan caracteres no válidos para el tipo de datos VARCHAR. Cuando se encuentran caracteres no válidos, se reemplazan por un carácter `?` predeterminado.

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
La cláusula QUERY\$1ALL\$1STATES establece si las tablas de integración sin ETL pueden consultarse en todos los estados (`Synced`, `Failed`, `ResyncRequired` y `ResyncInitiated`). De forma predeterminada, una tabla de integración sin ETL solo puede consultarse en estado `Synced`.

REFRESH\$1INTERVAL <intervalo>  
La cláusula REFRESH\$1INTERVAL establece el intervalo de tiempo aproximado, en segundos, para actualizar los datos desde el origen sin ETL en la base de datos de destino. El valor se puede establecer de 0 a 432 000 segundos (5 días) para las integraciones sin ETL cuyo tipo de origen sea Aurora MySQL, Aurora PostgreSQL o RDS para MySQL. Para las integraciones sin ETL de Amazon DynamoDB, el valor se puede establecer entre 900 y 432 000 segundos (15 minutos y 5 días). El `interval` predeterminado es cero (0) segundos para las integraciones sin ETL cuyo tipo de origen sea Aurora MySQL, Aurora PostgreSQL o RDS para MySQL. Para las integraciones sin ETL de Amazon DynamoDB, el `interval` predeterminado es de 900 segundos (15 minutos).

TRUNCATECOLUMNS [=] \$1 TRUE \$1 FALSE \$1  
La cláusula TRUNCATECOLUMNS establece si las tablas de integración sin ETL continúan con la ingesta cuando los valores de la columna VARCHAR o los atributos de columna SUPER exceden el límite. Cuando `TRUE`, los valores se truncan para que quepan en la columna y los valores de los atributos JSON desbordados se truncan para que quepan en la columna SUPER.

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1  
Cláusula que especifica si Amazon Redshift establecerá el modo de historial para todas las tablas nuevas de la base de datos especificada. Esta opción solo se aplica a las bases de datos creadas para la integración sin ETL.  
La cláusula HISTORY\$1MODE puede establecerse en `TRUE` o `FALSE`. El valor predeterminado es `FALSE`. Para obtener información sobre HISTORY\$1MODE, consulte [Modo de historial](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html) en la *Guía de administración de Amazon Redshift*.

WITH  
Palabra clave opcional.

OWNER [=] db\$1owner  
Especifica el nombre de usuario del propietario de la base de datos.

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
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 [CREATE USER](r_CREATE_USER.md). El valor predeterminado es UNLIMITED. Para ver las conexiones actuales, consulte la vista del sistema [STV\$1SESSIONS](r_STV_SESSIONS.md).  
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 \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Una cláusula que especifica si en la búsqueda o comparación de cadenas se distingue entre mayúsculas y minúsculas. El valor predeterminado es distinguir entre mayúsculas y minúsculas.  
No se admite la intercalación cuando se crea una base de datos a partir de un recurso compartido de datos.  
CASE\$1SENSITIVE y CS son intercambiables y producen los mismos resultados. Del mismo modo, CASE\$1INSENSITIVE y CI son intercambiables y producen los mismos resultados.

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
Una cláusula que especifica el nivel de aislamiento utilizado cuando las consultas se ejecutan en una base de datos. Para obtener más información sobre niveles de aislamiento, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md).  
+ 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. 
+ Aislamiento SERIALIZABLE: proporciona serialización completa para transacciones simultáneas. 

FROM ARN '<ARN>'  
ARN de base de datos de AWS Glue que se puede utilizar para crear la base de datos.

\$1 WITH DATA CATALOG SCHEMA '<esquema>' \$1 WITH NO DATA CATALOG SCHEMA \$1  
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.

IAM\$1ROLE \$1 default \$1 'SESSION' \$1 'arn:aws:iam::*<Cuenta de AWS-id>*:role/*<role-name>*' \$1  
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](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html), 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\$1ROLE 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](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html).  
A continuación se muestra la sintaxis de la cadena del parámetro IAM\$1ROLE 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](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 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](federated-create-secret-iam-role.md).   
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
<a name="r_CREATE_DATABASE-datashare-synopsis"></a>

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
<a name="r_CREATE_DATABASE-parameters-datashare"></a>

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

 *datashare\$1name*   
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\$1guid*   
Se trata de un valor que especifica el espacio de nombres productor al que pertenece el recurso compartido de datos.

ACCOUNT *account\$1id*  
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
<a name="r_CREATE_DATABASE-usage"></a>

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
<a name="r_CREATE_DATABASE_data-catalog"></a>

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\$1ROLE. Para obtener más información sobre el parámetro y los valores aceptados, consulte [Parámetros](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html#r_CREATE_DATABASE-parameters).

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
<a name="r_CREATE_DATABASE-integration"></a>

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\$1INTEGRATION;

```
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';
```

Si se necesita la base de datos de origen de integraciones sin ETL, por ejemplo, especifique.

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

También puede establecer un intervalo de actualización para la base de datos. Por ejemplo, para establecer el intervalo de actualización en 7200 segundos para los datos de un origen de integración sin ETL:

```
CREATE DATABASE myacct_mysql FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET REFRESH_INTERVAL 7200;
```

Consulte la vista de catálogo de SVV\$1INTEGRATION para obtener información sobre una integración sin ETL, como integration\$1id, target\$1database, origen, refresh\$1interval, etc.

```
SELECT * FROM svv_integration;
```

En el siguiente ejemplo se crea una base de datos a partir de una integración con el modo de historial activado.

```
CREATE DATABASE sample_integration_db FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET HISTORY_MODE = true;
```

## Límites de CREATE DATABASE
<a name="r_CREATE_DATABASE-create-database-limits"></a>

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
<a name="r_CREATE_DATABASE-collation"></a>

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\$1INSENSITIVE, 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](c_collation_sequences.md).

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\$1COUNT(), REGEXP\$1REPLACE(), REGEXP\$1INSTR(), REGEXP\$1SUBSTR()
+ 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](r_CREATE_TABLE_NEW.md).

Para obtener información acerca de la función COLLATE, consulte [Función COLLATE](r_COLLATE.md).

### Limitaciones de la intercalación de bases de datos
<a name="r_CREATE_DATABASE-collation-limitations"></a>

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.
  ```

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](r_COLLATE.md).

## Ejemplos
<a name="r_CREATE_DATABASE-examples"></a>

**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\$1DATABASE\$1INFO 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\$1db 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
<a name="r_CREATE_DATABASE-collation-examples"></a>

**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)
```

# CREATE DATASHARE
<a name="r_CREATE_DATASHARE"></a>

Cree un datashare nuevo en la base de datos actual. El propietario de este datashare es el emisor del comando CREATE DATASHARE.

Amazon Redshift asocia cada datashare a una sola base de datos de Amazon Redshift. Solo puede agregar objetos de la base de datos asociada a un datashare. Puede crear varios datashares en la misma base de datos de Amazon Redshift.

Para obtener más información sobre los recursos compartidos de datos, consulte [Uso compartido de datos en Amazon Redshift](datashare-overview.md).

Para ver información sobre los datashares, utilice [SHOW DATASHARES](r_SHOW_DATASHARES.md).

## Privilegios necesarios
<a name="r_CREATE_DATASHARE-privileges"></a>

Los siguientes privilegios son necesarios para CREATE DATASHARE:
+ Superusuario
+ Usuarios con el privilegio CREATE DATASHARE
+ Propietario de la base de datos

## Sintaxis
<a name="r_CREATE_DATASHARE-synopsis"></a>

```
CREATE DATASHARE datashare_name
[[SET] PUBLICACCESSIBLE [=] TRUE | FALSE ];
```

## Parameters
<a name="r_CREATE_DATASHARE-parameters"></a>

*datashare\$1name*  
El nombre del datashare. El nombre del datashare debe ser único en el espacio de nombres del clúster.

[[SET] PUBLICACCESSIBLE]  
Se trata de una cláusula que especifica si el datashare se puede compartir con clústeres accesibles de manera pública.  
El valor predeterminado de `SET PUBLICACCESSIBLE` es `FALSE`.

## Notas de uso
<a name="r_CREATE_DATASHARE_usage"></a>

De manera predeterminada, el propietario del recurso compartido de datos solo posee el recurso compartido pero no los objetos dentro de este.

Solo los superusuarios y el propietario de la base de datos pueden utilizar CREATE DATASHARE y delegar privilegios ALTER a otros usuarios o grupos. 

## Ejemplos
<a name="r_CREATE_DATASHARE_examples"></a>

En el siguiente ejemplo, se crea el recurso compartido de datos de `salesshare`.

```
CREATE DATASHARE salesshare;
```

En el siguiente ejemplo, se crea el recurso compartido de datos de `demoshare` que administra AWS Data Exchange.

```
CREATE DATASHARE demoshare SET PUBLICACCESSIBLE TRUE, MANAGEDBY ADX;
```

# CREATE EXTERNAL FUNCTION
<a name="r_CREATE_EXTERNAL_FUNCTION"></a>

Crea una función definida por el usuario (UDF) escalar basada en AWS Lambda para Amazon Redshift. Para obtener más información acerca de las funciones de Lambda definidas por el usuario, consulte [UDF de Lambda escalares](udf-creating-a-lambda-sql-udf.md).

## Privilegios necesarios
<a name="r_CREATE_EXTERNAL_FUNCTION-privileges"></a>

Los siguientes privilegios son necesarios para CREATE EXTERNAL FUNCTION:
+ Superusuario
+ Usuarios con el privilegio CREATE [ OR REPLACE ] EXTERNAL FUNCTION

## Sintaxis
<a name="r_CREATE_EXTERNAL_FUNCTION-synopsis"></a>

```
CREATE [ OR REPLACE ] EXTERNAL FUNCTION external_fn_name ( [data_type] [, ...] )
RETURNS data_type
{ VOLATILE | STABLE }
LAMBDA 'lambda_fn_name'
IAM_ROLE { default | ‘arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>’
RETRY_TIMEOUT milliseconds
MAX_BATCH_ROWS count
MAX_BATCH_SIZE size [ KB | MB ];
```

## Parameters
<a name="r_CREATE_EXTERNAL_FUNCTION-parameters"></a>

OR REPLACE  
Se trata de una cláusula que especifica que, si ya existe una función con el mismo nombre y los mismos tipos de datos de argumento de entrada o *firma* que este, debe reemplazarse la función existente. Solo puede reemplazar una función con una nueva función que defina un conjunto idéntico de tipos de datos. Debe ser un superusuario para reemplazar una función.  
Si define una función con el mismo nombre que una función existente, pero con una firma diferente, crea una nueva función. En otras palabras, se sobrecarga el nombre de la función. Para obtener más información, consulte [Sobrecarga de los nombres de función](udf-naming-udfs.md#udf-naming-overloading-function-names).

*external\$1fn\$1name*  
Se trata del nombre de la función externa. Si especifica un nombre de esquema (como myschema.myfunction), la función se crea con el esquema especificado. De lo contrario, la función se crea en el esquema actual. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).   
Recomendamos que utilice el prefijo en los nombres de todas las UDF `f_`. Amazon Redshift reserva el prefijo `f_` para los nombres de las UDF. Con el uso del prefijo `f_`, se asegura de que los nombres de las UDF no entren en conflicto con ninguno de los nombres de las funciones SQL integradas para Amazon Redshift ahora o en el futuro. Para obtener más información, consulte [Prevención de conflictos al dar nombre a las UDF](udf-naming-udfs.md).

*data\$1type*  
Se trata del tipo de datos para los argumentos de entrada. Para obtener más información, consulte [UDF de Python escalares](udf-creating-a-scalar-udf.md) y [UDF de Lambda escalares](udf-creating-a-lambda-sql-udf.md).

RETURNS *data\$1type*  
El tipo de datos del valor que la función devuelve. El tipo de datos RETURNS puede ser cualquier tipo de datos estándar de Amazon Redshift. Para obtener más información, consulte [UDF de Python escalares](udf-creating-a-scalar-udf.md) y [UDF de Lambda escalares](udf-creating-a-lambda-sql-udf.md).

VOLATILE \$1 STABLE  
Informa al optimizador de consultas acerca de la volatilidad de la función.   
Para obtener la mejor optimización, etiquete la función con la categoría de volatilidad válida más estricta. Las categorías de volatilidad, de la menos estricta a la más estricta, son las siguientes:  
+ VOLATILE
+ STABLE
VOLATILE  
Dados los mismos argumentos, la función puede devolver resultados diferentes en ejecuciones consecutivas, incluso para las filas de una única instrucción. El optimizador de consultas no puede hacer suposiciones sobre el comportamiento de una función volátil. Una consulta que utiliza una función volátil debe reevaluar la función para cada entrada.  
STABLE  
Dados los mismos argumentos, se garantiza que la función devuelve los mismos resultados en sucesivas llamadas procesadas en una misma instrucción. La función puede devolver resultados diferentes cuando se evoca en diferentes instrucciones. Con esta categoría, el optimizador puede reducir el número de veces que se llama a la función en una misma instrucción.  
Tenga en cuenta que si el rigor elegido no es válido para la función, existe el riesgo de que el optimizador omita algunas llamadas basándose en este rigor. Esto puede provocar un conjunto de resultados incorrecto.  
La cláusula IMMUTABLE no es compatible actualmente con las UDF de Lambda.

LAMBDA *'lambda\$1fn\$1name'*   
 Se trata del nombre de la función a la que llama Amazon Redshift.  
Si desea conocer los pasos necesarios para crear una función de AWS Lambda, consulte [Creación de una función de Lambda con la consola](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html) en la *Guía para desarrolladores de AWS Lambda*.  
Para obtener información acerca de los permisos necesarios para la función de Lambda, consulte [Permisos de AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html) en la *Guía para desarrolladores de AWS Lambda*.

IAM\$1ROLE \$1 default \$1 ‘arn:aws:iam::*<Cuenta de AWS-id>*:role/*<role-name>*’   
Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando CREATE EXTERNAL FUNCTION.  
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. El comando CREATE EXTERNAL FUNCTION tiene autorización para invocar funciones de Lambda a través de este rol de IAM. Si su clúster tiene un rol de IAM existente con permisos para invocar funciones de Lambda adjuntas, puede sustituir el ARN de su rol. Para obtener más información, consulte [Configuración del parámetro de autorización para las UDF de Lambda](udf-creating-a-lambda-sql-udf.md#udf-lambda-authorization).  
A continuación, se muestra la sintaxis del parámetro IAM\$1ROLE.  

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

RETRY\$1TIMEOUT *milliseconds*   
Se trata de la cantidad de tiempo total en milisegundos que Amazon Redshift utiliza para los retrasos en el reintento de retroceso.   
En lugar de volver a intentar ejecutar inmediatamente cualquier consulta que presente error, Amazon Redshift realiza retrocesos y espera cierta cantidad de tiempo entre reintentos. Luego, Amazon Redshift vuelve a intentar realizar la solicitud para ejecutar la consulta que presenta error de nuevo hasta que la suma de todos los retrasos sea igual o superior al valor RETRY\$1TIMEOUT que especificó. El valor predeterminado es 20 000 milisegundos.  
Cuando se invoca una función de Lambda, Amazon Redshift vuelve a intentar ejecutar las consultas que presentan errores, como `TooManyRequestsException`, `EC2ThrottledException` y `ServiceException`.   
Puede configurar el parámetro RETRY\$1TIMEOUT en 0 milisegundos para evitar cualquier reintento de ejecución de una UDF de Lambda.

MAX\$1BATCH\$1ROWS *recuento*  
 El número máximo de filas que Amazon Redshift envía en una sola solicitud por lotes para una única invocación de lambda.   
 El valor mínimo de este parámetro es 1. El valor máximo es INT\$1MAX o 2 147 483 647.   
 Este parámetro es opcional. El valor predeterminado es INT\$1MAX o 2 147 483 647. 

MAX\$1BATCH\$1SIZE *tamaño* [ KB \$1 MB ]   
 El tamaño máximo de la carga útil de datos que Amazon Redshift envía en una sola solicitud por lotes para una única invocación de lambda.   
 El valor mínimo de este parámetro es 1 KB. El valor máximo es 5 MB.   
 El valor predeterminado de este parámetro es 5 MB.   
 KB y MB son opcionales. Si no establece la unidad de medida, Amazon Redshift utilizará KB de forma predeterminada. 

## Notas de uso
<a name="r_CREATE_FUNCTION-usage-notes"></a>

Tenga en cuenta lo siguiente al crear UDF de Lambda: 
+ El orden de las llamadas a la función de Lambda en los argumentos de entrada no es fijo ni está garantizado. Puede variar de una instancia a otra de las consultas en ejecución, en función de la configuración del clúster.
+ No se garantiza que las funciones se apliquen a cada argumento de entrada una vez y solo una vez. La interacción entre Amazon Redshift y AWS Lambda podría dar lugar a llamadas repetitivas con las mismas entradas.

## Ejemplos
<a name="r_CREATE_FUNCTION-examples"></a>

A continuación, se proporcionan ejemplos de uso de funciones escalares de Lambda definidas por el usuario (UDF).

### Ejemplo de UDF escalar de Lambda con una función Node.js de Lambda
<a name="r_CREATE_FUNCTION-lambda-example-node"></a>

En el siguiente ejemplo, se crea una función externa denominada `exfunc_sum` que toma dos valores enteros como argumentos de entrada. Esta función devuelve la suma como una salida expresada con un número entero. El nombre de la función de Lambda a la que se llamará es `lambda_sum`. El lenguaje utilizado para esta función de Lambda es Node.js 12.x. Asegúrese de especificar el rol de IAM. El ejemplo utiliza `'arn:aws:iam::123456789012:user/johndoe'` como rol de IAM.

```
CREATE EXTERNAL FUNCTION exfunc_sum(INT,INT)
RETURNS INT
VOLATILE
LAMBDA 'lambda_sum'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

La función de Lambda toma la carga de solicitudes e itera sobre cada fila. Se suman todos los valores de una sola fila para calcular la suma de esa fila, que se guarda en la matriz de respuesta. La cantidad de filas en la matriz de resultados es similar a la cantidad de filas recibidas en la carga de la solicitud. 

La carga de respuesta JSON debe tener los datos de resultado en el campo “results” para que la función externa la reconozca. El campo de argumentos de la solicitud enviada a la función de Lambda contiene la carga de datos. En el caso de una solicitud por lote, es posible que existan varias filas en la carga de datos. La siguiente función de Lambda itera sobre todas las filas de la carga de datos de la solicitud. También itera de forma individual sobre todos los valores dentro de una sola fila.

```
exports.handler = async (event) => {
    // The 'arguments' field in the request sent to the Lambda function contains the data payload.
    var t1 = event['arguments'];

    // 'len(t1)' represents the number of rows in the request payload.
    // The number of results in the response payload should be the same as the number of rows received.
    const resp = new Array(t1.length);

    // Iterating over all the rows in the request payload.
    for (const [i, x] of t1.entries())
    {
        var sum = 0;
        // Iterating over all the values in a single row.
        for (const y of x) {
            sum = sum + y;
        }
        resp[i] = sum;
    }
    // The 'results' field should contain the results of the lambda call.
    const response = {
        results: resp
    };
    return JSON.stringify(response);
};
```

En el siguiente ejemplo, se llama a la función externa con valores literales.

```
select exfunc_sum(1,2);
exfunc_sum
------------
 3
(1 row)
```

En el siguiente ejemplo, se crea una tabla denominada t\$1sum con dos columnas, c1 y c2, del tipo de datos entero y se insertan dos filas de datos. Luego, se llama a la función externa transmitiendo los nombres de las columnas de esta tabla. Las dos filas de la tabla se envían en una solicitud por lote en la carga de la solicitud como una sola invocación de Lambda.

```
CREATE TABLE t_sum(c1 int, c2 int);
INSERT INTO t_sum VALUES (4,5), (6,7);
SELECT exfunc_sum(c1,c2) FROM t_sum;
 exfunc_sum
---------------
 9
 13
(2 rows)
```

### Ejemplo de UDF escalar de Lambda con el atributo RETRY\$1TIMEOUT
<a name="r_CREATE_FUNCTION-lambda-example-retry"></a>

En la siguiente sección, encontrará un ejemplo de cómo utilizar el atributo RETRY\$1TIMEOUT en las UDF de Lambda. 

AWS LambdaLas funciones de tienen límites de simultaneidad que se pueden establecer para cada función. Para obtener más información acerca de los límites de simultaneidad, consulte [Administración de la simultaneidad para una función de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) en la *Guía para desarrolladores de AWS Lambda* y la publicación [Administración de la simultaneidad de la función de AWS Lambda](https://aws.amazon.com/blogs/compute/managing-aws-lambda-function-concurrency) en el blog de computación de AWS. 

Cuando la cantidad de solicitudes que atiende una UDF de Lambda supera los límites de simultaneidad, las solicitudes nuevas reciben el error `TooManyRequestsException`. La UDF de Lambda intenta solucionar este error de nuevo hasta que la suma de todos los retrasos entre las solicitudes enviadas a la función de Lambda sea igual o superior al valor RETRY\$1TIMEOUT que estableció. El valor predeterminado de RETRY\$1TIMEOUT es 20 000 milisegundos.

En el siguiente ejemplo, se utiliza una función de Lambda denominada `exfunc_sleep_3`. Esta función toma la carga de la solicitud, itera sobre cada fila y convierte la entrada a mayúsculas. Luego, está inactiva durante 3 segundos y devuelve el resultado. El lenguaje utilizado para esta función de Lambda es Python 3.8. 

La cantidad de filas en la matriz de resultados es similar a la cantidad de filas recibidas en la carga de la solicitud. La carga de respuesta JSON debe tener los datos de resultado en el campo `results` para que la función externa la reconozca. El campo de `arguments` de la solicitud enviada a la función de Lambda contiene la carga de datos. En el caso de una solicitud por lote, es posible que aparezcan varias filas en la carga de datos.

El límite de simultaneidad para esta función se configura específicamente en 1 en simultaneidad reservada para demostrar el uso del atributo RETRY\$1TIMEOUT. Cuando el atributo se configura en 1, la función de Lambda solo puede atender una solicitud a la vez.

```
import json
import time
def lambda_handler(event, context):
    t1 = event['arguments']
    # 'len(t1)' represents the number of rows in the request payload.
    # The number of results in the response payload should be the same as the number of rows received.
    resp = [None]*len(t1)

    # Iterating over all rows in the request payload.
    for i, x in enumerate(t1):
        # Iterating over all the values in a single row.
        for j, y in enumerate(x):
            resp[i] = y.upper()

    time.sleep(3)
    ret = dict()
    ret['results'] = resp
    ret_json = json.dumps(ret)
    return ret_json
```

A continuación, se incluyen dos ejemplos adicionales que ilustran el atributo RETRY\$1TIMEOUT. Cada ejemplo invoca una sola UDF de Lambda. Cuando invocan la UDF de Lambda, cada ejemplo ejecuta la misma consulta SQL para invocar la UDF de Lambda desde dos sesiones de base de datos simultáneas. Cuando la primera consulta que invoca la UDF de Lambda es atendida por la UDF, la segunda consulta recibe el error `TooManyRequestsException`. Este resultado se produce porque se configura de forma específica la simultaneidad reservada en 1 en la UDF. Para obtener información sobre cómo establecer la simultaneidad reservada para las funciones de Lambda, consulte [Configuración de la simultaneidad reservada](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#configuration-concurrency-reservedconfiguration-concurrency-reserved).

A continuación, el primer ejemplo configura el atributo RETRY\$1TIMEOUT para la UDF de Lambda en 0 milisegundos. Si la solicitud de Lambda recibe alguna excepción de la función de Lambda, Amazon Redshift no realiza ningún reintento. Este resultado se produce porque el atributo RETRY\$1TIMEOUT se configura en 0.

```
CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar)
RETURNS varchar
VOLATILE
LAMBDA 'exfunc_sleep_3'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test'
RETRY_TIMEOUT 0;
```

Con RETRY\$1TIMEOUT configurado en 0, puede ejecutar las siguientes dos consultas desde sesiones de base de datos independientes para ver resultados diferentes.

La primera consulta SQL que utiliza la UDF de Lambda se ejecuta correctamente.

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

La segunda consulta, que se ejecuta desde una sesión de base de datos independiente al mismo tiempo, recibe el error `TooManyRequestsException`.

```
select exfunc_upper('Varchar');
ERROR:  Rate Exceeded.; Exception: TooManyRequestsException; ShouldRetry: 1
DETAIL:
-----------------------------------------------
error:  Rate Exceeded.; Exception: TooManyRequestsException; ShouldRetry: 1
code:      32103
context:query:     0
location:  exfunc_client.cpp:102
process:   padbmaster [pid=26384]
-----------------------------------------------
```

A continuación, el segundo ejemplo configura el atributo RETRY\$1TIMEOUT para la UDF de Lambda en 3000 milisegundos. Incluso si la segunda consulta se ejecuta de forma simultánea, la UDF de Lambda reintenta la ejecución hasta que el retraso total sea de 3000 milisegundos. Por lo tanto, ambas consultas se ejecutan correctamente.

```
CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar)
RETURNS varchar
VOLATILE
LAMBDA 'exfunc_sleep_3'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test'
RETRY_TIMEOUT 3000;
```

Con RETRY\$1TIMEOUT configurado en 3000, puede ejecutar las siguientes dos consultas desde sesiones de base de datos independientes para ver los mismos resultados.

La primera consulta SQL que ejecuta la UDF de Lambda se ejecuta correctamente.

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

La segunda consulta se ejecuta de forma simultánea, y la UDF de Lambda reintenta la ejecución hasta que el retraso total sea de 3000 milisegundos.

```
select exfunc_upper('Varchar');
 exfunc_upper
--------------
 VARCHAR
(1 row)
```

### Ejemplo de UDF escalar de Lambda con una función Python de Lambda
<a name="r_CREATE_FUNCTION-lambda-example-python"></a>

En el siguiente ejemplo, se crea una función externa denominada `exfunc_multiplication` que multiplica números y devuelve un número entero. Este ejemplo incorpora los campos de éxito y `error_msg` en la respuesta de Lambda. El campo de éxito se establece como false cuando hay un desbordamiento de valores enteros en el resultado de la multiplicación y el mensaje `error_msg` se establece como `Integer multiplication overflow`. La función `exfunc_multiplication` toma tres valores enteros como argumentos de entrada y devuelve la suma como un valor de salida entero. 

El nombre de la función de Lambda que se llama es `lambda_multiplication`. El lenguaje utilizado para esta función de Lambda es Python 3.8. Asegúrese de especificar el rol de IAM.

```
CREATE EXTERNAL FUNCTION exfunc_multiplication(int, int, int)
RETURNS INT
VOLATILE
LAMBDA 'lambda_multiplication'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

La función de Lambda toma la carga de solicitudes e itera sobre cada fila. Todos los valores de una sola fila se multiplican para calcular el resultado de esa fila, que se guarda en la lista de respuestas. En este ejemplo, se utiliza un valor booleano de éxito establecido como true de manera predeterminada. Si el resultado de la multiplicación de una fila tiene un desbordamiento de valores enteros, el valor de éxito se establece como false. Por lo tanto, se interrumpe el ciclo de iteraciones. 

Durante la creación de la carga de respuesta, si el valor de éxito es false, la siguiente función de Lambda agrega el campo `error_msg` a la carga. También establece el mensaje de error en `Integer multiplication overflow`. Si el valor de éxito es true, los datos de resultado se agregan en el campo de resultados. La cantidad de filas en la matriz de resultados, si hay, es similar a la cantidad de filas recibidas en la carga de la solicitud. 

El campo de argumentos de la solicitud enviada a la función de Lambda contiene la carga de datos. En el caso de una solicitud por lote, es posible que existan varias filas en la carga de datos. La siguiente función de Lambda itera sobre todas las filas de la carga de datos de la solicitud e itera de manera individual sobre todos los valores dentro de una sola fila. 

```
import json
def lambda_handler(event, context):
    t1 = event['arguments']
    # 'len(t1)' represents the number of rows in the request payload.
    # The number of results in the response payload should be the same as the number of rows received.
    resp = [None]*len(t1)

    # By default success is set to 'True'.
    success = True
    # Iterating over all rows in the request payload.
    for i, x in enumerate(t1):
        mul = 1
        # Iterating over all the values in a single row.
        for j, y in enumerate(x):
            mul = mul*y

        # Check integer overflow.
        if (mul >= 9223372036854775807 or mul <= -9223372036854775808):
            success = False
            break
        else:
            resp[i] = mul
    ret = dict()
    ret['success'] = success
    if not success:
        ret['error_msg'] = "Integer multiplication overflow"
    else:
        ret['results'] = resp
    ret_json = json.dumps(ret)

    return ret_json
```

En el siguiente ejemplo, se llama a la función externa con valores literales.

```
SELECT exfunc_multiplication(8, 9, 2);
  exfunc_multiplication
---------------------------
          144
(1 row)
```

En el siguiente ejemplo, se crea una tabla denominada t\$1multi con tres columnas, c1, c2 y c3, del tipo de datos entero. Se llama a la función externa transmitiendo los nombres de las columnas de esta tabla. Los datos se insertan de tal manera que provocan un desbordamiento de valores enteros para mostrar cómo se propaga el error.

```
CREATE TABLE t_multi (c1 int, c2 int, c3 int);
INSERT INTO t_multi VALUES (2147483647, 2147483647, 4);
SELECT exfunc_multiplication(c1, c2, c3) FROM t_multi;
DETAIL:
  -----------------------------------------------
  error:  Integer multiplication overflow
  code:      32004context:
  context:
  query:     38
  location:  exfunc_data.cpp:276
  process:   query2_16_38 [pid=30494]
  -----------------------------------------------
```

# CREATE EXTERNAL MODEL
<a name="r_create_external_model"></a>

**Topics**
+ [Requisitos previos para CREATE EXTERNAL MODEL](#r_create_external_model_prereqs)
+ [Privilegios necesarios](#r_simple_create_model-privileges)
+ [Control de costes](#r_create_model_cost)
+ [Sintaxis de CREATE EXTERNAL MODEL](#r_create_external_model_syntax)
+ [Parámetros y configuración de CREATE EXTERNAL MODEL](#r_create_external_model_parameters_settings)
+ [Parámetros de función de inferencia de CREATE EXTERNAL MODEL](#r_create_external_model_if_parameters)

## Requisitos previos para CREATE EXTERNAL MODEL
<a name="r_create_external_model_prereqs"></a>

Antes de utilizar la instrucción CREATE EXTERNAL MODEL, complete los requisitos previos en [Configuración del clúster para utilizar Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup). A continuación, se brinda un resumen de alto nivel de los requisitos previos.
+ Cree un clúster de Amazon Redshift con la consola de administración de AWS o la AWS Command Line Interface (AWS CLI)
+ Adjunte la política de AWS Identity and Access Management (IAM) mientras crea el clúster.
+ Para permitir que Amazon Redshift y Amazon Bedrock asuman el rol a la hora de interactuar con otros servicios, agregue la política de confianza adecuada al rol de IAM.
+ Habilite el acceso a los LLM específicos que desee usar desde la consola de Amazon Bedrock.
+ (Opcional) Si encuentra excepciones que imponen limitaciones provenientes de Amazon Bedrock, por ejemplo, `Too many requests, please wait before trying again`, incluso con pequeñas cantidades de datos, compruebe las cuotas en **Service Quotas** en su cuenta de Amazon Bedrock. Compruebe que la cuota de cuenta aplicada sea como mínimo igual al valor de la cuota predeterminada de AWS para las solicitudes de **InvokeModel** para el modelo que está utilizando.

Para obtener detalles sobre el rol de IAM, la política de confianza y otros requisitos previos, consulte [Configuración del clúster para utilizar Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup).

## Privilegios necesarios
<a name="r_simple_create_model-privileges"></a>

Los siguientes privilegios son necesarios para CREATE EXTERNAL MODEL:
+ Superusuario
+ Usuarios con el privilegio CREATE MODEL
+ Roles con el privilegio GRANT CREATE MODEL

## Control de costes
<a name="r_create_model_cost"></a>

 Amazon Redshift ML utiliza los recursos de clúster existentes para crear modelos de predicción, por lo que no es necesario pagar costes adicionales. Sin embargo, los cargos de AWS por el uso de Amazon Bedrock dependen del modelo que seleccione. Para obtener más información, consulte [Costes para usar Amazon Redshift ML](https://docs.aws.amazon.com/redshift/latest/dg/cost.html). 

## Sintaxis de CREATE EXTERNAL MODEL
<a name="r_create_external_model_syntax"></a>

A continuación, se muestra la sintaxis completa de la instrucción CREATE EXTERNAL MODEL.

```
CREATE EXTERNAL MODEL model_name 
FUNCTION function_name
IAM_ROLE {default/'arn:aws:iam::<account-id>:role/<role-name>'}
MODEL_TYPE BEDROCK
SETTINGS (
   MODEL_ID model_id
   [, PROMPT 'prompt prefix']
   [, SUFFIX 'prompt suffix']
   [, REQUEST_TYPE {RAW|UNIFIED}]
   [, RESPONSE_TYPE {VARCHAR|SUPER}]
);
```

El comando `CREATE EXTERNAL MODEL` crea una función de inferencia que se utiliza para generar contenido. 

A continuación, se muestra la sintaxis de una función de inferencia que `CREATE EXTERNAL MODEL` crea mediante un `REQUEST_TYPE` de `RAW`: 

```
SELECT inference_function_name(request_super) 
[FROM table];
```

A continuación, se muestra la sintaxis de una función de inferencia que `CREATE EXTERNAL MODEL` crea mediante un `REQUEST_TYPE` de `UNIFIED`: 

```
SELECT inference_function_name(input_text, [, inference_config [, additional_model_request_fields]])
[FROM table];
```

Para obtener información sobre cómo usar la función de inferencia, consulte [Uso de un modelo externo para la integración de Amazon Redshift ML con Amazon Bedrock](machine-learning-br.md#machine-learning-br-use).

## Parámetros y configuración de CREATE EXTERNAL MODEL
<a name="r_create_external_model_parameters_settings"></a>

En esta sección se describen los parámetros y la configuración del comando `CREATE EXTERNAL MODEL`.

**Topics**
+ [Parámetros de CREATE EXTERNAL MODEL](#r_create_external_model_parameters)
+ [Configuración de CREATE EXTERNAL MODEL](#r_create_external_model_settings)

### Parámetros de CREATE EXTERNAL MODEL
<a name="r_create_external_model_parameters"></a>

model\$1name  
El nombre del modelo externo. El nombre del modelo en un esquema debe ser único.

FUNCTION *function\$1name (data\$1type [,...] )*  
El nombre de la función de inferencia que `CREATE EXTERNAL MODEL` crea. La función de inferencia se utiliza para enviar solicitudes a Amazon Bedrock y recuperar el texto generado por ML.

IAM\$1ROLE * \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1*  
El rol de IAM que Amazon Redshift utiliza para acceder a Amazon Bedrock. Para obtener información acerca del rol de IAM, consulte [Creación o actualización de un rol de IAM para la integración de Amazon Redshift ML con Amazon Bedrock](machine-learning-br.md#machine-learning-br-iam).

MODEL\$1TYPE BEDROCK  
Especifica el tipo de modelo. El único valor válido es `BEDROCK`.

SETTINGS ( MODEL\$1ID model\$1id [,...] )  
Especifica la configuración del modelo externo. Consulte la siguiente sección para obtener más información.

### Configuración de CREATE EXTERNAL MODEL
<a name="r_create_external_model_settings"></a>

MODEL\$1ID model\$1id  
El identificador del modelo externo, por ejemplo, `anthropic.claude-v2`. Para obtener información sobre los ID de modelo de Amazon Bedrock, consulte [Amazon Bedrock model IDs](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html).

PROMPT “prefijo de petición”  
Especifica una petición estática que Amazon Redshift agrega al principio de cada solicitud de inferencia. Solo se admite con un `REQUEST_TYPE` de `UNIFIED`.

SUFFIX “sufijo de petición”  
Especifica una petición estática que Amazon Redshift agrega al final de cada solicitud de inferencia. Solo se admite con un `REQUEST_TYPE` de `UNIFIED`.

REQUEST\$1TYPE \$1 RAW \$1 UNIFIED \$1  
Especifica el formato de la solicitud enviada a Amazon Bedrock. Entre los valores válidos se incluyen los siguientes:  
+ **RAW**: la función de inferencia toma la entrada como un supervalor único y siempre devuelve un supervalor. El formato del supervalor es específico del modelo de Amazon Bedrock seleccionado. Un súper es un modelo de predicción que combina varios algoritmos para producir una única predicción mejorada.
+ **UNIFIED**: la función de inferencia utiliza la API unificada. Todos los modelos tienen una interfaz unificada y coherente con Amazon Bedrock. Esto funciona para todos los modelos que admiten mensajes. Este valor es el valor predeterminado.

  Para obtener más información, consulte la [Documentación de la API de conversión](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html) en la *Documentación de la API de Amazon Bedrock*.

RESPONSE\$1TYPE \$1 VARCHAR \$1 SUPER \$1  
Especifica el formato de la respuesta. Si `REQUEST_TYPE` es `RAW`, `RESPONSE_TYPE` es obligatorio y el único valor válido es `SUPER`. Para todos los demás valores `REQUEST TYPE`, el valor predeterminado es `VARCHAR` y `RESPONSE_TYPE` es opcional. Entre los valores válidos se incluyen los siguientes:  
+ **VARCHAR**: Amazon Redshift solo devuelve la respuesta de texto generada por el modelo.
+ **SUPER**: Amazon Redshift devuelve todo el JSON de respuesta generado por el modelo en forma de súper. Esto incluye la respuesta de texto e información como el motivo de la parada y el uso de los tokens de entrada y salida del modelo. Un súper es un modelo de predicción que combina varios algoritmos para producir una única predicción mejorada. 

## Parámetros de función de inferencia de CREATE EXTERNAL MODEL
<a name="r_create_external_model_if_parameters"></a>

En esta sección se describen los parámetros válidos para la función de inferencia que crea el comando `CREATE EXTERNAL MODEL`. 

### Parámetros de función de inferencia de CREATE EXTERNAL MODEL para `REQUEST_TYPE` de `RAW`
<a name="r_create_external_model_if_parameters_raw"></a>

Una función de inferencia creada con un `REQUEST_TYPE` de `RAW` tiene un argumento de superentrada y siempre devuelve un tipo de superdatos. La sintaxis de la superentrada sigue la sintaxis de la solicitud del modelo específico seleccionado de Amazon Bedrock.

### Parámetros de función de inferencia de CREATE EXTERNAL MODEL para `REQUEST_TYPE` de `UNIFIED`
<a name="r_create_external_model_if_parameters_unified"></a>

input\$1text  
El texto que Amazon Redshift envía a Amazon Bedrock.

inference\$1config  
Un supervalor que contiene parámetros opcionales que Amazon Redshift envía a Amazon Bedrock. Estos pueden incluir los siguientes:  
+ maxTokens
+ stopSequences
+ temperature
+ topP
Todos estos parámetros son opcionales y distinguen entre mayúsculas y minúsculas. Para obtener información sobre estos parámetros, consulte [InferenceConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InferenceConfiguration.html) en la *referencia de la API de Amazon Bedrock*.

# CREATE EXTERNAL SCHEMA
<a name="r_CREATE_EXTERNAL_SCHEMA"></a>

Crea un nuevo esquema externo en la base de datos actual. Puede utilizar este esquema externo para conectarse a las bases de datos de Amazon RDS for PostgreSQL o la Edición compatible con PostgreSQL de Amazon Aurora. También puede crear un esquema externo que referencie una base de datos en un catálogo de datos externo, como AWS Glue, Athena o una base de datos en un metastore de Apache Hive, como Amazon EMR.

El propietario de este esquema es el emisor del comando CREATE EXTERNAL SCHEMA. Para transferir la propiedad de un esquema externo, use [ALTER SCHEMA](r_ALTER_SCHEMA.md) para cambiar el propietario. Para conceder acceso al esquema a otros usuarios o grupos utilice el comando [GRANT](r_GRANT.md). 

No puede usar los comandos GRANT o REVOKE para los permisos en una tabla externa. En lugar de ello, conceda o revoque los permisos en el esquema externo. 

**nota**  
Si actualmente tiene tablas externas de Redshift Spectrum en el catálogo de datos de Amazon Athena, puede migrar el catálogo de datos de Athena a un AWS Glue Data Catalog. Para utilizar el catálogo de datos de AWS Glue con Redshift Spectrum, es posible que tenga que cambiar las políticas de AWS Identity and Access Management (IAM). Para obtener más información, consulte [Actualización al catálogo de datos de AWS Glue](https://docs.aws.amazon.com/athena/latest/ug/glue-athena.html#glue-upgrade) en la *Guía del usuario de Athena*.

Para ver detalles de los esquemas externos, consulte la vista del sistema [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md). 

## Sintaxis
<a name="r_CREATE_EXTERNAL_SCHEMA-synopsis"></a>

La sintaxis siguiente describe el comando CREATE EXTERNAL SCHEMA utilizado para hacer referencia a datos mediante un catálogo de datos externo. Para obtener más información, consulte [Amazon Redshift Spectrum](c-using-spectrum.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM [ [ DATA CATALOG ] | HIVE METASTORE | POSTGRES | MYSQL | KINESIS | MSK | REDSHIFT | KAFKA ]
[ DATABASE 'database_name' ]
[ SCHEMA 'schema_name' ]
[ REGION 'aws-region' ]
[ IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>' ] ]
[ AUTHENTICATION [ none | iam | mtls] ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ]
[ URI ['hive_metastore_uri' [ PORT port_number ] | 'hostname' [ PORT port_number ] | 'Kafka bootstrap URL'] ] 
[ CLUSTER_ARN 'arn:aws:kafka:<region>:<Cuenta de AWS-id>:cluster/msk/<cluster uuid>' ]
[ CATALOG_ROLE [ 'SESSION' | 'catalog-role-arn-string' ] ]
[ CREATE EXTERNAL DATABASE IF NOT EXISTS ]
[ CATALOG_ID 'Amazon Web Services account ID containing Glue or Lake Formation database' ]
```

La siguiente sintaxis describe el comando CREATE EXTERNAL SCHEMA que se utiliza para referenciar datos mediante una consulta federada a RDS POSTGRES o Aurora PostgreSQL. También se puede crear un esquema externo que haga referencia a orígenes de streaming, como Kinesis Data Streams. Para obtener más información, consulte [Consulta de datos con consultas federadas en Amazon Redshift](federated-overview.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM POSTGRES
DATABASE 'federated_database_name' [SCHEMA 'schema_name']
URI 'hostname' [ PORT port_number ]
IAM_ROLE [ default | 'arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

La siguiente sintaxis describe el comando CREATE EXTERNAL SCHEMA que se utiliza para referenciar datos mediante una consulta federada a RDS MySQL o Aurora MySQL. Para obtener más información, consulte [Consulta de datos con consultas federadas en Amazon Redshift](federated-overview.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM MYSQL
DATABASE 'federated_database_name'
URI 'hostname' [ PORT port_number ]
IAM_ROLE [ default | 'arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

La siguiente sintaxis describe el comando CREATE EXTERNAL SCHEMA que se utiliza para hacer referencia a datos de un flujo de Kinesis. Para obtener más información, consulte [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KINESIS
IAM_ROLE [ default | 'arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>' ]
```

La siguiente sintaxis describe el comando CREATE EXTERNAL SCHEMA utilizado para hacer referencia al clúster de Amazon Managed Streaming para Apache Kafka o Confluent Cloud y los temas desde los cuales se incorpora. Para conectarse, debe proporcionar el URI del agente. Para obtener más información, consulte [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KAFKA
[ IAM_ROLE [ default | 'arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>' ] ]
URI 'Kafka bootstrap URI'
AUTHENTICATION [ none | iam | mtls ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ];
```

La siguiente sintaxis describe el comando CREATE EXTERNAL SCHEMA que se utiliza para referenciar datos mediante una consulta entre distintas bases de datos.

```
CREATE EXTERNAL SCHEMA local_schema_name
FROM  REDSHIFT
DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'
```

## Parameters
<a name="r_CREATE_EXTERNAL_SCHEMA-parameters"></a>

IF NOT EXISTS  
Una cláusula que indica que si el esquema especificado ya existe, el comando no debe realizar cambios y debe devolver un mensaje en el que se indique que el esquema existe, en lugar de terminar con un error. Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si CREATE EXTERNAL SCHEMA intenta crear un esquema que ya existe. 

nombre\$1de\$1esquema\$1local  
El nombre del nuevo esquema externo. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

FROM [ DATA CATALOG ] \$1 HIVE METASTORE \$1 POSTGRES \$1 MYSQL \$1 KINESIS \$1 MSK \$1 REDSHIFT   
Una palabra clave que indica dónde está ubicada la base de datos externa.   
DATA CATALOG indica que la base de datos externa se define en el catálogo de datos de Athena o en el AWS Glue Data Catalog.   
Si la base de datos externa se define en un catálogo de datos externo en una región de AWS diferente, el parámetro REGION es obligatorio. DATA CATALOG es el valor predeterminado.  
HIVE METASTORE indica que la base de datos externa está definida en un metaalmacén Apache Hive. Si se especifica HIVE METASTORE, se requiere el URI.   
POSTGRES indica que la base de datos externa está definida en RDS PostgreSQL o Aurora PostgreSQL.  
MYSQL indica que la base de datos externa está definida en RDS MySQL o Aurora MySQL.  
KINESIS indica que el origen de datos es un flujo de Kinesis Data Streams.  
MSK indica que el origen de datos es un clúster aprovisionado o sin servidor de Amazon MSK.  
KAFKA indica que el origen de datos es un clúster de Kafka. Puede utilizar esta palabra clave para Amazon MSK y Confluent Cloud.

FROM REDSHIFT  
Se trata de una palabra clave que indica que la base de datos se encuentra en Amazon Redshift.

DATABASE '*redshift\$1database\$1name*' SCHEMA '*redshift\$1schema\$1name*'  
Se trata del nombre de la base de datos de Amazon Redshift.   
El parámetro *redshift\$1schema\$1name* indica el esquema en Amazon Redshift. El parámetro *redshift\$1schema\$1name* predeterminado es `public`.

DATABASE '*federated\$1database\$1name*'  
Se trata de una palabra clave que indica el nombre de la base de datos externa en un motor de base de datos de PostgreSQL o MySQL compatible. 

[SCHEMA '*schema\$1name*']  
El parámetro *schema\$1name* indica el esquema en un motor de base de datos de PostgreSQL compatible. El valor predeterminado de *schema\$1name* es `public`.  
No se puede especificar un SCHEMA cuando se configura una consulta federada a un motor de base de datos de MySQL compatible. 

REGION '*aws-region*'  
Si la base de datos externa se define en un catálogo de datos de Athena o en el AWS Glue Data Catalog, esta es la región de AWS en la que se encuentra la base de datos. Este parámetro es obligatorio si la base de datos se define en un catálogo de datos externo. 

URI [ 'hive\$1metastore\$1uri' [ PORT port\$1number ] \$1 'hostname' [ PORT port\$1number ] \$1 'Kafka bootstrap URI' ]  
Se trata del URI del nombre del alojamiento y el port\$1number de un motor de base de datos de PostgreSQL o MySQL compatible. El *hostname* es el nodo principal del conjunto de réplicas. El punto de conexión debe ser accesible (enrutable) desde el clúster de Amazon Redshift. El port\$1number predeterminado de PostgreSQL es 5432. El port\$1number predeterminado para MySQL es 3306.  
El motor de base de datos de PostgreSQL o MySQL compatible debe estar en la misma VPC que el clúster de Amazon Redshift con un grupo de seguridad que vincule Amazon Redshift y RDS url-rsPostgreSQL o Aurora PostgreSQL. Además, puede usar el enrutamiento de VPC mejorado para configurar un caso de uso entre VPC. Para obtener más información, consulte [Puntos de conexión de VPC administrador por Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-cluster-cross-vpc.html).
**Especificación de un URI de metastore de hive**  
Si la base de datos está en un metaalmacén Hive, especifique el URI y, de manera opcional, el número de puerto para el metaalmacén. El número de puerto predeterminado es 9083.   
Un URI no contiene una especificación de protocolo (“http://”). Un ejemplo de URI válido es .: `uri '172.10.10.10'`.   
**Especificación de un URI de agente para la ingesta de streaming**  
La inclusión del URI de bootstrap-broker proporciona la capacidad de conectarse a un clúster de Amazon MSK o Confluent Cloud y recibir datos transmitidos. Para obtener más información y ver un ejemplo, consulte [Introducción a la ingesta de streaming de Amazon Managed Streaming para Apache Kafka](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started-MSK.html).

IAM\$1ROLE [ default \$1 'SESSION' \$1 'arn:aws:iam::*<Cuenta de AWS-id>*:role/*<role-name>*' ]  
Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando CREATE EXTERNAL SCHEMA.  
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 obtener más información, 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](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html), lo que explica cómo configurar la identidad federada. Tenga en cuenta que esta configuración, con `'SESSION'` en lugar del ARN, solo se puede usar si el esquema se crea utilizando `DATA CATALOG`.   
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.  
A continuación se muestra la sintaxis de la cadena del parámetro IAM\$1ROLE 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 ver un ejemplo de encadenamiento de roles, consulte [Encadenamiento de roles de IAM en Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 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](federated-create-secret-iam-role.md).   
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>'
```

SECRET\$1ARN '*ssm-secret-arn*'  
Se trata del nombre de recurso de Amazon (ARN) de un secreto de motor de base de datos de PostgreSQL o MySQL compatible creado mediante AWS Secrets Manager. Para obtener información sobre cómo crear y recuperar un ARN para un secreto, consulte [Administrar secretos con AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) en la *Guía del usuario de AWS Secrets Manager*, y [Recuperar el nombre de recurso de Amazon (ARN) del secreto en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html). 

CATALOG\$1ROLE [ 'SESSION' \$1 *catalog-role-arn-string*]  
Use `'SESSION'` para conectarse al clúster de Amazon Redshift mediante una identidad federada para la autenticación y la autorización del catálogo de datos. Para obtener más información acerca de completar los pasos para la 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](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html). Tenga en cuenta que el rol `'SESSION'` solo se puede usar si el esquema se crea en el CATÁLOGO DE DATOS.  
Utilice el nombre de recurso de Amazon (ARN), para un rol de IAM que el clúster utiliza para la autenticación y la autorización del catálogo de datos.   
Si no se especifica CATALOG\$1ROLE, Amazon Redshift utiliza el IAM\$1ROLE especificado. El rol del catálogo debe tener permiso para acceder al catálogo de datos en AWS Glue o Athena. Para obtener más información, consulte [Políticas de IAM para Amazon Redshift Spectrum](c-spectrum-iam-policies.md).   
A continuación se muestra la sintaxis de la cadena del parámetro CATALOG\$1ROLE para un único ARN.  

```
CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role>'
```
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](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
La lista de roles encadenados no debe incluir espacios.
A continuación se muestra la sintaxis para encadenar tres roles.  

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


CREATE EXTERNAL DATABASE IF NOT EXISTS  
Una cláusula que crea una base de datos externa con el nombre especificado por el argumento DATABASE, si la base de datos externa especificada no existe. Si la base de datos externa especificada existe, el comando no realiza cambios. En este caso, el comando devuelve un mensaje en el que se indica que la base de datos externa existe, en lugar de terminar con un error.  
No puede utilizar CREATE EXTERNAL DATABASE IF NOT EXISTS con HIVE METASTORE.  
Para utilizar CREATE EXTERNAL DATABASE IF NOT EXISTS con un catálogo de datos habilitado para AWS Lake Formation, necesita tener el permiso `CREATE_DATABASE` en el catálogo de datos. 

CATALOG\$1ID "*ID de la cuenta de Amazon Web Services que contiene la base de datos de Glue o Lake Formation*"  
El ID de la cuenta donde se almacena la base de datos del catálogo de datos.  
`CATALOG_ID` solo se puede especificar si planea conectarse al clúster de Amazon Redshift o a Amazon Redshift sin servidor mediante una identidad federada para la autenticación y la autorización del catálogo de datos estableciendo una de las siguientes opciones:   
+ `CATALOG_ROLE` De a `'SESSION'`
+ `IAM_ROLE` a `'SESSION'` y `'CATALOG_ROLE'` configurado en su valor predeterminado 
Para obtener más información acerca de completar los pasos para la 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](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html). 

AUTENTICACIÓN  
El tipo de autenticación que se ha definido para la ingesta de streaming. La ingesta de streaming con tipos de autenticación funciona con Amazon Managed Streaming para Apache Kafka. Los tipos de `AUTHENTICATION` son los siguientes:  
+ **ninguno**: especifica que no se requiere autenticación. Esto corresponde al acceso no autenticado en MSK o texto sin formato con TLS en Apache Kafka.
+ **iam**: especifica la autenticación de IAM. Al elegir esta opción, asegúrese de que el rol de IAM tenga permisos para la autenticación de IAM. Para obtener más información acerca de la definición del esquema externo, consulte [Introducción a la ingesta de transmisiones desde orígenes de Apache Kafka](materialized-view-streaming-ingestion-getting-started-MSK.md).
+ **mtls**: especifica que la seguridad de la capa de transporte mutua proporciona una comunicación segura al facilitar la autenticación entre un cliente y un servidor. En este caso, el cliente es Redshift y el servidor es Amazon MSK. Para obtener más información acerca de cómo configurar la ingesta de streaming con mTLS, consulte [Autenticación con mTLS para la ingesta de transmisiones de Redshift desde orígenes de Apache Kafka](materialized-view-streaming-ingestion-mtls.md).


AUTHENTICATION\$1ARN  
El ARN del certificado AWS Certificate Manager utilizado por Amazon Redshift para la autenticación mtls con Amazon MSK. El ARN está disponible en la consola de ACM al elegir el certificado emitido.

CLUSTER\$1ARN  
Para la ingesta de streaming, CLUSTER\$1ARN es el identificador del clúster de Amazon Managed Streaming para Apache Kafka desde el que está transmitiendo. Al utilizar CLUSTER\$1ARN, se requiere una política de rol de IAM que incluya el permiso `kafka:GetBootstrapBrokers`. Esta opción se proporciona por compatibilidad con versiones anteriores. Actualmente, recomendamos utilizar la opción de URI de bootstrap-broker para conectarse a clústeres de Amazon Managed Streaming para Apache Kafka. Para obtener más información, consulte [Ingesta de streaming](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion.html).

## Notas de uso
<a name="r_CREATE_EXTERNAL_SCHEMA_usage"></a>

Para conocer los límites de uso del catálogo de datos de Athena, consulte [Límites de Athena](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#amazon-athena-limits) en la Referencia general de AWS.

Para conocer los límites cuando se utiliza el AWS Glue Data Catalog, consulte [Límites de AWS Glue](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_glue) en la Referencia general de AWS.

Estos límites no se aplican a un metaalmacén Hive.

Hay un máximo de 9 900 esquemas por base de datos. Para obtener más información, consulte [Cuotas y límites](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) en la *Guía de administración de Amazon Redshift*.

Para anular el registro del esquema, utilice el comando [DROP SCHEMA](r_DROP_SCHEMA.md). 

Para ver detalles de los esquemas externos, consulte las siguientes vistas del sistema: 
+ [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md) 
+ [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 
+ [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md) 

## Ejemplos
<a name="r_CREATE_EXTERNAL_SCHEMA_examples"></a>

El siguiente ejemplo crea un esquema externo utilizando una base de datos en un catálogo de datos denominado `sampledb` en la región Oeste de EE. UU. (Oregón). Utilice este ejemplo con un catálogo de datos de Athena o AWS Glue.

```
create external schema spectrum_schema
from data catalog
database 'sampledb'
region 'us-west-2'
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';
```

En el siguiente ejemplo, se crean un esquema externo y una nueva base de datos externa denominada `spectrum_db`.

```
create external schema spectrum_schema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole'
create external database if not exists;
```

En el siguiente ejemplo, se crea un esquema externo a través de una base de datos de metaalmacén Hive denominada `hive_db`.

```
create external schema hive_schema
from hive metastore
database 'hive_db'
uri '172.10.10.10' port 99
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';
```

En el siguiente ejemplo, se encadenan roles con el fin de utilizar el rol `myS3Role` para acceder a Amazon S3 y se utiliza `myAthenaRole` para acceder al catálogo de datos. Para obtener más información, consulte [Encadenamiento de roles de IAM en Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).

```
create external schema spectrum_schema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myRedshiftRole,arn:aws:iam::123456789012:role/myS3Role'
catalog_role 'arn:aws:iam::123456789012:role/myAthenaRole'
create external database if not exists;
```

En el siguiente ejemplo, se crea un esquema externo que referencia una base de datos de Aurora PostgreSQL. 

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema
FROM POSTGRES
DATABASE 'my_aurora_db' SCHEMA 'my_aurora_schema'
URI 'endpoint to aurora hostname' PORT 5432  
IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole'
SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'
```

En el siguiente ejemplo, se crea un esquema externo para referenciar la base de datos sales\$1db importada en el clúster consumidor.

```
CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
```

En el siguiente ejemplo, se crea un esquema externo que referencia una base de datos de Aurora MySQL. 

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema
FROM MYSQL
DATABASE 'my_aurora_db'
URI 'endpoint to aurora hostname'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole'
SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'
```

# CREATE EXTERNAL TABLE
<a name="r_CREATE_EXTERNAL_TABLE"></a>

Crea una nueva tabla externa en el esquema especificado. Todas las tablas externas deben crearse en un esquema externo. La ruta de búsqueda no es compatible con esquemas externos y tablas externas. Para obtener más información, consulte [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md).

Además de las tablas externas creadas con el comando CREATE EXTERNAL TABLE, Amazon Redshift puede referencia tablas externas definidas en un catálogo de AWS Glue o AWS Lake Formation, o bien, en un metastore de Apache Hive. Utilice el comando [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) para registrar una base de datos externa definida en el catálogo externo y para hacer que las tablas externas estén disponibles para usarse en Amazon Redshift. Si la tabla externa ya existe en un catálogo de AWS Glue o AWS Lake Formation o en un metastore de Hive, no necesita crear la tabla con CREATE EXTERNAL TABLE. Para ver las tablas externas, consulte la vista del sistema [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md). 

Si ejecuta el comando CREATE EXTERNAL TABLE AS, puede crear una tabla externa basada en la definición de la columna de una consulta y escribir los resultados de esa consulta en Amazon S3. Los resultados están en Apache Parquet o formato de texto delimitado. Si la tabla externa tiene una clave o claves de partición, Amazon Redshift particiona los archivos nuevos según esas claves de partición y registra las particiones nuevas en el catálogo externo de forma automática. Para obtener más información acerca de CREATE EXTERNAL TABLE AS, consulte [Notas de uso](r_CREATE_EXTERNAL_TABLE_usage.md). 

Puede consultar una tabla externa mediante la misma sintaxis SELECT que utiliza con otras tablas de Amazon Redshift. También puede utilizar la sintaxis INSERT para escribir archivos nuevos en la ubicación de la tabla externa en Amazon S3. Para obtener más información, consulte [INSERT (tabla externa)](r_INSERT_external_table.md).

Para crear una vista con una tabla externa, incluya la cláusula WITH NO SCHEMA BINDING en la instrucción [CREATE VIEW](r_CREATE_VIEW.md).

No puede ejecutar CREATE EXTERNAL TABLE en una transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

## Privilegios necesarios
<a name="r_CREATE_EXTERNAL_TABLE-privileges"></a>

Para crear tablas externas, debe ser el propietario del esquema externo o un superusuario. Para transferir la propiedad de un esquema externo, use ALTER SCHEMA para cambiar el propietario. El acceso a tablas externas está controlado por el acceso al esquema externo. No puede usar permisos [GRANT](r_GRANT.md) o [REVOKE](r_REVOKE.md) en una tabla externa. En su lugar, conceda o revoque USAGE en el esquema externo.

Las [Notas de uso](r_CREATE_EXTERNAL_TABLE_usage.md) tienen información adicional sobre permisos específicos para tablas externas.

## Sintaxis
<a name="r_CREATE_EXTERNAL_TABLE-synopsis"></a>

```
CREATE EXTERNAL TABLE
external_schema.table_name
(column_name data_type [, …] )
[ PARTITIONED BY (col_name data_type [, … ] )]
[ { ROW FORMAT DELIMITED row_format |
  ROW FORMAT SERDE 'serde_name'
  [ WITH SERDEPROPERTIES ( 'property_name' = 'property_value' [, ...] ) ] } ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
```

A continuación, se muestra la sintaxis de CREATE EXTERNAL TABLE AS.

```
CREATE EXTERNAL TABLE
external_schema.table_name
[ PARTITIONED BY (col_name [, … ] ) ]
[ ROW FORMAT DELIMITED row_format ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
 AS
 { select_statement }
```

## Parameters
<a name="r_CREATE_EXTERNAL_TABLE-parameters"></a>

 *external\$1schema.table\$1name*   
El nombre de la tabla que se creará, clasificada por un nombre de esquema externo. Las tablas externas deben crearse en un esquema externo. Para obtener más información, consulte [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md).  
La longitud máxima del nombre de la tabla es de 127 bytes; los nombres más largos se truncan en 127 bytes. Puede usar caracteres multibyte UTF-8 de hasta un máximo de cuatro bytes. Amazon Redshift establece un límite de 9900 tablas por clúster, incluidas las tablas temporales definidas por el usuario y las tablas temporales creadas por Amazon Redshift durante el procesamiento de consultas o el mantenimiento del sistema. De manera opcional, puede completar el nombre de la tabla con el nombre de base de datos. En el siguiente ejemplo, el nombre de base de datos es `spectrum_db`, el nombre de esquema externo es `spectrum_schema` y el nombre de tabla es `test`.  

```
create external table spectrum_db.spectrum_schema.test (c1 int)
stored as parquet
location 's3://amzn-s3-demo-bucket/myfolder/';
```
Si no existe la base de datos o el esquema especificados, no se crea la tabla y la instrucción devuelve un error. No puede crear tablas o vistas en las bases de datos del sistema `template0`, `template1`, `padb_harvest` o `sys:internal`.  
El nombre de la tabla debe ser un nombre único para el esquema especificado.   
Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

( *column\$1name* *data\$1type* )  
El nombre y el tipo de datos de cada columna que se crea.  
La longitud máxima del nombre de la columna es de 127 bytes; los nombres más largos se truncan en 127 bytes. Puede usar caracteres multibyte UTF-8 de hasta un máximo de cuatro bytes. No puede especificar nombres de columna `"$path"` o `"$size"`. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).  
De manera predeterminada, Amazon Redshift crea tablas externas con las pseudocolumnas `$path` y `$size`. Puede deshabilitar la creación de pseudocolumnas para una sesión estableciendo el parámetro de configuración `spectrum_enable_pseudo_columns` en `false`. Para obtener más información, consulte [Pseudocolumnas](r_CREATE_EXTERNAL_TABLE_usage.md#r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns).  
Si las pseudocolumnas están habilitadas, el número máximo de columnas que se pueden definir en una única tabla es 1 598. Si las pseudocolumnas no están habilitadas, el número máximo de columnas que se pueden definir en una única tabla es de 1600.   
Si va a crear una "tabla ancha", asegúrese de que la lista de columnas no supere los límites de ancho de las filas para los resultados intermedios durante la carga y el procesamiento de consultas. Para obtener más información, consulte [Notas de uso](r_CREATE_TABLE_NEW.md#r_CREATE_TABLE_usage).  
Para un comando CREATE EXTERNAL TABLE AS, no es necesaria una lista de columnas, ya que las columnas se obtienen de la consulta.

 *data\$1type*   
Se admiten los siguientes [Tipos de datos](c_Supported_data_types.md):  
+ SMALLINT (INT2)
+ INTEGER (INT, INT4)
+ BIGINT (INT8)
+ DECIMAL (NUMERIC)
+ REAL (FLOAT4)
+ DOUBLE PRECISION (FLOAT8)
+ BOOLEAN (BOOL)
+ CHAR (CHARACTER)
+ VARCHAR (CHARACTER VARYING)
+ VARBYTE (CHARACTER VARYING): se puede usar con archivos de datos Parquet y ORC, y solo con tablas que no sean de partición.
+ DATE: solo se puede utilizar con archivos de datos de texto, Parquet u ORC, o como una columna de partición.
+ TIMESTAMP
  
Para DATE, puede utilizar los formatos tal y como se describe a continuación. Para los valores de mes representados mediante dígitos, se admiten los siguientes formatos:  
+ `mm-dd-yyyy` por ejemplo, `05-01-2017`. Esta es la opción predeterminada.
+ `yyyy-mm-dd`, donde el año está representado por más de 2 dígitos. Por ejemplo, `2017-05-01`.
Para los valores de mes representados mediante abreviaturas de tres letras, se admiten los siguientes formatos:  
+ `mmm-dd-yyyy` por ejemplo, `may-01-2017`. Esta es la opción predeterminada.
+ `dd-mmm-yyyy`, donde el año está representado por más de 2 dígitos. Por ejemplo, `01-may-2017`.
+ `yyyy-mmm-dd`, donde el año está representado por más de 2 dígitos. Por ejemplo, `2017-may-01`.
En el caso de los valores de año sistemáticamente inferiores a 100, el año se calcula de la siguiente manera:  
+ Si el año es inferior a 70, el año se calcula como el año más 2000. Por ejemplo, la fecha 05-01-17 en el formato `mm-dd-yyyy` se convierte en `05-01-2017`.
+ Si el año es inferior a 100 o mayor que 69, el año se calcula como el año más 1900. Por ejemplo, la fecha 05-01-89 en el formato `mm-dd-yyyy` se convierte en `05-01-1989`.
+ Para los valores de año representados por dos dígitos, agregue ceros al principio para representar el año en 4 dígitos.
Los valores de marca temporal de los archivos de texto deben tener el formato `yyyy-mm-dd HH:mm:ss.SSSSSS`, tal y como se muestra en el siguiente valor de marca temporal: `2017-05-01 11:30:59.000000`.  
La longitud de una columna VARCHAR se expresa en bytes no en caracteres. Por ejemplo, una columna VARCHAR(12) puede contener 12 caracteres de un byte o 6 caracteres de dos bytes. Cuando se realiza una consulta a una tabla externa, los resultados se truncan para ajustar el tamaño de columna sin devolver un error. Para obtener más información, consulte [Almacenamiento y rangos](r_Character_types.md#r_Character_types-storage-and-ranges).   
Para obtener un rendimiento óptimo, le recomendamos que especifique el menor tamaño de columna que se adapte a sus datos. Para encontrar el tamaño máximo en bytes para los valores de una columna, use la función [OCTET\$1LENGTH](r_OCTET_LENGTH.md). El siguiente ejemplo devuelve el tamaño máximo de valores en la columna de correo electrónico.  

```
select max(octet_length(email)) from users;

max
---
 62
```

PARTITIONED BY (*col\$1name* *data\$1type* [, … ] )  
Una cláusula que define una tabla particionada con una o más columnas de partición. Se usa un directorio de datos separado para cada combinación especificada, lo que puede mejorar el rendimiento de la consulta en algunas circunstancias. Las columnas particionadas no existen dentro de los propios datos de la tabla. Recibirá un error si utiliza un valor para *col\$1name (nombre\$1de\$1columna)* igual al de una columna de la tabla.   
Después de crear una tabla con particiones, modifique la tabla mediante una instrucción [ALTER TABLE](r_ALTER_TABLE.md) … ADD PARTITION para registrar nuevas particiones en el catálogo externo. Cuando agrega una partición, define la ubicación de la subcarpeta en Amazon S3 que contiene los datos de partición.  
Por ejemplo, si la tabla `spectrum.lineitem_part` se define con `PARTITIONED BY (l_shipdate date)`, ejecute el siguiente comando ALTER TABLE para agregar una partición.  

```
ALTER TABLE spectrum.lineitem_part ADD PARTITION (l_shipdate='1992-01-29')
LOCATION 's3://spectrum-public/lineitem_partition/l_shipdate=1992-01-29';
```
Si utiliza CREATE EXTERNAL TABLE AS, no tendrá que ejecutar ALTER TABLE...ADD PARTITION. Amazon Redshift registra de forma automática las particiones nuevas en el catálogo externo. Amazon Redshift también escribe de forma automática los datos correspondientes en las particiones de Amazon S3 en función de la clave o las claves de partición definidas en la tabla.  
Para ver particiones, consulte la vista del sistema [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md).  
Para un comando CREATE EXTERNAL TABLE AS, no es necesario especificar el tipo de datos de la columna de partición porque esta columna se obtiene de la consulta. 

ROW FORMAT DELIMITED *rowformat (formato\$1de\$1fila)*  
Una cláusula que especifica el formato de los datos subyacentes. Los valores posibles para *rowformat (formato\$1de\$1fila)* son los siguientes:  
+ LINES TERMINATED BY '*delimiter*' 
+ FIELDS TERMINATED BY '*delimiter*' 
Especifique un solo carácter ASCII para '*delimiter (delimitador)*'. Puede especificar caracteres ASCII no imprimibles mediante octales, con el formato `'\`*`ddd`*`'`, donde *`d`* es un dígito octal (0-7) hasta “\$1177”. El siguiente ejemplo especifica el carácter BEL (campana) usando la representación octal.   

```
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\007'
```
Si se omite ROW FORMAT DELIMITED, el formato predeterminado es DELIMITED FIELDS TERMINATED BY '\$1A' (inicio de encabezado) y LINES TERMINATED BY '\$1n' (nueva línea). 

ROW FORMAT SERDE '*serde\$1name (nombre\$1de\$1serde)*' [WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
Una cláusula que especifica el formato SERDE para los datos subyacentes.     
'*serde\$1name (nombre\$1de\$1serde*'  
El nombre del SerDe. Puede especificar los siguientes formatos:  
+ org.apache.hadoop.hive.serde2.RegexSerDe 
+ com.amazonaws.glue.serde.GrokSerDe 
+ org.apache.hadoop.hive.serde2.OpenCSVSerde 

  Este parámetro admite la siguiente propiedad SerDE para OpenCSvSerde: 

  ```
  'wholeFile' = 'true' 
  ```

  Configure la propiedad `wholeFile` como `true` para analizar correctamente los nuevos caracteres de línea (\$1n) dentro de las cadenas citadas para las solicitudes OpenCSV. 
+ org.openx.data.jsonserde.JsonSerDe
  + El SERDE JSON también admite archivos Ion. 
  + El JSON debe tener un formato correcto. 
  + Las marcas temporales en Ion y JSON deben usar el formato ISO8601.
  + Este parámetro admite la siguiente propiedad SerDE para JsonSerDe: 

    ```
    'strip.outer.array'='true' 
    ```

    Procesa archivos Ion/JSON que contienen una matriz muy grande encerrada en corchetes exteriores ([ … ]) como si contiene múltiples registros JSON dentro de la matriz. 
+ com.amazon.ionhiveserde.IonHiveSerDe

  El formato Amazon ION proporciona formatos de texto y binarios, además de tipos de datos. Para una tabla externa que hace referencia a datos en formato ION, debe asignar cada columna en la tabla externa al elemento correspondiente de los datos de formato ION. Para obtener más información, consulte [Amazon Ion](https://amzn.github.io/ion-docs/). También debe especificar los formatos de entrada y salida.  
WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
De manera opcional, especifique los nombres y valores de las propiedades, separados por comas.
Si se omite ROW FORMAT DELIMITED, el formato predeterminado es DELIMITED FIELDS TERMINATED BY '\$1A' (inicio de encabezado) y LINES TERMINATED BY '\$1n' (nueva línea). 

STORED AS *file\$1format*  
El formato de archivo para los archivos de datos.   
Los formatos válidos son los siguientes:  
+ PARQUET
+ RCFILE (para datos que usan ColumnarSerDe únicamente, no LazyBinaryColumnarSerDe)
+ SEQUENCEFILE
+ TEXTFILE (para archivos de texto, incluidos los archivos JSON).
+ ORC 
+ AVRO 
+ INPUTFORMAT '*input\$1format\$1classname*' OUTPUTFORMAT '*output\$1format\$1classname*' 
El comando CREATE EXTERNAL TABLE AS solo admite dos formatos de archivo, TEXTFILE y PARQUET.  
Para INPUTFORMAT y OUTPUTFORMAT, especifique un nombre de la clase, como se muestra en el siguiente ejemplo:   

```
'org.apache.hadoop.mapred.TextInputFormat'
```

LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*'\$1  <a name="create-external-table-location"></a>
Se trata de la ruta a la carpeta o al bucket de Amazon S3 que contiene los archivos de datos o un archivo de manifiesto donde se incluye una lista de rutas de objetos de Amazon S3. Los buckets deben estar en la misma región de AWS que el clúster de Amazon Redshift. Para obtener una lista de las regiones de AWS admitidas, consulte [Limitaciones de Amazon Redshift Spectrum](c-spectrum-considerations.md).  
Si la ruta especifica un bucket o una carpeta, por ejemplo, `'s3://amzn-s3-demo-bucket/custdata/'`, Redshift Spectrum analiza los archivos en el bucket o la carpeta especificados, además de todas las subcarpetas. Redshift Spectrum omite los archivos ocultos y los archivos que comienzan con un carácter de subrayado.   
Si la ruta especifica un archivo de manifiesto, el argumento `'s3://bucket/manifest_file'` debe referencia de forma explícita un solo archivo; por ejemplo, `'s3://amzn-s3-demo-bucket/manifest.txt'`. No puede hacer referencia a un prefijo de clave.   
El manifiesto es un archivo de texto en formato JSON que muestra la dirección URL de cada archivo que se va a cargar desde Amazon S3 y el tamaño del archivo, en bytes. El URL incluye el nombre del bucket y la ruta de objeto completa para el archivo. Los archivos que se especifican en el manifiesto pueden estar en buckets diferentes, pero todos los buckets deben estar en la misma región de AWS que el clúster de Amazon Redshift. Si un archivo aparece dos veces, este se carga dos veces. En el siguiente ejemplo, se muestra el JSON para un manifiesto que carga tres archivos.   

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1", "meta": { "content_length": 5956875 } },
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2", "meta": { "content_length": 5997091 } },
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1", "meta": { "content_length": 5978675 } }
  ]
}
```
Puede hacer que la inclusión de un archivo en particular sea obligatoria. Para ello, incluya una opción `mandatory` en el nivel de archivo en el manifiesto. Cuando consulta una tabla externa con un archivo obligatorio faltante, se produce un error en la instrucción SELECT. Asegúrese de que todos los archivos incluidos en la definición de la tabla externa están presentes. Si no están todos presentes, aparece un error que muestra el primer archivo obligatorio que no se encuentra. En el siguiente ejemplo, se muestra el JSON de un manifiesto con la opción `mandatory` establecida en `true`.  

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1", "mandatory":true, "meta": { "content_length": 5956875 } },
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2", "mandatory":false, "meta": { "content_length": 5997091 } },
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1", "meta": { "content_length": 5978675 } }
  ]
}
```
Para hacer referencia a los archivos creados mediante UNLOAD, puede usar el manifiesto creado mediante [UNLOAD](r_UNLOAD.md) con el parámetro MANIFEST. El archivo de manifiesto es compatible con un archivo de manifiesto de [COPY de Amazon S3](copy-parameters-data-source-s3.md), pero usa claves diferentes. Las claves que no se usan se omiten. 

TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*' [, ...] )   
Una cláusula que establece la definición de tabla de las propiedades de la tabla.   
Las propiedades de tabla distinguen entre mayúsculas y minúsculas.  
 'compression\$1type'='*value (valor)*'   
 Propiedad que establece el tipo de compresión que se va a utilizar si el nombre de archivo no contiene una extensión. Si establece esta propiedad y hay una extensión de archivo, la extensión se omite y se usa el valor establecido por la propiedad. Los valores válidos para el tipo de compresión son los siguientes:  
+ bzip2
+ gzip
+ none
+ snappy  
“data\$1cleansing\$1enabled”=“true/false”  
Esta propiedad establece si el control de datos está activado para la tabla. Cuando “data\$1cleansing\$1enabled” se establece en true, el control de datos está activado para la tabla. Cuando “data\$1cleansing\$1enabled” se establece en false, el control de datos está desactivado para la tabla. A continuación, se muestra una lista de las propiedades de control de datos en el nivel de la tabla que controla esta propiedad:  
+ column\$1count\$1mismatch\$1handling
+ invalid\$1char\$1handling
+ numeric\$1overflow\$1handling
+ replacement\$1char
+ surplus\$1char\$1handling
Para ver ejemplos, consulte [Ejemplos de control de datos](r_CREATE_EXTERNAL_TABLE_examples.md#r_CREATE_EXTERNAL_TABLE_examples-data-handling).  
“invalid\$1char\$1handling”=“*valor*”   
Especifica la acción que se debe realizar cuando los resultados de la consulta contienen valores de caracteres UTF-8 no válidos. Puede especificar las siguientes acciones:    
DISABLED  
No lleva a cabo un control de caracteres no válido.  
FAIL  
Cancela las consultas que devuelven datos que contienen valores UTF-8 no válidos.  
SET\$1TO\$1NULL   
Reemplaza los valores UTF-8 no válidos por valores nulos.  
DROP\$1ROW  
Reemplaza cada valor de la fila por un valor nulo.  
REPLACE  
Reemplaza el carácter no válido por el carácter de reemplazo que se especifique mediante `replacement_char`.  
“replacement\$1char”=“*carácter*”  
Especifica el carácter de reemplazo que se va a utilizar al establecer `invalid_char_handling` en `REPLACE`.  
“numeric\$1overflow\$1handling”=“valor”  
Especifica la acción que se debe realizar cuando los datos de ORC contienen un entero (por ejemplo, BIGINT o int64) que es mayor que la definición de columna (por ejemplo, SMALLINT o int16). Puede especificar las siguientes acciones:    
DISABLED  
El control de caracteres no válidos está desactivado.  
FAIL  
Cancela la consulta cuando los datos incluyen caracteres no válidos.  
SET\$1TO\$1NULL  
Establece caracteres no válidos en valores nulos.  
DROP\$1ROW  
Establece cada valor de la fila como un valor nulo.  
'surplus\$1bytes\$1handling'='*valor*'  
Especifica cómo controlar los datos que se cargan que superan la longitud del tipo de datos definido para las columnas que contienen datos VARBYTE. De manera predeterminada, Redshift Spectrum establece el valor como nulo para los datos que superan el ancho de la columna.  
Puede especificar las siguientes acciones que se realizarán cuando la consulta devuelva datos que superen la longitud del tipo de datos:    
SET\$1TO\$1NULL  
Reemplaza los datos que superan el ancho de la columna por valores nulos.  
DISABLED  
No lleva a cabo un control de bytes sobrantes.  
FAIL  
Cancela las consultas que devuelven datos que superan el ancho de la columna.  
DROP\$1ROW  
Elimina todas las filas que contienen datos que superan la anchura de columna.  
TRUNCATE  
Elimina los caracteres que superan el número máximo de caracteres definidos para la columna.  
“surplus\$1char\$1handling”=“*valor*”  
Especifica cómo controlar los datos que se cargan que superan la longitud del tipo de datos definido para las columnas que contienen datos VARCHAR, CHAR o cadenas. De manera predeterminada, Redshift Spectrum establece el valor como nulo para los datos que superan el ancho de la columna.  
Puede especificar las siguientes acciones que se deben realizar cuando la consulta devuelva datos que superan el ancho de la columna:    
SET\$1TO\$1NULL  
Reemplaza los datos que superan el ancho de la columna por valores nulos.  
DISABLED  
No lleva a cabo un control de caracteres sobrantes.  
FAIL  
Cancela las consultas que devuelven datos que superan el ancho de la columna.  
DROP\$1ROW  
Reemplaza cada valor de la fila por un valor nulo.  
TRUNCATE  
Elimina los caracteres que superan el número máximo de caracteres definidos para la columna.  
'column\$1count\$1mismatch\$1handling'='value’  
Identifica si el archivo contiene menos o más valores para una fila que el número de columnas especificado en la definición de tabla externa. Esta propiedad solo está disponible para un formato de archivo de texto sin comprimir. Puede especificar las siguientes acciones:    
DISABLED  
El control de discrepancias en el recuento de columnas está desactivado.  
FAIL  
No se puede realizar la consulta si se detecta una discrepancia en el recuento de columnas.  
SET\$1TO\$1NULL  
Rellene los valores que faltan con NULL e ignore los valores adicionales de cada fila.  
DROP\$1ROW  
Elimine del análisis todas las filas que contengan un error de discrepancia en el recuento de columnas.  
'numRows'='*row\$1count*'   
Una propiedad que establece el valor de numRows para la definición de la tabla. Para actualizar de forma explícita las estadísticas de una tabla externa, establezca la propiedad numRows de manera que indique el tamaño de la tabla. Amazon Redshift no analiza las tablas externas para generar las estadísticas de las tablas que el optimizador de consultas emplea a la hora de crear un plan de consulta. Si no se configuran las estadísticas de tabla para una tabla externa, Amazon Redshift genera un plan de ejecución de consulta basado en un supuesto de que las tablas externas son las más grandes y las tablas locales son las más pequeñas.  
'skip.header.line.count'='*line\$1count*'  
Una propiedad que establece el número de filas que se omiten al principio de cada archivo de código fuente.  
'serialization.null.format'=' '  
Una propiedad que especifica que Spectrum debe devolver un valor `NULL` cuando hay una coincidencia exacta con el texto introducido en un campo.  
'orc.schema.resolution'='mapping\$1type' (tipo\$1de\$1asignación)  
Propiedad que establece el tipo de asignación de columnas en tablas que usan el formato de datos de ORC. Esta propiedad se omite con otros formatos de datos.  
Los valores válidos para el tipo de asignación de columnas son los siguientes:   
+ name 
+ position 
Si la propiedad *orc.schema.resolution* se omite, las columnas se asignan por nombre de manera predeterminada. Si *orc.schema.resolution* se establece en un valor que no es *'name'* ni *'position'*, las columnas se asignan por posición. Para obtener más información sobre la asignación de columnas, consulte [Asignación de columnas de tablas externas a columnas ORC](c-spectrum-external-tables.md#c-spectrum-column-mapping-orc).  
El comando COPY realiza asignaciones en archivos de datos de ORC únicamente por posición. La propiedad de tabla *orc.schema.resolution* no tiene ningún efecto en el comportamiento del comando COPY.   
'write.parallel'='on / off’  
Una propiedad que establece si CREATE EXTERNAL TABLE AS debe escribir datos en paralelo. De manera predeterminada, CREATE EXTERNAL TABLE AS escribe datos en paralelo en varios archivos, según el número de sectores en el clúster. La opción predeterminada está activada. Cuando 'write.parallel' está desactivado, CREATE EXTERNAL TABLE AS escribe en uno o más archivos de datos en serie en Amazon S3. Esta propiedad de tabla también se aplica a cualquier instrucción INSERT posterior en la misma tabla externa.  
‘write.maxfilesize.mb’=‘size’  
Se trata de una propiedad que establece el tamaño máximo (en MB) de cada archivo escrito en Amazon S3 con CREATE EXTERNAL TABLE AS. El tamaño debe ser un entero válido entre 5 y 6200. El tamaño máximo de archivo predeterminado es 6200 MB. Esta propiedad de tabla también se aplica a cualquier instrucción INSERT posterior en la misma tabla externa.  
'write.kms.key.id'='*value*'  
Puede especificar una clave AWS Key Management Service para habilitar el cifrado del lado del servidor (SSE) para objetos de Amazon S3, donde *value* es una de las opciones siguientes:   
+ `auto` para utilizar la clave de AWS KMS predeterminada almacenada en el bucket de Amazon S3
+ *clave de kms* especficada para cifrar los datos  
*select\$1statement*  
Una instrucción que inserta una o más filas en la tabla externa definiendo cualquier consulta. Todas las filas que genera la consulta se escriben en Amazon S3 en formato de texto o Parquet según la definición de tabla.

## Ejemplos
<a name="r_CREATE_EXTERNAL_TABLE_examples_link"></a>

Encontrará una selección de ejemplos en [Ejemplos](r_CREATE_EXTERNAL_TABLE_examples.md).

# Notas de uso
<a name="r_CREATE_EXTERNAL_TABLE_usage"></a>

Este tema contiene notas de uso para [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). No puede ver los detalles de las tablas de Amazon Redshift Spectrum con los mismos recursos que utiliza para las tablas de Amazon Redshift estándar, como [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md), [STV\$1TBL\$1PERM](r_STV_TBL_PERM.md), PG\$1CLASS o information\$1schema. Si su herramienta de análisis o inteligencia empresarial no reconoce las tablas externas de Redshift Spectrum, configure la aplicación para consultar [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) y [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md).

## CREATE EXTERNAL TABLE AS
<a name="r_CETAS"></a>

En algunos casos, puede ejecutar el comando CREATE EXTERNAL TABLE AS en un catálogo de datos de AWS Glue, un catálogo externo de AWS Lake Formation o un metastore de Apache Hive. En tales casos, se utiliza un rol de AWS Identity and Access Management (IAM) para crear el esquema externo. Este rol de IAM debe tener permisos de lectura y escritura en Amazon S3. 

Si utiliza un catálogo de Lake Formation, el rol de IAM debe tener permiso para crear tablas en el catálogo. En este caso, también debe tener el permiso de ubicación del lago de datos en la ruta de destino de Amazon S3. Este rol de IAM se convierte en el propietario de la nueva tabla AWS Lake Formation.

Para asegurarse de que los nombres de los archivos son únicos, Amazon Redshift utiliza el siguiente formato para el nombre de cada archivo cargado en Amazon S3 de manera predeterminada.

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

 Un ejemplo es `20200303_004509_810669_1007_0001_part_00.parquet`.

Tenga en cuenta lo siguiente al ejecutar el comando CREATE EXTERNAL TABLE AS:
+ La ubicación de Amazon S3 debe estar vacía.
+ Amazon Redshift solo admite los formatos PARQUET y TEXTFILE cuando se utiliza la cláusula STORED AS.
+ No es necesario definir una lista de definición de columna. Los nombres de columna y los tipos de datos de columna de la nueva tabla externa se obtienen directamente de la consulta SELECT.
+ No es necesario definir el tipo de datos de la columna de partición en la cláusula PARTITIONED BY. Si especifica una clave de partición, el nombre de esta columna debe existir en el resultado de la consulta SELECT. Cuando tiene varias columnas de partición, no importa el orden en la consulta SELECT. Amazon Redshift utiliza el orden definido en la cláusula PARTITIONED BY para crear la tabla externa.
+ Amazon Redshift particiona de forma automática los archivos de salida en carpetas de partición en función de los valores de la clave de partición. De manera predeterminada, Amazon Redshift quita las columnas de partición de los archivos de salida.
+ No se admite la cláusula LINES TERMINATED BY 'delimitador'.
+ No se admite la cláusula ROW FORMAT SERDE 'serde\$1name'.
+ No se admite el uso de archivos de manifiesto. Por lo tanto, no se puede definir la cláusula LOCATION en un archivo de manifiesto en Amazon S3.
+ Amazon Redshift actualiza de forma automática la propiedad de la tabla 'numRows' al final del comando.
+ La propiedad de tabla 'compression\$1type' sólo acepta 'none' o 'snappy' para el formato de archivo PARQUET.
+ Amazon Redshift no admite la cláusula LIMIT en la consulta SELECT externa. En su lugar, puede utilizar una cláusula LIMIT anidada.
+ Puede utilizar STL\$1UNLOAD\$1LOG para realizar un seguimiento de los archivos que cada operación CREATE EXTERNAL TABLE AS escribe en Amazon S3.

## Permisos necesarios para crear y consultar tablas externas
<a name="r_CREATE_EXTERNAL_TABLE_usage-permissions"></a>

Para crear tablas externas, asegúrese de que es el propietario del esquema externo o un superusuario. Para transferir la propiedad de un esquema externo, utilice [ALTER SCHEMA](r_ALTER_SCHEMA.md). En el siguiente ejemplo, se modifica el propietario del esquema `spectrum_schema` a `newowner`.

```
alter schema spectrum_schema owner to newowner;
```

Para ejecutar una consulta de Redshift Spectrum, necesita los siguientes permisos:
+ Permiso de uso para el esquema 
+ Permiso para crear tablas temporales en la base de datos actual 

En el siguiente ejemplo, se concede permiso de uso para el esquema `spectrum_schema` al grupo de usuarios `spectrumusers`.

```
grant usage on schema spectrum_schema to group spectrumusers;
```

En el siguiente ejemplo, se concede un permiso temporal para la base de datos `spectrumdb` al grupo de usuarios `spectrumusers`. 

```
grant temp on database spectrumdb to group spectrumusers;
```

## Pseudocolumnas
<a name="r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns"></a>

De manera predeterminada, Amazon Redshift crea tablas externas con las pseudocolumnas *\$1path* y *\$1size*. Seleccione estas columnas para ver la ruta a los archivos de datos en Amazon S3 y el tamaño de los archivos de datos de cada fila devuelta por una consulta. Los nombres de las columnas *\$1path* y *\$1size* deben estar delimitados con comillas dobles. Las cláusulas *SELECT \$1* no devuelven las pseudocolumnas. Debe incluir explícitamente los nombres de columna *\$1path* y *\$1size* en la consulta, tal y como se muestra en el siguiente ejemplo.

```
select "$path", "$size"
from spectrum.sales_part
where saledate = '2008-12-01';
```

Puede deshabilitar la creación de pseudocolumnas en una sesión estableciendo el parámetro de configuración *spectrum\$1enable\$1pseudo\$1columns* en *false*. 

**importante**  
La selección de *\$1size* o *\$1path* genera cargos, ya que Redshift Spectrum analiza los archivos de datos en Amazon S3 para determinar el tamaño del conjunto de resultados. Para obtener más información, consulte [Precios de Amazon Redshift](https://aws.amazon.com/redshift/pricing/).

## Configuración de opciones de control de datos
<a name="r_CREATE_EXTERNAL_TABLE_usage-data-handling"></a>

Puede establecer parámetros de tabla para especificar el control de entrada de los datos que se consultan en tablas externas, incluidos los siguientes: 
+ Caracteres sobrantes en columnas que contengan datos de VARCHAR, CHAR y cadenas. Para obtener más información, consulte la propiedad de tabla externa `surplus_char_handling`.
+ Caracteres no válidos en columnas que contengan datos de VARCHAR, CHAR y cadenas. Para obtener más información, consulte la propiedad de tabla externa `invalid_char_handling`.
+ Carácter de reemplazo que se utilizará al especificar REPLACE para la propiedad de tabla externa `invalid_char_handling`.
+ Control de desbordamiento de conversión en columnas que contengan datos enteros y decimales. Para obtener más información, consulte la propiedad de tabla externa `numeric_overflow_handling`.
+ Surplus\$1bytes\$1handling para especificar la gestión de entrada de los bytes sobrantes en las columnas que contienen datos varbyte. Para obtener más información, consulte la propiedad de tabla externa `surplus_bytes_handling`.

# Ejemplos
<a name="r_CREATE_EXTERNAL_TABLE_examples"></a>

En el siguiente ejemplo, se crea una tabla denominada SALES en el esquema externo de Amazon Redshift `spectrum`. Los datos están en archivos de texto delimitados por tabulaciones. La cláusula TABLE PROPERTIES configura la propiedad numRows con 170 000 filas.

Según la identidad que utilice para ejecutar CREATE EXTERNAL TABLE, es posible que deba configurar permisos de IAM. Como práctica recomendada, aconsejamos asociar las políticas de permisos a un rol de IAM y luego asignarlo a los usuarios y grupos según sea necesario. Para obtener más información, consulte [Administración de identidades y accesos en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html).

```
create external table spectrum.sales(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
saledate date,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
row format delimited
fields terminated by '\t'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/sales/'
table properties ('numRows'='170000');
```

En el siguiente ejemplo, se crea una tabla que utiliza JsonSerDe para hacer referencia a datos con formato JSON.

```
create external table spectrum.cloudtrail_json (
event_version int,
event_id bigint,
event_time timestamp,
event_type varchar(10),
awsregion varchar(20),
event_name varchar(max),
event_source varchar(max),
requesttime timestamp,
useragent varchar(max),
recipientaccountid bigint)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties (
'dots.in.keys' = 'true',
'mapping.requesttime' = 'requesttimestamp'
) location 's3://amzn-s3-demo-bucket/json/cloudtrail';
```

En el siguiente ejemplo CREATE EXTERNAL TABLE AS se crea una tabla externa no particionada. Luego, escribe el resultado de la consulta SELECT con Apache Parquet en la ubicación de destino de Amazon S3.

```
CREATE EXTERNAL TABLE spectrum.lineitem
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/lineitem/'
AS SELECT * FROM local_lineitem;
```

En el siguiente ejemplo, se crea una tabla externa particionada y se incluyen las columnas de partición en la consulta SELECT. 

```
CREATE EXTERNAL TABLE spectrum.partitioned_lineitem
PARTITIONED BY (l_shipdate, l_shipmode)
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/partitioned_lineitem/'
AS SELECT l_orderkey, l_shipmode, l_shipdate, l_partkey FROM local_table;
```

Para obtener una lista de bases de datos existentes en el catálogo de datos externos, consulte la vista del sistema [SVV\$1EXTERNAL\$1DATABASES](r_SVV_EXTERNAL_DATABASES.md). 

```
select eskind,databasename,esoptions from svv_external_databases order by databasename;
```

```
eskind | databasename | esoptions
-------+--------------+----------------------------------------------------------------------------------
     1 | default      | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
     1 | sampledb     | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
     1 | spectrumdb   | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
```

Para ver detalles de tablas externas, consulte las vistas del sistema [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) y [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md).

En el siguiente ejemplo, se consulta la vista SVV\$1EXTERNAL\$1TABLES.

```
select schemaname, tablename, location from svv_external_tables;
```

```
schemaname | tablename            | location
-----------+----------------------+--------------------------------------------------------
spectrum   | sales                | s3://redshift-downloads/tickit/spectrum/sales
spectrum   | sales_part           | s3://redshift-downloads/tickit/spectrum/sales_partition
```

En el siguiente ejemplo, se consulta la vista SVV\$1EXTERNAL\$1COLUMNS. 

```
select * from svv_external_columns where schemaname like 'spectrum%' and tablename ='sales';
```

```
schemaname | tablename | columnname | external_type | columnnum | part_key
-----------+-----------+------------+---------------+-----------+---------
spectrum   | sales     | salesid    | int           |         1 |        0
spectrum   | sales     | listid     | int           |         2 |        0
spectrum   | sales     | sellerid   | int           |         3 |        0
spectrum   | sales     | buyerid    | int           |         4 |        0
spectrum   | sales     | eventid    | int           |         5 |        0
spectrum   | sales     | saledate   | date          |         6 |        0
spectrum   | sales     | qtysold    | smallint      |         7 |        0
spectrum   | sales     | pricepaid  | decimal(8,2)  |         8 |        0
spectrum   | sales     | commission | decimal(8,2)  |         9 |        0
spectrum   | sales     | saletime   | timestamp     |        10 |        0
```

Para ver las particiones de la tabla, use la siguiente consulta.

```
select schemaname, tablename, values, location
from svv_external_partitions
where tablename = 'sales_part';
```

```
schemaname | tablename  | values         | location
-----------+------------+----------------+-------------------------------------------------------------------------
spectrum   | sales_part | ["2008-01-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-02-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02
spectrum   | sales_part | ["2008-03-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04
spectrum   | sales_part | ["2008-05-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05
spectrum   | sales_part | ["2008-06-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06
spectrum   | sales_part | ["2008-07-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07
spectrum   | sales_part | ["2008-08-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08
spectrum   | sales_part | ["2008-09-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09
spectrum   | sales_part | ["2008-10-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10
spectrum   | sales_part | ["2008-11-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11
spectrum   | sales_part | ["2008-12-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12
```

El siguiente ejemplo devuelve el tamaño total de los archivos de datos relacionados de una tabla externa.

```
select distinct "$path", "$size"
   from spectrum.sales_part;

 $path                                                                    | $size
--------------------------------------------------------------------------+-------
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/ |  1616
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ |  1444
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ |  1444
```

## Ejemplos de partición
<a name="r_CREATE_EXTERNAL_TABLE_examples-partitioning"></a>

Para crear una tabla externa particionada por fecha, ejecute el siguiente comando.

```
create external table spectrum.sales_part(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
dateid smallint,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
partitioned by (saledate date)
row format delimited
fields terminated by '|'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/sales_partition/'
table properties ('numRows'='170000');
```

Para agregar las particiones, ejecute los siguientes comandos ALTER TABLE.

```
alter table spectrum.sales_part
add if not exists partition (saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-02-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-03-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-04-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-05-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-06-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-07-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-08-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-09-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-10-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-11-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-12-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12/';
```

Para seleccionar los datos de la tabla particionada, ejecute la siguiente consulta.

```
select top 10 spectrum.sales_part.eventid, sum(spectrum.sales_part.pricepaid)
from spectrum.sales_part, event
where spectrum.sales_part.eventid = event.eventid
  and spectrum.sales_part.pricepaid > 30
  and saledate = '2008-12-01'
group by spectrum.sales_part.eventid
order by 2 desc;
```

```
eventid | sum
--------+---------
    914 | 36173.00
   5478 | 27303.00
   5061 | 26383.00
   4406 | 26252.00
   5324 | 24015.00
   1829 | 23911.00
   3601 | 23616.00
   3665 | 23214.00
   6069 | 22869.00
   5638 | 22551.00
```

Para ver particiones de la tabla externa, consulte la vista del sistema [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md).

```
select schemaname, tablename, values, location from svv_external_partitions
where tablename = 'sales_part';
```

```
schemaname | tablename  | values         | location
-----------+------------+----------------+--------------------------------------------------
spectrum   | sales_part | ["2008-01-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-02-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02
spectrum   | sales_part | ["2008-03-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04
spectrum   | sales_part | ["2008-05-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05
spectrum   | sales_part | ["2008-06-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06
spectrum   | sales_part | ["2008-07-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07
spectrum   | sales_part | ["2008-08-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08
spectrum   | sales_part | ["2008-09-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09
spectrum   | sales_part | ["2008-10-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10
spectrum   | sales_part | ["2008-11-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11
spectrum   | sales_part | ["2008-12-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12
```

## Ejemplos de formato de fila
<a name="r_CREATE_EXTERNAL_TABLE_examples-row-format"></a>

A continuación, se muestra un ejemplo de cómo especificar los parámetros ROW FORMAT SERDE para archivos de datos almacenados con formato AVRO.

```
create external table spectrum.sales(salesid int, listid int, sellerid int, buyerid int, eventid int, dateid int, qtysold int, pricepaid decimal(8,2), comment VARCHAR(255))
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES ('avro.schema.literal'='{\"namespace\": \"dory.sample\",\"name\": \"dory_avro\",\"type\": \"record\", \"fields\": [{\"name\":\"salesid\", \"type\":\"int\"},
{\"name\":\"listid\", \"type\":\"int\"},
{\"name\":\"sellerid\", \"type\":\"int\"},
{\"name\":\"buyerid\", \"type\":\"int\"},
{\"name\":\"eventid\",\"type\":\"int\"},
{\"name\":\"dateid\",\"type\":\"int\"},
{\"name\":\"qtysold\",\"type\":\"int\"},
{\"name\":\"pricepaid\", \"type\": {\"type\": \"bytes\", \"logicalType\": \"decimal\", \"precision\": 8, \"scale\": 2}}, {\"name\":\"comment\",\"type\":\"string\"}]}')
STORED AS AVRO
location 's3://amzn-s3-demo-bucket/avro/sales' ;
```

A continuación se muestra un ejemplo de especificación de los parámetros ROW FORMAT SERDE mediante RegEx.

```
create external table spectrum.types(
cbigint bigint,
cbigint_null bigint,
cint int,
cint_null int)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties ('input.regex'='([^\\x01]+)\\x01([^\\x01]+)\\x01([^\\x01]+)\\x01([^\\x01]+)')
stored as textfile
location 's3://amzn-s3-demo-bucket/regex/types';
```

A continuación se muestra un ejemplo de especificación de los parámetros ROW FORMAT SERDE mediante Grok.

```
create external table spectrum.grok_log(
timestamp varchar(255),
pid varchar(255),
loglevel varchar(255),
progname varchar(255),
message varchar(255))
row format serde 'com.amazonaws.glue.serde.GrokSerDe'
with serdeproperties ('input.format'='[DFEWI], \\[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid:int}\\] *(?<loglevel>:DEBUG|FATAL|ERROR|WARN|INFO) -- +%{DATA:progname}: %{GREEDYDATA:message}')
stored as textfile
location 's3://DOC-EXAMPLE-BUCKET/grok/logs';
```

A continuación, se muestra un ejemplo en el que se define un registro de acceso al servidor de Amazon S3 en un bucket de S3. Puede utilizar Redshift Spectrum para consultar los registros de acceso de Amazon S3.

```
CREATE EXTERNAL TABLE spectrum.mybucket_s3_logs(
bucketowner varchar(255),
bucket varchar(255),
requestdatetime varchar(2000),
remoteip varchar(255),
requester varchar(255),
requested varchar(255),
operation varchar(255),
key varchar(255),
requesturi_operation varchar(255),
requesturi_key varchar(255),
requesturi_httpprotoversion varchar(255),
httpstatus varchar(255),
errorcode varchar(255),
bytessent bigint,
objectsize bigint,
totaltime varchar(255),
turnaroundtime varchar(255),
referrer varchar(255),
useragent varchar(255),
versionid varchar(255)
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*)\\s*([^ ]*)\\s*([^ ]*)\" (- |[^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*).*$')
LOCATION 's3://amzn-s3-demo-bucket/s3logs’;
```

A continuación, se muestra un ejemplo de cómo especificar los parámetros ROW FORMAT SERDE para datos con formato ION.

```
CREATE EXTERNAL TABLE tbl_name (columns)
ROW FORMAT SERDE 'com.amazon.ionhiveserde.IonHiveSerDe'
STORED AS
INPUTFORMAT 'com.amazon.ionhiveserde.formats.IonInputFormat'
OUTPUTFORMAT 'com.amazon.ionhiveserde.formats.IonOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/prefix'
```

## Ejemplos de control de datos
<a name="r_CREATE_EXTERNAL_TABLE_examples-data-handling"></a>

Los ejemplos siguientes acceden al archivo [spi\$1global\$1rankings.csv](https://s3.amazonaws.com/redshift-downloads/docs-downloads/spi_global_rankings.csv). Puede cargar el archivo `spi_global_rankings.csv` en un bucket de Amazon S3 para probar estos ejemplos.

En el siguiente ejemplo, se crea el esquema externo `schema_spectrum_uddh` y la base de datos `spectrum_db_uddh`. En el caso de `aws-account-id`, ingrese su ID de cuenta de AWS y, para `role-name`, ingrese el nombre de rol de Redshift Spectrum.

```
create external schema schema_spectrum_uddh
from data catalog
database 'spectrum_db_uddh'
iam_role 'arn:aws:iam::aws-account-id:role/role-name'
create external database if not exists;
```

En el siguiente ejemplo, se crea una tabla externa `soccer_league` en el esquema externo `schema_spectrum_uddh`.

```
CREATE EXTERNAL TABLE schema_spectrum_uddh.soccer_league
(
  league_rank smallint,
  prev_rank   smallint,
  club_name   varchar(15),
  league_name varchar(20),
  league_off  decimal(6,2),
  league_def  decimal(6,2),
  league_spi  decimal(6,2),
  league_nspi integer
)
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n\l'
stored as textfile
LOCATION 's3://spectrum-uddh/league/'
table properties ('skip.header.line.count'='1');
```

Verifique el número de filas en la tabla `soccer_league`.

```
select count(*) from schema_spectrum_uddh.soccer_league;
```

Se muestra el número de filas.

```
count
645
```

En la siguiente consulta, se muestran los 10 clubes principales. Dado que el club `Barcelona` tiene un carácter no válido en la cadena, se muestra un NULL en el nombre.

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

```
league_rank	club_name	league_name			league_nspi
1		Manchester City	Barclays Premier Lea		34595
2		Bayern Munich	German Bundesliga		34151
3		Liverpool	Barclays Premier Lea		33223
4		Chelsea		Barclays Premier Lea		32808
5		Ajax		Dutch Eredivisie		32790
6		Atletico 	Madrid	Spanish Primera Divi	31517
7		Real Madrid	Spanish Primera Divi		31469
8		NULL	        Spanish Primera Divi            31321
9		RB Leipzig	German Bundesliga		31014
10		Paris Saint-Ger	French Ligue 1			30929
```

En el siguiente ejemplo, se modifica la tabla `soccer_league` para especificar las propiedades de tabla externa `invalid_char_handling`, `replacement_char` y `data_cleansing_enabled` con objeto de insertar un signo de interrogación (?) como reemplazo de caracteres no previstos.

```
alter  table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='REPLACE','replacement_char'='?','data_cleansing_enabled'='true');
```

En el siguiente ejemplo, se consulta la tabla `soccer_league` para equipos con una clasificación del 1 al 10.

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

Dado que las propiedades de la tabla se han modificado, los resultados muestran los 10 principales clubes, con el carácter de sustitución del signo de interrogación (?) en la octava fila para el club `Barcelona`.

```
league_rank	club_name	league_name		league_nspi
1		Manchester City	Barclays Premier Lea	34595
2		Bayern Munich	German Bundesliga	34151
3		Liverpool	Barclays Premier Lea	33223
4		Chelsea		Barclays Premier Lea	32808
5		Ajax		Dutch Eredivisie	32790
6		Atletico Madrid	Spanish Primera Divi	31517
7		Real Madrid	Spanish Primera Divi	31469
8		Barcel?na	Spanish Primera Divi	31321
9		RB Leipzig	German Bundesliga	31014
10		Paris Saint-Ger	French Ligue 1		30929
```

En el siguiente ejemplo, se modifica la tabla `soccer_league` para especificar las propiedades de tabla externa `invalid_char_handling` con objeto de eliminar filas con caracteres no previstos.

```
alter table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='DROP_ROW','data_cleansing_enabled'='true');
```

En el siguiente ejemplo, se consulta la tabla `soccer_league` para equipos con una clasificación del 1 al 10.

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

En los resultados se muestran los clubes principales, pero no se incluye la octava fila, que correspondería al club `Barcelona`.

```
league_rank   club_name         league_name            league_nspi
1             Manchester City   Barclays Premier Lea   34595
2             Bayern Munich     German Bundesliga      34151
3             Liverpool         Barclays Premier Lea   33223
4             Chelsea           Barclays Premier Lea   32808
5             Ajax              Dutch Eredivisie       32790
6             Atletico Madrid   Spanish Primera Divi   31517
7             Real Madrid       Spanish Primera Divi   31469
9             RB Leipzig        German Bundesliga      31014
10            Paris Saint-Ger   French Ligue 1         30929
```

# CREATE EXTERNAL VIEW
<a name="r_CREATE_EXTERNAL_VIEW"></a>

La característica de versión preliminar de las vistas del catálogo de datos solo está disponible en las siguientes regiones.
+ Este de EE. UU. (Ohio) (us-east-2)
+ Este de EE. UU. (Norte de Virginia) (us-east-1)
+ EE. UU. Oeste (Norte de California) (us-west-1)
+ Asia-Pacífico (Tokio) (ap-northeast-1)
+ Europa (Irlanda) (eu-west-1)
+ Europa (Estocolmo) (eu-north-1)

Crea una vista de catálogo de datos. Las vistas de catálogo de datos son un esquema de vista única que funciona con otros motores de SQL, como Amazon Athena y Amazon EMR. Puede consultar la vista desde el motor que elija. Para obtener más información acerca de las vistas del catálogo de datos, consulte [Creación de vistas del catálogo de datos](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

## Sintaxis
<a name="r_CREATE_EXTERNAL_VIEW-synopsis"></a>

```
CREATE EXTERNAL VIEW schema_name.view_name [ IF NOT EXISTS ]
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
AS query_definition;
```

## Parameters
<a name="r_CREATE_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
Es el esquema asociado a la base de datos de AWS Glue, seguido del nombre de la vista.

PROTECTED  
Especifica que el comando CREATE EXTERNAL VIEW solo debería completarse si la consulta incluida en la query\$1definition se puede completar correctamente.

IF NOT EXISTS  
Crea la vista si aún no existe.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
Es la notación del esquema que se utilizará al crear la vista. Puede especificar el uso de AWS Glue Data Catalog, una base de datos de Glue que haya creado o un esquema externo que haya creado. Consulte [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) y [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) para obtener más información.

 *query\$1definition*   
Es la definición de la consulta SQL que Amazon Redshift ejecuta para modificar la vista.

## Ejemplos
<a name="r_CREATE_EXTERNAL_VIEW-examples"></a>

El siguiente ejemplo crea una vista del catálogo de datos denominada sample\$1schema.glue\$1data\$1catalog\$1view.

```
CREATE EXTERNAL PROTECTED VIEW sample_schema.glue_data_catalog_view IF NOT EXISTS
AS SELECT * FROM sample_database.remote_table "remote-table-name";
```

# CREATE FUNCTION
<a name="r_CREATE_FUNCTION"></a>

Crea un nueva función escalar definida por el usuario (UDF) mediante una cláusula SQL SELECT o un programa Python.

Para obtener más información y ejemplos, consulte [Funciones definidas por el usuario en Amazon Redshift](user-defined-functions.md).

## Privilegios necesarios
<a name="r_CREATE_FUNCTION-privileges"></a>

Debe haber obtenido permiso de una de las siguientes maneras para ejecutar CREATE OR REPLACE FUNCTION:
+ Para CREATE FUNCTION:
  + Un superusuario puede utilizar lenguajes de confianza y que no sean de confianza para crear funciones.
  + Los usuarios con el privilegio CREATE [ OR REPLACE ] FUNCTION pueden crear funciones con lenguajes de confianza.
+ Para REPLACE FUNCTION:
  + Superusuario
  + Usuarios con el privilegio CREATE [ OR REPLACE ] FUNCTION
  + Propietario de la función

## Sintaxis
<a name="r_CREATE_FUNCTION-synopsis"></a>

```
CREATE [ OR REPLACE ] FUNCTION f_function_name
( { [py_arg_name  py_arg_data_type |
sql_arg_data_type } [ , ... ] ] )
RETURNS data_type
{ VOLATILE | STABLE | IMMUTABLE }
AS $$
  { python_program | SELECT_clause }
$$ LANGUAGE { plpythonu | sql }
```

## Parameters
<a name="r_CREATE_FUNCTION-parameters"></a>

OR REPLACE  
Especifica si ya existe una función con el mismo nombre y los mismos tipos de datos de argumento de entrada o *firma* que este, debe reemplazarse la función existente. Solo puede reemplazar una función con una nueva función que defina un conjunto idéntico de tipos de datos. Debe ser un superusuario para reemplazar una función.  
Si define una función con el mismo nombre que una función existente, pero con una firma diferente, crea una nueva función. En otras palabras, se sobrecarga el nombre de la función. Para obtener más información, consulte [Sobrecarga de los nombres de función](udf-naming-udfs.md#udf-naming-overloading-function-names).

 *f\$1function\$1name*   
El nombre de la función. Si especifica un nombre de esquema (como `myschema.myfunction`), la función se crea con el esquema especificado. De lo contrario, la función se crea en el esquema actual. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).  
Recomendamos que utilice el prefijo en los nombres de todas las UDF `f_`. Amazon Redshift reserva el prefijo `f_` para los nombres de las UDF; por lo tanto, cuando utiliza el prefijo `f_`, se asegura de que el nombre de la UDF no entre en conflicto con el nombre de una función SQL integrada en Amazon Redshift existente o futura. Para obtener más información, consulte [Prevención de conflictos al dar nombre a las UDF](udf-naming-udfs.md).  
Puede definir más de una función con el mismo nombre de función si los tipos de datos de los argumentos de entrada son diferentes. En otras palabras, se sobrecarga el nombre de la función. Para obtener más información, consulte [Sobrecarga de los nombres de función](udf-naming-udfs.md#udf-naming-overloading-function-names).

 *py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
Para una UDF de Python, una lista de nombres de argumento de entrada y tipos de datos. Para una UDF de SQL, una lista tipos de datos, sin nombres de argumento. En una UDF de Python, haga referencia a los argumentos usando los nombres de argumento. En una UDF de SQL, haga referencia a los argumentos usando \$11, \$12, etc., en función del orden de los argumentos en la lista de argumentos.   
Para una UDF de SQL, los tipos de datos de entrada y salida pueden ser cualquier tipo de datos estándar de Amazon Redshift. Para una UDF Python, los tipos de datos de entrada y salida pueden ser SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE o TIMESTAMP. Además, las funciones definidas por el usuario (UDF) de Python admiten un tipo de datos de ANYELEMENT. Este tipo de datos se convierte automáticamente en un tipo de datos estándar basado en el tipo de datos correspondiente al argumento proporcionado en tiempo de ejecución. Si varios argumentos utilizan ANYELEMENT, todos se resuelven con el mismo tipo de datos durante el tiempo de ejecución, según el primer argumento ANYELEMENT de la lista. Para obtener más información, consulte [Tipos de datos de UDF de Python](udf-data-types.md) y [Tipos de datos](c_Supported_data_types.md).  
Puede especificar un máximo de 32 argumentos.

 RETURNS *data\$1type*   
El tipo de datos del valor que la función devuelve. El tipo de datos RETURNS puede ser cualquier tipo de datos estándar de Amazon Redshift. Además, las UDF de Python pueden usar un tipo de datos de ANYELEMENT, que se convierte automáticamente en un tipo de datos estándar basado en el argumento proporcionado en tiempo de ejecución. Si especifica ANYELEMENT para el tipo de datos que se devuelve, al menos un argumento debe usar ANYELEMENT. El tipo de datos que se devuelve coincide con el tipo de datos proporcionado por el argumento ANYELEMENT cuando se convoca la función. Para obtener más información, consulte [Tipos de datos de UDF de Python](udf-data-types.md).

 VOLATILE \$1 STABLE \$1 IMMUTABLE   
Informa al optimizador de consultas acerca de la volatilidad de la función.   
Obtendrá la mejor optimización si etiqueta la función con la categoría de volatilidad válida más estricta. No obstante, si la categoría es demasiado estricta, hay un riesgo de que el optimizador omita por error algunas ejecuciones, lo que resultaría en un conjunto de resultados incorrectos. Las categorías de volatilidad, de la menos estricta a la más estricta, son las siguientes:  
+ VOLATILE
+ STABLE
+ IMMUTABLE
VOLATILE  
Dados los mismos argumentos, la función puede devolver resultados diferentes en ejecuciones consecutivas, incluso para las filas de una única instrucción. El optimizador de consultas no puede realizar ninguna suposición acerca del comportamiento de una función volátil, por lo que una consulta que utiliza una función volátil debe reevaluar la función para cada fila de entrada.  
STABLE  
Dados los mismos argumentos, se garantiza que la función devuelve los mismos resultados para todas las filas procesadas dentro de una única instrucción. La función puede devolver resultados diferentes cuando se evoca en diferentes instrucciones. Esta categoría permite que el optimizador mejore diversas ejecuciones de la función dentro de una única instrucción a una única ejecución para la instrucción.   
IMMUTABLE  
Dados los mismos argumentos, la función siempre devuelve el mismo resultado. Cuando una consulta evoca una función `IMMUTABLE` con argumentos constantes, el optimizador evalúa previamente la función.

AS \$1\$1 *statement* \$1\$1  
 Una construcción que contiene la instrucción que se ejecutará. Las palabras claves literales `AS $$` y `$$` son obligatorias.   
En Amazon Redshift, la instrucción debe incluirse en la función con un formato llamado entrecomillado con símbolo de dólar. Cualquier elemento que se encuentre dentro de los signos se transmite exactamente como es. No necesita incluir en una secuencia de escape los caracteres especiales porque el contenido de la cadena se escribe literalmente.   
 Con el *entrecomillado de dólar, *se utilizan un par de signos de dólar (\$1\$1) para representar el inicio y el final de la instrucción que se va a ejecutar, tal y como se muestra en el siguiente ejemplo.   

```
$$ my statement $$
```
 De manera opcional, entre los signos de dólar de cada par, puede especificar una cadena para ayudar a identificar la instrucción. La cadena que usa debe ser la misma en el inicio y en el final de los pares de signos. La cadena distingue entre mayúsculas y minúsculas, y sigue las mismas restricciones que un identificador sin comillas, excepto que no puede contener signos de dólar. En el siguiente ejemplo, se usa la cadena `test`.   

```
$test$ my statement $test$
```
Para obtener más información acerca de los signos de dólar, consulte Dollar-quoted String Constants bajo [Lexical Structure](https://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html) en la documentación de PostgreSQL. 

*python\$1program*   
Un programa Python ejecutable válido que devuelve un valor. La instrucción que pase con la función debe ajustarse a los requisitos de sangría, tal y como se especifica en la [guía de estilo para el código de Python](https://www.python.org/dev/peps/pep-0008/#indentation) del sitio web de Python. Para obtener más información, consulte [Compatibilidad del lenguaje Python con las UDF](udf-python-language-support.md).

*SQL\$1clause*   
Una cláusula SQL SELECT.  
La cláusula SELECT no puede incluir ninguno de los tipos de cláusulas siguientes:  
+ FROM
+ INTO
+ WHERE
+ GROUP BY
+ ORDER BY
+ LIMIT

LANGUAGE \$1 plpythonu \$1 sql \$1   
Para Python, especifique `plpythonu`. Para SQL, especifique `sql`. Debe tener permiso para usar el lenguaje de SQL o plpythonu. Para obtener más información, consulte [Seguridad y permisos de UDF](udf-security-and-privileges.md).

## Notas de uso
<a name="r_CREATE_FUNCTION-usage-notes"></a>

### Funciones anidadas
<a name="r_CREATE_FUNCTION-usage-notes-nested-functions"></a>

Puede llamar a otra función definida por el usuario (UDF) de SQL desde una UDF de SQL. La función anidada debe existir cuando se ejecuta el comando CREATE FUNCTION. Amazon Redshift no realiza un seguimiento de las dependencias de las UDF; por lo tanto, si se elimina la función anidada, Amazon Redshift no devuelve ningún error. No obstante, la UDF producirá un error si la función anidada no existe. Por ejemplo, la siguiente función llama a la función `f_sql_greater ` en la cláusula SELECT.

```
create function f_sql_commission (float, float )
  returns float
stable
as $$
  select f_sql_greater ($1, $2)
$$ language sql;
```

### Privilegios y seguridad de las UDF
<a name="r_CREATE_FUNCTION-usage-notes-security-and-privileges"></a>

Para crear una UDF, debe tener permiso para usar el lenguaje de SQL o plpythonu (Python). De manera predeterminada, se concede el permiso USAGE ON LANGUAGE SQL a PUBLIC. No obstante, debe conceder explícitamente el permiso de USAGE ON LANGUAGE PLPYTHONU a usuarios o grupos específicos. 

Para revocar los permisos de uso de SQL, primero revoque el uso de PUBLIC. A continuación, conceda los permisos de uso de SQL a solo los usuarios o grupos que tienen permiso para crear UDF de SQL. En el siguiente ejemplo, se revocan los permisos de uso de SQL de PUBLIC y después se conceden permisos de uso al grupo de usuarios `udf_devs`.

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```

Para ejecutar una UDF, debe tener permisos de ejecución para cada función. De manera predeterminada, el permiso de ejecución de nuevas UDF está establecido en PUBLIC. Para restringir el uso, revoque el permiso de ejecución PUBLIC para la función. A continuación, conceda el privilegio a usuarios o grupos específicos. 

En el siguiente ejemplo, se revocan los permisos de ejecución en la función `f_py_greater` de PUBLIC y después se conceden permisos de uso al grupo de usuarios `udf_devs`.

```
revoke execute on function f_py_greater(a float, b float) from PUBLIC;
grant execute on function f_py_greater(a float, b float) to group udf_devs;
```

De manera predeterminada, los superusuarios tienen todos los privilegios. 

Para obtener más información, consulte [GRANT](r_GRANT.md) y [REVOKE](r_REVOKE.md).

## Ejemplos
<a name="r_CREATE_FUNCTION-examples"></a>

### Ejemplo de una UDF escalar de Python
<a name="r_CREATE_FUNCTION-python-example"></a>

En el siguiente ejemplo, se crea una UDF de Python que compara dos enteros y devuelve el valor mayor.

```
create function f_py_greater (a float, b float)
  returns float
stable
as $$
  if a > b:
    return a
  return b
$$ language plpythonu;
```

En el siguiente ejemplo, se consulta la tabla SALES y se evoca la nueva función `f_py_greater` para devolver COMMISSION o 20 por ciento de PRICEPAID, el que represente el mayor valor.

```
select f_py_greater (commission, pricepaid*0.20) from sales;
```

### Ejemplo de una UDF escalar de SQL
<a name="r_CREATE_FUNCTION-sql-example"></a>

En el siguiente ejemplo, se crea una función que compara dos números y devuelve el valor más grande. 

```
create function f_sql_greater (float, float)
  returns float
stable
as $$
  select case when $1 > $2 then $1
    else $2
  end
$$ language sql;
```

La siguiente consulta llama a la nueva función `f_sql_greater` para consultar la tabla SALES y devuelve COMMISSION o el 20 por ciento de PRICEPAID, lo que sea mayor.

```
select f_sql_greater (commission, pricepaid*0.20) from sales;
```

# CREATE GROUP
<a name="r_CREATE_GROUP"></a>

Define un nuevo grupo de usuarios. Solo un superusuario puede crear un grupo.

## Sintaxis
<a name="r_CREATE_GROUP-synopsis"></a>

```
CREATE GROUP group_name
[ [ WITH ] [ USER username ] [, ...] ]
```

## Parameters
<a name="r_CREATE_GROUP-parameters"></a>

 *group\$1name*   
Nombre del nuevo grupo de usuarios. Los nombres de grupos que comienzan con dos guiones bajos se reservan para el uso interno de Amazon Redshift. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

WITH  
Sintaxis opcional para indicar parámetros adicionales para CREATE GROUP.

USER  
Agregue uno o más usuarios al grupo.

 *username*   
Nombre del usuario que desea agregar al grupo.

## Ejemplos
<a name="r_CREATE_GROUP-examples"></a>

En el siguiente ejemplo, se crea un grupo de usuarios llamado ADMIN\$1GROUP con dos usuarios: ADMIN1 y ADMIN2.

```
create group admin_group with user admin1, admin2;
```

# CREATE IDENTITY PROVIDER
<a name="r_CREATE_IDENTITY_PROVIDER"></a>

Define un nuevo proveedor de identidades. Solo un superusuario puede crear un proveedor de identidades.

## Sintaxis
<a name="r_CREATE_IDENTITY_PROVIDER-synopsis"></a>

```
CREATE IDENTITY PROVIDER identity_provider_name TYPE type_name
NAMESPACE namespace_name
[PARAMETERS parameter_string]
[APPLICATION_ARN arn]
[IAM_ROLE iam_role]
[AUTO_CREATE_ROLES
    [ TRUE [ { INCLUDE | EXCLUDE } GROUPS LIKE filter_pattern] |
      FALSE
    ]
  ];
```

## Parameters
<a name="r_CREATE_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
Nombre del nuevo proveedor de identidades. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

*type\$1name*  
El proveedor de identidades con el que interactuar. En la actualidad, Azure y AWSIDC son los únicos proveedores de identidad admitidos.

*namespace\$1name*  
El espacio de nombres. Se trata de un identificador abreviado único para el directorio del proveedor de identidades.

 *parameter\$1string*   
Una cadena que contiene un objeto JSON con el formato correcto que contiene los parámetros y valores necesarios para el proveedor de identidades específico.

 *arn*   
El nombre de recurso de Amazon (ARN) de una aplicación administrada por el IAM Identity Center. Este parámetro solo se aplica cuando el tipo de proveedor de identidades es AWSIDC.

 *iam\$1role*   
El rol de IAM que proporciona permisos para realizar la conexión al IAM Identity Center. Este parámetro solo se aplica cuando el tipo de proveedor de identidades es AWSIDC.

 *auto\$1create\$1roles*   
Habilita o deshabilita la característica de creación automática de roles. Si el valor es TRUE, Amazon Redshift habilita la característica de creación automática de roles. Si el valor es FALSE, Amazon Redshift desactiva la característica de creación automática de roles. Si no se especifica el valor de este parámetro, Amazon Redshift determina el valor mediante la siguiente lógica:   
+  Si se proporciona `AUTO_CREATE_ROLES` pero no se especifica el valor, el valor se establece en TRUE. 
+  Si no se proporciona `AUTO_CREATE_ROLES` y el proveedor de identidad es AWSIDC, el valor se establece en FALSE. 
+  Si no se proporciona `AUTO_CREATE_ROLES` y el proveedor de identidad es Azure, el valor se establece en TRUE. 
Para incluir grupos, especifique `INCLUDE`. El valor predeterminado es vacío, lo que significa incluir todos los grupos si `AUTO_CREATE_ROLES` está activado.  
Para excluir grupos, especifique `EXCLUDE`. El valor predeterminado es vacío, lo que significa que no se excluirá ningún grupo si `AUTO_CREATE_ROLES` está activado.

 *filter\$1pattern*   
Una expresión de caracteres UTF-8 válida con un patrón para hacer coincidir los nombres de grupo. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_CREATE_IDENTITY_PROVIDER.html)
Si *filter\$1pattern* no contiene metacaracteres, solo representa la propia cadena; en ese caso, LIKE actúa igual que el operador de igualdad.   
*filter\$1pattern* admite los siguientes caracteres:  
+  Caracteres alfabéticos en mayúsculas y minúsculas (A-Z y a-z) 
+  Números (0-9) 
+  Los siguientes caracteres especiales: 

  ```
  _ % ^ * + ? { } , $
  ```

## Ejemplos
<a name="r_CREATE_IDENTITY_PROVIDER-examples"></a>

En el ejemplo siguiente se crea un proveedor de identidades denominado *oauth\$1standard*, con un TIPO *azure*, para establecer la comunicación con Microsoft Azure Active Directory (AD).

```
CREATE IDENTITY PROVIDER oauth_standard TYPE azure
NAMESPACE 'aad'
PARAMETERS '{"issuer":"https://sts.windows.net/2sdfdsf-d475-420d-b5ac-667adad7c702/",
"client_id":"87f4aa26-78b7-410e-bf29-57b39929ef9a",
"client_secret":"BUAH~ewrqewrqwerUUY^%tHe1oNZShoiU7",
"audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift"]
}'
```

Puede conectar una aplicación administrada de IAM Identity Center con un clúster aprovisionado existente o un grupo de trabajo de Amazon Redshift sin servidor. Esto le permite administrar el acceso a una base de datos de Redshift a través del IAM Identity Center. Para ello, ejecute un comando de SQL como el siguiente ejemplo. Debe ser administrador de bases de datos.

```
CREATE IDENTITY PROVIDER "redshift-idc-app" TYPE AWSIDC
NAMESPACE 'awsidc'
APPLICATION_ARN 'arn:aws:sso::123456789012:application/ssoins-12345f67fe123d4/apl-a0b0a12dc123b1a4'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyRedshiftRole';
```

En este caso, el ARN de la aplicación identifica la aplicación administrada a la que conectarse. Puede encontrarla ejecutando `SELECT * FROM SVV_IDENTITY_PROVIDERS;`.

Para obtener más información sobre el uso de CREATE IDENTITY PROVIDER, incluidos ejemplos adicionales, consulte [Federación de proveedores de identidades (IdP) nativos para Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html). Para obtener más información sobre la configuración de una conexión de IAM Identity Center desde Redshift, consulte [Conectar Redshift con IAM Identity Center para ofrecer a los usuarios una experiencia de inicio de sesión único](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

# CREATE LIBRARY
<a name="r_CREATE_LIBRARY"></a>

Instala una biblioteca de Python, que esta disponible para que los usuarios la incorporen cuando crean una función definida por el usuario (UDF) con el comando [CREATE FUNCTION](r_CREATE_FUNCTION.md). El tamaño total de las bibliotecas instaladas por el usuario no puede superar los 100 MB. 

CREATE LIBRARY no puede ejecutarse dentro de un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

Amazon Redshift es compatible con la versión 2.7 de Python. Para obtener más información, consulte [www.python.org](https://www.python.org/).

Para obtener más información, consulte [Ejemplo: Importación de módulos personalizados desde la biblioteca de Python](udf-importing-custom-python-library-modules.md). 

## Privilegios necesarios
<a name="r_CREATE_LIBRARY-privileges"></a>

Los siguientes privilegios son necesarios para CREATE LIBRARY:
+ Superusuario
+ Usuarios con el privilegio CREATE LIBRARY o con el privilegio del lenguaje especificado

## Sintaxis
<a name="r_CREATE_LIBRARY-synopsis"></a>

```
CREATE [ OR REPLACE ] LIBRARY library_name LANGUAGE plpythonu
FROM
{ 'https://file_url'
| 's3://bucketname/file_name'
authorization
  [ REGION [AS] 'aws_region']
  IAM_ROLE { default | ‘arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>’ }
}
```

## Parameters
<a name="r_CREATE_LIBRARY-parameters"></a>

OR REPLACE  
Especifica que se reemplaza la biblioteca existente si ya existe una biblioteca con el mismo nombre. REPLACE se confirma inmediatamente. Si una UDF que depende de la biblioteca se ejecuta simultáneamente, es posible que la UDF falle o devuelva resultados inesperados, incluso si la UDF se ejecuta dentro de una transacción. Debe ser el propietario o un superusuario para reemplazar una biblioteca.

 *library\$1name*   
El nombre de la biblioteca que se instalará. No se puede crear una biblioteca que contenga un módulo con el mismo nombre que un módulo de la Biblioteca estándar de Python o un módulo de Python preinstalado en Amazon Redshift. Si una biblioteca existente instalada por el usuario utiliza el mismo paquete de Python que la biblioteca que se instalará, debe eliminar la biblioteca existente antes de instalar la biblioteca nueva. Para obtener más información, consulte [Compatibilidad del lenguaje Python con las UDF](udf-python-language-support.md).

LANGUAGE plpythonu  
El lenguaje que se utilizará. Python (plpythonu) es el único lenguaje compatible. Amazon Redshift es compatible con la versión 2.7 de Python. Para obtener más información, consulte [www.python.org](https://www.python.org/).

FROM  
La ubicación del archivo de biblioteca. Puede especificar un nombre de objeto y bucket de Amazon S3, o bien, puede especificar una dirección URL para descargar el archivo desde un sitio web público. La biblioteca debe comprimirse en la forma de un archivo `.zip`. Para obtener más información, consulte [Building and Installing Python Modules](https://docs.python.org/2/library/distutils.html?highlight=distutils#module-distutils) en la documentación de Python.

 https://*file\$1url*   
El URL para descargar el archivo desde un sitio web público. El URL puede contener hasta tres redireccionamientos. A continuación se muestra un ejemplo del URL de un archivo.  

```
'https://www.example.com/pylib.zip'
```

 s3://*bucket\$1name/file\$1name*   
Se trata de la ruta a un objeto único de Amazon S3 que contiene el archivo de la biblioteca. En el siguiente ejemplo, se muestra una ruta de objeto de Amazon S3.  

```
's3://amzn-s3-demo-bucket/my-pylib.zip'
```
Si especifica un bucket de Amazon S3, también debe proporcionar credenciales para un usuario de AWS que tenga permiso para descargar el archivo.   
 Si el bucket de Amazon S3 no se encuentra en la misma región de AWS que el clúster de Amazon Redshift, debe utilizar la opción REGION para especificar la región de AWS en la que se encuentran los datos. El valor de *aws\$1region* debe coincidir con una región de AWS enumerada en la tabla en la descripción del parámetro [REGION](copy-parameters-data-source-s3.md#copy-region) para el comando COPY.

*authorization*   
Se trata de una cláusula que inicia el método que el clúster utiliza para la autenticación y la autorización con objeto de acceder al bucket de Amazon S3 que contiene el archivo de biblioteca. El clúster debe tener permisos para obtener acceso a Amazon S3 con las acciones LIST y GET.  
La sintaxis de la autorización es la misma que para la autorización del comando COPY. Para obtener más información, consulte [Parámetros de autorización](copy-parameters-authorization.md).  

```
IAM_ROLE { default | ‘arn:aws:iam::<Cuenta de AWS-id>:role/<role-name>’
```
 Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando CREATE LIBRARY.  
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. Si especifica IAM\$1ROLE, no puede utilizar ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN ni CREDENTIALS.  
De manera opcional, si el bucket de Amazon S3 utiliza cifrado de servidor, proporcione la clave de cifrado en la cadena credentials-args. Si utiliza credenciales de seguridad temporales, proporcione el token temporal en la cadena *credentials-args*.  
Para obtener más información, consulte [Credenciales de seguridad temporales](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials).

 REGION [AS] *aws\$1region*   
Se trata de la región de AWS donde está ubicado el bucket de Amazon S3. REGION es necesario cuando el bucket de Amazon S3 no está en la misma región de AWS que el clúster de Amazon Redshift. El valor de *aws\$1region* debe coincidir con una región de AWS enumerada en la tabla en la descripción del parámetro [REGION](copy-parameters-data-source-s3.md#copy-region) para el comando COPY.  
De manera predeterminada, CREATE LIBRARY asume que el bucket de Amazon S3 está ubicado en la misma región de AWS que el clúster de Amazon Redshift.

## Ejemplos
<a name="r_CREATE_LIBRARY-examples"></a>

Los siguientes dos ejemplos instalan el módulo de Python [urlparse](https://docs.python.org/2/library/urlparse.html#module-urlparse), que está comprimido en un archivo llamado `urlparse3-1.0.3.zip`. 

El siguiente comando instala una biblioteca de UDF denominada `f_urlparse` desde un paquete que se ha cargado en un bucket de Amazon S3 ubicado en la región EE. UU. Este.

```
create library f_urlparse
language plpythonu
from 's3://amzn-s3-demo-bucket/urlparse3-1.0.3.zip'
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
region as 'us-east-1';
```

En el siguiente ejemplo, se instala una biblioteca denominada `f_urlparse` desde un archivo de biblioteca en un sitio web.



```
create library f_urlparse
language plpythonu
from 'https://example.com/packages/urlparse3-1.0.3.zip';
```

# CREATE MASKING POLICY
<a name="r_CREATE_MASKING_POLICY"></a>

Crea una nueva política de enmascaramiento dinámico de datos para ofuscar los datos de un determinado formato. Para obtener más información sobre el enmascaramiento dinámico de datos, consulte [Enmascaramiento de datos dinámico](t_ddm.md).

Los superusuarios y los usuarios o roles que tienen el rol sys:secadmin pueden crear una política de enmascaramiento.

## Sintaxis
<a name="r_CREATE_MASKING_POLICY-synopsis"></a>

```
CREATE MASKING POLICY 
   { policy_name | database_name.policy_name } [IF NOT EXISTS]
   WITH (input_columns)
   USING (masking_expression);
```

## Parameters
<a name="r_CREATE_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
Nombre de la política de enmascaramiento. La política de enmascaramiento no puede tener el mismo nombre que otra política de enmascaramiento que ya existe en la base de datos.

database\$1name  
El nombre de la base de datos donde se creará la política. La política se puede crear en la base de datos conectada o en el catálogo de permisos federados de Amazon Redshift.

*input\$1columns*   
Una tupla de nombres de columnas con el formato (tipo de col1, tipo de col2, ...).  
Los nombres de columna se utilizan como entrada de la expresión de enmascaramiento. Los nombres de columna no tienen que coincidir con los nombres de columna que se enmascaran, pero los tipos de datos de entrada y de salida sí deben coincidir.

*masking\$1expression*  
Expresión SQL que se utiliza para transformar las columnas de destino. Se puede escribir mediante funciones de manipulación de datos, como las funciones de manipulación de cadenas, o junto con funciones definidas por el usuario escritas en SQL, Python o con AWS Lambda. Puede incluir una tupla de expresiones de columna para las políticas de enmascaramiento que tienen múltiples salidas. Si usa una constante como expresión de enmascaramiento, debe convertirla explícitamente a un tipo que coincida con el tipo de entrada.  
 Debe tener el permiso USAGE en todas las funciones definidas por el usuario que utilice en la expresión de enmascaramiento. 

Para obtener información sobre el uso de CREATE MASKING POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# CREATE MATERIALIZED VIEW
<a name="materialized-view-create-sql-command"></a>

Crea una vista materializada basada en una o más tablas de Amazon Redshift. También puede basar las vistas materializadas en tablas externas creadas mediante Spectrum o una consulta federada. Para obtener información acerca de Spectrum, consulte [Amazon Redshift Spectrum](c-using-spectrum.md). Para obtener información acerca de las consultas federadas, consulte [Consulta de datos con consultas federadas en Amazon Redshift](federated-overview.md).

## Sintaxis
<a name="mv_CREATE_MATERIALIZED_VIEW-synopsis"></a>

```
CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query
```

## Parameters
<a name="mv_CREATE_MATERIALIZED_VIEW-parameters"></a>

BACKUP  
Una cláusula que especifica si la vista materializada debe incluirse en instantáneas de clústeres manuales y automáticos.   
Para las vistas materializadas que no contienen datos críticos, especifique BACKUP NO para ahorrar tiempo de procesamiento al momento de crear instantáneas y restaurar contenido a partir de ellas, y para reducir espacio de almacenamiento en Amazon Simple Storage Service. El ajuste BACKUP NO no afecta la replicación automática de datos a otros nodos dentro del clúster, por lo que las vistas materializadas con BACKUP NO especificado se restauran en el caso de un error del nodo. El valor predeterminado es BACKUP YES.

 *table\$1attributes*   
Cláusula que especifica cómo se distribuyen los datos de la vista materializada, incluida la siguiente:  
+  El estilo de distribución para la vista materializada en formato `DISTSTYLE { EVEN | ALL | KEY }`. Si omite esta cláusula, el estilo de distribución es `EVEN`. Para obtener más información, consulte [Estilos de distribución](c_choosing_dist_sort.md).
+ La clave de distribución de la vista materializada en formato `DISTKEY ( distkey_identifier )`. Para obtener más información, consulte [Designación de estilos de distribución](t_designating_distribution_styles.md).
+ Clave de ordenación de la vista materializada en formato `SORTKEY ( column_name [, ...] )`. Para obtener más información, consulte [Claves de clasificación](t_Sorting_data.md).

AS *query*  
Se trata de una instrucción `SELECT` válida que define la vista materializada y su contenido. El conjunto de resultados de la consulta define las columnas y filas de la vista materializada. Para obtener información sobre las limitaciones al crear vistas materializadas, consulte [Limitaciones](#mv_CREATE_MATERIALIZED_VIEW-limitations).  
Además, las construcciones específicas del lenguaje SQL utilizadas en la consulta determinan si la vista materializada se puede actualizar de forma incremental o completa. Para obtener información sobre el método de actualización, consulte [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md). Para obtener información acerca de las limitaciones para la actualización incremental, consulte [Limitaciones para la actualización incremental](materialized-view-refresh-sql-command.md#mv_REFRESH_MARTERIALIZED_VIEW_limitations).  
Si la consulta contiene un comando SQL que no es compatible con la actualización progresiva, Amazon Redshift muestra un mensaje que indica que la vista materializada utilizará una actualización completa. El mensaje se puede mostrar o no, en función de la aplicación cliente de SQL. Active la columna `state` de [STV\$1MV\$1INFO](r_STV_MV_INFO.md) para ver el tipo de actualización utilizado por una vista materializada.

AUTO REFRESH  
Se trata de una cláusula que define si la vista materializada debe actualizarse de forma automática con los últimos cambios de las tablas base. El valor predeterminado es `NO`. Para obtener más información, consulte [Actualización de una vista materializada](materialized-view-refresh.md).

## Notas de uso
<a name="mv_CREATE_MARTERIALIZED_VIEW_usage"></a>

Para crear una vista materializada, debe tener los siguientes privilegios:
+ Privilegios CREATE para un esquema.
+ Privilegio SELECT de nivel de tabla o de columna en las tablas base para crear una vista materializada. Si tiene privilegios de nivel de columna en columnas específicas, no puede crear una vista materializada solo en esas columnas.

 Puede crear una vista materializada desde un clúster de recurso compartido de datos remoto proporcionando el nombre de la base de datos externa en el `mv_name`. 

## Actualización incremental para obtener vistas materializadas en un recurso compartido de datos
<a name="mv_CREATE_MARTERIALIZED_VIEW_datashare"></a>

 Amazon Redshift admite la actualización automática e incremental de las vistas materializadas en un recurso compartido de datos de consumidores cuando se comparten las tablas base. La actualización incremental es una operación en la que Amazon Redshift identifica los cambios en la tabla o tablas base que se produjeron después de la actualización anterior y actualiza solo los registros correspondientes de la vista materializada. Esto se ejecuta más rápido que una actualización completa y mejora el rendimiento de la carga de trabajo. No es necesario cambiar la definición de la vista materializada para aprovechar la actualización incremental. 

Hay un par de limitaciones que hay que tener en cuenta a la hora de aprovechar la actualización incremental con una vista materializada: 
+ La vista materializada debe hacer referencia solo a una base de datos, ya sea local o remota. 
+ La actualización incremental solo está disponible en las nuevas vistas materializadas. Por lo tanto, debe eliminar las vistas materializadas existentes y volver a crearlas para que se produzca una actualización incremental.

Para obtener más información sobre la creación de vistas materializadas en un recurso compartido de datos, consulte [Trabajo con vistas en el uso compartido de datos de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/datashare-views), que contiene varios ejemplos de consultas.

## Actualizaciones DDL en vistas materializadas o tablas base
<a name="materialized-view-ddl"></a>

Cuando utilice vistas materializadas en Amazon Redshift, siga las siguientes notas de uso para las actualizaciones de lenguaje de definición de datos (DDL) en vistas materializadas o tablas base.
+ Puede agregar columnas a una tabla base sin que esto afecte a las vistas materializadas que hacen referencia a la tabla base.
+ Algunas operaciones pueden dejar la vista materializada en un estado en el que no se puede actualizar. Por ejemplo, operaciones como renombrar o eliminar una columna, cambiar el tipo de columna y cambiar el nombre de un esquema. Dichas vistas materializadas se pueden consultar pero no se pueden actualizar. En este caso, debe eliminar y volver a crear la vista materializada. 
+ En general, no se puede modificar la definición de una vista materializada (su instrucción SQL).
+ No se puede cambiar el nombre de una vista materializada. 

## Limitaciones
<a name="mv_CREATE_MATERIALIZED_VIEW-limitations"></a>

No puede definir una vista materializada que haga referencia a o incluya cualquiera de los siguientes:
+ Vistas estándar o vistas y tablas de sistema.
+ Tablas temporales.
+ Funciones definidas por el usuario.
+ La cláusula ORDER BY, LIMIT u OFFSET.
+ Referencias de enlace tardío a tablas básicas. En otras palabras, cualquier tabla de base o columnas relacionadas a las que se hace referencia en la definición de la consulta SQL de la vista materializada debe existir y ser válida. 
+ Funciones específicas del nodo principal: CURRENT\$1SCHEMA, CURRENT\$1SCHEMAS, HAS\$1DATABASE\$1PRIVILEGE, HAS\$1SCHEMA\$1PRIVILEGE, HAS\$1TABLE\$1PRIVILEGE.
+ No se puede utilizar la opción AUTO REFRESH YES cuando la definición de la vista materializada incluye funciones mutables o esquemas externos. Tampoco puede usarla cuando define una vista materializada en otra vista materializada.
+ No hace falta que ejecute manualmente [ANALYZE](r_ANALYZE.md) en las vistas materializadas. Actualmente, esto solo ocurre mediante AUTO ANALYZE. Para obtener más información, consulte [Análisis de tablas](t_Analyzing_tables.md).
+ Tablas protegidas por RLS o DDM. 
+ La creación de vistas materializadas desde clústeres de recurso compartido de datos remotos no admite referencias a otras vistas materializadas, tablas Spectrum, tablas definidas en un clúster Redshift diferente ni UDF. Se admiten para la creación de vistas materializadas desde el clúster local (productor). 

## Ejemplos
<a name="mv_CREATE_MARTERIALIZED_VIEW_examples"></a>

En el siguiente ejemplo, se crea una vista materializada a partir de tres tablas base que se combinan y se agrupan. Cada fila representa una categoría con el número de entradas vendidas. Cuando consulta la vista materializada tickets\$1mv, accede directamente a los datos precalculados en la vista materializada tickets\$1mv.

```
CREATE MATERIALIZED VIEW tickets_mv AS
    select   catgroup,
    sum(qtysold) as sold
    from     category c, event e, sales s
    where    c.catid = e.catid
    and      e.eventid = s.eventid
    group by catgroup;
```

En el siguiente ejemplo, se crea una vista materializada similar al ejemplo anterior y se utiliza la función agregada MAX(). 

```
CREATE MATERIALIZED VIEW tickets_mv_max AS
    select   catgroup,
    max(qtysold) as sold
    from     category c, event e, sales s
    where    c.catid = e.catid
    and      e.eventid = s.eventid
    group by catgroup;

SELECT name, state FROM STV_MV_INFO;
```

En el siguiente ejemplo, se utiliza una cláusula UNION ALL para combinar la tabla `public_sales` de Amazon Redshift y la tabla `spectrum.sales` de Redshift Spectrum para crear una vista material `mv_sales_vw`. Para obtener información acerca del comando CREATE EXTERNAL TABLE para Amazon Redshift Spectrum, consulte [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). La tabla externa de Redshift Spectrum referencia los datos de Amazon S3.

```
CREATE MATERIALIZED VIEW mv_sales_vw as
select salesid, qtysold, pricepaid, commission, saletime from public.sales
union all
select salesid, qtysold, pricepaid, commission, saletime from spectrum.sales
```

En el siguiente ejemplo, se crea una vista materializada `mv_fq` basada en una tabla externa de consulta federada. Para obtener información acerca de las consultas federadas, consulte [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md).

```
CREATE MATERIALIZED VIEW mv_fq as select firstname, lastname from apg.mv_fq_example;

select firstname, lastname from mv_fq;
 firstname | lastname
-----------+----------
 John      | Day
 Jane      | Doe
(2 rows)
```

En el siguiente ejemplo, se muestra la definición de una vista materializada.

```
SELECT pg_catalog.pg_get_viewdef('mv_sales_vw'::regclass::oid, true);

pg_get_viewdef
---------------------------------------------------
create materialized view mv_sales_vw as select a from t;
```

 El siguiente ejemplo muestra cómo configurar AUTO REFRESH en la definición de vista materializada y también especifica un DISTSTYLE. Primero, crea una tabla base simple. 

```
CREATE TABLE baseball_table (ball int, bat int);
```

A continuación, cree una vista materializada.

```
CREATE MATERIALIZED VIEW mv_baseball DISTSTYLE ALL AUTO REFRESH YES AS SELECT ball AS baseball FROM baseball_table;
```

Ahora puede consultar la vista materializada de mv\$1baseball. Para comprobar si la actualización automática está activada en una vista materializada, consulte [STV\$1MV\$1INFO](r_STV_MV_INFO.md).

En el siguiente ejemplo se crea una vista materializada que hace referencia a una tabla de origen de otra base de datos. Se supone que la base de datos que contiene la tabla de origen, database\$1A, se encuentra en el mismo clúster o grupo de trabajo que la vista materializada, que se crea en database\$1B. (Puede sustituir el ejemplo por sus propias bases de datos). Primero, cree una tabla en database\$1A denominada *cities*, con una columna de *cityname*. Haga que el tipo de datos de la columna sea VARCHAR. Después de crear la tabla de origen, ejecute el siguiente comando en database\$1B para crear una vista materializada cuyo origen sea la tabla *cities*. Asegúrese de especificar la base de datos y el esquema de la tabla de origen en la cláusula FROM:

```
CREATE MATERIALIZED VIEW cities_mv AS
SELECT  cityname
FROM    database_A.public.cities;
```

Consulte la vista materializada que ha creado. La consulta recupera los registros cuyo origen original es la tabla *cities* de database\$1A:

```
select * from cities_mv;
```

Al ejecutar la instrucción SELECT, *cities\$1mv* devuelve los registros. Los registros se actualizan desde la tabla de origen solo cuando se ejecuta una instrucción REFRESH. Además, tenga en cuenta que no puede actualizar los registros directamente en la vista materializada. Para obtener información sobre cómo actualizar los datos en una vista materializada, consulte [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md).

Para obtener información detallada sobre la información general de la vista materializada y los comandos SQL utilizados para actualizar y eliminar vistas materializadas, consulte los siguientes temas:
+ [Vistas materializadas en Amazon Redshift](materialized-view-overview.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)

# CREATE MODEL
<a name="r_CREATE_MODEL"></a>

**Topics**
+ [Requisitos previos](#r_create_model_prereqs)
+ [Privilegios necesarios](#r_simple_create_model-privileges)
+ [Control de costes](#r_create_model_cost)
+ [CREATE MODEL completo](#r_full_create_model)
+ [Parameters](#r_create_model_parameters)
+ [Notas de uso](r_create_model_usage_notes.md)
+ [Casos de uso](r_create_model_use_cases.md)

## Requisitos previos
<a name="r_create_model_prereqs"></a>

Antes de utilizar la instrucción CREATE MODEL, complete los requisitos previos indicados en [Configuración del clúster para utilizar Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup). A continuación, se brinda un resumen de alto nivel de los requisitos previos.
+ Cree un clúster de Amazon Redshift con la consola de administración de AWS o la AWS Command Line Interface (AWS CLI)
+ Adjunte la política de AWS Identity and Access Management (IAM) mientras crea el clúster.
+ Para permitir que Amazon Redshift y SageMaker AI asuman el rol para interactuar con otros servicios, añada la política de confianza adecuada al rol de IAM.

Para obtener detalles sobre el rol de IAM, la política de confianza y otros requisitos previos, consulte [Configuración del clúster para utilizar Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup).

A continuación, encontrará diferentes casos de uso para la instrucción CREATE MODEL.
+ [CREATE MODEL simple](r_create_model_use_cases.md#r_simple_create_model)
+ [CREATE MODEL con guía para el usuario](r_create_model_use_cases.md#r_user_guidance_create_model)
+ [CREATE para modelos XGBoost con AUTO OFF](r_create_model_use_cases.md#r_auto_off_create_model)
+ [Bring your own model (BYOM): inferencia local](r_create_model_use_cases.md#r_byom_create_model)
+ [Bring your own model (BYOM): inferencia remota](r_create_model_use_cases.md#r_byom_create_model_remote)
+ [CREATE MODEL con K-MEANS](r_create_model_use_cases.md#r_k-means_create_model)
+ [CREATE MODEL completo](#r_full_create_model)

## Privilegios necesarios
<a name="r_simple_create_model-privileges"></a>

Los siguientes privilegios son necesarios para CREATE MODEL:
+ Superusuario
+ Usuarios con el privilegio CREATE MODEL
+ Roles con el privilegio GRANT CREATE MODEL

## Control de costes
<a name="r_create_model_cost"></a>

 Amazon Redshift ML utiliza los recursos de clúster existentes para crear modelos de predicción, por lo que no es necesario pagar costes adicionales. Sin embargo, es posible que tenga costes adicionales si necesita cambiar el tamaño del clúster o desea entrenar los modelos. Amazon Redshift ML utiliza Amazon SageMaker AI para entrenar modelos, lo que supone un costo adicional asociado. Hay formas de controlar los costes adicionales, como limitar el tiempo máximo que puede tardar el entrenamiento o limitar el número de ejemplos de formación utilizados a la hora de entrenar el modelo. Para obtener más información, consulte [Costes para usar Amazon Redshift ML](https://docs.aws.amazon.com/redshift/latest/dg/cost.html). 

## CREATE MODEL completo
<a name="r_full_create_model"></a>

A continuación, se resumen las opciones básicas de la sintaxis de CREATE MODEL completo.

### Sintaxis de CREATE MODEL completo
<a name="r_auto_off-create-model-synposis"></a>

A continuación, se muestra la sintaxis completa de la instrucción CREATE MODEL.

**importante**  
Cuando cree un modelo con la instrucción CREATE MODEL, siga el orden de las palabras clave en la sintaxis que aparece a continuación.

```
CREATE MODEL model_name
FROM { table_name | ( select_statement )  | 'job_name' }
[ TARGET column_name ]
FUNCTION function_name [ ( data_type [, ...] ) ] 
[ RETURNS data_type ] 
  -- supported only for BYOM
[ SAGEMAKER 'endpoint_name'[:'model_name']] 
  -- supported only for BYOM remote inference
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
[ AUTO ON / OFF ]
  -- default is AUTO ON
[ MODEL_TYPE { XGBOOST | MLP | LINEAR_LEARNER | KMEANS | FORECAST } ]
  -- not required for non AUTO OFF case, default is the list of all supported types
  -- required for AUTO OFF
[ PROBLEM_TYPE ( REGRESSION | BINARY_CLASSIFICATION | MULTICLASS_CLASSIFICATION ) ]
  -- not supported when AUTO OFF
[ OBJECTIVE ( 'MSE' | 'Accuracy' | 'F1' | 'F1_Macro' | 'AUC' |
             'reg:squarederror' | 'reg:squaredlogerror'| 'reg:logistic'|
             'reg:pseudohubererror' | 'reg:tweedie' | 'binary:logistic' | 'binary:hinge',
             'multi:softmax' | 'RMSE' | 'WAPE' | 'MAPE' | 'MASE' | 'AverageWeightedQuantileLoss' ) ]
  -- for AUTO ON: first 5 are valid
  -- for AUTO OFF: 6-13 are valid
  -- for FORECAST: 14-18 are valid
[ PREPROCESSORS 'string' ]
  -- required for AUTO OFF, when it has to be 'none'
  -- optional for AUTO ON
[ HYPERPARAMETERS { DEFAULT | DEFAULT EXCEPT ( Key 'value' (,...) ) } ]
  -- support XGBoost hyperparameters, except OBJECTIVE
  -- required and only allowed for AUTO OFF
  -- default NUM_ROUND is 100
  -- NUM_CLASS is required if objective is multi:softmax (only possible for AUTO OFF)
 [ SETTINGS (
   S3_BUCKET 'amzn-s3-demo-bucket',  |
    -- required
  TAGS 'string', |
    -- optional
  KMS_KEY_ID 'kms_string', |
    -- optional
  S3_GARBAGE_COLLECT on / off, |
    -- optional, defualt is on.
  MAX_CELLS integer, |
    -- optional, default is 1,000,000
  MAX_RUNTIME integer (, ...) |
    -- optional, default is 5400 (1.5 hours)
  HORIZON integer, |
    -- required if creating a forecast model
  FREQUENCY integer, |
    -- required if creating a forecast model
  PERCENTILES string, |
    -- optional if creating a forecast model
  MAX_BATCH_ROWS integer -- optional for BYOM remote inference
    ) ]
```

## Parameters
<a name="r_create_model_parameters"></a>

model\$1name  
El nombre del modelo. El nombre del modelo en un esquema debe ser único.

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1 *'job\$1name'*\$1  
Se trata del nombre de la tabla o la consulta que especifica los datos de formación. Pueden ser una tabla existente en el sistema o una consulta SELECT compatible con Amazon Redshift entre paréntesis, es decir, (). En el resultado de la consulta, debe haber al menos dos columnas. 

TARGET *column\$1name*  
Se trata del nombre de la columna que se convierte en el objetivo de predicción. La columna debe existir en la cláusula FROM. 

FUNCTION *function\$1name* ( *data\$1type* [, ...] )  
Se trata del nombre de la función que se creará y los tipos de datos de los argumentos de entrada. Puede proporcionar el nombre de un esquema de la base de datos en lugar del nombre de una función.

RETURNS *data\$1type*  
El tipo de datos que se va a devolver desde la función del modelo. El tipo de datos `SUPER` de devolución solo se aplica a BYOM con inferencia remota.

SAGEMAKER *'endpoint\$1name'*[:*'model\$1name'*]  
El nombre del punto de conexión de Amazon SageMaker AI. Si el nombre del punto de conexión apunta a un punto de conexión de múltiples modelos, agregue el nombre del modelo que se utilizará. El punto de conexión debe estar alojado en la misma Región de AWS que el clúster de Amazon Redshift.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando CREATE MODEL. También puede especificar un ARN de un rol de IAM para usar ese rol.

[AUTO ON/OFF]  
 Activa o desactiva la detección automática de CREATE MODEL de procesadores previos, algoritmos e hiperparámetros. Si especifica esta opción al crear un modelo de previsión, se debe utilizar un AutoPredictor, en el que Amazon Forecast aplica las combinaciones óptimas de algoritmos a cada serie temporal del conjunto de datos. 

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1 KMEANS \$1 FORECAST \$1*   
(Opcional) Especifica el tipo de modelo. Puede especificar si desea entrenar un modelo de un tipo específico, como XGBoost, perceptron multicapa (MLP), KMEANS o Linear Learner, que son todos algoritmos compatibles con el Piloto automático de Amazon SageMaker AI. Si no se especifica el parámetro, se buscan todos los tipos de modelos admitidos durante la formación para encontrar el mejor modelo. También puede crear un modelo de previsión en Redshift ML para crear previsiones precisas de series temporales.

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(Opcional) Especifica el tipo de problema. Si conoce el tipo de problema, puede restringir a Amazon Redshift a que busque solo el mejor modelo de ese tipo específico. Si no se especifica este parámetro, se detecta un tipo de problema durante la formación, en función de sus datos.

OBJECTIVE ( 'MSE' \$1 'Accuracy' \$1 'F1' \$1 'F1Macro' \$1 'AUC' \$1 'reg:squarederror' \$1 'reg:squaredlogerror' \$1 'reg:logistic' \$1 'reg:pseudohubererror' \$1 'reg:tweedie' \$1 'binary:logistic' \$1 'binary:hinge' \$1 'multi:softmax' \$1 'RMSE' \$1 'WAPE' \$1 'MAPE' \$1 'MASE' \$1 'AverageWeightedQuantileLoss' )  
(Opcional) Especifica el nombre de la métrica de objetivo utilizada para medir la calidad predictiva de un sistema de machine learning. Esta métrica se optimiza durante la formación para proporcionar la mejor estimación para los valores del parámetro del modelo a partir de los datos. Si no se especifica una métrica de forma explícita, el comportamiento predeterminado es utilizar automáticamente MSE para regresión, F1 para clasificación binaria y Accuracy para clasificación multiclase. Para obtener más información acerca de los objetivos, consulte [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) en la *Referencia de la API de Amazon SageMaker AI* y [Learning task parameters](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters) en la documentación de XGBOOST. Los valores RMSE, WAPE, MAPE, MASE y AverageWeightedQuantileLoss solo son aplicables a los modelos de previsión. Para obtener más información, consulte la operación de la API [CreateAutoPredictor](https://docs.aws.amazon.com/forecast/latest/dg/API_CreateAutoPredictor.html#forecast-CreateAutoPredictor-request-OptimizationMetric).

 *PREPROCESSORS "string' *   
(Opcional) Especifica ciertas combinaciones de procesadores previos para determinados conjuntos de columnas. El formato es una lista de columnSets y las transformaciones adecuadas que se aplicarán a cada conjunto de columnas. Amazon Redshift aplica todos los transformadores de una lista de transformadores específica a todas las columnas del ColumnSet correspondiente. Por ejemplo, para aplicar OneHotEncoder con Imputer a las columnas t1 y t2, utilice el comando de muestra que aparece a continuación.  

```
CREATE MODEL customer_churn
FROM customer_data
TARGET 'Churn'
FUNCTION predict_churn
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
PROBLEM_TYPE BINARY_CLASSIFICATION
OBJECTIVE 'F1'
PREPROCESSORS '[
...
  {"ColumnSet": [
      "t1",
      "t2"
    ],
    "Transformers": [
      "OneHotEncoder",
      "Imputer"
    ]
  },
  {"ColumnSet": [
      "t3"
    ],
    "Transformers": [
      "OneHotEncoder"
    ]
  },
  {"ColumnSet": [
      "temp"
    ],
    "Transformers": [
      "Imputer",
      "NumericPassthrough"
    ]
  }
]'
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket'
)
```

HYPERPARAMETERS \$1 DEFAULT \$1 DEFAULT EXCEPT ( key ‘value’ (,..) ) \$1  
Especifica si los parámetros de XGBoost predeterminados se utilizan o se sustituyen con valores especificados por el usuario. Los valores deben ir entre comillas simples. Los siguientes son ejemplos de parámetros para XGBoost y sus valores predeterminados.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_CREATE_MODEL.html)

SETTINGS ( S3\$1BUCKET *'amzn-s3-demo-bucket'*, \$1 TAGS 'string', \$1 KMS\$1KEY\$1ID *'kms\$1string' *, \$1 S3\$1GARBAGE\$1COLLECT on / off, \$1 MAX\$1CELLS integer , \$1 MAX\$1RUNTIME (,...) , \$1 HORIZON integer, \$1 FREQUENCY forecast\$1frequency, \$1 PERCENTILES matriz de cadenas )  
La cláusula S3\$1BUCKET especifica la ubicación de Amazon S3 que se utiliza para almacenar resultados intermedios.  
(Opcional) El parámetro TAGS es una lista separada por comas de pares clave-valor que puede utilizar para etiquetar recursos creados en Amazon SageMaker AI y Amazon Forecast. Las etiquetas lo ayudan a organizar los recursos y a asignar los costos. Los valores del par son opcionales, por lo que puede crear etiquetas mediante el formato `key=value` o simplemente con la creación de una clave. Para obtener más información sobre las etiquetas en Amazon Redshift, consulte [Información general del proceso de etiquetado](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-tagging.html).  
(Opcional) KMS\$1KEY\$1ID especifica si Amazon Redshift utiliza cifrado del lado del servidor con una clave de AWS KMS para proteger los datos en reposo. Los datos en tránsito están protegidos con la capa de conexión segura (SSL).   
(Opcional) S3\$1GARBAGE\$1COLLECT \$1ON\$1OFF\$1 especifica si Amazon Redshift realiza la recopilación de elementos no utilizados en los conjuntos de datos resultantes utilizados para formar modelos, además de los propios modelos. Si se establece en OFF, los conjuntos de datos resultantes utilizados para formar modelos y los modelos permanecen en Amazon S3 y se pueden utilizar para otros fines. Si se establece en ON, Amazon Redshift elimina los artefactos en Amazon S3 una vez que se completa la formación. El valor predeterminado es ON.  
(Opcional) MAX\$1CELLS especifica el número de celdas de los datos de formación. Este valor se obtiene de multiplicar el número de registros (en la tabla o en la consulta de formación) por el número de columnas. El valor predeterminado es 1 000 000.  
(Opcional) MAX\$1RUNTIME especifica la cantidad máxima de tiempo que dura la formación. Los trabajos de formación suelen completarse antes en función del tamaño del conjunto de datos. Especifica la cantidad máxima de tiempo que debería tomar la formación. El valor predeterminado es 5400 (90 minutos).  
HORIZON especifica el número máximo de predicciones que puede devolver el modelo de previsión. Una vez que el modelo esté formado, no podrá cambiar este entero. Este parámetro es obligatorio si se entrena un modelo de previsión.  
FREQUENCY especifica los detalles en unidades de tiempo que desea que sean las previsiones. Las opciones disponibles son  `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`. Este parámetro es obligatorio si se entrena un modelo de previsión.  
(Opcional) PERCENTILES es una cadena delimitada por comas que especifica los tipos de previsión que se utilizan para entrenar un predictor. Los tipos de previsión pueden ser cuantiles de 0,01 a 0,99, en incrementos de 0,01 o más. También puede especificar la previsión media con la media. Puede especificar un máximo de cinco tipos de previsión.

 MAX\$1BATCH\$1ROWS *integer*   
(Opcional) El número máximo de filas que Amazon Redshift envía en una sola solicitud por lotes para una única invocación de SageMaker AI. Solo se admite para BYOM con inferencia remota. El valor mínimo de este parámetro es 1. El valor máximo es `INT_MAX` o 2 147 483 647. Este parámetro solo es necesario cuando el tipo de datos de entrada y de devolución son *SUPER*. El valor predeterminado es `INT_MAX` o 2 147 483 647. 

# Notas de uso
<a name="r_create_model_usage_notes"></a>

Cuando utilice CREATE MODEL, tenga en cuenta lo siguiente:
+ La instrucción CREATE MODEL funciona en modo asíncrono y devuelve los resultados una vez exportados los datos de formación a Amazon S3. Los pasos restantes de entrenamiento en Amazon SageMaker AI se producen en segundo plano. Mientras la formación está en curso, la función de inferencia correspondiente está visible, pero no se puede ejecutar. Puede consultar [STV\$1ML\$1MODEL\$1INFO](r_STV_ML_MODEL_INFO.md) para ver el estado de la formación. 
+ La formación puede durar hasta 90 minutos en segundo plano de manera predeterminada en el modelo Auto y puede extenderse. Para cancelar la formación, simplemente ejecute el comando [DROP MODEL](r_DROP_MODEL.md).
+ El clúster de Amazon Redshift que se utiliza a la hora de crear el modelo y el bucket de Amazon S3 que se utiliza para preparar los datos de formación y los artefactos del modelo deberán estar en la misma región de AWS.
+ Durante el entrenamiento del modelo, Amazon Redshift y SageMaker AI almacenan artefactos intermedios en el bucket de Amazon S3 proporcionado. De manera predeterminada, Amazon Redshift realiza la recopilación de elementos no utilizados al final de la operación CREATE MODEL. Amazon Redshift quita esos objetos de Amazon S3. Para retener esos artefactos en Amazon S3, establezca la opción S3\$1GARBAGE COLLECT OFF.
+ Debe utilizar al menos 500 filas de los datos de formación proporcionados en la cláusula FROM.
+ Solo se pueden especificar hasta 256 columnas de características (entrada) en la cláusula FROM \$1 table\$1name \$1 ( select\$1query ) \$1 cuando se utiliza la instrucción CREATE MODEL.
+ Para AUTO ON, los tipos de columnas que puede utilizar como conjunto de formación son SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE, BOOLEAN, CHAR, VARCHAR, DATE, TIME, TIMETZ, TIMESTAMP y TIMESTAMPTZ. Para AUTO OFF, los tipos de columnas que puede utilizar como conjunto de formación son SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE y BOOLEAN.
+ No se puede utilizar DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, GEOMETRY, GEOGRAPHY, HLLSKETCH, SUPER, o VARBYTE como el tipo de columna de destino.
+ Para mejorar la precisión del modelo, lleve a cabo una las siguientes acciones:
  + Cuando especifique los datos de formación en la cláusula FROM, agregue tantas columnas relevantes en el comando CREATE MODEL como sea posible.
  + Utilice un valor más grande para MAX\$1RUNTIME y MAX\$1CELLS. Los valores más grandes para este parámetro aumentan el costo de la formación de un modelo.
+ La ejecución de la instrucción CREATE MODEL presenta los resultados tan pronto como los datos de formación se calculan y exportan al bucket de Amazon S3. Después de ese punto, se puede verificar el estado de la formación mediante el comando SHOW MODEL. Cuando un modelo que se está formando en segundo plano presenta error, se puede verificar el error con SHOW MODEL. No se puede volver a probar un modelo que presente error. Utilice DROP MODEL para quitar un modelo que presenta error y volver a crear un modelo nuevo. Para obtener más información acerca de SHOW MODEL, consulte [SHOW MODEL](r_SHOW_MODEL.md).
+ El procedimiento BYOM local es compatible con el mismo tipo de modelos que Amazon Redshift ML admite para casos que no son de BYOM. Amazon Redshift es compatible con modelos de XGBoost (mediante la versión 1.0 o posteriores de XGBoost) y KMEANS básicos sin preprocesadores y modelos de XGBOOST/MLP/Linear Learner entrenados por el Piloto automático de Amazon SageMaker AI. Admite estos últimos modelos con procesadores previos que el Piloto automático ha especificado y que también son compatibles con Amazon SageMaker AI Neo.
+ Si su clúster de Amazon Redshift ha habilitado el enrutamiento mejorado para su nube privada virtual (VPC), asegúrese de crear un punto de conexión de VPC de Amazon S3 y un punto de conexión de VPC de SageMaker AI para la VPC en la que se encuentra el clúster. Esto permite que el tráfico pase por la VPC entre estos servicios durante el proceso CREATE MODEL. Para obtener más información, consulte [SageMaker AI Clarify Job Amazon VPC Subnets and Security Groups](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-vpc.html#clarify-vpc-job).

# Casos de uso
<a name="r_create_model_use_cases"></a>

En los siguientes casos de uso se muestra cómo utilizar CREATE MODEL a la medida de sus necesidades.

## CREATE MODEL simple
<a name="r_simple_create_model"></a>

A continuación, se resumen las opciones básicas de la sintaxis de CREATE MODEL.

### Sintaxis de CREATE MODEL simple
<a name="r_simple-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | ( select_query ) }
TARGET column_name
FUNCTION prediction_function_name
IAM_ROLE { default }
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  [ MAX_CELLS integer ]
)
```

### Parámetros de CREATE MODEL simple
<a name="r_simple-create-model-parameters"></a>

 *model\$1name*   
El nombre del modelo. El nombre del modelo en un esquema debe ser único.

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1  
Se trata del nombre de la tabla o la consulta que especifica los datos de formación. Pueden ser una tabla existente en el sistema o una consulta SELECT compatible con Amazon Redshift entre paréntesis, es decir, (). En el resultado de la consulta, debe haber al menos dos columnas. 

TARGET *column\$1name*  
Se trata del nombre de la columna que se convierte en el objetivo de predicción. La columna debe existir en la cláusula FROM. 

FUNCTION *prediction\$1function\$1name*   
Se trata de un valor que especifica el nombre de la función de machine learning de Amazon Redshift que generará CREATE MODEL y que se utilizará para generar predicciones con este modelo. La función se crea en el mismo esquema que el objeto del modelo y se puede sobrecargar.  
El machine learning de Amazon Redshift es compatible con modelos, como el árbol Xtreme Gradient Boosted (XGBoost) para la regresión y la clasificación.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1  
 Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando CREAT MODEL. También puede especificar el ARN de un rol de IAM para usar ese rol.

 *S3\$1BUCKET *'amzn-s3-demo-bucket'**   
Se trata del nombre del bucket de Amazon S3 que creó anteriormente y que se utiliza para compartir datos de entrenamiento y artefactos entre Amazon Redshift y SageMaker AI. Amazon Redshift crea una subcarpeta en este bucket antes de descargar los datos de formación. Una vez que se completa la formación, Amazon Redshift elimina la subcarpeta creada y su contenido. 

Número entero para MAX\$1CELLS   
Se trata del número máximo de celdas que se exportarán desde la cláusula FROM. El valor predeterminado es 1 000 000.   
El número de celdas se obtiene de multiplicar el número de filas de los datos de formación (productos de la tabla o la consulta de la cláusula FROM) por el número de columnas. Si el número de celdas de los datos de formación es mayor que el especificado por el parámetro max\$1cells, CREATE MODEL reduce la cantidad de datos de formación de la cláusula FROM para reducir el tamaño del conjunto de formación debajo de MAX\$1CELLS. Si se admiten conjuntos de datos de formación más grandes pueden brindar mayor precisión, pero también puede significar que el modelo tarde más en formarse y cueste más.  
Para obtener información acerca de los costos que implica usar Amazon Redshift, consulte [Costos de utilizar Amazon Redshift ML](cost.md).  
Para obtener más información sobre los costos asociados a los distintos números de celdas y los detalles de la prueba gratuita, consulte [Precios de Amazon Redshift](https://aws.amazon.com/redshift/pricing).

## CREATE MODEL con guía para el usuario
<a name="r_user_guidance_create_model"></a>

A continuación, encontrará una descripción de las opciones de CREATE MODEL, además de las opciones descritas en [CREATE MODEL simple](#r_simple_create_model).

De manera predeterminada, CREATE MODEL busca la mejor combinación de procesamiento previo y modelo para su conjunto de datos específico. Es posible que desee un control adicional o introducir conocimientos de dominio adicionales (como el tipo de problema o el objetivo) sobre su modelo. En un escenario de deserción de clientes, si el resultado “el cliente no está activo” es poco frecuente, se suele preferir el objetivo F1 en lugar del objetivo de precisión. Como los modelos de alta precisión tal vez predicen que “el cliente está activo” en todo momento, esto se traduce en una alta precisión, pero escaso valor empresarial. Para obtener información acerca del objetivo F1, consulte [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) en la *Referencia de la API de Amazon SageMaker AI*.

Luego, CREATE MODEL sigue las sugerencias sobre los aspectos especificados, como el objetivo. Al mismo tiempo, CREATE MODEL descubre de forma automática los mejores procesadores previos y los mejores hiperparámetros. 

### CREATE MODEL con sintaxis de guía para el usuario
<a name="r_user_guidance-create-model-synposis"></a>

CREATE MODEL ofrece más flexibilidad en los aspectos que se pueden especificar y en los aspectos que Amazon Redshift descubre de forma automática.

```
CREATE MODEL model_name
FROM { table_name | ( select_statement ) }
TARGET column_name
FUNCTION function_name
IAM_ROLE { default }
[ MODEL_TYPE { XGBOOST | MLP | LINEAR_LEARNER} ]
[ PROBLEM_TYPE ( REGRESSION | BINARY_CLASSIFICATION | MULTICLASS_CLASSIFICATION ) ]
[ OBJECTIVE ( 'MSE' | 'Accuracy' | 'F1' | 'F1Macro' | 'AUC') ]
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', |
  S3_GARBAGE_COLLECT { ON | OFF }, |
  KMS_KEY_ID 'kms_key_id', |
  MAX_CELLS integer, |
  MAX_RUNTIME integer (, ...)
)
```

### CREATE MODEL con parámetros de guía para el usuario
<a name="r_user_guidance-create-model-parameters"></a>

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1*   
(Opcional) Especifica el tipo de modelo. Puede especificar si desea entrenar un modelo de un tipo específico, como XGBoost, perceptron multicapa (MLP) o Linear Learner, que son todos algoritmos compatibles con el Piloto automático de Amazon SageMaker AI. Si no se especifica el parámetro, se buscan todos los tipos de modelos admitidos durante la formación para encontrar el mejor modelo.

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(Opcional) Especifica el tipo de problema. Si conoce el tipo de problema, puede restringir a Amazon Redshift a que busque solo el mejor modelo de ese tipo específico. Si no se especifica este parámetro, se detecta un tipo de problema durante la formación, en función de sus datos.

OBJECTIVE ( 'MSE' \$1 'Accuracy' \$1 'F1' \$1 'F1Macro' \$1 'AUC')  
(Opcional) Especifica el nombre de la métrica de objetivo utilizada para medir la calidad predictiva de un sistema de machine learning. Esta métrica se optimiza durante la formación para proporcionar la mejor estimación para los valores del parámetro del modelo a partir de los datos. Si no se especifica una métrica de forma explícita, el comportamiento predeterminado es utilizar automáticamente MSE para regresión, F1 para clasificación binaria y Accuracy para clasificación multiclase. Para obtener más información acerca de los objetivos, consulte [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) en la *Referencia de la API de Amazon SageMaker AI*.

Número entero para MAX\$1CELLS   
(Opcional) Especifica el número de celdas de los datos de formación. Este valor se obtiene de multiplicar el número de registros (en la tabla o en la consulta de formación) por el número de columnas. El valor predeterminado es 1 000 000.

Número entero para MAX\$1RUNTIME   
(Opcional) Especifica la cantidad máxima de tiempo que dura la formación. Los trabajos de formación suelen completarse antes en función del tamaño del conjunto de datos. Especifica la cantidad máxima de tiempo que debería tomar la formación. El valor predeterminado es 5400 (90 minutos).

S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1  
(Opcional) Especifica si Amazon Redshift realiza la recolección de basura en los conjuntos de datos resultantes utilizados para formar modelos, además de los propios modelos. Si se establece en OFF, los conjuntos de datos resultantes utilizados para formar modelos y los modelos permanecen en Amazon S3 y se pueden utilizar para otros fines. Si se establece en ON, Amazon Redshift elimina los artefactos en Amazon S3 una vez que se completa la formación. El valor predeterminado es ON.

KMS\$1KEY\$1ID 'kms\$1key\$1id'  
(Opcional) Especifica si Amazon Redshift utiliza el cifrado del lado del servidor con una clave de AWS KMS para proteger los datos en reposo. Los datos en tránsito están protegidos con la capa de conexión segura (SSL). 

 *PREPROCESSORS "string' *   
(Opcional) Especifica ciertas combinaciones de procesadores previos para determinados conjuntos de columnas. El formato es una lista de columnSets y las transformaciones adecuadas que se aplicarán a cada conjunto de columnas. Amazon Redshift aplica todos los transformadores de una lista de transformadores específica a todas las columnas del ColumnSet correspondiente. Por ejemplo, para aplicar OneHotEncoder con Imputer a las columnas t1 y t2, utilice el comando de muestra que aparece a continuación.  

```
CREATE MODEL customer_churn
FROM customer_data
TARGET 'Churn'
FUNCTION predict_churn
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
PROBLEM_TYPE BINARY_CLASSIFICATION
OBJECTIVE 'F1'
PREPROCESSORS '[
...
{"ColumnSet": [
    "t1",
    "t2"
  ],
  "Transformers": [
    "OneHotEncoder",
    "Imputer"
  ]
},
{"ColumnSet": [
    "t3"
  ],
  "Transformers": [
    "OneHotEncoder"
  ]
},
{"ColumnSet": [
    "temp"
  ],
  "Transformers": [
    "Imputer",
    "NumericPassthrough"
  ]
}
]'
SETTINGS (
S3_BUCKET 'amzn-s3-demo-bucket'
)
```

Amazon Redshift es compatible con los siguientes transformadores:
+ OneHotEncoder: generalmente se utiliza para codificar un valor discreto en un vector binario con un valor distinto de cero. Este transformador es adecuado para muchos modelos de machine learning. 
+ OrdinalEncoder: codifica valores discretos en un solo valor entero. Este transformador es adecuado para determinados modelos de machine learning, como MLP y Linear Learner. 
+ NumericPassthrough: transmite la entrada como está al modelo.
+ Imputer: completa los valores que faltan y los valores que no son un número (Not a Number, NaN).
+ ImputerWithIndicator: completa los valores que faltan y los valores NaN. Este transformador también crea un indicador que señala si existen valores que faltaban o que se completaron.
+ Normalizer: normaliza los valores, lo que puede mejorar el rendimiento de muchos algoritmos de machine learning.
+ DateTimeVectorizer: crea una integración de vectores, que representa una columna de tipo de datos de fecha y hora que se puede utilizar en modelos de machine learning.
+ PCA: proyecta los datos en un espacio de dimensiones más pequeñas para reducir el número de características y, al mismo tiempo, conservar la mayor cantidad de información posible.
+ StandardScaler: estandariza las características mediante la eliminación de la media y el escalado a la varianza unitaria. 
+ MinMax: transforma las características mediante el escalado de cada característica a un rango determinado.

Amazon Redshift ML almacena los transformadores formados y los aplica de forma automática como parte de la consulta de predicción. No es necesario especificarlos cuando se generan predicciones a partir del modelo. 

## CREATE para modelos XGBoost con AUTO OFF
<a name="r_auto_off_create_model"></a>

El comando AUTO OFF CREATE MODEL tiene objetivos generalmente diferentes a los del comando CREATE MODEL predeterminado.

Como usuario avanzado que ya conoce el tipo de modelo que desea y los hiperparámetros que se utilizan para formar estos modelos, puede utilizar CREATE MODEL con AUTO OFF para desactivar la detección automática de CREATE MODEL de procesadores previos e hiperparámetros. Para ello, especifica de forma explícita el tipo de modelo. Actualmente, XGBoost es el único tipo de modelo compatible cuando AUTO está configurado como OFF. Puede especificar hiperparámetros. Amazon Redshift utiliza valores predeterminados para cualquier hiperparámetro que especifique. 

### CREATE para modelos XGBoost con sintaxis AUTO OFF
<a name="r_auto_off-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | (select_statement ) }
TARGET column_name
FUNCTION function_name
IAM_ROLE { default }
AUTO OFF
MODEL_TYPE XGBOOST
OBJECTIVE { 'reg:squarederror' | 'reg:squaredlogerror' | 'reg:logistic' |
            'reg:pseudohubererror' | 'reg:tweedie' | 'binary:logistic' | 'binary:hinge' |
            'multi:softmax' | 'rank:pairwise' | 'rank:ndcg' }
HYPERPARAMETERS DEFAULT EXCEPT (
    NUM_ROUND '10',
    ETA '0.2',
    NUM_CLASS '10',
    (, ...)
)
PREPROCESSORS 'none'
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', |
  S3_GARBAGE_COLLECT { ON | OFF }, |
  KMS_KEY_ID 'kms_key_id', |
  MAX_CELLS integer, |
  MAX_RUNTIME integer (, ...)
)
```

### CREATE para modelos XGBoost con parámetros AUTO OFF
<a name="r_auto_off-create-model-parameters"></a>

 *AUTO OFF*   
Desactiva la detección automática de CREATE MODEL de procesadores previos, algoritmos e hiperparámetros.

MODEL\$1TYPE XGBOOST  
Especifica el uso de XGBOOST para formar el modelo. 

OBJECTIVE str  
Especifica un objetivo reconocido por el algoritmo. Amazon Redshift admite reg:squarederror, reg:squaredlogerror, reg:logistic, reg:pseudohubererror, reg:tweedie, binary:logistic, binary:hinge, multi:softmax. Para obtener más información acerca de estos objetivos, consulte [Learning task parameters](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters) en la documentación de XGBoost.

HYPERPARAMETERS \$1 DEFAULT \$1 DEFAULT EXCEPT ( key ‘value’ (,..) ) \$1  
Especifica si los parámetros de XGBoost predeterminados se utilizan o se sustituyen con valores especificados por el usuario. Los valores deben ir entre comillas simples. Los siguientes son ejemplos de parámetros para XGBoost y sus valores predeterminados.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_create_model_use_cases.html)

En el siguiente ejemplo, se preparan datos para XGBoost.

```
DROP TABLE IF EXISTS abalone_xgb;

CREATE TABLE abalone_xgb (
length_val float,
diameter float,
height float,
whole_weight float,
shucked_weight float,
viscera_weight float,
shell_weight float,
rings int,
record_number int);

COPY abalone_xgb
FROM 's3://redshift-downloads/redshift-ml/abalone_xg/'
REGION 'us-east-1'
IAM_ROLE default
IGNOREHEADER 1 CSV;
```

En el siguiente ejemplo, se crea un modelo XGBoost con las opciones avanzadas especificadas, como MODEL\$1TYPE, OBJECTIVE y PREPROCESSORS.

```
DROP MODEL abalone_xgboost_multi_predict_age;

CREATE MODEL abalone_xgboost_multi_predict_age
FROM ( SELECT length_val,
              diameter,
              height,
              whole_weight,
              shucked_weight,
              viscera_weight,
              shell_weight,
              rings
   FROM abalone_xgb WHERE record_number < 2500 )
TARGET rings FUNCTION ml_fn_abalone_xgboost_multi_predict_age
IAM_ROLE default
AUTO OFF
MODEL_TYPE XGBOOST
OBJECTIVE 'multi:softmax'
PREPROCESSORS 'none'
HYPERPARAMETERS DEFAULT EXCEPT (NUM_ROUND '100', NUM_CLASS '30')
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');
```

En el siguiente ejemplo, se utiliza una consulta de inferencia para predecir la edad del pez con un número de registro superior a 2500. Utiliza la función ml\$1fn\$1abalone\$1xgboost\$1multi\$1predict\$1age creada a partir del comando anterior. 

```
select ml_fn_abalone_xgboost_multi_predict_age(length_val,
                                                   diameter,
                                                   height,
                                                   whole_weight,
                                                   shucked_weight,
                                                   viscera_weight,
                                                   shell_weight)+1.5 as age
from abalone_xgb where record_number > 2500;
```

## Bring your own model (BYOM): inferencia local
<a name="r_byom_create_model"></a>

Amazon Redshift ML admite el uso de Bring your own model (BYOM) para inferencias locales.

A continuación, se resumen las opciones para la sintaxis de CREATE MODEL para BYOM. Puede utilizar un modelo entrenado fuera de Amazon Redshift con Amazon SageMaker AI para la inferencia local en la base de datos de Amazon Redshift.

### Sintaxis de CREATE MODEL para inferencias locales
<a name="r_local-create-model"></a>

A continuación, se describe la sintaxis de CREATE MODEL para inferencias locales.

```
CREATE MODEL model_name
FROM ('job_name' | 's3_path' )
FUNCTION function_name ( data_type [, ...] )
RETURNS data_type
IAM_ROLE { default }
[ SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', | --required
  KMS_KEY_ID 'kms_string') --optional
];
```

‎Actualmente, Amazon Redshift solo admite modelos XGBoost, MLP y Linear Learner con formación previa para BYOM. Puede importar el Piloto automático de SageMaker AI y modelos entrenados directamente en Amazon SageMaker AI para inferencias locales con esta ruta. 

#### Parámetros de CREATE MODEL para inferencias locales
<a name="r_local-create-model-parameters"></a>

 *model\$1name*   
El nombre del modelo. El nombre del modelo en un esquema debe ser único.

FROM (*'job\$1name'* \$1 *'s3\$1path'* )  
El parámetro *job\$1name* utiliza un nombre de trabajo de Amazon SageMaker AI como entrada. El nombre del trabajo puede ser el nombre de un trabajo de entrenamiento de Amazon SageMaker AI o el nombre de un trabajo de Piloto automático de Amazon SageMaker AI. El trabajo debe crearse en la misma cuenta de AWS propietaria del clúster de Amazon Redshift. Para encontrar el nombre del trabajo, inicialice Amazon SageMaker AI. En el menú desplegable de **Training** (Formación), elija **Training jobs** (Trabajos de formación).  
El parámetro *'s3\$1path'* especifica la ubicación de S3 del archivo de artefactos del modelo .tar.gz que se utilizará cuando se cree el modelo.

FUNCTION *function\$1name* ( *data\$1type* [, ...] )  
Se trata del nombre de la función que se creará y los tipos de datos de los argumentos de entrada. Puede proporcionar un nombre de esquema.

RETURNS *data\$1type*  
El tipo de datos del valor que la función devuelve.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando CREATE MODEL.  
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. 

SETTINGS ( S3\$1BUCKET *'amzn-s3-demo-bucket'*, \$1 KMS\$1KEY\$1ID *'kms\$1string'*)  
La cláusula S3\$1BUCKET especifica la ubicación de Amazon S3 que se utiliza para almacenar resultados intermedios.  
(Opcional) La cláusula KMS\$1KEY\$1ID especifica si Amazon Redshift utiliza cifrado del lado del servidor con una clave de AWS KMS para proteger los datos en reposo. Los datos en tránsito están protegidos con la capa de conexión segura (SSL).  
Para obtener más información, consulte [CREATE MODEL con guía para el usuario](#r_user_guidance_create_model).

#### Ejemplo de CREATE MODEL para inferencias locales
<a name="r_local-create-model-example"></a>

En el siguiente ejemplo, se crea un modelo que se entrenó previamente en Amazon SageMaker, AI fuera de Amazon Redshift. Dado que Amazon Redshift ML admite el tipo de modelo para la inferencia local, el siguiente comando CREATE MODEL crea una función que se puede utilizar localmente en Amazon Redshift. Puede proporcionar el nombre de un trabajo de entrenamiento de SageMaker AI.

```
CREATE MODEL customer_churn
FROM 'training-job-customer-churn-v4'
FUNCTION customer_churn_predict (varchar, int, float, float)
RETURNS int
IAM_ROLE default
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');
```

Una vez que se creó el modelo, puede utilizar la función *customer\$1churn\$1predict* con los tipos de argumentos especificados para generar predicciones.

## Bring your own model (BYOM): inferencia remota
<a name="r_byom_create_model_remote"></a>

Amazon Redshift ML también admite el uso de Bring your own model (BYOM) para inferencias remotas.

A continuación, se resumen las opciones para la sintaxis de CREATE MODEL para BYOM.

### Sintaxis de CREATE MODEL para inferencias remotas
<a name="r_remote-create-model"></a>

A continuación, se describe la sintaxis de CREATE MODEL para inferencias remotas.

```
CREATE MODEL model_name 
FUNCTION function_name ( data_type [, ...] )
RETURNS data_type
SAGEMAKER 'endpoint_name'[:'model_name']
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
[SETTINGS (MAX_BATCH_ROWS integer)];
```

#### Parámetros de CREATE MODEL para inferencias remotas
<a name="r_remote-create-model-parameters"></a>

 *model\$1name*   
El nombre del modelo. El nombre del modelo en un esquema debe ser único.

FUNCTION *fn\$1name* ( [*data\$1type*] [, ...] )  
Se trata del nombre de la función y los tipos de datos de los argumentos de entrada. Consulte [Tipos de datos](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html) para ver todos los tipos de datos compatibles. `Geography`, `geometry` y `hllsketch` no son compatibles.   
También puede proporcionar un nombre de función en un esquema mediante una notación de dos partes, como `myschema.myfunction`.

RETURNS *data\$1type*  
El tipo de datos del valor que la función devuelve. Consulte [Tipos de datos](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html) para ver todos los tipos de datos compatibles. `Geography`, `geometry` y `hllsketch` no son compatibles. 

SAGEMAKER *'endpoint\$1name'*[:*'model\$1name'*]   
El nombre del punto de conexión de Amazon SageMaker AI. Si el nombre del punto de conexión apunta a un punto de conexión de múltiples modelos, agregue el nombre del modelo que se utilizará. El punto de conexión debe estar alojado en la misma región de AWS y Cuenta de AWS que el clúster de Amazon Redshift. Para buscar el punto de conexión, inicialice Amazon SageMaker AI. En el menú desplegable de **Inference** (Inferencia), elija **Endpoints** (Puntos de conexión).

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando CREATE MODEL. También puede especificar el ARN de un rol de IAM para usar ese rol.

MAX\$1BATCH\$1ROWS *integer*  
El número máximo de filas que Amazon Redshift envía en una sola solicitud por lotes para una única invocación de SageMaker AI. Solo se admite para BYOM con inferencia remota. El número real de filas de un lote también depende del tamaño de la entrada, pero es inferior o igual a este valor. El valor mínimo de este parámetro es 1. El valor máximo es `INT_MAX` o 2 147 483 647. Este parámetro solo es necesario cuando el tipo de datos de entrada y de devolución son `SUPER`. El valor predeterminado es `INT_MAX` o 2 147 483 647. 

Cuando el modelo se implementa en un punto de conexión de SageMaker AI, este servicio crea la información del modelo en Amazon Redshift. Luego, realiza la inferencia a través de la función externa. Puede utilizar el comando SHOW MODEL para ver la información del modelo en el clúster de Amazon Redshift.

#### Notas de uso de CREATE MODEL para inferencias remotas
<a name="r_remote-create-model-usage-notes"></a>

Antes de utilizar CREATE MODEL para inferencias remotas, tenga en cuenta lo siguiente:
+ El punto de conexión debe estar alojado en la misma cuenta de AWS propietaria del clúster de Amazon Redshift.
+ Asegúrese de que el punto de conexión de Amazon SageMaker AI tenga suficientes recursos para admitir las llamadas de inferencia de Amazon Redshift o de que el punto de conexión de Amazon SageMaker AI se pueda escalar de forma automática.
+ Si no utiliza el tipo de datos `SUPER` como entrada, el modelo solo acepta entradas en formato de valores separados por comas (CSV), que corresponde a un tipo de contenido de `text/CSV` en SageMaker AI.
+ Si no utiliza el tipo de datos `SUPER` como entrada, la salida de los modelos es un único valor del tipo especificado al crear la función. La salida está en el formato de valores separados por comas (CSV) en un tipo de contenido de `text/CSV` en SageMaker AI. Los tipos de datos `VARCHAR` no pueden estar entre comillas y no pueden contener saltos de línea. Además, cada salida debe estar en una nueva línea.
+ Los modelos aceptan valores nulos como cadenas vacías.
+ Si el tipo de datos de entrada es `SUPER`, solo se admite un argumento de entrada. 
+ Si el tipo de datos de entrada es `SUPER`, el tipo de datos de devolución también debe ser `SUPER`. 
+ MAX\$1BATCH\$1ROWS es necesario cuando los tipos de datos de entrada y de devolución son SUPER. 
+ Cuando el tipo de datos de entrada es `SUPER`, el tipo de contenido de la invocación del punto de conexión es `application/json` cuando MAX\$1BATCH\$1ROWS es `1` o `application/jsonlines` en todos los demás casos. 
+ Cuando el tipo de datos de devolución es `SUPER`, el tipo de aceptación de la invocación del punto de conexión es `application/json` cuando MAX\$1BATCH\$1ROWS es `1` o `application/jsonlines` en todos los demás casos. 

##### Ejemplo de CREATE MODEL para inferencias remotas
<a name="r_remote-create-model-example"></a>

En el siguiente ejemplo, se crea un modelo que utiliza un punto de conexión de SageMaker AI para generar predicciones. Asegúrese de que el punto de conexión se esté ejecutando para generar predicciones y especifique su nombre en el comando CREATE MODEL.

```
CREATE MODEL remote_customer_churn
FUNCTION remote_fn_customer_churn_predict (varchar, int, float, float)
RETURNS int
SAGEMAKER 'customer-churn-endpoint'
IAM_ROLE default;
```

 El siguiente ejemplo crea un BYOM con inferencia remota con un modelo de lenguaje grande (LLM). Los LLM alojados en Amazon Sagemaker AI Jumpstart aceptan y devuelven el tipo de contenido `application/json` y admiten un único JSON por invocación. Los tipos de datos de entrada y de devolución deben ser `SUPER` y MAX\$1BATCH\$1ROWS debe establecerse a 1. 

```
CREATE MODEL sample_super_data_model
FUNCTION sample_super_data_model_predict(super)
RETURNS super
SAGEMAKER 'sample_super_data_model_endpoint'
IAM_ROLE default
SETTINGS (MAX_BATCH_ROWS 1);
```

## CREATE MODEL con K-MEANS
<a name="r_k-means_create_model"></a>

Amazon Redshift admite el algoritmo K-Means que agrupa datos que no están etiquetados. Este algoritmo resuelve problemas en clústeres en los que desea descubrir agrupaciones en los datos. Los datos sin clasificar se agrupan y dividen en función de sus similitudes y diferencias. 

### CREATE MODEL con sintaxis K-MEANS
<a name="r_k-means-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | ( select_statement ) }
FUNCTION function_name
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
AUTO OFF
MODEL_TYPE KMEANS
PREPROCESSORS 'string'
HYPERPARAMETERS DEFAULT EXCEPT ( K 'val' [, ...] )
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  KMS_KEY_ID 'kms_string', |
    -- optional
  S3_GARBAGE_COLLECT on / off, |
    -- optional
  MAX_CELLS integer, |
    -- optional
  MAX_RUNTIME integer
    -- optional);
```

### CREATE MODEL con parámetros K-MEANS
<a name="r_k-means-create-model-parameters"></a>

 *AUTO OFF*   
Desactiva la detección automática de CREATE MODEL de procesadores previos, algoritmos e hiperparámetros.

MODEL\$1TYPE KMEANS  
Especifica el uso de KMEANS para formar el modelo. 

PREPROCESSORS 'string'  
Especifica ciertas combinaciones de procesadores previos para determinados conjuntos de columnas. El formato es una lista de columnSets y las transformaciones adecuadas que se aplicarán a cada conjunto de columnas. Amazon Redshift admite 3 procesadores previos de K-Means, a saber, StandardScaler, MinMax y NumericPassthrough. Si no desea aplicar ningún procesamiento previo para K-Means, elija NumericPassthrough explícitamente como transformador. Para obtener más información sobre cómo usar los transformadores admitidos, consulte [CREATE MODEL con parámetros de guía para el usuario](#r_user_guidance-create-model-parameters).  
El algoritmo K-Means utiliza la distancia euclidiana para calcular la similitud. El procesamiento previo de los datos garantiza que las características del modelo se mantengan a la misma escala y produzcan resultados confiables.

HYPERPARAMETERS DEFAULT EXCEPT ( K 'val' [, ...] )  
Especifica si se utilizan los parámetros K-Means. Cuando se utiliza el algoritmo K-Means debe especificar el parámetro `K`. Para obtener más información, consulte [Hiperparámetros de k-means](https://docs.aws.amazon.com/sagemaker/latest/dg/k-means-api-config.html) en la *Guía para el desarrollador de Amazon SageMaker AI*

En el siguiente ejemplo, se preparan datos para K-Means.

```
CREATE MODEL customers_clusters
FROM customers
FUNCTION customers_cluster
IAM_ROLE default
AUTO OFF
MODEL_TYPE KMEANS
PREPROCESSORS '[
{
  "ColumnSet": [ "*" ],
  "Transformers": [ "NumericPassthrough" ]
}
]'
HYPERPARAMETERS DEFAULT EXCEPT ( K '5' )
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');

select customer_id, customers_cluster(...) from customers;
customer_id | customers_cluster
--------------------
12345            1
12346            2
12347            4
12348
```

## CREATE MODEL con Forecast
<a name="r_forecast_model"></a>

Los modelos de previsión de Redshift ML utilizan Amazon Forecast para crear previsiones de series temporales precisas. Esto le permite utilizar datos históricos de un periodo de tiempo para hacer predicciones sobre eventos futuros. Los casos de uso comunes de Amazon Forecast incluyen el uso de datos de productos minoristas para decidir el precio del inventario, los datos de cantidades de fabricación para predecir la cantidad de un artículo que se debe pedir y los datos de tráfico web para la previsión de la cantidad de tráfico que es posible que reciba un servidor web. 

 [Los límites de cuota de Amazon Forecast](https://docs.aws.amazon.com/forecast/latest/dg/limits.html) se aplican a los modelos de previsión de Amazon Redshift. Por ejemplo, el número máximo de previsiones es 100, pero es ajustable. Al eliminar un modelo de previsión, no se eliminan automáticamente los recursos asociados en Amazon Forecast. Si elimina un clúster de Redshift, también se eliminarán todos los modelos asociados. 

Tenga en cuenta que los modelos de previsión actualmente solo están disponibles en las siguientes regiones:
+ Este de EE. UU. (Ohio) (us-east-2)
+ Este de EE. UU. (Norte de Virginia) (us-east-1)
+ Oeste de EE. UU. (Oregón) (us-west-2)
+ Asia-Pacífico (Mumbai) (ap-south-1)
+ Asia-Pacífico (Seúl) (ap-northeast-2)
+ Asia-Pacífico (Singapur) (ap-southeast-1)
+ Asia-Pacífico (Sídney) (ap-southeast-2)
+ Asia-Pacífico (Tokio) (ap-northeast-1)
+ Europa (Fráncfort) (eu-central-1)
+ Europa (Irlanda) (eu-west-1)

### CREATE MODEL con sintaxis de Forecast
<a name="r_forecast_model-synopsis"></a>

```
CREATE [ OR REPLACE ] MODEL forecast_model_name 
FROM { table_name | ( select_query ) } 
TARGET column_name
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>'} 
AUTO ON
MODEL_TYPE FORECAST
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  HORIZON integer,
  FREQUENCY forecast_frequency
  [PERCENTILES '0.1', '0.5', '0.9']
  )
```

### CREATE MODEL con parámetros de Forecast
<a name="r_forecast_model-parameters"></a>

 *forecast\$1model\$1name*   
El nombre del modelo. El nombre del modelo debe ser único.

FROM \$1 table\$1name \$1 ( select\$1query ) \$1  
Se trata del nombre de la tabla o la consulta que especifica los datos de formación. Esto puede ser una tabla existente en el sistema o una consulta SELECT compatible con Amazon Redshift entre paréntesis. El resultado de la tabla o consulta debe tener al menos tres columnas: (1) una columna varchar que especifique el nombre de la serie temporal. Cada conjunto de datos puede tener varias series temporales; (2) una columna de fecha y hora; y (3) la columna de destino para predecir. Esta columna de destino debe ser int o flotante. Si proporciona un conjunto de datos que tiene más de tres columnas, Amazon Redshift asume que todas las columnas adicionales forman parte de una serie temporal relacionada. Tenga en cuenta que las series temporales relacionadas deben ser de tipo int o flotante. Para obtener más información sobre series temporales relacionadas, consulte [Uso de conjuntos de datos de series temporales relacionadas](https://docs.aws.amazon.com/forecast/latest/dg/related-time-series-datasets.html).

TARGET column\$1name  
Se trata del nombre de la columna que se convierte en el objetivo de predicción. La columna debe existir en la cláusula FROM.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1  
Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando CREAT MODEL. También puede especificar un ARN de un rol de IAM para usar ese rol. 

AUTO ON  
Activa la detección automática de CREATE MODEL del algoritmo y de la selección de hiperparámetros. Si especifica esta opción al crear un modelo de previsión, se debe utilizar un AutoPredictor de previsión, en el que Amazon Forecast aplica las combinaciones óptimas de algoritmos a cada serie temporal del conjunto de datos.

MODEL\$1TYPE FORECAST  
Especifica el uso de FORECAST para formar el modelo.

S3\$1BUCKET 'amzn-s3-demo-bucket'  
Se trata del nombre del bucket de Amazon Simple Storage Service que creó anteriormente y que se utiliza para compartir datos de formación y artefactos entre Amazon Redshift y Amazon Forecast. Amazon Redshift crea una subcarpeta en este bucket antes de descargar los datos de formación. Una vez que se completa la formación, Amazon Redshift elimina la subcarpeta creada y su contenido.

HORIZON integer  
El número máximo de predicciones que puede devolver el modelo de previsión. Una vez que el modelo esté formado, no podrá cambiar este entero.

FREQUENCY forecast\$1frequency  
Especifica el nivel de detalle que desea que tengan las previsiones. Las opciones disponibles son `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`. Obligatorio si se entrena un modelo de previsión.

Cadena de PERCENTILES  
Es una cadena delimitada por comas que especifica los tipos de previsión que se utilizan para entrenar un predictor. Los tipos de previsión pueden ser cuantiles de 0,01 a 0,99, por incrementos de 0,01 o más. También puede especificar la previsión media con la media. Puede especificar un máximo de cinco tipos de previsión.

En el siguiente ejemplo se muestra cómo crear un modelo de previsión sencillo.

```
CREATE MODEL forecast_example
FROM forecast_electricity_
TARGET target 
IAM_ROLE 'arn:aws:iam::<account-id>:role/<role-name>'
AUTO ON 
MODEL_TYPE FORECAST
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket',
          HORIZON 24,
          FREQUENCY 'H',
          PERCENTILES '0.25,0.50,0.75,mean',
          S3_GARBAGE_COLLECT OFF);
```

Tras crear el modelo de previsión, puede crear una tabla nueva con los datos de predicción.

```
CREATE TABLE forecast_model_results as SELECT Forecast(forecast_example)
```

A continuación, puede consultar la nueva tabla para obtener predicciones.

```
SELECT * FROM forecast_model_results
```

# CREATE PROCEDURE
<a name="r_CREATE_PROCEDURE"></a>

Crea un procedimiento almacenado nuevo o sustituye un procedimiento existente para la actual base de datos.

Para obtener más información y ejemplos, consulte [Creación de procedimientos almacenados en Amazon Redshift](stored-procedure-overview.md).

## Privilegios necesarios
<a name="r_CREATE_PROCEDURE-privileges"></a>

Debe haber obtenido permiso de una de las siguientes maneras para ejecutar CREATE OR REPLACE PROCEDURE:
+ Para CREATE PROCEDURE:
  + Superusuario
  + Usuarios con privilegios CREATE y USAGE en el esquema donde se crea el procedimiento almacenado
+ Para REPLACE PROCEDURE:
  + Superusuario
  + Propietario del procedimiento

## Sintaxis
<a name="r_CREATE_PROCEDURE-synopsis"></a>

```
CREATE [ OR REPLACE ] PROCEDURE sp_procedure_name  
  ( [ [ argname ] [ argmode ] argtype [, ...] ] )
[ NONATOMIC ]
AS $$
  procedure_body
$$ LANGUAGE plpgsql
[ { SECURITY INVOKER | SECURITY DEFINER } ]
[ SET configuration_parameter { TO value | = value } ]
```

## Parameters
<a name="r_CREATE_PROCEDURE-parameters"></a>

 OR REPLACE   
Una cláusula que especifica que si ya existe un procedimiento con el mismo nombre y los mismos tipos de datos de argumento de entrada o firma que este, debe reemplazarse el procedimiento existente. Solo puede reemplazar un procedimiento por un nuevo procedimiento que defina un conjunto idéntico de tipos de datos.   
Si define un procedimiento con el mismo nombre que un procedimiento existente, pero con una firma diferente, creará un nuevo procedimiento. En otras palabras, se sobrecarga el nombre del procedimiento. Para obtener más información, consulte [Sobrecarga de nombres de procedimientos](stored-procedure-naming.md#stored-procedure-overloading-name). 

 *sp\$1procedure\$1name*   
El nombre del procedimiento. Si especifica un nombre de esquema (como **myschema.myprocedure**), se crea el procedimiento en el esquema especificado. De lo contrario, el procedimiento se crea en el esquema actual. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).   
Se recomienda que agregue el prefijo a todos los nombres de procedimientos almacenados `sp_`. Amazon Redshift reserva el prefijo `sp_` para los nombres de procedimientos almacenados. Con el uso del prefijo `sp_`, se asegura de que el nombre del procedimiento almacenado no entre en conflicto con el nombre de una función o un procedimiento almacenado integrado de Amazon Redshift existente o futuro. Para obtener más información, consulte [Nomenclatura de los procedimientos almacenados](stored-procedure-naming.md).  
Puede definir más de un procedimiento con el mismo nombre si los tipos de datos para los argumentos de entrada, o firmas, son diferentes. En otras palabras, en este caso se sobrecarga el nombre del procedimiento. Para obtener más información, consulte [Sobrecarga de nombres de procedimientos](stored-procedure-naming.md#stored-procedure-overloading-name)

*[argname] [ argmode] argtype*   
Una lista de nombres de argumento, modos de argumento y tipos de datos. Solo se necesita el tipo de datos. El nombre y el modo son opcionales y es posible cambiar su posición.  
El modo del argumento puede ser IN, OUT O INOUT. El valor predeterminado es IN.  
Puede utilizar argumentos OU e INOUT para devolver uno o más valores de una llamada de procedimientos. Cuando hay argumentos o INOUT, la llamada de procedimientos devuelve una fila de resultados que contiene *n* columnas, done *n* es el número total de argumentos OUT o INOUT.  
Los argumentos INOUT son argumentos de entrada y salida al mismo tiempo. Los *argumentos de entrada* incluyen argumentos IN e INOUT, y los *argumentos de salida * incluyen argumentos OUT e INOUT.  
Los argumentos OUT no se especifican como parte de la instrucción CALL. Especifique argumentos INOUT en la declaración CALL de procedimientos almacenada. Los argumentos INOUT pueden ser útiles al pasar y devolver valores de una llamada anidada y también al devolver un `refcursor`. Para obtener más información sobre los tipos `refcursor`, consulte [Cursores](c_PLpgSQL-statements.md#r_PLpgSQL-cursors).  
Los tipos de datos de argumentos pueden ser cualquier tipo de datos estándar de Amazon Redshift. Además, un tipo de datos de argumentos puede ser `refcursor`.  
Puede especificar un máximo de 32 argumentos de entrada y 32 argumentos de salida. 

AS \$1\$1 *procedure\$1body* \$1\$1   
Se trata de una construcción que contiene el procedimiento que se ejecutará. Las palabras claves literales \$1\$1 y \$1\$1 son obligatorias.  
Amazon Redshift exige que se incluya la instrucción en el procedimiento mediante un formato llamado entrecomillado con símbolo de dólar. Cualquier elemento que se encuentre dentro de los signos se transmite exactamente como es. No necesita incluir en una secuencia de escape los caracteres especiales porque el contenido de la cadena se escribe literalmente.  
Con el *entrecomillado de dólar, *se utilizan un par de signos de dólar (\$1\$1) para representar el inicio y el final de la instrucción que se va a ejecutar, tal y como se muestra en el siguiente ejemplo.  

```
$$ my statement $$
```
De manera opcional, entre los signos de dólar de cada par, puede especificar una cadena para ayudar a identificar la instrucción. La cadena que usa debe ser la misma en el inicio y en el final de los pares de signos. La cadena distingue entre mayúsculas y minúsculas, y sigue las mismas restricciones que un identificador sin comillas, excepto que no puede contener signos de dólar. En el siguiente ejemplo, se usa la prueba de cadena.  

```
$test$ my statement $test$
```
Esta sintaxis también es útil para el entrecomillado de dólar anidado. Para obtener más información acerca de los signos de dólar, consulte"Dollar-quoted String Constants" bajo [Lexical Structure](https://www.postgresql.org/docs/9.0/sql-syntax-lexical.html) en la documentación de PostgreSQL.

 *procedure\$1body*   
Un conjunto de instrucciones PL/pgSQL válidas. Las instrucciones PL/pgSQL aumentan los comandos SQL con construcciones de procedimiento, entre las que se incluyen expresiones condicionales y bucles, para controlar el flujo lógico. Se pueden usar la mayoría de los comandos SQL en el cuerpo del procedimiento, incluidos lenguajes de modificación de datos (DML) como COPY, UNLOAD e INSERT y lenguajes de definición de datos (DDL) como CREATE TABLE. Para obtener más información, consulte [Referencia del lenguaje PL/pgSQL](c_pl_pgSQL_reference.md). 

LANGUAGE *plpgsql*  
Un valor del lenguaje. Especifique: . `plpgsql`. Debe tener permiso para usar el lenguaje para utilizar `plpgsql`. Para obtener más información, consulte [GRANT](r_GRANT.md). 

NONATOMIC  
Crea el procedimiento almacenado en un modo de transacción no atómico. El modo NONATOMIC confirma automáticamente las instrucciones que incluye el procedimiento. Además, cuando se produce un error en el procedimiento NONATOMIC, el error no se vuelve a generar si se gestiona mediante un bloque de excepciones. Para obtener más información, consulte [Administración de transacciones](stored-procedure-transaction-management.md) y [RAISE](c_PLpgSQL-statements.md#r_PLpgSQL-messages-errors).  
Cuando defina un procedimiento almacenado como `NONATOMIC`, tenga en cuenta lo siguiente:  
+ Cuando anide llamadas a procedimientos almacenados, todos deben crearse en el mismo modo de transacción.
+ Las opciones `SECURITY DEFINER` y `SET configuration_parameter` no se admiten cuando se crea un procedimiento en modo NONATOMIC.
+ Cualquier cursor que esté abierto (explícita o implícitamente) se cierra automáticamente cuando se procesa una confirmación implícita. Por lo tanto, debe abrir una transacción explícita antes de iniciar un bucle de cursor para asegurarse de que ninguna instrucción SQL en la iteración del bucle se confirme de forma implícita.

SECURITY INVOKER \$1 SECURITY DEFINER  
La opción `SECURITY DEFINER` no se admite cuando se especifica `NONATOMIC`.  
El modo de seguridad para el procedimiento determina los privilegios de acceso del procedimiento en el tiempo de ejecución. El procedimiento tiene que tener permiso para acceder a los objetos subyacentes de la base de datos.   
Para el modo SECURITY INVOKER, el procedimiento usa los privilegios del usuario que llama al procedimiento. El usuario tiene que tener permisos explícitos sobre los objetos subyacentes de la base de datos. El valor predeterminado es SECURITY INVOKER.  
Para el modo SECURITY DEFINER, el procedimiento usa los privilegios del propietario del procedimiento. El propietario del procedimiento se define como el usuario propietario del procedimiento en tiempo de ejecución, no necesariamente el usuario que definió inicialmente el procedimiento. El usuario que llama al procedimiento necesita privilegio de ejecución en el procedimiento pero no necesita ningún privilegio en los objetos subyacentes. 

SET configuration\$1parameter \$1 TO value \$1 = value \$1  
Estas opciones no se admiten cuando se especifica `NONATOMIC`.  
La cláusula SET causa que el parámetro `configuration_parameter` especificado se establezca en el valor especificado cuando se especifica el procedimiento. Esta cláusula restaura a continuación `configuration_parameter` a su valor anterior cuando el procedimiento existe. 

## Notas de uso
<a name="r_CREATE_PROCEDURE-usage"></a>

Si se creó un procedimiento almacenado mediante la opción SECURITY DEFINER, al invocar la función CURRENT\$1USER desde el procedimiento almacenado, Amazon Redshift devuelve el nombre de usuario del propietario del procedimiento almacenado.

## Ejemplos
<a name="r_CREATE_PROCEDURE-examples"></a>

**nota**  
Si al ejecutar estos ejemplos se produce un error similar a:  

```
ERROR: 42601: [Amazon](500310) unterminated dollar-quoted string at or near "$$
```
Consulte [Información general de procedimientos almacenados en Amazon Redshift](stored-procedure-create.md). 

El siguiente ejemplo crea un procedimiento con dos parámetros de entrada.

```
CREATE OR REPLACE PROCEDURE test_sp1(f1 int, f2 varchar(20))
AS $$
DECLARE
  min_val int;
BEGIN
  DROP TABLE IF EXISTS tmp_tbl;
  CREATE TEMP TABLE tmp_tbl(id int);
  INSERT INTO tmp_tbl values (f1),(10001),(10002);
  SELECT min_val MIN(id) FROM tmp_tbl;
  RAISE INFO 'min_val = %, f2 = %', min_val, f2;
END;
$$ LANGUAGE plpgsql;
```

**nota**  
 Al escribir procedimientos almacenados, sugerimos una práctica recomendada para proteger los valores confidenciales:   
 No codifique ninguna información confidencial en la lógica de procedimientos almacenada. Por ejemplo, no asigne una contraseña de usuario en una instrucción CREATE USER del cuerpo de un procedimiento almacenado. Esto supone un riesgo de seguridad, porque los valores codificados de forma rígida se pueden registrar como metadatos de esquema en las tablas del catálogo. En cambio, pase valores confidenciales, como las contraseñas, como argumentos al procedimiento almacenado, mediante parámetros.   
Para obtener más información acerca de los procedimientos almacenados, consulte[PROCEDIMIENTO DE CREACIÓN](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_PROCEDURE.html)y[Creación de procedimientos almacenados en Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-overview.html). Para obtener más información acerca de las tablas de catálogos, consulte [Tablas de catálogos de sistema](https://docs.aws.amazon.com/redshift/latest/dg/c_intro_catalog_views.html).

El siguiente ejemplo crea un procedimiento con un parámetro IN, un parámetro OUT y un parámetro INOUT.

```
CREATE OR REPLACE PROCEDURE test_sp2(f1 IN int, f2 INOUT varchar(256), out_var OUT varchar(256))
AS $$
DECLARE
  loop_var int;
BEGIN
  IF f1 is null OR f2 is null THEN
    RAISE EXCEPTION 'input cannot be null';
  END IF;
  DROP TABLE if exists my_etl;
  CREATE TEMP TABLE my_etl(a int, b varchar);
    FOR loop_var IN 1..f1 LOOP
        insert into my_etl values (loop_var, f2);
        f2 := f2 || '+' || f2;
    END LOOP;
  SELECT INTO out_var count(*) from my_etl;
END;
$$ LANGUAGE plpgsql;
```

En el siguiente ejemplo se crea un procedimiento que usa el parámetro `SECURITY DEFINER`. Este procedimiento se ejecuta con los privilegios del usuario propietario del procedimiento.

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_definer()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER;
```

En el siguiente ejemplo se crea un procedimiento que usa el parámetro `SECURITY INVOKER`. Este procedimiento se ejecuta con los privilegios del usuario que ejecuta el procedimiento.

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_invoker()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY INVOKER;
```

# CREATE RLS POLICY
<a name="r_CREATE_RLS_POLICY"></a>

Crea una nueva política de seguridad de la fila para proporcionar acceso pormenorizado a los objetos de la base de datos.

Los superusuarios y los usuarios o roles que tienen el rol sys:secadmin pueden crear una política.

## Sintaxis
<a name="r_CREATE_RLS_POLICY-synopsis"></a>

```
CREATE RLS POLICY { policy_name | database_name.policy_name }
[ WITH (column_name data_type [, ...]) [ [AS] relation_alias ] ]
USING ( using_predicate_exp )
```

## Parameters
<a name="r_CREATE_RLS_POLICY-parameters"></a>

 *policy\$1name*   
El nombre de la política.

database\$1name  
El nombre de la base de datos donde se creará la política. La política se puede crear en la base de datos conectada o en una base de datos que admite permisos federados de Amazon Redshift.

WITH (*column\$1name data\$1type [, ...]*)   
Especifica *column\$1name* y *data\$1type* referenciados en las columnas de tablas a las que se adjunta la política.   
Puede omitir la cláusula WITH solo cuando la política de RLS no haga referencia a ninguna columna de la tabla a la que se adjunta la política.

AS *relation\$1alias*  
Especifica un alias opcional para la tabla a la que se adjuntará la política de RLS.

USING (* using\$1predicate\$1exp *)  
Especifica un filtro que se aplica a la cláusula WHERE de la consulta. Amazon Redshift aplica un predicado de política antes de los predicados de usuario de la consulta. Por ejemplo, **current\$1user = ‘joe’ and price > 10** limita a Joe a ver solo registros con un precio superior a 10 USD.

Para obtener información sobre el uso de CREATE RLS POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Notas de uso
<a name="r_CREATE_RLS_POLICY-usage"></a>

Al trabajar con la instrucción CREATE RLS POLICY, observe lo siguiente:
+ Amazon Redshift admite filtros que pueden formar parte de la cláusula WHERE de una consulta.
+ Todas las políticas que se adjuntan a una tabla deben haberse creado con el mismo alias de tabla.
+ Debe usar las instrucciones GRANT y REVOKE para conceder y revocar de manera explícita permisos SELECT a las políticas de RLS que hacen referencia a tablas de búsqueda. Una tabla de búsqueda es un objeto de tabla que se utiliza dentro de la definición de una política. Para obtener más información, consulte [GRANT](r_GRANT.md) y [REVOKE](r_REVOKE.md). 
+ La seguridad de la fila de Amazon Redshift no admite los siguientes tipos de objeto dentro de una definición de política: tablas de catálogo, relaciones entre bases de datos, tablas externas, vistas normales, vistas de enlace en tiempo de ejecución, tablas con políticas de RLS activadas y tablas temporales.

## Ejemplos
<a name="r_CREATE_RLS_POLICY-examples"></a>

En el siguiente ejemplo, se crea una política de RLS denominada policy\$1concerts. Esta política se aplica a una columna de VARCHAR(10) llamada catgroup y establece el filtro USING para que devuelva solo las filas donde esté el valor de catgroup `'Concerts'`.

```
CREATE RLS POLICY policy_concerts
WITH (catgroup VARCHAR(10))
USING (catgroup = 'Concerts');
```

Para obtener un ejemplo integral del uso de políticas de RLS, consulte [Ejemplo completo de seguridad en el nivel de fila](t_rls-example.md).

# CREATE ROLE
<a name="r_CREATE_ROLE"></a>

Crea un nuevo rol personalizado que es un conjunto de permisos. Para obtener una lista de roles definidos por el sistema de Amazon Redshift, consulte [Roles definidos por el sistema de Amazon Redshift](r_roles-default.md). Consulte [SVV\$1ROLES](r_SVV_ROLES.md) para ver los roles creados actualmente en su clúster o grupo de trabajo.

Hay una cuota del número de roles que se pueden crear. Para obtener más información, consulte [Cuotas y límites de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) en la *Guía de administración de Amazon Redshift*.

## Permisos necesarios
<a name="r_CREATE_ROLE-privileges"></a>

Los siguientes privilegios son necesarios para CREATE ROLE.
+ Superusuario
+ Usuarios con el privilegio CREATE ROLE

## Sintaxis
<a name="r_CREATE_ROLE-synopsis"></a>

```
CREATE ROLE role_name
[ EXTERNALID external_id ]
```

## Parameters
<a name="r_CREATE_ROLE-parameters"></a>

*role\$1name*  
Nombre del rol El nombre del rol debe ser único y no puede ser el mismo que ningún nombre de usuario. El nombre de un rol no puede ser una palabra reservada.  
Un superusuario o un usuario normal con el privilegio CREATE ROLE pueden crear roles. Un usuario que no sea superusuario pero al que se le haya concedido USAGE para el rol WITH GRANT OPTION y el privilegio ALTER puede conceder este rol a cualquiera.

EXTERNALID *external\$1id*  
El identificador del rol, que está asociado a un proveedor de identidades. Para obtener más información, consulte [Federación de proveedores de identidades (IdP) nativos para Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

## Ejemplos
<a name="r_CREATE_ROLE-examples"></a>

El siguiente ejemplo crea un rol `sample_role1`.

```
CREATE ROLE sample_role1;
```

En el ejemplo siguiente se crea un rol `sample_role1`, con un nuevo ID externo asociado a un proveedor de identidades.

```
CREATE ROLE sample_role1 EXTERNALID "ABC123";
```

# CREATE SCHEMA
<a name="r_CREATE_SCHEMA"></a>

Define un nuevo esquema para la base de datos actual.

## Privilegios necesarios
<a name="r_CREATE_SCHEMA-privileges"></a>

Los siguientes privilegios son necesarios para CREATE SCHEMA:
+ Superusuario
+ Usuarios con el privilegio CREATE SCHEMA

## Sintaxis
<a name="r_CREATE_SCHEMA-synopsis"></a>

```
CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION username ]
           [ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ]

CREATE SCHEMA AUTHORIZATION username[ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ] ]
```

## Parameters
<a name="r_CREATE_SCHEMA-parameters"></a>

 IF NOT EXISTS   
Cláusula que indica que si el esquema especificado ya existe, el comando no debe realizar cambios y debe devolver un mensaje en el que se indique que el esquema existe, en lugar de terminar con un error.  
Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si CREATE SCHEMA intenta crear un esquema que ya existe.

 *schema\$1name*   
Nombre del nuevo esquema. El nombre del esquema no puede ser `PUBLIC`. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).  
La lista de esquemas en el parámetro de configuración [search\$1path](r_search_path.md) determina la prioridad de objetos con nombres idénticos cuando se les hace referencia sin nombres de esquema.

AUTHORIZATION   
Cláusula que otorga propiedad a un usuario especificado.

 *username*   
Nombre del propietario del esquema.

 *schema\$1element*   
Definición de uno o más objetos que se crearán dentro del esquema.

QUOTA  
La cantidad máxima de espacio en disco que puede utilizar el esquema especificado. Este espacio es el uso colectivo del disco. Incluye todas las tablas permanentes, vistas materializadas bajo el esquema especificado y copias duplicadas de todas las tablas con distribución ALL en cada nodo de computación. La cuota de esquema no tiene en cuenta las tablas temporales creadas como parte de un espacio de nombres o un esquema temporales.   
Para ver las cuotas del esquema configuradas, consulte [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md).  
Para ver los registros en los que se superaron las cuotas del esquema, consulte [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md).  
Amazon Redshift convierte el valor seleccionado en megabytes. Gigabytes es la unidad de medida predeterminada cuando no se especifica un valor.  
Debe ser un superusuario de base de datos para establecer y cambiar una cuota de esquema. Un usuario que no sea superusuario pero que tenga permiso CREATE SCHEMA puede crear un esquema con una cuota definida. Cuando se crea un esquema sin definir una cuota, el esquema tiene una cuota ilimitada. Cuando se establece la cuota por debajo del valor actual utilizado por el esquema, Amazon Redshift no permite más ingesta hasta que se libere espacio en el disco. Una instrucción DELETE elimina datos de una tabla y el espacio en disco solo se libera cuando se ejecuta VACUUM.   
Amazon Redshift verifica cada transacción en busca de infracciones de cuota antes de confirmar la transacción. Amazon Redshift revisa el tamaño (el espacio en disco utilizado por todas las tablas de un esquema) de cada esquema modificado en comparación con la cuota establecida. Dado que la comprobación de infracción de cuota se produce al final de una transacción, el límite de tamaño puede superar temporalmente la cuota dentro de una transacción antes de que se confirme. Cuando una transacción supera la cuota, Amazon Redshift detiene la transacción, prohíbe ingestas posteriores y revierte todos los cambios hasta que se libere espacio en el disco. Como la operación VACUUM y la limpieza interna se producen en segundo plano, es posible que un esquema no esté lleno al momento de su verificación después de que se cancela una transacción.   
Como excepción, Amazon Redshift no tiene en cuenta la infracción de cuota y confirma transacciones en determinados casos. Amazon Redshift hace esto para transacciones que constan únicamente de una o más de las siguientes instrucciones donde no hay una instrucción de ingesta INSERT o COPY en la misma transacción:  
+ DELETE
+ TRUNCATE
+ VACUUM
+ DROP TABLE
+ ALTER TABLE APPEND solo cuando se mueven datos desde el esquema completo a otro esquema no completo

 *UNLIMITED*   
Amazon Redshift no impone ningún límite al crecimiento del tamaño total del esquema.

## Límites
<a name="r_CREATE_SCHEMA-limit"></a>

Amazon Redshift aplica los siguientes límites para los esquemas.
+ Hay un máximo de 9 900 esquemas por base de datos.

## Ejemplos
<a name="r_CREATE_SCHEMA-examples"></a>

En el siguiente ejemplo, se crea un esquema denominado US\$1SALES y le otorga la propiedad al usuario DWUSER.

```
create schema us_sales authorization dwuser;
```

En el siguiente ejemplo, se crea un esquema denominado US\$1SALES, se otorga la propiedad al usuario DWUSER y se establece la cuota en 50 GB.

```
create schema us_sales authorization dwuser QUOTA 50 GB;
```

Para ver el nuevo esquema, consulte la tabla de catálogo PG\$1NAMESPACE, como se muestra a continuación.

```
select nspname as schema, usename as owner
from pg_namespace, pg_user
where pg_namespace.nspowner = pg_user.usesysid
and pg_user.usename ='dwuser';

   schema |  owner
----------+----------
 us_sales | dwuser
(1 row)
```

En el siguiente ejemplo, se crea el esquema US\$1SALES o no se hace nada y se devuelve un mensaje si el esquema ya existe:

```
create schema if not exists us_sales;
```

# CREATE TABLE
<a name="r_CREATE_TABLE_NEW"></a>

Crea una nueva tabla en la base de datos actual. Defina una lista de columnas, cada una de las cuales contiene datos de un tipo distinto. El propietario de la tabla es el emisor del comando CREATE TABLE.

## Privilegios necesarios
<a name="r_CREATE_TABLE-privileges"></a>

Los siguientes privilegios son necesarios para CREATE TABLE:
+ Superusuario
+ Usuarios con el privilegio CREATE TABLE

## Sintaxis
<a name="r_CREATE_TABLE_NEW-synopsis"></a>

```
CREATE [ [LOCAL ] { TEMPORARY | TEMP } ] TABLE
[ IF NOT EXISTS ] table_name
( { column_name data_type [column_attributes] [ column_constraints ]
  | table_constraints
  | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }
  [, ... ]  )
[ BACKUP { YES | NO } ]
[table_attributes]

where column_attributes are:
  [ DEFAULT default_expr ]
  [ IDENTITY ( seed, step ) ]
  [ GENERATED BY DEFAULT AS IDENTITY ( seed, step ) ]
  [ ENCODE encoding ]
  [ DISTKEY ]
  [ SORTKEY ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]

and column_constraints are:
  [ { NOT NULL | NULL } ]
  [ { UNIQUE  |  PRIMARY KEY } ]
  [ REFERENCES reftable [ ( refcolumn ) ] ]

and table_constraints  are:
  [ UNIQUE ( column_name [, ... ] ) ]
  [ PRIMARY KEY ( column_name [, ... ] )  ]
  [ FOREIGN KEY (column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]


and table_attributes are:
  [ DISTSTYLE { AUTO | EVEN | KEY | ALL } ]
  [ DISTKEY ( column_name ) ]
  [ [COMPOUND | INTERLEAVED ] SORTKEY ( column_name [,...]) |  [ SORTKEY AUTO ] ]
  [ ENCODE AUTO ]
```

## Parameters
<a name="r_CREATE_TABLE_NEW-parameters"></a>

LOCAL   
Opcional. Aunque esta palabra clave se acepta en la instrucción, no tiene efecto en Amazon Redshift.

TEMPORARY \$1 TEMP   
Palabra clave que crea una tabla temporal que solo se puede ver dentro de la sesión actual. La tabla se elimina automáticamente al final de la sesión en la que se creó. La tabla temporal puede tener el mismo nombre que una tabla permanente. La tabla temporal se crea en un esquema separado específico de la sesión. (No se puede especificar un nombre para este esquema). Este esquema temporal se convierte en el primer esquema en la ruta de búsqueda, por lo que la tabla temporal tiene prioridad sobre la tabla permanente a menos que califique el nombre de la tabla con el nombre del esquema para obtener acceso a la tabla permanente. Para obtener más información acerca de esquemas y prioridades, consulte [search\$1path](r_search_path.md).  
De forma predeterminada, los usuarios de base de datos tienen permiso para crear tablas temporales por su pertenencia automática al grupo PUBLIC. Para denegarle este privilegio a un usuario, anule el privilegio TEMP del grupo PUBLIC y, luego, conceda explícitamente el privilegio TEMP solo a usuarios o grupos de usuarios específicos.

IF NOT EXISTS  
Cláusula que indica que si la tabla especificada ya existe, el comando no debe realizar cambios y debe devolver un mensaje en el que se indique que la tabla existe, en lugar de detenerse con un error. Tenga en cuenta que la tabla existente puede ser completamente diferente a la que podría haberse creado; solo se compara el nombre de la tabla.  
Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si CREATE TABLE intenta crear una tabla que ya existe.

 *table\$1name*   
Nombre de la tabla que se creará.  
Si especifica un nombre de tabla que comienza con "\$1", la tabla se crea como una tabla temporal. A continuación, se muestra un ejemplo:  

```
create table #newtable (id int);
```
También hace referencia a la tabla con el carácter “\$1”. Por ejemplo:   

```
select * from #newtable;
```
La longitud máxima del nombre de la tabla es de 127 bytes; los nombres más largos se truncan en 127 bytes. Puede usar caracteres multibyte UTF-8 de hasta un máximo de cuatro bytes. Amazon Redshift aplica una cuota para el número de tablas por clúster según el tipo de nodo, incluidas las tablas temporales definidas por el usuario y las tablas temporales creadas por Amazon Redshift durante el procesamiento de consultas o el mantenimiento del sistema. De manera opcional, puede clasificar el nombre de la tabla con el nombre de la base de datos y del esquema. En el siguiente ejemplo, el nombre de base de datos es `tickit`, el nombre de esquema es `public` y el nombre de tabla es `test`.   

```
create table tickit.public.test (c1 int);
```
Si no existe la base de datos o el esquema, no se crea la tabla y la instrucción devuelve un error. No puede crear tablas o vistas en las bases de datos del sistema `template0`, `template1`, `padb_harvest` o `sys:internal`.  
Si se proporciona un nombre de esquema, la tabla nueva se crea en ese esquema (suponiendo que el creador tiene acceso al esquema). El nombre de la tabla debe ser un nombre único para ese esquema. Si no se especifica un esquema, se crea la tabla a través del esquema de la base de datos actual. Si está creando una tabla temporal, no puede especificar un nombre de esquema, ya que las tablas temporales existen en un esquema especial.  
Pueden existir varias tablas temporales con el mismo nombre y al mismo tiempo en la misma base de datos si se crean en sesiones separadas porque las tablas se asignan a diferentes esquemas. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

 *column\$1name*   
Nombre de una columna que se creará en la tabla nueva. La longitud máxima del nombre de la columna es de 127 bytes; los nombres más largos se truncan en 127 bytes. Puede usar caracteres multibyte UTF-8 de hasta un máximo de cuatro bytes. La cantidad máxima de columnas que se pueden definir en una única tabla es 1 600. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).  
Si está creando una "tabla ancha", asegúrese de que la lista de columnas no supere los límites de ancho de las filas para los resultados intermedios durante la carga y el procesamiento de consultas. Para obtener más información, consulte [Notas de uso](#r_CREATE_TABLE_usage).

 *data\$1type*   
El tipo de datos de la columna que se crea. Para las columnas CHAR y VARCHAR, puede usar la palabra clave MAX en lugar de declarar una longitud máxima. MAX establece la longitud máxima en 4096 bytes para CHAR o 65 535 bytes para VARCHAR. El tamaño máximo del objeto GEOMETRY es 1 048 447 bytes.   
Para obtener información acerca de los tipos de datos compatibles con Amazon Redshift, consulte [Tipos de datos](c_Supported_data_types.md).

DEFAULT *default\$1expr*   <a name="create-table-default"></a>
Cláusula que asigna un valor de datos predeterminado para la columna. El tipo de datos de *default\$1expr* debe coincidir con el tipo de datos de la columna. El valor DEFAULT debe ser una expresión sin variables. No se permiten subconsultas, referencias cruzadas a otras columnas de la tabla actual ni funciones definidas por el usuario.  
La expresión *default\$1expr* se utiliza en las operaciones INSERT que no especifican un valor para la columna. Si no se especifica un valor predeterminado, el valor predeterminado para la columna es nulo.  
Si una operación COPY con una lista de columnas definida omite una columna que tiene el valor DEFAULT, el comando COPY inserta el valor de *default\$1expr (expresión\$1predeterminada)*.

IDENTITY(*seed*, *step*)   <a name="identity-clause"></a>
Cláusula que especifica que la columna es una columna IDENTITY. Las columnas IDENTITY contienen valores únicos generados automáticamente. El tipo de datos de una columna IDENTITY debe ser INT o BIGINT.   
Cuando agrega filas utilizando la instrucción `INSERT` o `INSERT INTO [tablename] VALUES()`, estos valores comienzan por el valor especificado como *seed (valor de inicialización)* y van aumentando según el número especificado en *step (paso)*.   
Cuando la tabla se carga mediante la instrucción `INSERT INTO [tablename] SELECT * FROM` o `COPY` , los datos se cargan en paralelo y se distribuyen a los sectores del nodo. Para asegurarse de que los valores de identidad sean únicos, Amazon Redshift omite una serie de valores cuando crea los valores de identidad. Los valores de identidad son únicos, pero es posible que el orden no coincida con el de los archivos de origen. 

GENERATED BY DEFAULT AS IDENTITY(*seed*, *step*)   <a name="identity-generated-bydefault-clause"></a>
Cláusula que especifica que la columna es una columna IDENTITY predeterminada y permite asignar automáticamente un valor único a la columna. El tipo de datos de una columna IDENTITY debe ser INT o BIGINT. Cuando agrega filas sin valores, estos valores comienzan con el valor especificado como *seed (valor de inicialización)* y van aumentando según el número especificado como *step (paso)*. Para obtener más información acerca de cómo se generan los valores, consulte [IDENTITY](#identity-clause) .  
Además, durante las operaciones INSERT, UPDATE o COPY, puede proporcionar un valor sin EXPLICIT\$1IDS. Amazon Redshift utiliza ese valor para insertarlo en la columna de identidad en lugar de utilizar el valor generado por el sistema. El valor puede ser un duplicado, un valor inferior al valor de inicialización (seed) o un valor comprendido entre los valores de paso (step). Amazon Redshift no verifica la singularidad de los valores de la columna. El hecho de que se proporcione un valor no afecta al siguiente valor generado por el sistema.  
Si necesita valores eclusivos en la columna, no agregue un valor duplicado. En su lugar, agregue un valor único que sea inferior al valor de inicialización (seed) o que esté comprendido entre los valores de paso (step).
Tenga en cuenta lo siguiente sobre las columnas de identidad predeterminadas:   
+ Las columnas de identidad predeterminadas son NOT NULL. No se pueden insertar valores NULL.
+ Para insertar un valor generado en una columna de identidad predeterminada, utilice la palabra clave `DEFAULT`. 

  ```
  INSERT INTO tablename (identity-column-name) VALUES (DEFAULT);
  ```
+ El hecho de anular los valores de una columna de identidad predeterminada no afecta al siguiente valor generado. 
+ No puede agregar una columna de identidad predeterminada con la instrucción ALTER TABLE ADD COLUMN. 
+ Puede anexar una columna de identidad predeterminada con la instrucción ALTER TABLE APPEND. 

ENCODE *encoding*   
La codificación de compresión de una columna. ENCODE AUTO es la opción predeterminada para las tablas. Amazon Redshift administra de forma automática la codificación de compresión para todas las columnas de la tabla. Si especifica la codificación de compresión para alguna columna de la tabla, esta ya no tendrá la opción ENCODE AUTO configurada. Amazon Redshift ya no administra automáticamente la codificación de compresión para todas las columnas de la tabla. Puede especificar la opción ENCODE AUTO para la tabla con el fin de permitir que Amazon Redshift administre automáticamente la codificación de compresión para todas las columnas de la tabla.  
  
Amazon Redshift asigna de forma automática una codificación de compresión inicial a las columnas para las que no se especifica la codificación de compresión de la siguiente manera:  
+ Por defecto, se asigna una compresión RAW a todas las columnas de tablas temporales.
+ A las columnas que están definidas como claves de ordenación se les asigna una compresión RAW.
+ A las columnas que están definidas como tipos de datos BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY o GEOGRAPHY se les asigna una compresión RAW.
+ A las columnas que se definen como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ se les asigna la compresión AZ64.
+ A las columnas que se definen como CHAR, VARCHAR o VARBYTE se les asigna la compresión LZO.
Si no desea que una columna se comprima, especifique explícitamente la codificación RAW.
 Se admiten los siguientes [compression encodings](c_Compression_encodings.md#compression-encoding-list):  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (sin comprimir)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD

DISTKEY  
Palabra clave que especifica que la columna es la clave de distribución de la tabla. Solo una columna de una tabla puede ser la clave de distribución. Puede usar la palabra clave DISTKEY después del nombre de una columna o como parte de la definición de la tabla utilizando la sintaxis DISTKEY (*column\$1name*). Los dos métodos tienen el mismo efecto. Para obtener más información, consulte el parámetro DISTSTYLE más adelante en este tema.  
El tipo de datos de una columna de clave de distribución puede ser algunas de las siguientes opciones: BOOLEAN, REAL, DOUBLE PRECISION, SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, CHAR o VARCHAR.

SORTKEY  
Palabra clave que especifica que la columna es la clave de ordenación de la tabla. Cuando carga datos en la tabla, los datos se ordenan por una o más columnas que se designan como claves de ordenación. Puede usar la palabra clave SORTKEY después de un nombre de columna para especificar una clave de ordenación de una única columna, o puede especificar una o varias columnas como columnas de clave de ordenación de la tabla utilizando la sintaxis SORTKEY (*column\$1name (nombre\$1de\$1columna)* [, ...]). Solo se crean claves de ordenación compuestas con esta sintaxis.  
Puede definir un máximo de 400 columnas SORTKEY por tabla.  
El tipo de datos de una columna de clave de ordenación puede ser alguna de las siguientes opciones: BOOLEAN, REAL, DOUBLE PRECISION, SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, CHAR o VARCHAR.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Una cláusula que especifica si la búsqueda o comparación de cadenas en la columna distingue entre mayúsculas y minúsculas o no. El valor predeterminado es el mismo que la configuración actual de distinción entre mayúsculas y minúsculas de la base de datos.  
COLLATE solo es compatible con tipos de datos basados en cadenas, incluidos CHAR, VARCHAR y los valores de cadena dentro de las columnas SUPER. Para obtener más información sobre las consultas de datos SUPER sin distinción entre mayúsculas y minúsculas, consulte [Consultas sin distinción de mayúsculas y minúsculas](query-super.md#case-insensitive-super-queries).  
Para encontrar información de la intercalación de bases de datos, utilice el siguiente comando:  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE y CS son intercambiables y producen los mismos resultados. Del mismo modo, CASE\$1INSENSITIVE y CI son intercambiables y producen los mismos resultados.

NOT NULL \$1 NULL   
NOT NULL indica que la columna no puede contener valores nulos. NULL, el valor predeterminado, especifica que la columna acepta valores nulos. Las columnas IDENTITY están declaradas NOT NULL por defecto.

UNIQUE  
Palabra clave que especifica que la columna puede contener solo valores únicos. El comportamiento de la restricción única de la tabla es el mismo que el de las restricciones de columna, con la capacidad adicional de abarcar varias columnas. Para definir una restricción de tabla única, consulte la sintaxis UNIQUE ( *column\$1name* [, ... ] ).  
Las restricciones únicas son informativas y el sistema no fuerza su aplicación.

PRIMARY KEY  
Palabra clave que especifica que la columna es la clave principal de la tabla. Solo una columna se puede definir como la clave principal al utilizar una definición de columna. Para definir una restricción de tabla con una clave principal de varias columnas, use la sintaxis PRIMARY KEY ( *column\$1name* [, ... ] ).  
Identificar una columna como clave principal proporciona metadatos acerca del diseño del esquema. Una clave principal implica que otras tablas pueden contar con este conjunto de columnas como un identificador único para las filas. Una clave principal puede especificarse para una tabla, ya sea como restricción de columna o restricción de tabla. La restricción de clave principal debe designar un conjunto de columnas diferente a los otros conjuntos de columnas denominados por cualquier restricción única definida para la misma tabla.  
Las columnas CLAVE PRINCIPAL también se definen como NOT NULL.  
Las restricciones de clave principal son solo con fines informativos. El sistema no fuerza su aplicación, pero el planificador las utiliza.

References *reftable* [ ( *refcolumn* ) ]  
Cláusula que especifica una restricción de clave externa, que implica que la columna debe contener solo los valores que coinciden con los valores en la columna referenciada de alguna fila de la tabla referenciada. Las columnas referenciadas deben ser las columnas de una clave única o principal en la tabla referenciada.   
 Las restricciones de clave externa son solo con fines informativos. El sistema no fuerza su aplicación, pero el planificador las utiliza. 

LIKE *parent\$1table* [ \$1 INCLUDING \$1 EXCLUDING \$1 DEFAULTS ]   <a name="create-table-like"></a>
Una cláusula que especifica una tabla existente desde la cual la nueva tabla copia automáticamente nombres de columna, tipos de datos y restricciones NOT NULL. La tabla nueva y la tabla principal están desacopladas, por lo que los cambios realizados en la tabla principal no se aplicarán a la tabla nueva Las expresiones predeterminadas para las definiciones de columnas copiadas se copian solo si INCLUDING DEFAULTS está especificado. El comportamiento predeterminado es excluir las expresiones predeterminadas, para que todas las columnas de la tabla nueva tengan valores predeterminados nulos.   
Las tablas creadas con la opción LIKE no heredan restricciones de clave principal y externa. Las tablas LIKE heredan el estilo de distribución, las claves de ordenación y las propiedades BACKUP y NULL, pero no se pueden configurar de forma explícita en la instrucción CREATE TABLE … LIKE.

BACKUP \$1 YES \$1 NO \$1   <a name="create-table-backup"></a>
Una cláusula que especifica si la tabla debe incluirse en instantáneas de clústeres manuales y automáticos.   
Para las tablas, como las tablas provisionales que no contienen datos críticos, especifique BACKUP NO para ahorrar tiempo de procesamiento al momento de crear instantáneas y restaurar contenido a partir de ellas, y para reducir espacio de almacenamiento en Amazon Simple Storage Service. El ajuste BACKUP NO no afecta la replicación automática de datos a otros nodos dentro del clúster, por lo que las tablas con BACKUP NO especificado se restauran en el caso de un error del nodo. El valor predeterminado es BACKUP YES.  
Las tablas sin copia de seguridad no son compatibles con los clústeres aprovisionados con RA3 ni con los grupos de trabajo de Amazon Redshift sin servidor. Una tabla marcada como sin copia de seguridad en un clúster de RA3 o grupo de trabajo sin servidor se tratará como una tabla permanente de la que siempre se hará una copia de seguridad al tomar una instantánea, y que siempre se restaurará al restaurar desde una instantánea. Para evitar los costos de instantáneas de las tablas sin copia de seguridad, trúnquelas antes de tomar una instantánea.

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
Se trata de la palabra clave que define el estilo de distribución de datos para toda la tabla. Amazon Redshift distribuye las filas de una tabla entre los nodos informáticos en función del estilo de distribución especificado en la tabla. El valor predeterminado es AUTO.  
El estilo de distribución que selecciona para las tablas afecta el rendimiento global de la base de datos. Para obtener más información, consulte [Distribución de datos para la optimización de consultas](t_Distributing_data.md). Los posibles estilos de distribución son los siguientes:  
+ AUTO: Amazon Redshift asigna un estilo de distribución óptimo en función de los datos de la tabla. Por ejemplo, si se especifica el estilo de distribución AUTO, Amazon Redshift asigna inicialmente el estilo de distribución ALL a una tabla pequeña. Cuando la tabla crezca, Amazon Redshift podría cambiar el estilo de distribución a KEY y elegir la clave principal (o una columna de la clave primaria compuesta) como DISTKEY. Si la tabla aumenta de tamaño y ninguna de las columnas es adecuada para ser DISTKEY, Amazon Redshift cambia el estilo de distribución a EVEN. El cambio en el estilo de distribución se produce en segundo plano y tiene un impacto mínimo en las consultas de los usuarios. 

  Para ver el estilo de distribución aplicado a una tabla, consulte la tabla de catálogo del sistema PG\$1CLASS. Para obtener más información, consulte [Visualización de los estilos de distribución](viewing-distribution-styles.md). 
+ EVEN: Los datos de la tabla se distribuyen de manera uniforme en los nodos de un clúster en una distribución de turnos rotativos. Los ID de filas se utilizan para determinar la distribución, y se distribuye casi la misma cantidad de filas a cada nodo. 
+ KEY: Los datos se distribuyen por los valores en la columna DISTKEY. Cuando establece las columnas de unión de las tablas de unión como claves de distribución, las filas de combinación de ambas tablas se colocan en los nodos de computación. Cuando se colocan los datos, el optimizador puede realizar combinaciones de manera más eficiente. Si especifica DISTSTYLE KEY, debe nombrar una columna DISTKEY, ya sea para la tabla o como parte de la definición de la columna. Para obtener más información, consulte el parámetro DISTKEY mencionado en este tema.
+  ALL: Una copia de toda la tabla se distribuye a cada nodo. El estilo de distribución garantiza que todas las filas obligatorias para cualquier combinación estén disponibles en todos los nodos, pero multiplica los requisitos de almacenamiento y aumenta el tiempo de carga y mantenimiento de la tabla. La distribución ALL puede mejorar el tiempo de ejecución cuando se usa con determinadas tablas de dimensión en las que la distribución KEY no es adecuada. No obstante, es conveniente analizar las mejoras de rendimiento en relación con los costos de mantenimiento. 

DISTKEY ( *column\$1name* )  
Restricción que especifica la columna que se utilizará como la clave de distribución de la tabla. Puede usar la palabra clave DISTKEY detrás del nombre de columna o como parte de la definición de tabla utilizando la sintaxis DISTKEY (*column\$1name*). Los dos métodos tienen el mismo efecto. Para obtener más información, consulte el parámetro DISTSTYLE mencionado en este tema.

[COMPOUND \$1 INTERLEAVED ] SORTKEY (* column\$1name* [,...]) \$1 [ SORTKEY AUTO ]  
Especifica una o más claves de ordenación para la tabla. Cuando carga datos en la tabla, los datos se ordenan por las columnas que se designan como claves de ordenación. Puede usar la palabra clave SORTKEY después del nombre de una columna para especificar una clave de ordenación de una única columna, o puede especificar una o más columnas como las columnas de clave de ordenación para la tabla a través de la sintaxis `SORTKEY (column_name [ , ... ] )`.   
Puede especificar el estilo de ordenación COMPOUND o INTERLEAVED. Si especifica SORTKEY con columnas, el valor predeterminado es COMPOUND. Para obtener más información, consulte [Claves de clasificación](t_Sorting_data.md).  
Si no especifica ninguna opción de claves de ordenación, el valor predeterminado es AUTO.  
Puede definir un máximo de 400 columnas COMPOUND SORTKEY u 8 columnas INTERLEAVED SORTKEY por tabla.     
AUTO  
Especifica que Amazon Redshift asigna una clave de ordenación óptima en función de los datos de la tabla. Por ejemplo, si se especifica la clave de ordenación AUTO, Amazon Redshift inicialmente no asigna ninguna clave de ordenación a una tabla. Si Amazon Redshift determina que una clave de ordenación mejorará el rendimiento de las consultas, dicho servicio podría cambiar la clave de ordenación de la tabla. La ordenación real de la tabla se realiza con la ordenación automática de la tabla. Para obtener más información, consulte [Clasificación automática de tablas](t_Reclaiming_storage_space202.md#automatic-table-sort).   
Amazon Redshift no modifica las tablas que ya tienen claves de ordenación o de distribución. Con una excepción, si una tabla tiene una clave de distribución que nunca se ha utilizado en una operación JOIN, la clave podría modificarse si Amazon Redshift determina que hay una clave mejor.   
Para ver la clave de ordenación de una tabla, consulte la vista de catálogo del sistema SVV\$1TABLE\$1INFO. Para obtener más información, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Si desea ver las recomendaciones para tablas de Advisor de Amazon Redshift, consulte la vista de catálogo del sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Para obtener más información, consulte [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para ver las acciones llevadas a cabo por Amazon Redshift, consulte la vista de catálogo del sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obtener más información, consulte [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md).   
COMPOUND  
Especifica que los datos se ordenan a través de una clave compuesta formada por todas las columnas enumeradas en el orden en que aparecen en la lista. Una clave de ordenación compuesta es útil cuando una consulta analiza filas según el orden de las columnas de ordenación. Los beneficios del rendimiento de ordenación con una clave compuesta se reducen cuando las consultas dependen de columnas de ordenación secundarias. Puede definir una cantidad máxima de 400 columnas COMPOUND SORTKEY por tabla.   
INTERLEAVED  
Especifica que los datos se ordenan a través de una clave de ordenación intercalada. Se puede especificar una cantidad máxima de ocho columnas para una clave de ordenación intercalada.   
Una ordenación intercalada otorga el mismo peso a cada columna o subconjunto de columnas de la clave de ordenación. Por lo tanto, las consultas no dependen del orden que tengan las columnas en la clave de ordenación. Cuando una consulta usa una o más columnas de ordenación secundarias, la ordenación intercalada mejora considerablemente el rendimiento de la consulta. La ordenación intercalada tiene un pequeño costo general para las operaciones de carga y limpieza de datos.   
No utilice una clave de ordenación intercalada con atributos monótonamente crecientes, como columnas de identidad, fechas o marcas temporales.

ENCODE AUTO   
Permite a Amazon Redshift ajustar de forma automática el tipo de codificación de todas las columnas de la tabla para optimizar el rendimiento de la consulta. ENCODE AUTO conserva los tipos de codificación iniciales que se especifican durante la creación de la tabla. Luego, si Amazon Redshift determina que un nuevo tipo de codificación puede mejorar el rendimiento de la consulta, Amazon Redshift puede cambiar el tipo de codificación de las columnas de la tabla. ENCODE AUTO es la opción predeterminada si no se especifica un tipo de codificación en cualquiera de las columnas de la tabla.

UNIQUE ( *column\$1name* [,...] )  
Restricción que especifica que un grupo de una o más columnas de una tabla puede contener solo valores únicos. El comportamiento de la restricción única de la tabla es el mismo que el de las restricciones de columna, con la capacidad adicional de abarcar varias columnas. En el contexto de las restricciones únicas, los valores nulos no se consideran iguales. Cada restricción de tabla única debe designar un conjunto de columnas diferente al conjunto de columnas denominado por otra restricción de clave única o principal definida para la tabla.   
 Las restricciones únicas son informativas y el sistema no fuerza su aplicación. 

PRIMARY KEY ( *column\$1name* [,...] )  
Restricción que especifica que una columna o un grupo de columnas de una tabla puede contener solo valores no nulos (no duplicados). Identificar un conjunto de columnas como clave principal también proporciona metadatos acerca del diseño del esquema. Una clave principal implica que otras tablas pueden contar con este conjunto de columnas como un identificador único para las filas. Una clave principal puede especificarse para una tabla, ya sea como restricción de columna única o restricción de tabla. La restricción de clave principal debe designar un conjunto de columnas diferente a los otros conjuntos de columnas denominados por cualquier restricción única definida para la misma tabla.   
 Las restricciones de clave principal son solo con fines informativos. El sistema no fuerza su aplicación, pero el planificador las utiliza. 

FOREIGN KEY ( *column\$1name* [, ... ] ) REFERENCES *reftable* [ ( *refcolumn* ) ]   
Restricción que especifica una restricción de clave externa, que requiere que un grupo de una o más columnas de la nueva tabla debe contener solo valores que coincidan con los valores en la columna o columnas a las que se hace referencia de alguna fila de la tabla referenciada. Si se omite *refcolumn* , se usa la clave principal de *reftable*. Las columnas referenciadas deben ser las columnas de una clave única o principal en la tabla referenciada.  
Las restricciones de clave externa son solo con fines informativos. El sistema no fuerza su aplicación, pero el planificador las utiliza.

## Notas de uso
<a name="r_CREATE_TABLE_usage"></a>

Las restricciones de unicidad, clave principal y clave externa son solo informativas, *Amazon Redshift* no las aplica al rellena una tabla. Por ejemplo, si inserta datos en una tabla con dependencias, la inserción puede realizarse correctamente aunque infrinja la restricción. No obstante, las claves principales y externas se utilizan como sugerencias de planificación y deben estar declaradas si el proceso de Extract, Transform, Load (ETL, Extracción, transformación y carga) o algún otro proceso de su aplicación exige su integridad. Para obtener información acerca de cómo eliminar una tabla con dependencias, consulte [DROP TABLE](r_DROP_TABLE.md).

### Límites y cuotas
<a name="r_CREATE_TABLE_usage-limits"></a>

Tenga en cuenta los siguientes límites al crear una tabla.
+ Existe un límite para el número máximo de tablas en un clúster por tipo de nodo. Para obtener más información, consulte [Límites](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) en la *Guía de administración de Amazon Redshift*. 
+ La cantidad máxima de caracteres para el nombre de una tabla es 127. 
+ La cantidad máxima de columnas que se pueden definir en una única tabla es 1 600. 
+ La cantidad máxima de columnas SORTKEY que se pueden definir en una única tabla es 400. 

### Resumen de ajustes de nivel de columna y ajustes de nivel de tabla
<a name="r_CREATE_TABLE_usage-summary_of_settings"></a>

 Se pueden configurar varios atributos y ajustes al nivel de columna o al nivel de tabla. En algunos casos, configurar un atributo o una restricción al nivel de columna o al nivel de tabla tiene el mismo efecto. En otros casos, producen resultados diferentes. 

 La siguiente lista resume los ajustes de nivel de columna y de nivel de tabla: 

DISTKEY  
No hay diferencia en el efecto si se configura al nivel de columna o al nivel de tabla.   
Si se establece DISTKEY, ya sea al nivel de columna o al nivel de tabla, DISTSTYLE debe estar configurado en KEY o no estar configurado. DISTSTYLE solo puede configurarse al nivel de tabla. 

SORTKEY  
Si se configura al nivel de columna, SORTKEY debe ser una única columna. Si SORTKEY se configura al nivel de tabla, una o más columnas pueden formar una clave de ordenación compuesta o intercalada. 

COLLATE CASE\$1SENSITIVE \$1 COLLATE CASE\$1INSENSITIVE  
Amazon Redshift no admite la modificación de la configuración de distinción entre mayúsculas y minúsculas para una columna. Cuando agrega una nueva columna a la tabla, Amazon Redshift utiliza el valor predeterminado para la distinción entre mayúsculas y minúsculas. Amazon Redshift no admite la palabra clave COLLATE cuando se anexa una columna nueva.  
Para obtener información sobre cómo crear bases de datos mediante la intercalación de bases de datos, consulte [CREATE DATABASE](r_CREATE_DATABASE.md).  
Para obtener información acerca de la función COLLATE, consulte [Función COLLATE](r_COLLATE.md).

UNIQUE  
Al nivel de columna, una o más claves pueden configurarse en UNIQUE. La restricción UNIQUE se aplica a cada columna individualmente. Si UNIQUE se configura al nivel de tabla, una o más columnas pueden formar una restricción UNIQUE compuesta. 

PRIMARY KEY  
Si se configura al nivel de columna, PRIMARY KEY debe ser una única columna. Si PRIMARY KEY se configura al nivel de tabla, una o más columnas pueden formar una clave principal compuesta. 

FOREIGN KEY  
No hay diferencia en el efecto si se configura FOREIGN KEY al nivel de columna o al nivel de tabla. Al nivel de columna, la sintaxis es `REFERENCES` *reftable* [ ( *refcolumn* )]. 

### Distribución de datos entrantes
<a name="r_CREATE_TABLE_usage-distribution-of-incoming-data"></a>

Cuando el esquema de distribución hash de los datos entrantes coincide con el de la tabla de destino, no es necesaria la distribución física de datos cuando se cargan los datos. Por ejemplo, si se configura una clave de distribución para la nueva tabla y los datos se insertan desde otra tabla que está distribuida en la misma columna clave, los datos se cargan en el lugar a través de los mismos nodos y sectores. No obstante, si las tablas de origen y destino se configuran en distribución EVEN, los datos se redistribuyen en la tabla de destino.

### Tablas anchas
<a name="r_CREATE_TABLE_usage-wide-tables"></a>

Puede crear una tabla muy ancha pero no tener la capacidad de realizar el procesamiento de consultas, como instrucciones INSERT o SELECT, en la tabla. El ancho máximo de una tabla con columnas de ancho fijo, como CHAR, es 64 KB - 1 (o 65 535 bytes). Si una tabla contiene columnas VARCHAR, la tabla puede tener un ancho declarado superior sin devolver un error, ya que, en las columnas VARCHARS, el ancho declarado completo no afecta al límite calculado de procesamiento de consultas. El límite de procesamiento de consultas en vigor para las columnas VARCHAR variará en función a un número de factores.

Si la tabla es demasiado ancha para insertar o seleccionar, recibe el siguiente error.

```
ERROR:  8001
DETAIL:  The combined length of columns processed in the SQL statement
exceeded the query-processing limit of 65535 characters (pid:7627)
```

## Ejemplos
<a name="r_CREATE_TABLE_usage-examples"></a>

Para ver ejemplos que muestran cómo usar el comando CREATE TABLE, consulte el tema [Ejemplos](r_CREATE_TABLE_examples.md).

# Ejemplos
<a name="r_CREATE_TABLE_examples"></a>

Los siguientes ejemplos muestran distintos atributos de tabla y columna en instrucciones CREATE TABLE de Amazon Redshift. Para obtener más información acerca de CREATE TABLE, incluidas las definiciones de parámetros, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md).

Muchos de los ejemplos utilizan tablas y datos del conjunto de datos de muestra *TICKIT*. Para obtener más información, consulte [Base de datos de muestra](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html).

 En un comando CREATE TABLE puede anteponer el nombre de base de datos y el nombre de esquema al nombre de tabla. Por ejemplo, `dev_database.public.sales`. El nombre de base de datos debe ser la base de datos a la que está conectado. Cualquier intento de crear objetos de base de datos en otra base de datos produce un error de operación no válida.

## Crear una tabla con una clave de distribución, una clave de ordenación compuesta y compresión
<a name="r_CREATE_TABLE_examples-create-a-table-with-distribution-key"></a>

En el siguiente ejemplo, se crea una tabla SALES en la base de datos TICKIT con compresión definida para varias columnas. LISTID está declarada como la clave de distribución, y LISTID y SELLERID están declaradas como una clave de ordenación compuesta de varias columnas. También se definen las restricciones de clave principal y clave externa para la tabla. Antes de crear la tabla del ejemplo, puede que necesite agregar una restricción UNIQUE a cada columna a la que haga referencia una clave externa, si no existen restricciones.

```
create table sales(
salesid integer not null,
listid integer not null,
sellerid integer not null,
buyerid integer not null,
eventid integer not null encode mostly16,
dateid smallint not null,
qtysold smallint not null encode mostly8,
pricepaid decimal(8,2) encode delta32k,
commission decimal(8,2) encode delta32k,
saletime timestamp,
primary key(salesid),
foreign key(listid) references listing(listid),
foreign key(sellerid) references users(userid),
foreign key(buyerid) references users(userid),
foreign key(dateid) references date(dateid))
distkey(listid)
compound sortkey(listid,sellerid);
```

Los resultados son los siguientes:

```
schemaname | tablename | column     | type                        | encoding | distkey | sortkey | notnull
-----------+-----------+------------+-----------------------------+----------+---------+---------+--------
public     | sales     | salesid    | integer                     | lzo      | false   |       0 | true
public     | sales     | listid     | integer                     | none     | true    |       1 | true
public     | sales     | sellerid   | integer                     | none     | false   |       2 | true
public     | sales     | buyerid    | integer                     | lzo      | false   |       0 | true
public     | sales     | eventid    | integer                     | mostly16 | false   |       0 | true
public     | sales     | dateid     | smallint                    | lzo      | false   |       0 | true
public     | sales     | qtysold    | smallint                    | mostly8  | false   |       0 | true
public     | sales     | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
public     | sales     | commission | numeric(8,2)                | delta32k | false   |       0 | false
public     | sales     | saletime   | timestamp without time zone | lzo      | false   |       0 | false
```

En el siguiente ejemplo, se crea la tabla t1 con una columna col1 que no distingue entre mayúsculas y minúsculas.

```
create table T1 (
  col1 Varchar(20) collate case_insensitive
 );
            
insert into T1 values ('bob'), ('john'), ('Tom'), ('JOHN'), ('Bob');
```

Consultar la tabla:

```
select * from T1 where col1 = 'John';
   
col1
------
 john
 JOHN
(2 rows)
```

## Crear una tabla con una clave de ordenación intercalada
<a name="CREATE_TABLE_NEW-create-a-table-using-interleaved-sortkey"></a>

En el siguiente ejemplo, se crea una tabla CUSTOMER con una clave de ordenación intercalada.

```
create table customer_interleaved (
  c_custkey     	integer        not null,
  c_name        	varchar(25)    not null,
  c_address     	varchar(25)    not null,
  c_city        	varchar(10)    not null,
  c_nation      	varchar(15)    not null,
  c_region      	varchar(12)    not null,
  c_phone       	varchar(15)    not null,
  c_mktsegment      varchar(10)    not null)
diststyle all
interleaved sortkey (c_custkey, c_city, c_mktsegment);
```

## Crear una tabla con IF NOT EXISTS
<a name="CREATE_TABLE_NEW-create-a-table-using-if-not-exists"></a>

 En el siguiente ejemplo, se crea la tabla CITIES o no se realiza una acción y se devuelve un mensaje si ya existe:

```
create table if not exists cities(
cityid integer not null,
city varchar(100) not null,
state char(2) not null);
```

## Crear una tabla con la distribución ALL
<a name="CREATE_TABLE_NEW-create-a-table-with-all-distribution"></a>

 En el siguiente ejemplo, se crea la tabla VENUE con la distribución ALL. 

```
create table venue(
venueid smallint not null,
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid))
diststyle all;
```

## Crear una tabla con la distribución EVEN
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-even-distribution"></a>

En el siguiente ejemplo, se crea una tabla denominada MYEVENT con tres columnas. 

```
create table myevent(
eventid int,
eventname varchar(200),
eventcity varchar(30))
diststyle even;
```

La tabla se distribuye de manera uniforme y no se ordena. La tabla no tiene columnas DISTKEY o SORTKEY declaradas. 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'myevent';
            
  column   |          type          | encoding | distkey | sortkey
-----------+------------------------+----------+---------+---------
 eventid   | integer                | lzo      | f       |       0
 eventname | character varying(200) | lzo      | f       |       0
 eventcity | character varying(30)  | lzo      | f       |       0
(3 rows)
```

## Crear una tabla temporal con el comando LIKE que sea como otra tabla
<a name="r_CREATE_TABLE_NEW-create-a-temporary-table-that-is-like-another-table"></a>

En el siguiente ejemplo, se crea una tabla temporal denominada TEMPEVENT, que hereda sus columnas de la tabla EVENT. 

```
create temp table tempevent(like event); 
```

Esta tabla también hereda los atributos DISTKEY y SORTKEY de su tabla principal: 

```
select "column", type, encoding, distkey, sortkey
 from pg_table_def where tablename = 'tempevent';

  column   |            type             | encoding | distkey | sortkey
-----------+-----------------------------+----------+---------+---------
 eventid   | integer                     | none     | t       |       1
 venueid   | smallint                    | none     | f       |       0
 catid     | smallint                    | none     | f       |       0
 dateid    | smallint                    | none     | f       |       0
 eventname | character varying(200)      | lzo      | f       |       0
 starttime | timestamp without time zone | bytedict | f       |       0
(6 rows)
```

## Crear una tabla con una columna IDENTITY
<a name="r_CREATE_TABLE_NEW-create-a-table-with-an-identity-column"></a>

En el siguiente ejemplo, se crea una tabla denominada VENUE\$1IDENT, que tiene una columna IDENTITY denominada VENUEID. Esta columna comienza con 0 y crece en incrementos de 1 para cada registro. VENUEID también se declara como la clave principal de la tabla. 

```
create table venue_ident(venueid bigint identity(0, 1),
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid));
```

## Crear una tabla con una columna IDENTITY predeterminada
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-identity-column"></a>

En el siguiente ejemplo, se crea una tabla llamada `t1`. Esta tabla tiene una columna IDENTITY llamada `hist_id` y una columna IDENTITY predeterminada llamada `base_id`. 

```
CREATE TABLE t1(
  hist_id BIGINT IDENTITY NOT NULL, /* Cannot be overridden */
  base_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, /* Can be overridden */
  business_key varchar(10) ,
  some_field varchar(10)
);
```

Si se inserta una fila en la tabla, se generan los dos valores: `hist_id` y `base_id`. 

```
INSERT INTO T1 (business_key, some_field) values ('A','MM');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
```

Si se inserta una segunda fila, se genera el valor predeterminado de `base_id`.

```
INSERT INTO T1 (base_id, business_key, some_field) values (DEFAULT, 'B','MNOP');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
```

Si se inserta una tercera fila, no es necesario que el valor de `base_id` sea único.

```
INSERT INTO T1 (base_id, business_key, some_field) values (2,'B','MNNN');
```

```
SELECT * FROM t1;
            
 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
       3 |       2 | B            | MNNN
```

## Crear una tabla con valores de la columna DEFAULT
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-column-values"></a>

En el siguiente ejemplo, se crea una tabla CATEGORYDEF que declara valores predeterminados para cada columna: 

```
create table categorydef(
catid smallint not null default 0,
catgroup varchar(10) default 'Special',
catname varchar(10) default 'Other',
catdesc varchar(50) default 'Special events',
primary key(catid));
            
insert into categorydef values(default,default,default,default);
```

```
select * from categorydef;
            
 catid | catgroup | catname |    catdesc
-------+----------+---------+----------------
     0 | Special  | Other   | Special events
(1 row)
```

## Opciones DISTSTYLE, DISTKEY y SORTKEY
<a name="r_CREATE_TABLE_NEW-diststyle-distkey-and-sortkey-options"></a>

En el siguiente ejemplo, se muestra cómo funcionan las opciones DISTKEY, SORTKEY y DISTSTYLE. En este ejemplo, COL1 es la clave de distribución: por lo tanto, el estilo de distribución debe configurarse en KEY o no configurarse. De manera predeterminada, la tabla no tiene ninguna clave de ordenación y, por lo tanto, no se ordena: 

```
create table t1(col1 int distkey, col2 int) diststyle key;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't1';

column |  type   | encoding | distkey | sortkey
-------+---------+----------+---------+---------
col1   | integer | az64     | t       | 0
col2   | integer | az64     | f       | 0
```

En el siguiente ejemplo, se define la misma columna como la clave de distribución y la clave de ordenación. El estilo de distribución debe configurarse en KEY o no configurarse. 

```
create table t2(col1 int distkey sortkey, col2 int);
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't2';
            
column |  type   | encoding | distkey | sortkey
-------+---------+----------+---------+---------
col1   | integer | none     | t       | 1
col2   | integer | az64     | f       | 0
```

En el siguiente ejemplo, no se configura una columna como la clave de distribución, se configura COL2 como la clave de ordenación, y se configura el estilo de distribución en ALL: 

```
create table t3(col1 int, col2 int sortkey) diststyle all;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't3';
            
Column |  Type   | Encoding | DistKey | SortKey
-------+---------+----------+---------+--------
col1   | integer | az64     | f       | 0
col2   | integer | none     | f       | 1
```

En el siguiente ejemplo, el estilo de distribución está establecido en EVEN y no se define explícitamente una clave de ordenación. Por lo tanto, la tabla se distribuye de manera uniforme, pero no se ordena. 

```
create table t4(col1 int, col2 int) diststyle even;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't4';
            
             column |  type   |encoding | distkey | sortkey
--------+---------+---------+---------+--------
col1    | integer | az64    | f       | 0
col2    | integer | az64    | f       | 0
```

## Crear una tabla con la opción ENCODE AUTO
<a name="r_CREATE_TABLE_NEW-create-a-table-with-encode-option"></a>

En el siguiente ejemplo, se crea la tabla `t1` con codificación de compresión automática. ENCODE AUTO es la opción predeterminada para las tablas cuando no se especifica un tipo de codificación para ninguna columna.

```
create table t1(c0 int, c1 varchar);
```

En el siguiente ejemplo, se crea la tabla `t2` con codificación de compresión automática mediante la especificación de ENCODE AUTO.

```
create table t2(c0 int, c1 varchar) encode auto;
```

En el siguiente ejemplo, se crea la tabla `t3` con codificación de compresión automática mediante la especificación de ENCODE AUTO. La columna `c0` se define con un tipo de codificación inicial de DELTA. Amazon Redshift puede cambiar la codificación si otra codificación proporciona un mejor rendimiento en las consultas.

```
create table t3(c0 int encode delta, c1 varchar) encode auto;
```

En el siguiente ejemplo, se crea la tabla `t4` con codificación de compresión automática mediante la especificación de ENCODE AUTO. La columna `c0` se define con una codificación inicial de DELTA, y la columna `c1` se define con una codificación inicial de LZO. Amazon Redshift puede cambiar estas codificaciones si otras codificaciones proporcionan un mejor rendimiento en las consultas.

```
create table t4(c0 int encode delta, c1 varchar encode lzo) encode auto;
```

# CREATE TABLE AS
<a name="r_CREATE_TABLE_AS"></a>

**Topics**
+ [Sintaxis](#r_CREATE_TABLE_AS-synopsis)
+ [Parameters](#r_CREATE_TABLE_AS-parameters)
+ [Notas de uso de CTAS](r_CTAS_usage_notes.md)
+ [Ejemplos de CTAS](r_CTAS_examples.md)

Crea una nueva tabla en función de una consulta. El propietario de esta tabla es el usuario que emite el comando.

La tabla nueva se carga con datos definidos por la consulta en el comando. Las columnas de la tabla tienen nombres y tipos de datos asociados con las columnas de salida de la consulta. El comando CREATE TABLE AS (CTAS) crea una tabla nueva y evalúa la consulta para cargar la tabla nueva.

## Sintaxis
<a name="r_CREATE_TABLE_AS-synopsis"></a>

```
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ]
TABLE table_name
[ ( column_name [, ... ] ) ]
[ BACKUP { YES | NO } ]
[ table_attributes ]
AS query

where table_attributes are:
[ DISTSTYLE { AUTO | EVEN | ALL | KEY } ]
[ DISTKEY( distkey_identifier ) ]
[ [ COMPOUND | INTERLEAVED ] SORTKEY( column_name [, ...] ) ]
```

## Parameters
<a name="r_CREATE_TABLE_AS-parameters"></a>

LOCAL   
Aunque esta palabra clave opcional se acepta en la instrucción, no tiene efecto en Amazon Redshift.

TEMPORARY \$1 TEMP   
Crea una tabla temporal. Una tabla temporal se elimina automáticamente al final de la sesión en la que se creó.

 *table\$1name*   
El nombre de la tabla que se creará.  
Si especifica un nombre de tabla que comienza con "\$1", la tabla se crea como una tabla temporal. Por ejemplo:  

```
create table #newtable (id) as select * from oldtable;
```
La longitud máxima del nombre de la tabla es de 127 bytes; los nombres más largos se truncan en 127 bytes. Amazon Redshift aplica una cuota del número de tablas por clúster según el tipo de nodo. Puede clasificar el nombre de la tabla con el nombre de la base de datos y del esquema, como se muestra en la siguiente tabla.  

```
create table tickit.public.test (c1) as select * from oldtable;
```
En este ejemplo, `tickit` es el nombre de base de datos y `public` es el nombre de esquema. Si la base de datos o el esquema no existen, la instrucción devuelve un error.  
Si se proporciona un nombre de esquema, la tabla nueva se crea en ese esquema (suponiendo que el creador tiene acceso al esquema). El nombre de la tabla debe ser un nombre único para ese esquema. Si no se especifica un esquema, se crea la tabla a través del esquema de la base de datos actual. Si está creando una tabla temporal, no puede especificar un nombre de esquema dado que las tablas temporales existen en un esquema especial.  
Pueden existir varias tablas temporales con el mismo nombre y al mismo tiempo en la misma base de datos si se crean en sesiones separadas. Estas tablas se asignan a esquemas diferentes.

 *column\$1name*   
El nombre de una columna en la tabla nueva. Si no se proporcionan nombres de columnas, se toman de los nombres de columnas de salida de la consulta. Se usan nombres de columnas predeterminados para las expresiones. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

BACKUP \$1 YES \$1 NO \$1   
Una cláusula que especifica si la tabla debe incluirse en instantáneas de clústeres manuales y automáticos.   
Para las tablas, como las tablas provisionales que no contienen datos críticos, especifique BACKUP NO para ahorrar tiempo de procesamiento al momento de crear instantáneas y restaurar contenido a partir de ellas, y para reducir espacio de almacenamiento en Amazon Simple Storage Service. El ajuste BACKUP NO no tiene efecto en la replicación automática de datos a otros nodos dentro del clúster, por lo que las tablas con BACKUP NO especificado se restauran en el caso de un error del nodo. El valor predeterminado es BACKUP YES.  
Las tablas sin copia de seguridad no son compatibles con los clústeres aprovisionados con RA3 ni con los grupos de trabajo de Amazon Redshift sin servidor. Una tabla marcada como sin copia de seguridad en un clúster de RA3 o grupo de trabajo sin servidor se tratará como una tabla permanente de la que siempre se hará una copia de seguridad al tomar una instantánea, y que siempre se restaurará al restaurar desde una instantánea. Para evitar los costos de instantáneas de las tablas sin copia de seguridad, trúnquelas antes de tomar una instantánea.

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
Se trata de la palabra clave que define el estilo de distribución de datos para toda la tabla. Amazon Redshift distribuye las filas de una tabla entre los nodos informáticos en función del estilo de distribución especificado en la tabla. El valor predeterminado es DISTSTYLE AUTO.  
El estilo de distribución que selecciona para las tablas afecta el rendimiento global de la base de datos. Para obtener más información, consulte [Distribución de datos para la optimización de consultas](t_Distributing_data.md).  
+ AUTO: Amazon Redshift asigna un estilo de distribución óptimo en función de los datos de la tabla. Para ver el estilo de distribución aplicado a una tabla, consulte la tabla de catálogo del sistema PG\$1CLASS. Para obtener más información, consulte [Visualización de los estilos de distribución](viewing-distribution-styles.md). 
+ EVEN: Los datos de la tabla se distribuyen de manera uniforme en los nodos de un clúster en una distribución de turnos rotativos. Los ID de filas se utilizan para determinar la distribución, y se distribuye casi la misma cantidad de filas a cada nodo. Este es el método de distribución predeterminado.
+ KEY: Los datos se distribuyen por los valores en la columna DISTKEY. Cuando establece las columnas de unión de las tablas de unión como claves de distribución, las filas de combinación de ambas tablas se colocan en los nodos de computación. Cuando se colocan los datos, el optimizador puede realizar combinaciones de manera más eficiente. Si especifica DISTSTYLE KEY, debe asignar una columna DISTKEY.
+  ALL: Una copia de toda la tabla se distribuye a cada nodo. El estilo de distribución garantiza que todas las filas obligatorias para cualquier combinación estén disponibles en todos los nodos, pero multiplica los requisitos de almacenamiento y aumenta el tiempo de carga y mantenimiento de la tabla. La distribución ALL puede mejorar el tiempo de ejecución cuando se usa con determinadas tablas de dimensión en las que la distribución KEY no es adecuada. No obstante, es conveniente analizar las mejoras de rendimiento en relación con los costos de mantenimiento. 

DISTKEY (*column*)  
Especifica un nombre de columna o número de posicionamiento para la clave de distribución. Use el nombre especificado en la lista de columnas opcional para la tabla o la lista de selección de la consulta. De manera opcional, use un número de posición, donde la primera columna seleccionada es 1, la segunda es 2, etc. Solo una columna de una tabla puede ser la clave de distribución:  
+ Si declara una columna como la columna DISTKEY, DISTSTYLE debe estar configurado en KEY o no estar configurado.
+ Si no declara ninguna columna DISTKEY, puede establecer DISTSTYLE en EVEN.
+ Si no especifica DISTKEY ni DISTSTYLE, CTAS determina el estilo de distribución para la nueva tabla en función del plan de consulta para la cláusula SELECT. Para obtener más información, consulte [Herencia de atributos de columna y tabla](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes).
Puede definir la misma columna como la clave de distribución y la clave de ordenación; este enfoque tiende a acelerar las combinaciones cuando la columna en cuestión es una columna de combinación en la consulta.

[COMPOUND \$1 INTERLEAVED] SORTKEY (*nombre\$1de\$1columna* [, ... ])  
Especifica una o más claves de ordenación para la tabla. Cuando carga datos en la tabla, los datos se ordenan por las columnas que se designan como claves de ordenación.   
Puede especificar el estilo de ordenación COMPOUND o INTERLEAVED. La opción predeterminada es COMPOUND. Para obtener más información, consulte [Claves de clasificación](t_Sorting_data.md).  
Puede definir un máximo de 400 columnas COMPOUND SORTKEY u 8 columnas INTERLEAVED SORTKEY por tabla.   
Si no especifica SORTKEY, CTAS determina las claves de ordenación para la nueva tabla en función del plan de consulta para la cláusula SELECT. Para obtener más información, consulte [Herencia de atributos de columna y tabla](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes).    
COMPOUND  
Especifica que los datos se ordenan a través de una clave compuesta formada por todas las columnas enumeradas en el orden en que aparecen en la lista. Una clave de ordenación compuesta es útil cuando una consulta analiza filas según el orden de las columnas de ordenación. Los beneficios del rendimiento de ordenación con una clave compuesta se reducen cuando las consultas dependen de columnas de ordenación secundarias. Puede definir una cantidad máxima de 400 columnas COMPOUND SORTKEY por tabla.   
INTERLEAVED  
Especifica que los datos se ordenan a través de una clave de ordenación intercalada. Se puede especificar una cantidad máxima de ocho columnas para una clave de ordenación intercalada.   
Una ordenación intercalada otorga el mismo peso a cada columna o subconjunto de columnas de la clave de ordenación. Por lo tanto, las consultas no dependen del orden que tengan las columnas en la clave de ordenación. Cuando una consulta usa una o más columnas de ordenación secundarias, la ordenación intercalada mejora considerablemente el rendimiento de la consulta. La ordenación intercalada tiene un pequeño costo general para las operaciones de carga y limpieza de datos. 

AS *query*   
Se trata de cualquier consulta (instrucción SELECT) que Amazon Redshift admita.

# Notas de uso de CTAS
<a name="r_CTAS_usage_notes"></a>

## Límites
<a name="r_CTAS_usage_notes-limits"></a>

Amazon Redshift aplica una cuota del número de tablas por clúster según el tipo de nodo. 

La cantidad máxima de caracteres para el nombre de una tabla es 127. 

La cantidad máxima de columnas que se pueden definir en una única tabla es 1 600. 

## Herencia de atributos de columna y tabla
<a name="r_CTAS_usage_notes-inheritance-of-column-and-table-attributes"></a>

Las tablas CREATE TABLE AS (CTAS) no heredan restricciones, columnas de identidad, valores de columna predeterminados ni la clave principal de la tabla de la cual fueron creadas. 

No se pueden especificar codificaciones de compresión de las columnas para tablas CTAS. Amazon Redshift asigna de forma automática la codificación de compresión de la siguiente manera:
+ A las columnas que están definidas como claves de ordenación se les asigna una compresión RAW.
+ A las columnas que están definidas como tipos de datos BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY o GEOGRAPHY se les asigna una compresión RAW.
+ A las columnas que se definen como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ se les asigna la compresión AZ64.
+ A las columnas que se definen como CHAR, VARCHAR o VARBYTE se les asigna la compresión LZO.

Para obtener más información, consulte [Codificaciones de compresión](c_Compression_encodings.md) y [Tipos de datos](c_Supported_data_types.md). 

Para asignar explícitamente codificaciones de la columna, utilice [CREATE TABLE](r_CREATE_TABLE_NEW.md).

CTAS determina el estilo de distribución y la clave de ordenación para la nueva tabla en función del plan de consulta para la cláusula SELECT. 

Para consultas completas, como consultas que incluyen combinaciones, agregaciones, una cláusula de ordenación o una cláusula de límite, CTAS realiza su mejor esfuerzo por seleccionar el estilo de distribución y la clave de ordenación óptimos en función del plan de consulta. 

**nota**  
Para conseguir un mejor rendimiento con conjuntos de datos grandes o consultas complejas, recomendamos probar los conjuntos de datos típicos.

A menudo, puede predecir la clave de distribución y la clave de ordenación que CTAS selecciona al examinar el plan de consulta y ver cuáles son las columnas, si hay, que el optimizador de consultas selecciona para ordenar y distribuir datos. Si el nodo superior del plan de consulta es un análisis secuencial simple de una tabla única (XN Seq Scan), por lo general CTAS usa el estilo de distribución y la clave de ordenación de la tabla de origen. Si el nodo superior del plan de consulta no es un análisis secuencial (como XN Limit, XN Sort, XN HashAggregate, etc.), CTAS realiza su mejor esfuerzo por seleccionar el estilo de distribución y la clave de ordenación óptimos en función del plan de consulta.

Por ejemplo, supongamos que crea cinco tablas con los siguientes tipos de cláusulas SELECT:
+ Una instrucción de selección simple 
+ Una cláusula de límite 
+ Una cláusula de ordenación con LISTID 
+ Una cláusula de ordenación con QTYSOLD 
+ Una función de agregación SUM con una cláusula de agrupación.

En los siguientes ejemplos se muestra el plan de consulta para cada instrucción CTAS.

```
explain create table sales1_simple as select listid, dateid, qtysold from sales;
                           QUERY PLAN
----------------------------------------------------------------
 XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(1 row)


explain create table sales2_limit as select listid, dateid, qtysold from sales limit 100;
                              QUERY PLAN
----------------------------------------------------------------------
 XN Limit  (cost=0.00..1.00 rows=100 width=8)
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(2 rows)


explain create table sales3_orderbylistid as select listid, dateid, qtysold from sales order by listid;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Sort  (cost=1000000016724.67..1000000017155.81 rows=172456 width=8)
   Sort Key: listid
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(3 rows)


explain create table sales4_orderbyqty as select listid, dateid, qtysold from sales order by qtysold;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Sort  (cost=1000000016724.67..1000000017155.81 rows=172456 width=8)
   Sort Key: qtysold
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(3 rows)


explain create table sales5_groupby as select listid, dateid, sum(qtysold) from sales group by listid, dateid;
                              QUERY PLAN
----------------------------------------------------------------------
 XN HashAggregate  (cost=3017.98..3226.75 rows=83509 width=8)
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(2 rows)
```

Para ver la clave de distribución y la clave de ordenación de cada tabla, consulte la tabla de catálogo del sistema PG\$1TABLE\$1DEF como se muestra a continuación. 

```
select * from pg_table_def where tablename like 'sales%';

      tablename       |   column   | distkey | sortkey
----------------------+------------+---------+---------
 sales                | salesid    | f       |       0
 sales                | listid     | t       |       0
 sales                | sellerid   | f       |       0
 sales                | buyerid    | f       |       0
 sales                | eventid    | f       |       0
 sales                | dateid     | f       |       1
 sales                | qtysold    | f       |       0
 sales                | pricepaid  | f       |       0
 sales                | commission | f       |       0
 sales                | saletime   | f       |       0
 sales1_simple        | listid     | t       |       0
 sales1_simple        | dateid     | f       |       1
 sales1_simple        | qtysold    | f       |       0
 sales2_limit         | listid     | f       |       0
 sales2_limit         | dateid     | f       |       0
 sales2_limit         | qtysold    | f       |       0
 sales3_orderbylistid | listid     | t       |       1
 sales3_orderbylistid | dateid     | f       |       0
 sales3_orderbylistid | qtysold    | f       |       0
 sales4_orderbyqty    | listid     | t       |       0
 sales4_orderbyqty    | dateid     | f       |       0
 sales4_orderbyqty    | qtysold    | f       |       1
 sales5_groupby       | listid     | f       |       0
 sales5_groupby       | dateid     | f       |       0
 sales5_groupby       | sum        | f       |       0
```

En la siguiente tabla se resumen los resultados. Para simplificar, omitimos detalles de ancho, filas y costo del plan de explicación.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_CTAS_usage_notes.html)

Puede especificar explícitamente el estilo de distribución y la clave de ordenación en la instrucción de CTAS. Por ejemplo, la siguiente instrucción crea una tabla con la distribución EVEN y especifica SALESID como la clave de ordenación.

```
create table sales_disteven
diststyle even
sortkey (salesid)
as
select eventid, venueid, dateid, eventname
from event;
```

## Codificación de compresión
<a name="r_CTAS_usage_notes_encoding"></a>

ENCODE AUTO se usa como la opción predeterminada para las tablas. Amazon Redshift administra de forma automática la codificación de compresión para todas las columnas de la tabla.

## Distribución de datos entrantes
<a name="r_CTAS_usage_notes-distribution-of-incoming-data"></a>

Cuando el esquema de distribución hash de los datos entrantes coincide con el de la tabla de destino, no es necesaria la distribución física de datos cuando se cargan los datos. Por ejemplo, si se configura una clave de distribución para la nueva tabla y los datos se insertan desde otra tabla que está distribuida en la misma columna clave, los datos se cargan en el lugar a través de los mismos nodos y sectores. No obstante, si las tablas de origen y destino se configuran en distribución EVEN, los datos se redistribuyen en la tabla de destino. 

## Operaciones ANALYZE automáticas
<a name="r_CTAS_usage_notes-automatic-analyze-operations"></a>

Amazon Redshift analiza de forma automática las tablas que usted crea con los comandos CTAS. No necesita ejecutar el comando ANALYZE en estas tablas cuando se crean. Si las modifica, debe analizarlas de la misma manera en que analiza las demás tablas. 

# Ejemplos de CTAS
<a name="r_CTAS_examples"></a>

En el siguiente ejemplo, se crea una tabla denominada EVENT\$1BACKUP para la tabla EVENT:

```
create table event_backup as select * from event;
```

La tabla resultante hereda las claves de distribución y ordenación de la tabla EVENT. 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'event_backup';

column    | type                        | encoding | distkey | sortkey
----------+-----------------------------+----------+---------+--------
catid     | smallint                    | none     | false   |       0
dateid    | smallint                    | none     | false   |       1
eventid   | integer                     | none     | true    |       0
eventname | character varying(200)      | none     | false   |       0
starttime | timestamp without time zone | none     | false   |       0
venueid   | smallint                    | none     | false   |       0
```

El siguiente comando crea una tabla nueva denominada EVENTDISTSORT al seleccionar cuatro columnas de la tabla EVENT. La tabla nueva es distribuida por EVENTID y ordenada por EVENTID y DATEID: 

```
create table eventdistsort
distkey (1)
sortkey (1,3)
as
select eventid, venueid, dateid, eventname
from event;
```

El resultado es el siguiente.

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistsort';

column   |          type          | encoding | distkey | sortkey
---------+------------------------+----------+---------+-------
eventid   | integer               | none     | t       | 1
venueid   | smallint              | none     | f       | 0
dateid    | smallint              | none     | f       | 2
eventname | character varying(200)| none     | f       | 0
```

Podría crear exactamente la misma tabla al utilizar nombres de columnas para las claves de distribución y ordenación. Por ejemplo:

```
create table eventdistsort1
distkey (eventid)
sortkey (eventid, dateid)
as
select eventid, venueid, dateid, eventname
from event;
```

La siguiente instrucción aplica una distribución uniforme a la tabla, pero no define una clave de ordenación explícita: 

```
create table eventdisteven
diststyle even
as
select eventid, venueid, dateid, eventname
from event;
```

La tabla no hereda la clave de ordenación de la tabla EVENT (EVENTID) porque la distribución EVEN está especificada para la tabla nueva. La tabla nueva no tiene clave de ordenación ni clave de distribución. 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdisteven';

column    |          type          | encoding | distkey | sortkey
----------+------------------------+----------+---------+---------
eventid   | integer                | none     | f       | 0
venueid   | smallint               | none     | f       | 0
dateid    | smallint               | none     | f       | 0
eventname | character varying(200) | none     | f       | 0
```

La siguiente instrucción aplica distribución uniforme y define una clave de ordenación: 

```
create table eventdistevensort diststyle even sortkey (venueid)
as select eventid, venueid, dateid, eventname from event;
```

 La tabla resultante tiene una clave de ordenación pero no tiene una clave de distribución. 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistevensort';

column    |          type          | encoding | distkey | sortkey
----------+------------------------+----------+---------+-------
eventid   | integer                | none     | f       | 0
venueid   | smallint               | none     | f       | 1
dateid    | smallint               | none     | f       | 0
eventname | character varying(200) | none     | f       | 0
```

La siguiente instrucción redistribuye la tabla EVENT en una columna de clave diferente de los datos entrantes, que está ordenada en la columna EVENTID, y no define una columna SORTKEY. Por lo tanto, la tabla no se ordena. 

```
create table venuedistevent distkey(venueid)
as select * from event;
```

El resultado es el siguiente. 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'venuedistevent';

 column   |            type             | encoding | distkey | sortkey
----------+-----------------------------+----------+---------+-------
eventid   | integer                     | none     | f       | 0
venueid   | smallint                    | none     | t       | 0
catid     | smallint                    | none     | f       | 0
dateid    | smallint                    | none     | f       | 0
eventname | character varying(200)      | none     | f       | 0
starttime | timestamp without time zone | none     | f       | 0
```

# CREATE TEMPLATE
<a name="r_CREATE_TEMPLATE"></a>

Crea plantillas reutilizables para comandos de Amazon Redshift como [COPY](r_COPY.md). Las plantillas almacenan parámetros de uso común que pueden consultarse en múltiples ejecuciones de comandos, lo que mejora la coherencia y reduce la especificación manual de parámetros.

Las plantillas eliminan la necesidad de especificar repetidamente los mismos parámetros de formato en múltiples operaciones, mientras que las rutas de origen, las tablas de destino y la autorización pueden variar entre operaciones.

## Privilegios necesarios
<a name="r_CREATE_TEMPLATE-privileges"></a>

Para crear una plantilla, debe tener una de las siguientes opciones:
+ Privilegios de superusuario
+ Permiso CREATE en el esquema donde desea crear la plantilla, o permiso CREATE con ámbito en los esquemas de la base de datos donde desea crear la plantilla.

## Sintaxis
<a name="r_CREATE_TEMPLATE-synopsis"></a>

```
CREATE [ OR REPLACE ] TEMPLATE [database_name.][schema_name.]template_name
FOR COPY [ AS ]
[ [ FORMAT ] [ AS ] data_format ]
[ parameter [ argument ] [ , ... ] ];
```

## Parameters
<a name="r_CREATE_TEMPLATE-parameters"></a>

 *OR REPLACE*   
Si ya existe una plantilla con el mismo nombre en la base de datos y el esquema especificados, se sustituirá la plantilla existente. Solo puede sustituir una plantilla por una nueva que defina el mismo tipo de operación, por ejemplo, COPY. Debe tener los privilegios necesarios para reemplazar una plantilla.

*database\$1name*  
(Opcional) El nombre de la base de datos donde se creará la plantilla. Si no se especifica, la plantilla se crea en la base de datos actual.  
Si no existe la base de datos o el esquema, no se crea la plantilla y la instrucción devuelve un error. No puede crear plantillas en las bases de datos del sistema `template0`, `template1`, `padb_harvest` ni `sys:internal`.

*schema\$1name*  
(Opcional) El nombre del esquema donde se creará la plantilla. Si no se especifica, la plantilla se crea en el esquema actual.  
Si se proporciona un nombre de esquema, la plantilla nueva se crea en ese esquema (suponiendo que el creador tiene acceso al esquema). El nombre de la plantilla debe ser un nombre único para ese esquema.

*template\$1name*  
El nombre de la plantilla que se va a crear. De manera opcional, puede clasificar el nombre de la plantilla con el nombre de la base de datos y del esquema. En el siguiente ejemplo, el nombre de base de datos es `demo_database`, el nombre de esquema es `demo_schema` y el nombre de plantilla es `test`. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).  

```
CREATE TEMPLATE demo_database.demo_schema.test FOR COPY AS CSV;
```

COPY  
Especifica el tipo de comando de Redshift para el que se crea la plantilla. Actualmente, solo se admite el comando COPY.

[ [ FORMAT ] [ AS ] *data\$1format* ]   
Se trata de un parámetro opcional. Especifica el formato de datos para las operaciones COPY.

[ *parameter* [ argument ]]  
Cualquier parámetro válido para el comando de redshift especificado.  
Por ejemplo, las plantillas del comando COPY pueden incluir:  
+ [Parámetros de formato de datos](copy-parameters-data-format.md)
+ [Parámetros de compresión de archivos](copy-parameters-file-compression.md)
+ [Parámetros de conversión de datos](copy-parameters-data-conversion.md)
+ [Operaciones de carga de datos](copy-parameters-data-load.md)
Para obtener una lista completa de los parámetros admitidos, consulte el comando [COPY](r_COPY.md).

### Notas de uso
<a name="create_template-usage-notes"></a>
+ Por defecto, todos los usuarios tienen privilegios CREATE y USAGE en el esquema PUBLIC. Para no permitirles a los usuarios crear objetos en el esquema PUBLIC de una base de datos, use el comando REVOKE para eliminar ese privilegio.
+ Cuando un parámetro existe tanto en la plantilla como en el comando, el parámetro del comando tiene prioridad.
+ Las plantillas son objetos de base de datos y siguen las reglas estándar de Redshift para la denominación y los permisos de los objetos. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).
+ Las plantillas no pueden contener especificaciones de archivos manifiestos para el comando [COPY](r_COPY.md).

### Limitaciones
<a name="create_template-limitations"></a>
+ Se debe especificar al menos un parámetro al crear una plantilla.
+ Parámetros excluidos: los parámetros específicos de los comandos, como las rutas de origen, las tablas de destino, las credenciales de autorización y las especificaciones de los archivos de manifiesto, no se pueden incluir en las plantillas. Estos parámetros deben especificarse en el comando real.
+ Número máximo de plantillas por clúster: puede crear un máximo de 1000 plantillas por clúster. Este límite se aplica al número total de plantillas en todas las bases de datos y esquemas del clúster.
+ Referencias entre bases de datos: no se puede hacer referencia a plantillas entre bases de datos.
+ Datos compartidos: las plantillas no se pueden incluir en recursos de datos compartidos. Las plantillas se deben crear por separado en cada clúster donde se necesiten.

## Ejemplos
<a name="r_CREATE_TEMPLATE-examples"></a>

En el siguiente ejemplo se crea una plantilla para el comando COPY. 

```
CREATE TEMPLATE test_schema.demo_template
FOR COPY
AS
FORMAT JSON 'auto'
NULL AS ''
MAXERROR 100;
```

Use [SHOW TEMPLATE](r_SHOW_TEMPLATE.md) para obtener la definición de la plantilla:

```
SHOW TEMPLATE test_schema.demo_template;
CREATE OR REPLACE TEMPLATE dev.test_schema.demo_template FOR COPY AS FORMAT AS JSON 'auto' NULL '' MAXERROR 100;
```

 Consulte la vista del sistema [SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md) para obtener más detalles acerca de una plantilla. 

```
SELECT * FROM SYS_REDSHIFT_TEMPLATE;

database_name | schema_name | template_name | template_type |        create_time         |     last_modified_time     | owner_id | last_modified_by | template_parameters 
---------------+-------------+---------------+---------------+----------------------------+----------------------------+----------+------------------+---------------------
 dev           | test_schema | demo_template |             1 | 2025-12-17 20:06:01.944171 | 2025-12-17 20:06:01.944171 |        1 |                1 | {
    "JSON": "auto",
    "MAXERROR": 100,
    "NULL": ""
}
```

# CREATE USER
<a name="r_CREATE_USER"></a>

Crea un nuevo usuario de base de datos. Los usuarios de base de datos pueden recuperar datos, ejecutar comandos y realizar otras acciones en una base de datos, en función de sus privilegios y roles. Debe ser un superusuario de base de datos para ejecutar este comando.

## Privilegios necesarios
<a name="r_CREATE_USER-privileges"></a>

Los siguientes privilegios son necesarios para CREATE USER:
+ Superusuario
+ Usuarios con el privilegio CREATE USER

## Sintaxis
<a name="r_CREATE_USER-synopsis"></a>

```
CREATE USER name [ WITH ]
PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ option [ ... ] ]

where option can be:

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| IN GROUP groupname [, ... ]
| VALID UNTIL 'abstime'
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit
| EXTERNALID external_id
```

## Parameters
<a name="r_CREATE_USER-parameters"></a>

 *name*   
Nombre del usuario que se va a crear. El nombre de usuario no puede ser `PUBLIC`. Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md).

WITH  
Palabra clave opcional. Amazon Redshift ignora la palabra WITH.

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
Establece la contraseña del usuario.   
De manera predeterminada, los usuarios pueden cambiar sus propias contraseñas, a menos que la contraseña esté deshabilitada. Para deshabilitar la contraseña de un usuario, especifique DISABLE. Cuando se deshabilita la contraseña de un usuario, se elimina del sistema y el usuario solo puede iniciar sesión con credenciales de usuario de AWS Identity and Access Management IAM temporales. Para obtener más información, consulte [Uso de la autenticación de IAM para generar credenciales de usuario de base de datos](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html). Solo un superusuario puede habilitar o deshabilitar contraseñas. No puede deshabilitar la contraseña de un superusuario. Para habilitar una contraseña, ejecute [ALTER USER](r_ALTER_USER.md) y especifique una contraseña.  
Puede especificar la contraseña en texto sin cifrar, como una cadena hash MD5 o como una cadena de algoritmo hash seguro-256.   
 Cuando lanza un clúster nuevo a través de la Consola de administración de AWS, la AWS CLI o la API de Amazon Redshift, debe proporcionar una contraseña de texto sin cifrar para el usuario inicial de la base de datos. Puede cambiar la contraseña en otro momento al utilizar [ALTER USER](r_ALTER_USER.md). 
Para texto sin cifrar, la contraseña debe cumplir con las siguientes restricciones:  
+ Tener entre 8 y 64 caracteres de longitud.
+ Contener al menos una letra en mayúsculas, una letra en minúsculas y un número.
+ Puede utilizar cualquier carácter ASCII con códigos ASCII del rango 33-126, excepto ' (comilla simple), " (comilla doble), \$1, / o @.
Como una alternativa más segura para especificar el parámetro de contraseña CREATE USER como texto sin cifrar, puede especificar un hash MD5 de una cadena que incluya la contraseña y el nombre de usuario.   
Cuando especifica una cadena hash MD5, el comando CREATE USER busca una cadena hash MD5 válida, pero no valida la porción de la contraseña de la cadena. En este caso es posible crear una contraseña, como una cadena vacía, que no puede usar para ingresar en la base de datos.
Siga estos pasos para especificar una contraseña MD5:   

1. Concatene la contraseña y el nombre de usuario. 

   Por ejemplo, para la contraseña `ez` y el usuario `user1`, la cadena concatenada es `ezuser1`. 

1. Convierta la cadena concatenada en una cadena hash MD5 de 32 caracteres. Puede usar cualquier utilidad MD5 para crear la cadena hash. En el siguiente ejemplo, se utiliza [Función MD5](r_MD5.md) de Amazon Redshift y el operador de concatenación (\$1\$1) para devolver una cadena hash MD5 de 32 caracteres. 

   ```
   select md5('ez' || 'user1');
                           
   md5
   --------------------------------
   153c434b4b77c89e6b94f12c5393af5b
   ```

1. Concatene "`md5`" delante de la cadena hash MD5 y proporcione la cadena concatenada como argumento *md5hash*.

   ```
   create user user1 password 'md5153c434b4b77c89e6b94f12c5393af5b';
   ```

1. Inicie sesión en la base de datos con las credenciales de inicio de sesión. 

   Para este ejemplo, ingrese como `user1` con la contraseña `ez`. 
Otra alternativa segura es especificar un hash de algoritmo hash seguro-256 de una cadena de contraseñas; o puede proporcionar su propio resumen de algoritmo hash seguro-256 válido y la sal de 256 bits que se utilizó para crear el resumen.  
+ Resumen: salida de una función de hash.
+ Sal: datos generados aleatoriamente que se combinan con la contraseña para ayudar a reducir los patrones en la salida de la función hash.

```
'sha256|Mypassword'
```

```
'sha256|digest|256-bit-salt'
```
En el siguiente ejemplo, Amazon Redshift genera y administra la sal.   

```
CREATE USER admin PASSWORD 'sha256|Mypassword1';
```
En el siguiente ejemplo, se proporciona un resumen de algoritmo hash seguro-256 válido y una sal de 256 bits que se utilizó para crear el resumen.  
Para especificar una contraseña y cifrarla con tu propio valor de salt, sigue estos pasos:  

1. Cree un valor de salt de 256 bits. Puede obtener un valor de salt utilizando cualquier generador de cadenas hexadecimales para generar una cadena de 64 caracteres de longitud. En este ejemplo, el valor de salt es `c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6`. 

1.  Utilice la función FROM\$1HEX para convertir su valor de salt en binario. Esto se debe a que la función SHA2 requiere la representación binaria del valor de salt. Utilice la siguiente instrucción. 

   ```
   SELECT FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6');
   ```

1.  Utilice la función CONCAT para anexar su valor de salt a su contraseña. Para este ejemplo, la contraseña es `Mypassword1`. Utilice la siguiente instrucción. 

   ```
   SELECT CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6'));
   ```

1. Utilice la función SHA2 para crear un resumen a partir de la combinación de contraseña y valor de salt. Utilice la siguiente instrucción.

   ```
   SELECT SHA2(CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6')), 0);
   ```

1.  Mediante el resumen y el valor de sal de los pasos anteriores, cree el usuario. Utilice la siguiente instrucción. 

   ```
   CREATE USER admin PASSWORD 'sha256|821708135fcc42eb3afda85286dee0ed15c2c461d000291609f77eb113073ec2|c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6';
   ```

1. Inicie sesión en la base de datos con las credenciales de inicio de sesión.

    Para este ejemplo, ingrese como `admin` con la contraseña `Mypassword1`.
Si configura una contraseña en texto sin formato sin especificar la función de hash, se genera un resumen MD5 utilizando el nombre de usuario como la sal. 

CREATEDB \$1 NOCREATEDB   
La opción CREATEDB permite que el usuario cree bases de datos. El valor predeterminado es NOCREATEDB.

CREATEUSER \$1 NOCREATEUSER   
La opción CREATEUSER crea un superusuario con todos los privilegios de base de datos, incluido CREATE USER. El valor predeterminado es NOCREATEUSER. Para obtener más información, consulte [Superusuarios](r_superusers.md).

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="create-user-syslog-access"></a>
Se trata de una cláusula que especifica el nivel de acceso a las vistas y las tablas de sistema de Amazon Redshift que tiene el usuario.   
Los usuarios normales que tengan el permiso SYSLOG ACCESS RESTRICTED solo pueden ver las filas generadas por ese usuario en las tablas y vistas del sistema visibles para el usuario. El valor predeterminado es RESTRICTED.   
Los usuarios normales que tengan el permiso SYSLOG ACCESS UNRESTRICTED pueden ver todas las filas en las tablas y vistas del sistema visibles para el usuario, incluidas las filas generadas por otro usuario. UNRESTRICTED no permite que los usuarios normales puedan obtener acceso a las tablas visibles para los superusuarios. Solo los superusuarios pueden ver estas tablas.   
Al brindar a un usuario acceso sin restricciones a las tablas del sistema, le proporciona la visibilidad necesaria para ver los datos generados por otros usuarios. Por ejemplo, STL\$1QUERY y STL\$1QUERYTEXT contienen todo el texto de las instrucciones INSERT, UPDATE y DELETE, que podrían incluir datos confidenciales generados por los usuarios. 
Todas las filas de SVV\$1TRANSACTIONS son visibles para todos los usuarios.   
Para obtener más información, consulte [Visibilidad de datos en las tablas y vistas de sistema](cm_chap_system-tables.md#c_visibility-of-data).

IN GROUP *groupname*   
Especifica el nombre de un grupo existente al que pertenece el usuario. Se pueden enumerar varios nombres de grupos.

VALID UNTIL *abstime*   
La opción VALID UNTIL establece un tiempo absoluto después del cual la contraseña de la cuenta de usuario ya no es válida. Por defecto, la contraseña no tiene límite de tiempo.

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
La cantidad máxima de conexiones a la base de datos que el usuario puede 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 aplicar un límite en la cantidad de conexiones de cada base de datos. Para obtener más información, consulte [CREATE DATABASE](r_CREATE_DATABASE.md). El valor predeterminado es UNLIMITED. Para ver las conexiones actuales, consulte la vista del sistema [STV\$1SESSIONS](r_STV_SESSIONS.md).  
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.

SESSION TIMEOUT *limit*  
El tiempo máximo en segundos durante el cual una sesión permanece inactiva o en reposo. El rango es de 60 segundos (un minuto) a 1 728 000 segundos (20 días). Si no se establece el tiempo de espera de la sesión para el usuario, se aplica el ajuste del clúster. Para obtener más información, consulte [Cuotas y límites de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) en la *Guía de administración de Amazon Redshift*.  
Cuando se establece el tiempo de espera de la sesión, se aplica solo a las sesiones nuevas.  
Para ver información sobre las sesiones de usuario activas, incluidos la hora de inicio, el nombre de usuario y el tiempo de espera de la sesión, consulte la vista de sistema [STV\$1SESSIONS](r_STV_SESSIONS.md). Para ver información sobre el historial de sesiones del usuario, consulte la vista [STL\$1SESSIONS](r_STL_SESSIONS.md). Para recuperar información acerca de los usuarios de las bases de datos, incluidos los valores de tiempo de espera de la sesión, consulte la vista [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md).

EXTERNALID *external\$1id*  
El identificador del usuario, que está asociado a un proveedor de identidades. El usuario debe tener desactivada la contraseña. Para obtener más información, consulte [Federación de proveedores de identidades (IdP) nativos para Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

### Notas de uso
<a name="create_user-usage-notes"></a>

Por defecto, todos los usuarios tienen privilegios CREATE y USAGE en el esquema PUBLIC. Para no permitirles a los usuarios crear objetos en el esquema PUBLIC de una base de datos, use el comando REVOKE para eliminar ese privilegio.

Cuando use la autenticación de IAM para crear credenciales de usuario de la base de datos, tal vez le convenga crear un superusuario que solo pueda iniciar sesión con credenciales temporales. Puede deshabilitar la contraseña de un superusuario, pero no puede crear una contraseña desconocida mediante una cadena hash MD5 generada aleatoriamente.

```
create user iam_superuser password 'md5A1234567890123456780123456789012' createuser;
```

El caso de un *nombre de usuario* entre comillas dobles se conserva siempre, independientemente del valor de la opción de configuración `enable_case_sensitive_identifier`. Para obtener más información, consulte [enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md).

## Ejemplos
<a name="r_CREATE_USER-examples"></a>

El siguiente comando crea un usuario denominado dbuser con la contraseña “abcD1234”, privilegios de creación de base de datos y un límite de conexión de 30.

```
create user dbuser with password 'abcD1234' createdb connection limit 30;
```

 Consulte la tabla de catálogos PG\$1USER\$1INFO para ver detalles de un usuario de la base de datos. 

```
select * from pg_user_info;
         
 usename   | usesysid | usecreatedb | usesuper | usecatupd | passwd   | valuntil | useconfig | useconnlimit
-----------+----------+-------------+----------+-----------+----------+----------+-----------+-------------
 rdsdb     |        1 | true        | true     | true      | ******** | infinity |           |
 adminuser |      100 | true        | true     | false     | ******** |          |           | UNLIMITED
 dbuser    |      102 | true        | false    | false     | ******** |          |           | 30
```

En el siguiente ejemplo, la contraseña de la cuenta es válida hasta el 10 de junio de 2017.

```
create user dbuser with password 'abcD1234' valid until '2017-06-10';
```

 En el siguiente ejemplo, se crea un usuario con una contraseña que distingue entre mayúsculas y minúsculas que contiene caracteres especiales.

```
create user newman with password '@AbC4321!';
```

 Para usar una barra oblicua inversa ("\$1") en la contraseña MD5, encierre la barra oblicua inversa con una barra oblicua inversa en la cadena de origen. En el siguiente ejemplo, se crea un usuario denominado `slashpass` con una barra oblicua inversa ("`\`") como la contraseña. 

```
select md5('\\'||'slashpass');
         
md5
--------------------------------
0c983d1a624280812631c5389e60d48c
```

Cree un usuario con la contraseña md5.

```
create user slashpass password 'md50c983d1a624280812631c5389e60d48c';
```

En el siguiente ejemplo, se crea un usuario denominado `dbuser` con un tiempo de espera para las sesiones inactivas establecido en 120 segundos.

```
CREATE USER dbuser password 'abcD1234' SESSION TIMEOUT 120;
```

El siguiente ejemplo crea una usuario denominado `bob`. El espacio de nombres es `myco_aad`. Solo es un ejemplo. Para ejecutar el comando correctamente, debe tener un proveedor de identidades registrado. Para obtener más información, consulte [Federación de proveedores de identidades nativos (IdP) para Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

```
CREATE USER myco_aad:bob EXTERNALID "ABC123" PASSWORD DISABLE;
```

# CREATE VIEW
<a name="r_CREATE_VIEW"></a>

Crea una vista en una base de datos. La vista no está materializada físicamente; la consulta que define la vista se ejecuta cada vez que se hace referencia a dicha vista en una consulta. Para crear una vista con una tabla externa, incluya la cláusula WITH NO SCHEMA BINDING.

Para crear una vista estándar, debe obtener acceso a las tablas o vistas subyacentes. Para consultar una vista estándar, debe seleccionar los premisos de la vista, pero no es necesario seleccionar permisos para las tablas subyacentes. Si crea una vista que haga referencia a una tabla o vista de otro esquema o si crea una vista que haga referencia a una vista materializada, es posible que necesite permisos de uso. Para consultar una vista de enlace tardío, debe seleccionar los permisos de la propia vista de enlace tardío. También debe asegurarse de que el propietario de la vista de enlace tardío tiene permisos de selección para los objetos de referencia (tablas, vistas o funciones definidas por el usuario). Para obtener más información acerca de las vistas de enlace tardío, consulte [Notas de uso](#r_CREATE_VIEW_usage_notes).

## Permisos necesarios
<a name="r_CREATE_VIEW-privileges"></a>

Para utilizar CREATE VIEW, se requiere uno de los siguientes permisos.
+ Para crear una vista con CREATE [ OR REPLACE ] VIEW:
  + Superusuario
  + Usuarios con el permiso CREATE [ REPLACE ] VIEW
+ Para reemplazar una vista existente mediante CREATE OR REPLACE VIEW:
  + Superusuario
  + Usuarios con el permiso CREATE [ OR REPLACE ] VIEW
  + Propietario de la vista

Si un usuario desea acceder a una vista que incorpora una función definida por el usuario, debe contar con el permiso EXECUTE en esa función.

## Sintaxis
<a name="r_CREATE_VIEW-synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]
```

## Parameters
<a name="r_CREATE_VIEW-parameters"></a>

OR REPLACE   
Si ya existe una vista con el mismo nombre, se sustituye la vista. Solo puede reemplazar una vista con una nueva consulta que genere el conjunto idéntico de columnas, con los mismos nombres de columnas y los mismos tipos de datos. CREATE OR REPLACE VIEW bloquea la vista para lecturas y escrituras hasta que se completa la operación.  
Cuando se reemplaza una vista, se conservan sus otras propiedades, como la propiedad y los privilegios concedidos. 

 *name*   
El nombre de la vista. Si se proporciona un nombre de esquema (como `myschema.myview`), la vista se crea con el esquema especificado. De lo contrario, la vista se crea en el esquema actual. El nombre de la vista debe ser distinto al de cualquier otra vista o tabla en el mismo esquema.   
Si especifica un nombre de vista que comienza con "\$1", la vista se crea como una vista temporal que solo es visible en la sesión actual.  
Para obtener más información acerca de los nombres válidos, consulte [Nombres e identificadores](r_names.md). No puede crear tablas o vistas en las bases de datos del sistema template0, template1, padb\$1harvest o sys:internal.

 *column\$1name*   
Lista opcional de nombres que se utilizarán para las columnas en la vista. Si no se proporcionan nombres de columnas, se derivan de la consulta. La cantidad máxima de columnas que se pueden definir en una única vista es 1 600.

 *query*   
Una consulta (en la forma de una instrucción SELECT) que se evalúa en una tabla. Esta tabla define las columnas y filas de la vista. 

 WITH NO SCHEMA BINDING   
Cláusula que especifica que la vista no está vinculada a los objetos de base de datos subyacentes, como tablas y funciones definidas por el usuario. Por tanto, no existe ninguna dependencia entre la vista y los objetos a los que hace referencia. Puede crear una vista aunque no existan los objetos a los que se hace referencia. Como no hay dependencias, puede quitar o modificar un objeto al que se referencie sin que esto afecte a la vista. Amazon Redshift no verifica si existen dependencias hasta que se consulta la vista. No se admiten expresiones de tabla comunes recursivas (rCTE) con vistas de enlace tardío. Para ver los detalles de las vistas de enlace tardío, ejecute la función [PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS](PG_GET_LATE_BINDING_VIEW_COLS.md).  
Cuando incluya la cláusula WITH NO SCHEMA BINDING, las tablas y vistas a las que se hace referencia en la instrucción SELECT deben incluir el nombre de un esquema. El esquema debe existir cuando se crea la vista, aunque no exista la tabla a la que se hace referencia. Por ejemplo, la siguiente instrucción devuelve un error.   

```
create view myevent as select eventname from event
with no schema binding;
```
La siguiente instrucción se ejecuta correctamente.  

```
create view myevent as select eventname from public.event
with no schema binding;
```

**nota**  
No se puede actualizar, insertar en o eliminar de una vista. 

## Notas de uso
<a name="r_CREATE_VIEW_usage_notes"></a>



### Vistas de enlace en tiempo de ejecución
<a name="r_CREATE_VIEW_late-binding-views"></a>

Una vista de enlace en tiempo de ejecución comprueba los objetos de base de datos subyacentes, como tablas y otras vistas, hasta que se consulta la vista. Por consiguiente, puede modificar o borrar los objetos subyacentes sin borrar o volver a crear la vista. Si borra objetos subyacentes, las consultas a la vista de enlace de tiempo de ejecución darán error. Si la consulta de la vista de enlace de tiempo de ejecución hace referencia a columnas del objeto subyacente que no están presentes, la consulta no se ejecutará correctamente. 

 Si borra y luego vuelve a crear una tabla o vista subyacente de la vista de enlace de tiempo de ejecución, el nuevo objeto se creará con los permisos de acceso predeterminados. Es posible que deba conceder permisos para los objetos subyacentes a los usuarios que consultarán la vista. 

Para crear una vista de enlace en tiempo de ejecución, incluya la cláusula WITH NO SCHEMA BINDING. El siguiente ejemplo crea un vista sin enlace con el esquema. 

```
create view event_vw as select * from public.event
with no schema binding;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | eventname     | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

El siguiente ejemplo muestra que puede modificar o borrar una tabla subyacente sin volver a crear la vista. 

```
alter table event rename column eventname to title;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | title         | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

Solo puede referenciar las tablas externas de Amazon Redshift Spectrum en una vista de enlace de tiempo de ejecución. Una aplicación de las vistas de enlace de tiempo de ejecución es consultar las tablas de Amazon Redshift y de Redshift Spectrum. Por ejemplo, puede utilizar el comando [UNLOAD](r_UNLOAD.md) para archivar datos más antiguos en Amazon S3. Luego, cree una tabla externa de Redshift Spectrum que referencie los datos de Amazon S3 y cree una vista que consulte ambas tablas. En el siguiente ejemplo, se utiliza una cláusula UNION ALL para combinar la tabla `SALES` de Amazon Redshift y la tabla `SPECTRUM.SALES` de Redshift Spectrum.

```
create view sales_vw as
select * from public.sales
union all
select * from spectrum.sales
with no schema binding;
```

Para obtener más información acerca de la creación de tablas externas de Redshift Spectrum, incluida la tabla `SPECTRUM.SALES`, consulte [Introducción a Amazon Redshift Spectrum](c-getting-started-using-spectrum.md).

**importante**  
Al crear una vista estándar a partir de una vista de enlace tardío, la definición estándar de la vista contiene la definición de la vista de enlace tardío en el momento en que se creó la vista estándar, incluido el propietario de la vista de enlace tardío. Si realiza un cambio en la vista de enlace tardío subyacente, esos cambios no se utilizarán en la vista estándar hasta que esta se vuelva a crear. Por lo tanto, cuando se consulta la vista estándar, siempre utilizará la definición de la vista de enlace tardío y el propietario de la vista de enlace tardío para comprobar los permisos en el momento de crear la vista estándar.

Para actualizar la vista estándar y hacer referencia a la definición más reciente de la vista de enlace tardío, ejecute CREATE OR REPLACE VIEW con la definición de vista inicial que ha utilizado para crear la vista estándar.

Consulte el siguiente ejemplo de creación de una vista estándar a partir de una vista de enlace tardío.

```
create view sales_vw_lbv as 
select * from public.sales 
with no schema binding;

show view sales_vw_lbv;
                            Show View DDL statement
--------------------------------------------------------------------------------
 create view sales_vw_lbv as select * from public.sales with no schema binding;
(1 row)

create view sales_vw as 
select * from sales_vw_lbv;

show view sales_vw;
                                               Show View DDL statement
---------------------------------------------------------------------------------------------------------------------
 SELECT sales_vw_lbv.price, sales_vw_lbv."region" FROM (SELECT sales.price, sales."region" FROM sales) sales_vw_lbv;
(1 row)
```

Tenga en cuenta que la vista de enlace tardío, tal como se muestra en la instrucción DDL de la vista estándar, se define al crear la vista estándar y no se actualizará con los cambios que realice posteriormente en la vista de enlace tardío.

## Ejemplos
<a name="r_CREATE_VIEW-examples"></a>

Los comandos de ejemplo utilizan un conjunto de objetos y datos de muestra denominado base de datos *TICKIT*. Para obtener más información, consulte [Base de datos de muestra](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html).

El siguiente comando crea una vista denominada *myevent* a partir de una tabla llamada EVENT. 

```
create view myevent as select eventname from event
where eventname = 'LeAnn Rimes';
```

El siguiente comando crea una vista denominada* myuser* a partir de una tabla llamada USERS. 

```
create view myuser as select lastname from users;
```

El siguiente comando crea o sustituye una vista denominada* myuser* a partir de una tabla llamada USERS. 

```
create or replace view myuser as select lastname from users;
```

El siguiente ejemplo crea un vista sin enlace con el esquema. 

```
create view myevent as select eventname from public.event
with no schema binding;
```

# DEALLOCATE
<a name="r_DEALLOCATE"></a>

Anula la asignación de una instrucción preparada. 

## Sintaxis
<a name="r_DEALLOCATE-synopsis"></a>

```
DEALLOCATE [PREPARE] plan_name
```

## Parameters
<a name="r_DEALLOCATE-parameters"></a>

PREPARE   
Esta palabra clave es opcional y se ignora. 

 *plan\$1name*   
El nombre de la instrucción preparada para la que desea cancelar la asignación. 

## Notas de uso
<a name="r_DEALLOCATE_usage_notes"></a>

DEALLOCATE se usa para cancelar la asignación de una instrucción SQL preparada con anterioridad. Si no desasigna explícitamente una instrucción preparada, se desasignará cuando finalice la sesión actual. Para obtener más información acerca de instrucciones preparadas, consulte [PREPARE](r_PREPARE.md).

## Véase también
<a name="r_DEALLOCATE-see-also"></a>

 [EXECUTE](r_EXECUTE.md), [PREPARE](r_PREPARE.md) 

# DECLARE
<a name="declare"></a>

Define un nuevo cursor. Utilice un cursor para recuperar algunas filas a la vez del conjunto de resultados de una consulta más grande. 

Cuando se recupera la primera fila de un cursor, el conjunto completo de resultados se materializa en el nodo principal, en la memoria o en el disco, si es necesario. Debido al posible impacto negativo en el rendimiento del uso de cursores con conjuntos de resultados grandes, recomendamos usar enfoques alternativos cuando sea posible. Para obtener más información, consulte [Consideraciones acerca del rendimiento cuando se utilizan cursores](#declare-performance).

Debe declarar un cursor dentro de un bloque de transacción. Solo se puede abrir un cursor a la vez por sesión. 

Para obtener más información, consulte [FETCH](fetch.md), [CLOSE](close.md).

## Sintaxis
<a name="declare-synopsis"></a>

```
DECLARE cursor_name CURSOR FOR query
```

## Parameters
<a name="declare-parameters"></a>

*cursor\$1name*   
Nombre del nuevo cursor. 

 *query*   
Una instrucción SELECT que rellena el cursor.

## Notas de uso acerca de DECLARE CURSOR
<a name="declare-usage"></a>

Si su aplicación cliente utiliza una conexión Open Database Connectivity (ODBC, Conectividad de base de datos abierta) y su consulta crea un conjunto de resultados que es demasiado grande para entrar en la memoria, puede transmitir el conjunto de resultados a su aplicación cliente por medio del cursor. Cuando utiliza un cursor, el conjunto completo de resultados se materializa en el nodo principal y, luego, el cliente puede recuperar los resultados gradualmente. 

**nota**  
Para habilitar cursores en ODBC para Microsoft Windows, habilite la opción **Use Declare/Fetch** (Utilizar Declarar/Recuperar) en el nombre de origen de datos (DSN) de ODBC que utiliza para Amazon Redshift. En los clústeres de varios nodos, es recomendable establecer el tamaño de la caché de ODBC en 4000 o un valor superior utilizando el campo **Cache Size (Tamaño de caché)** del cuadro de diálogo de opciones del DSN de ODBC para minimizar los recorridos de ida y vuelta. En un clúster de un nodo, configure el tamaño de la caché en 1 000.

Debido al posible impacto negativo en el rendimiento del uso de cursores, recomendamos usar enfoques alternativos cuando sea posible. Para obtener más información, consulte [Consideraciones acerca del rendimiento cuando se utilizan cursores](#declare-performance).

Los cursores de Amazon Redshift se admiten con las siguientes limitaciones:
+ Solo se puede abrir un cursor a la vez por sesión. 
+ Los cursores deben utilizarse dentro de una transacción (BEGIN … END). 
+ El tamaño máximo del conjunto de resultados acumulables para todos los cursores está limitado en función del tipo de nodo del clúster. Si necesita conjuntos de resultados más grandes, puede cambiar el tamaño a una configuración de nodos XL o 8XL.

  Para obtener más información, consulte [Restricciones del cursor](#declare-constraints). 

## Restricciones del cursor
<a name="declare-constraints"></a>

Cuando se recupera la primera fila de un cursor, el conjunto completo de resultados se materializa en el nodo principal. Si el conjunto de resultados no entra en la memoria, se escribe en el disco, según sea necesario. Para proteger la integridad del nodo principal, Amazon Redshift aplica restricciones al tamaño de todos los conjuntos de resultados del cursor, en función del tipo de nodo del clúster.

En la tabla siguiente se muestra el tamaño máximo total del conjunto de resultados para cada tipo de nodo de clúster. Los tamaños máximos del conjunto de resultados se expresan en megabytes.


| Tipo de nodo | Conjunto de resultados máximo por clúster (MB) | 
| --- | --- | 
|   DC2 LargeVarios nodos   | 192 000 | 
|   DC2 LargeUn solo nodo   | 8000 | 
|   Varios nodos DC2 8XL   | 3 200 000 | 
|   Varios nodos RA3 16XL   | 14 400 000 | 
|   Varios nodos RA3 4XL   | 3 200 000 | 
|   Varios nodos RA3 XLPLUS   | 1 000 000 | 
|   Nodo único RA3 XLPLUS   | 64 000 | 
|   Varios nodos RA3 LARGE   | 240 000 | 
|   Un nodo RA3 LARGE   | 8000 | 
| Amazon Redshift sin servidor | 150 000 | 

Para ver la configuración del cursor activo para un clúster, consulte la tabla del sistema [STV\$1CURSOR\$1CONFIGURATION](r_STV_CURSOR_CONFIGURATION.md) como superusuario. Para ver el estado de los cursores activos, consulte la table del sistema [STV\$1ACTIVE\$1CURSORS](r_STV_ACTIVE_CURSORS.md). El usuario puede ver solo las filas de los propios cursores de un usuario, pero un superusuario puede ver todos los cursores.

## Consideraciones acerca del rendimiento cuando se utilizan cursores
<a name="declare-performance"></a>

Debido a que los cursores materializan el conjunto completo de resultados en el nodo principal antes de comenzar a devolver resultados al cliente, el uso de cursores con conjuntos de resultados grandes puede tener un impacto negativo en el rendimiento. No recomendamos utilizar cursores con conjuntos de resultados muy grandes. En algunos casos, como cuando la aplicación usa una conexión ODBC, los cursores pueden ser la única solución viable. Si es posible, recomendamos utilizar estas alternativas:
+ Utilice [UNLOAD](r_UNLOAD.md) para exportar una tabla grande. Cuando utiliza UNLOAD, los nodos informáticos trabajan en paralelo para transferir los datos de forma directa a los archivos de datos en Amazon Simple Storage Service. Para obtener más información, consulte [Descarga de datos en Amazon Redshift](c_unloading_data.md). 
+ Establezca el parámetro de búsqueda de JDBC en la aplicación cliente. Si utiliza una conexión JDBC y se encuentra con errores de falta de memoria del lado del cliente, puede habilitar el cliente para recuperar conjuntos de resultados en lotes más pequeños al configurar el parámetro de tamaño de búsqueda de JDBC. Para obtener más información, consulte [Configuración del parámetro de tamaño de búsqueda de la JDBC](set-the-JDBC-fetch-size-parameter.md). 

## Ejemplos de DECLARE CURSOR
<a name="declare-example"></a>

En el siguiente ejemplo, se declara un cursor denominado LOLLAPALOOZA para seleccionar información de ventas para el evento Lollapalooza y, luego, se recuperan filas del conjunto de resultados a través del cursor:

```
-- Begin a transaction

begin;

-- Declare a cursor

declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';

-- Fetch the first 5 rows in the cursor lollapalooza:

fetch forward 5 from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-05-01 19:00:00 |   92.00000000 |       3
 Lollapalooza | 2008-11-15 15:00:00 |  222.00000000 |       2
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       3
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       4
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       1
(5 rows)

-- Fetch the next row:

fetch next from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-10-06 14:00:00 |  114.00000000 |       2

-- Close the cursor and end the transaction:

close lollapalooza;
commit;
```

El siguiente ejemplo realiza un bucle en un refcursor con todos los resultados de una tabla:

```
CREATE TABLE tbl_1 (a int, b int);
INSERT INTO tbl_1 values (1, 2),(3, 4);

CREATE OR REPLACE PROCEDURE sp_cursor_loop() AS $$
DECLARE
    target record;
    curs1 cursor for select * from tbl_1;
BEGIN
    OPEN curs1;
    LOOP
        fetch curs1 into target;
        exit when not found;
        RAISE INFO 'a %', target.a;
    END LOOP;
    CLOSE curs1;
END;
$$ LANGUAGE plpgsql;

CALL sp_cursor_loop();
         
SELECT message 
   from svl_stored_proc_messages 
   where querytxt like 'CALL sp_cursor_loop()%';
         
  message
----------
      a 1
      a 3
```

# DELETE
<a name="r_DELETE"></a>

Elimina filas de tablas.

**nota**  
El tamaño máximo de una instrucción SQL es de 16 MB.

## Sintaxis
<a name="r_DELETE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] { table_name | materialized_view_name }
    [ { USING } table_name, ... ]
    [ WHERE condition ]
```

## Parameters
<a name="r_DELETE-parameters"></a>

Cláusula WITH  
Se trata de una cláusula opcional que especifica una o más *common-table-expressions*. Consulte [Cláusula WITH](r_WITH_clause.md). 

FROM  
La palabra clave FROM es opcional, excepto cuando se especifica la cláusula USING. Las instrucciones `delete from event;` y `delete event;` son operaciones equivalentes que eliminan todas las filas de la tabla EVENT.  
Para eliminar todas las filas de una tabla, [TRUNCATE](r_TRUNCATE.md) la tabla. TRUNCATE es mucho más eficiente que DELETE y no requiere VACUUM ni ANALYZE. No obstante, tenga en cuenta que TRUNCATE confirma la transacción en la que se ejecuta.

 *table\$1name*   
Una tabla temporal o persistente. Solo el propietario de la tabla o un usuario con el privilegio DELETE en la tabla puede eliminar filas de la tabla.  
Considere utilizar el comando TRUNCATE para las operaciones de eliminación incompletas rápidas en tablas grandes; para ello, consulte [TRUNCATE](r_TRUNCATE.md).  
Después de eliminar una gran cantidad de filas de una tabla:  
+ Limpie la tabla para recuperar espacio de almacenamiento y reordene las filas.
+ Analice la tabla para actualizar las estadísticas para el planificador de consultas.

 *materialized\$1view\$1name*   
Una vista materializada. La instrucción DELETE funciona en una vista materializada utilizada para [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md). Solo el propietario de la vista materializada o un usuario con privilegio DELETE sobre la vista materializada puede eliminar filas de ella.  
No puede ejecutar DELETE en una vista materializada para la ingesta de streaming con una política de seguridad a nivel de fila (RLS) que no tenga el permiso IGNORE RLS concedido al usuario. Hay una excepción a esto: Si el usuario que realiza la operación DELETE tiene concedida la opción IGNORE RLS, esta se ejecuta correctamente. Para obtener más información, consulte [Propiedad y administración de la política de RLS](https://docs.aws.amazon.com/redshift/latest/dg/t_rls_ownership.html).

USING *table\$1name (nombre\$1de\$1tabla)*, ...  
La palabra clave USING se utiliza para presentar una lista de tabla cuando se hace referencia a tablas adicionales en la condición de la cláusula WHERE. Por ejemplo, la siguiente instrucción elimina todas las filas de la tabla EVENT que cumplen con la condición de combinación sobre las tablas EVENT y SALES. La tabla SALES debe tener un nombre designado explícitamente en la lista FROM:  

```
delete from event using sales where event.eventid=sales.eventid;
```
Si repite el nombre de la tabla de destino en la cláusula USING, la operación DELETE ejecuta una combinación automática. Puede usar una subconsulta en la cláusula WHERE en lugar de la sintaxis USING como una manera alternativa para escribir la misma consulta.

WHERE *condition*   
Cláusula opcional que limita la eliminación de filas a aquellas que coinciden con la condición. Por ejemplo, la condición puede ser una restricción en una columna, una condición de combinación o una condición basada en el resultado de una consulta. La consulta puede hacer referencia a tablas diferentes a la tabla de origen del comando DELETE. Por ejemplo:  

```
delete from t1
where col1 in(select col2 from t2);
```
Si no se especifica una condición, se eliminan todas las filas de la tabla.

## Notas de uso
<a name="r_DELETE-usage"></a>
+ Las operaciones DELETE mantienen bloqueos exclusivos cuando se ejecutan en vistas materializadas de streaming de Amazon Redshift conectadas a cualquiera de los siguientes:
  +  Un flujo de datos de Amazon Kinesis 
  +  Una transmisión gestionada de Amazon para el tema de Apache Kafka 
  +  Una transmisión externa compatible, como un tema de Confluent Cloud Kafka 

  Para obtener más información, consulte [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md).

## Ejemplos
<a name="r_DELETE-examples"></a>

Elimine todas las filas de la tabla CATEGORY:

```
delete from category;
```

Elimine las filas con valores CATID entre 0 y 9 de la tabla CATEGORY:

```
delete from category
where catid between 0 and 9;
```

Elimine las filas de la tabla LISTING cuyos valores SELLERID no existan en la tabla SALES:

```
delete from listing
where listing.sellerid not in(select sales.sellerid from sales);
```

Las siguientes dos consultas eliminan una fila de la tabla CATEGORY en función de una combinación con la tabla EVENT y una restricción adicional en la columna CATID:

```
delete from category
using event
where event.catid=category.catid and category.catid=9;
```

```
delete from category
where catid in
(select category.catid from category, event
where category.catid=event.catid and category.catid=9);
```

La siguiente consulta elimina todas las filas de la vista materializada `mv_cities`. El nombre de vista materializada en este ejemplo es una muestra:

```
delete from mv_cities;
```

# DESC DATASHARE
<a name="r_DESC_DATASHARE"></a>

Muestra una lista de los objetos de la base de datos dentro de un datashare que se agregan a él con ALTER DATASHARE. Amazon Redshift muestra los nombres, las bases de datos, los esquemas y los tipos de tablas, vistas y funciones. 

Puede encontrar información adicional sobre los objetos del recurso compartido de datos utilizando las vistas del sistema. Para obtener más información, consulte [SVV\$1DATASHARE\$1OBJECTS](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_DATASHARE_OBJECTS.html) y [SVV\$1DATASHARES](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_DATASHARES.html).

## Sintaxis
<a name="r_DESC_DATASHARE-synopsis"></a>

```
DESC DATASHARE datashare_name [ OF [ ACCOUNT account_id ] NAMESPACE namespace_guid ]
```

## Parameters
<a name="r_DESC_DATASHARE-parameters"></a>

 *datashare\$1name*   
Se trata del nombre del datashare. 

NAMESPACE *namespace\$1guid*   
Se trata de un valor que especifica el espacio de nombres que utiliza el datashare. Cuando ejecute DESC DATASHARE como administrador de un clúster consumidor, especifique el parámetro NAMESPACE para ver los datashares entrantes.

ACCOUNT *account\$1id*  
Se trata de un valor que especifica la cuenta a la que pertenece el datashare.

## Notas de uso
<a name="r_DESC_DATASHARE-usage"></a>

Como administrador de una cuenta consumidora, cuando ejecute DESC DATASHARE para ver los datashares entrantes en la cuenta de AWS, especifique la opción NAMESPACE. Cuando ejecute DESC DATASHARE para ver los datashares entrantes en las cuentas de AWS, especifique las opciones ACCOUNT y NAMESPACE.

## Ejemplos
<a name="r_DESC_DATASHARE-examples"></a>

En el siguiente ejemplo, se muestra la información de los datashares salientes en un clúster productor.

```
DESC DATASHARE salesshare;

producer_account |          producer_namespace           | share_type  | share_name   | object_type |        object_name           |  include_new
-----------------+---------------------------------------+-------------+--------------+-------------+------------------------------+--------------
 123456789012    | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d  | OUTBOUND    |  salesshare  | TABLE       | public.tickit_sales_redshift |
 123456789012    | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d  | OUTBOUND    |  salesshare  | SCHEMA      | public                       |   t
```

En el siguiente ejemplo, se muestra la información de los datashares entrantes en un clúster consumidor.

```
DESC DATASHARE salesshare of ACCOUNT '123456789012' NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';

 producer_account |          producer_namespace          | share_type | share_name | object_type |         object_name          |  include_new
------------------+--------------------------------------+------------+------------+-------------+------------------------------+--------------
 123456789012     | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND    | salesshare | table       | public.tickit_sales_redshift |
 123456789012     | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND    | salesshare | schema      | public                       |
(2 rows)
```

# DESC IDENTITY PROVIDER
<a name="r_DESC_IDENTITY_PROVIDER"></a>

Muestra información sobre un proveedor de identidades. Solo un superusuario puede crear un proveedor de identidades.

## Sintaxis
<a name="r_DESC_IDENTITY_PROVIDER-synopsis"></a>

```
DESC IDENTITY PROVIDER identity_provider_name
```

## Parameters
<a name="r_DESC_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
El nombre del proveedor de identidades.

## Ejemplo
<a name="r_DESC_IDENTITY_PROVIDER-examples"></a>

En el siguiente ejemplo se muestra información acerca del proveedor de identidades.

```
DESC IDENTITY PROVIDER azure_idp;
```

Resultados de ejemplo.

```
  uid   |   name    | type  |              instanceid              | namespc |                                                                                                                                                 params                                                                                                                                                  | enabled
--------+-----------+-------+--------------------------------------+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------
 126692 | azure_idp | azure | e40d4bb2-7670-44ae-bfb8-5db013221d73 | aad     | {"issuer":"https://login.microsoftonline.com/e40d4bb2-7670-44ae-bfb8-5db013221d73/v2.0", "client_id":"871c010f-5e61-4fb1-83ac-98610a7e9110", "client_secret":'', "audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift", "https://analysis.windows.net/powerbi/connector/AWSRDS"]} | t
(1 row)
```

# DETACH MASKING POLICY
<a name="r_DETACH_MASKING_POLICY"></a>

Desconecta una política de enmascaramiento dinámico de datos ya adjunta de una columna. Para obtener más información sobre el enmascaramiento dinámico de datos, consulte [Enmascaramiento de datos dinámico](t_ddm.md).

Los superusuarios y los usuarios o roles que tienen el rol sys:secadmin pueden desconectar una política de enmascaramiento.

## Sintaxis
<a name="r_DETACH_MASKING_POLICY-synopsis"></a>

```
DETACH MASKING POLICY
{
  policy_name ON table_name
  | database_name.policy_name ON database_name.schema_name.table_name
}
( output_column_names )
FROM { user_name | ROLE role_name | PUBLIC };
```

## Parameters
<a name="r_DETACH_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
El nombre de la política de enmascaramiento que se va a desconectar.

database\$1name  
El nombre de la base de datos a partir de la que se crea la política y la relación. La política y la relación deben estar en la misma base de datos. La base de datos puede ser la base de datos conectada o una base de datos que admita los permisos federados de Amazon Redshift.

schema\$1name  
El nombre del esquema al que pertenece la relación.

 *table\$1name*   
El nombre de la tabla de la que se puede desconectar la tabla de enmascaramiento.

*output\$1column\$1names*   
Nombres de las columnas a las que se asoció la política de enmascaramiento.

*user\$1name*   
Nombre del usuario al que se asoció la política de enmascaramiento.  
Solo puede establecer user\$1name, role\$1name o PUBLIC en una sola instrucción DETACH MASKING POLICY.

*role\$1name*   
Nombre del rol al que se asoció la política de enmascaramiento.  
Solo puede establecer user\$1name, role\$1name o PUBLIC en una sola instrucción DETACH MASKING POLICY.

*PUBLIC*   
Muestra que la política se asoció a todos los usuarios de la tabla.  
Solo puede establecer user\$1name, role\$1name o PUBLIC en una sola instrucción DETACH MASKING POLICY.

Para obtener información sobre el uso de DETACH MASKING POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# DETACH RLS POLICY
<a name="r_DETACH_RLS_POLICY"></a>

Desconecte una política de seguridad de la fila en una tabla de uno o más usuarios o roles.

Los superusuarios y los usuarios o roles que tienen el rol `sys:secadmin` pueden desconectar una política.

## Sintaxis
<a name="r_DETACH_RLS_POLICY-synopsis"></a>

```
DETACH RLS POLICY
{
  policy_name ON [TABLE] table_name [, ...]
  | database_name.policy_name ON [TABLE] database_name.schema_name.table_name [, ...]
}
FROM { user_name | ROLE role_name | PUBLIC } [, ...];
```

## Parameters
<a name="r_DETACH_RLS_POLICY-parameters"></a>

 *policy\$1name*   
El nombre de la política.

database\$1name  
El nombre de la base de datos a partir de la que se crea la política y la relación. La política y la relación deben estar en la misma base de datos. La base de datos puede ser la base de datos conectada o una base de datos que admita los permisos federados de Amazon Redshift.

schema\$1name  
El nombre del esquema al que pertenece la relación.

table\$1name  
Es la relación a la que se asocia la política de seguridad de nivel de fila.

FROM \$1 *user\$1name* \$1 ROLE *role\$1name* \$1 PUBLIC\$1 [, ...]  
Especifica si la política está desconectada de uno o más usuarios o roles especificados. 

Para obtener información sobre el uso de DETACH RLS POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Notas de uso
<a name="r_DETACH_RLS_POLICY-usage"></a>

Al trabajar con la instrucción DETACH RLS POLICY, observe lo siguiente:
+ Puede desconectar una política de una relación, usuario, rol o público.

## Ejemplos
<a name="r_DETACH_RLS_POLICY-examples"></a>

En el ejemplo siguiente, se desconecta una política en una tabla de un rol.

```
DETACH RLS POLICY policy_concerts ON tickit_category_redshift FROM ROLE analyst, ROLE dbadmin;
```

# DROP DATABASE
<a name="r_DROP_DATABASE"></a>

Elimina una base de datos. 

No se puede ejecutar DROP DATABASE en un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

## Sintaxis
<a name="r_DROP_DATABASE-synopsis"></a>

```
DROP DATABASE database_name [ FORCE ]
```

## Parameters
<a name="r_DROP_DATABASE-parameters"></a>

 *database\$1name*   
Nombre de la base de datos que se eliminará. No se pueden eliminar las bases de datos dev, padb\$1harvest, template0, template1 o sys:internal, ni tampoco se puede eliminar la base de datos actual.  
Para eliminar una base de datos externa, elimine el esquema externo. Para obtener más información, consulte [DROP SCHEMA](r_DROP_SCHEMA.md).

 FORCE   
Al especificar FORCE, DROP DATABASE intenta terminar las conexiones activas antes de eliminar la base de datos. Si todas las conexiones activas terminan satisfactoriamente dentro del tiempo de espera, la eliminación continúa. Si no terminan todas las conexiones, el comando arroja un error.

## Notas de uso de DROP DATABASE
<a name="r_DROP_DATABASE_usage"></a>

Cuando utilice la instrucción DROP DATABASE, tenga en cuenta lo siguiente:
+ En general, se recomienda que no elimine una base de datos que contenga un recurso compartido de datos de AWS Data Exchange mediante la instrucción DROP DATABASE. Si lo hace, las Cuentas de AWS que tengan acceso al recurso compartido de datos perderán el acceso. Realizar este tipo de alteración puede infringir los términos del producto de datos en AWS Data Exchange.

  El siguiente ejemplo muestra un error cuando se elimina una base de datos que contiene un recurso compartido de datos de AWS Data Exchange.

  ```
  DROP DATABASE test_db;
  ERROR:   Drop of database test_db that contains ADX-managed datashare(s) requires session variable datashare_break_glass_session_var to be set to value 'ce8d280c10ad41'
  ```

  Para permitir la eliminación de la base de datos, configure la siguiente variable y ejecute de nuevo la instrucción DROP DATABASE.

  ```
  SET datashare_break_glass_session_var to 'ce8d280c10ad41';
  ```

  ```
  DROP DATABASE test_db;
  ```

  En este caso, Amazon Redshift genera un valor aleatorio único para establecer la variable de sesión para permitir DROP DATABASE para una base de datos que contiene un recurso compartido de datos de AWS Data Exchange.

## Ejemplos
<a name="r_DROP_DATABASE-examples"></a>

En el siguiente ejemplo, se elimina una base de datos denominada TICKIT\$1TEST: 

```
drop database tickit_test;
```

# DROP DATASHARE
<a name="r_DROP_DATASHARE"></a>

Elimina un datashare. Este comando no es reversible.

Solo un superusuario o el propietario de datashare puede eliminar uno de estos.

## Privilegios necesarios
<a name="r_DROP_DATASHARE-privileges"></a>

Los siguientes privilegios son necesarios para DROP DATASHARE:
+ Superusuario
+ Usuarios con el privilegio DROP DATASHARE
+ Propietario del recurso compartido de datos

## Sintaxis
<a name="r_DROP_DATASHARE-synopsis"></a>

```
DROP DATASHARE datashare_name;
```

## Parameters
<a name="r_DROP_DATASHARE-parameters"></a>

 *datashare\$1name*   
Se trata del nombre del datashare que se eliminará.

## Notas de uso de DROP DATASHARE
<a name="r_DROP_DATASHARE_usage"></a>

Cuando utilice la instrucción DROP DATASHARE, tenga en cuenta lo siguiente:
+ En general, le recomendamos que no elimine un recurso compartido de datos de AWS Data Exchange mediante la instrucción DROP DATASHARE. Si lo hace, las Cuentas de AWS que tengan acceso al recurso compartido de datos perderán el acceso. Realizar este tipo de alteración puede infringir los términos del producto de datos en AWS Data Exchange.

  El siguiente ejemplo muestra un error cuando se elimina un recurso compartido de datos de AWS Data Exchange.

  ```
  DROP DATASHARE salesshare;
  ERROR:  Drop of ADX-managed datashare salesshare requires session variable datashare_break_glass_session_var to be set to value '620c871f890c49'
  ```

  Para permitir la eliminación del recurso compartido de datos de AWS Data Exchange, configure la siguiente variable y ejecute de nuevo la instrucción DROP DATASHARE.

  ```
  SET datashare_break_glass_session_var to '620c871f890c49';
  ```

  ```
  DROP DATASHARE salesshare;
  ```

  En este caso, Amazon Redshift genera un valor aleatorio único para establecer la variable de sesión para permitir DROP DATASHARE para un recurso compartido de datos de AWS Data Exchange.

## Ejemplos
<a name="r_DROP_DATASHARE-examples"></a>

En el siguiente ejemplo, se elimina un recurso compartido de datos denominado `salesshare`.

```
DROP DATASHARE salesshare;
```

# DROP EXTERNAL VIEW
<a name="r_DROP_EXTERNAL_VIEW"></a>

Elimina una vista externa de la base de datos. Al eliminar una vista externa, se elimina de todos los motores de SQL a los que está asociada la vista, como Amazon Athena y Amazon EMR Spark. Este comando no se puede revertir. Para obtener más información sobre las vistas del Catálogo de datos, consulte [Vistas de AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

## Sintaxis
<a name="r_DROP_EXTERNAL_VIEW-synopsis"></a>

```
DROP EXTERNAL VIEW schema_name.view_name [ IF EXISTS ]
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
```

## Parameters
<a name="r_DROP_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
Es el esquema asociado a la base de datos de AWS Glue, seguido del nombre de la vista.

IF EXISTS  
Elimina la vista solo si existe.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
Es la notación del esquema que se utilizará al eliminar la vista. Puede especificar el uso de AWS Glue Data Catalog, una base de datos de Glue que haya creado o un esquema externo que haya creado. Consulte [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) y [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) para obtener más información.

 *query\$1definition*   
Es la definición de la consulta SQL que Amazon Redshift ejecuta para modificar la vista.

## Ejemplos
<a name="r_DROP_EXTERNAL_VIEW-examples"></a>

El siguiente ejemplo elimina una vista del catálogo de datos denominada sample\$1schema.glue\$1data\$1catalog\$1view.

```
DROP EXTERNAL VIEW sample_schema.glue_data_catalog_view IF EXISTS
```

# DROP FUNCTION
<a name="r_DROP_FUNCTION"></a>

Elimina una función definida por el usuario (UDF) de la base de datos. Se debe especificar la firma de la función, o una lista de tipos de datos de argumento, ya que puede haber varias funciones con el mismo nombre pero con diferentes firmas. No se puede eliminar una función integrada de Amazon Redshift.

Este comando no es reversible.

## Privilegios necesarios
<a name="r_DROP_FUNCTION-privileges"></a>

Los siguientes privilegios son necesarios para DROP FUNCTION:
+ Superusuario
+ Usuarios con el privilegio DROP FUNCTION
+ Propietario de la función

## Sintaxis
<a name="r_DROP_FUNCTION-synopsis"></a>

```
DROP FUNCTION name
( [arg_name] arg_type   [, ...] )
[ CASCADE | RESTRICT ]
```

## Parameters
<a name="r_DROP_FUNCTION-parameters"></a>

 *name*   
El nombre de la función que se eliminará.

 *arg\$1name (nombre\$1de\$1argumento*   
El nombre de un argumento de entrada. DROP FUNCTION ignora nombres de argumento ya que solo los tipos de datos de argumento son necesarios para determinar la identidad de la función.

 *arg\$1type*   
El tipo de datos del argumento de entrada. Puede proporcionar una lista de valores separados por coma con un máximo de 32 tipos de datos.

 CASCADE   
Palabra clave que especifica que se deben eliminar automáticamente los objetos que dependen de una función, como las vistas.   
Para crear una vista que no dependa de una función, incluya la cláusula WITH NO SCHEMA BINDING en la definición de vista. Para obtener más información, consulte [CREATE VIEW](r_CREATE_VIEW.md).

 RESTRICT   
Se trata de la palabra clave que especifica que, si hay objetos que dependen de la función, no se debe eliminar la función y devolver un mensaje. Esta acción es la predeterminada.

## Ejemplos
<a name="r_DROP_FUNCTION-examples"></a>

En el siguiente ejemplo, se elimina la función denominada `f_sqrt`:

```
drop function f_sqrt(int);
```

Para eliminar una función que tiene dependencias, use la opción CASCADE, como se muestra en el siguiente ejemplo:

```
drop function f_sqrt(int)cascade;
```

# DROP GROUP
<a name="r_DROP_GROUP"></a>

Elimina un grupo de usuarios. Este comando no es reversible. Este comando no elimina a los usuarios individuales de un grupo.

Consulte DROP USER para eliminar un usuario individual.

## Sintaxis
<a name="r_DROP_GROUP-synopsis"></a>

```
DROP GROUP name
```

## Parámetro
<a name="r_DROP_GROUP-parameter"></a>

 *name*   
Nombre del grupo de usuarios que se eliminará.

## Ejemplo
<a name="r_DROP_GROUP-example"></a>

En el siguiente ejemplo, se elimina el grupo de usuarios `guests`:

```
DROP GROUP guests;
```

No se puede eliminar un grupo si el grupo tiene privilegios en un objeto. Si intenta eliminar dicho grupo, recibirá el siguiente error.

```
ERROR: group "guests" can't be dropped because the group has a privilege on some object
```

Si el grupo tiene privilegios para un objeto, debe eliminar los privilegios antes de eliminar el grupo. Para buscar los objetos para los que el grupo `guests` tiene privilegios, utilice el siguiente ejemplo. Para obtener más información sobre la vista de metadatos utilizada en el ejemplo, consulte [SVV\$1RELATION\$1PRIVILEGES](https://docs.aws.amazon.com//redshift/latest/dg/r_SVV_RELATION_PRIVILEGES.html).

```
SELECT DISTINCT namespace_name, relation_name, identity_name, identity_type 
FROM svv_relation_privileges
WHERE identity_type='group' AND identity_name='guests';

+----------------+---------------+---------------+---------------+
| namespace_name | relation_name | identity_name | identity_type |
+----------------+---------------+---------------+---------------+
| public         | table1        | guests        | group         |
+----------------+---------------+---------------+---------------+
| public         | table2        | guests        | group         |
+----------------+---------------+---------------+---------------+
```

En el siguiente ejemplo, se eliminan todos los privilegios en todas las tablas del esquema `public` del grupo de usuarios `guests` y, luego, se elimina el grupo.

```
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM GROUP guests;
DROP GROUP guests;
```

# DROP IDENTITY PROVIDER
<a name="r_DROP_IDENTITY_PROVIDER"></a>

Elimina un proveedor de identidades. Este comando no es reversible. Solo un superusuario puede eliminar un proveedor de identidades.

## Sintaxis
<a name="r_DROP_IDENTITY_PROVIDER-synopsis"></a>

```
DROP IDENTITY PROVIDER identity_provider_name [ CASCADE ]
```

## Parámetros
<a name="r_DROP_IDENTITY_PROVIDER-parameter"></a>

 *identity\$1provider\$1name*   
Nombre del proveedor de identidades que se va a eliminar.

 CASCADE   
Elimina los usuarios y roles asociados al proveedor de identidades cuando se elimina.

## Ejemplo
<a name="r_DROP_IDENTITY_PROVIDER-example"></a>

En el siguiente ejemplo se elimina el proveedor de identidades *oauth\$1provider*.

```
DROP IDENTITY PROVIDER oauth_provider;
```

Si elimina el proveedor de identidades, es posible que algunos usuarios no puedan iniciar sesión o utilizar herramientas de cliente configuradas para utilizar el proveedor de identidades.

# DROP LIBRARY
<a name="r_DROP_LIBRARY"></a>

Elimina una biblioteca de Python personalizada de la base de datos. Solo el propietario de la biblioteca o un superusuario puede eliminar una biblioteca. 

DROP LIBRARY no se puede ejecutar dentro de un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

Este comando no es reversible. El comando DROP LIBRARY se confirma inmediatamente. Si una UDF que depende de la biblioteca se ejecuta simultáneamente, es posible que la UDF falle, incluso si la UDF se ejecuta dentro de una transacción.

Para obtener más información, consulte [CREATE LIBRARY](r_CREATE_LIBRARY.md). 

## Privilegios necesarios
<a name="r_DROP_LIBRARY-privileges"></a>

Los siguientes privilegios son necesarios para DROPLIBRARY:
+ Superusuario
+ Usuarios con el privilegio DROP LIBRARY
+ Propietario de la biblioteca

## Sintaxis
<a name="r_DROP_LIBRARY-synopsis"></a>

```
DROP LIBRARY library_name
```

## Parameters
<a name="r_DROP_LIBRARY-parameters"></a>

 *library\$1name*   
El nombre de la biblioteca.

# DROP MASKING POLICY
<a name="r_DROP_MASKING_POLICY"></a>

Elimina una política de enmascaramiento dinámico de datos de todas las bases de datos. No puede eliminar una política de enmascaramiento si sigue adjunta a una o más tablas. Para obtener más información sobre el enmascaramiento dinámico de datos, consulte [Enmascaramiento de datos dinámico](t_ddm.md).

Los superusuarios y los usuarios o roles que tienen el rol sys:secadmin pueden eliminar una política de enmascaramiento.

## Sintaxis
<a name="r_DROP_MASKING_POLICY-synopsis"></a>

```
DROP MASKING POLICY { policy_name | database_name.policy_name };
```

## Parameters
<a name="r_DROP_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
El nombre de la política de enmascaramiento que se va a eliminar.

database\$1name  
El nombre de la base de datos a partir de la que se elimina la política. La base de datos puede ser la base de datos conectada o una base de datos que admita los permisos federados de Amazon Redshift.

Para obtener información sobre el uso de DROP MASKING POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# DROP MODEL
<a name="r_DROP_MODEL"></a>

Quita un modelo de la base de datos. Solo el propietario del modelo o un superusuario puede quitarlo. 

DROP MODEL también elimina toda función de predicción asociada que se obtenga de este modelo, todos los artefactos de Amazon Redshift relacionados con el modelo y todos los datos de Amazon S3 relacionados con el modelo. Mientras el modelo se está entrenando en Amazon SageMaker AI, DROP MODEL cancelará esas operaciones.

Este comando no es reversible. El comando DROP MODEL se confirma de forma inmediata.

## Permisos necesarios
<a name="r_DROP_MODEL-privileges"></a>

Los siguientes permisos son necesarios para DROP MODEL:
+ Superusuario
+ Usuarios con el permiso DROP MODEL
+ Propietario del modelo
+ Propietario del esquema

## Sintaxis
<a name="r_DROP_MODEL-synopsis"></a>

```
DROP MODEL [ IF EXISTS ] model_name
```

## Parameters
<a name="r_DROP_MODEL-parameters"></a>

 *IF EXISTS*   
Se trata de una cláusula que indica que, si el esquema especificado ya existe, el comando no debe realizar cambios y debe devolver un mensaje en el que se indique que el esquema existe.

 *model\$1name*   
El nombre del modelo. El nombre del modelo en un esquema debe ser único.

## Ejemplos
<a name="r_DROP_MODEL-examples"></a>

En el siguiente ejemplo, se elimina el modelo demo\$1ml.customer\$1churn.

```
DROP MODEL demo_ml.customer_churn
```

# DROP MATERIALIZED VIEW
<a name="materialized-view-drop-sql-command"></a>

Retira una vista materializada.

Para obtener más información acerca de las vistas materializadas, consulte [Vistas materializadas en Amazon Redshift](materialized-view-overview.md).

## Sintaxis
<a name="mv_DROP_MATERIALIZED_VIEW-synopsis"></a>

```
DROP MATERIALIZED VIEW [ IF EXISTS ] mv_name [, ... ] [ CASCADE | RESTRICT ]
```

## Parameters
<a name="mv_DROP_MATERIALIZED_VIEW-parameters"></a>

IF EXISTS  
Cláusula que especifica que hay que comprobar si existe la vista materializada nombrada. Si la vista materializada no existe, el comando `DROP MATERIALIZED VIEW` le mostrará un mensaje de error. Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si se elimina una vista materializada inexistente.

*mv\$1name*  
El nombre de la vista materializada que desea eliminar.

CASCADE  
Cláusula que indica que se eliminen automáticamente los objetos de los que depende la vista materializada, como otras vistas.

RESTRICT  
Cláusula que indica que no se elimine la vista materializada si algún objeto depende de ella. Esta es la opción predeterminada.

## Notas de uso
<a name="mv_DROP_MATERIALIZED_VIEW-usage"></a>

Solo el propietario de una vista materializada puede utilizar `DROP MATERIALIZED VIEW` en esa vista. Las excepciones pueden ser un superusuario o un usuario al que se le hayan otorgado específicamente privilegios DROP.

Al escribir una instrucción drop para una vista materializada y una vista con un nombre coincidente, se produce un error que indica que debe utilizar DROP VIEW. Se produce un error incluso en el caso de que utilice `DROP MATERIALIZED VIEW IF EXISTS`.

## Ejemplo
<a name="mv_DROP_MATERIALIZED_VIEW-examples"></a>

El siguiente ejemplo elimina la vista materializada de `tickets_mv`.

```
DROP MATERIALIZED VIEW tickets_mv;
```

# DROP PROCEDURE
<a name="r_DROP_PROCEDURE"></a>

Elimina un procedimiento. Para eliminar un procedimiento se necesitan el nombre del procedimiento y los tipos de datos del argumento de entrada (firma). De manera opción, puede incluir los tipos de datos del argumento completo, incluidos los argumentos OUT. Para buscar la firma de un procedimiento, utilice el comando [SHOW PROCEDURE](r_SHOW_PROCEDURE.md). Para obtener más información acerca de las firmas de procedimientos, consulte [PG\$1PROC\$1INFO](r_PG_PROC_INFO.md).

## Privilegios necesarios
<a name="r_DROP_PROCEDURE-privileges"></a>

Los siguientes privilegios son necesarios para DROP PROCEDURE:
+ Superusuario
+ Usuarios con el privilegio DROP PROCEDURE
+ Propietario del procedimiento

## Sintaxis
<a name="r_DROP_PROCEDURE-synopsis"></a>

```
DROP PROCEDURE sp_name ( [ [ argname ] [ argmode ] argtype [, ...] ] )
```

## Parameters
<a name="r_DROP_PROCEDURE-parameters"></a>

 *sp\$1name*   
El nombre del procedimiento que debe eliminarse. 

 *argname*   
El nombre de un argumento de entrada. DROP PROCEDURE ignora nombres de argumento ya que solo los tipos de datos de argumento son necesarios para determinar la identidad del procedimiento. 

 *argmode*   
El modo de un argumento, que puede ser IN, OUT o INOUT. Los argumentos OUT son opcionales porque no se utilizan para identificar un procedimiento almacenado. 

 *argtype*   
El tipo de datos del argumento de entrada. Para ver una lista de los tipos de datos admitidos, consulte [Tipos de datos](c_Supported_data_types.md). 

## Ejemplos
<a name="r_DROP_PROCEDURE-examples"></a>

El siguiente ejemplo elimina un procedimiento almacenado denominado `quarterly_revenue`.

```
DROP PROCEDURE quarterly_revenue(volume INOUT bigint, at_price IN numeric,result OUT int);
```

# DROP RLS POLICY
<a name="r_DROP_RLS_POLICY"></a>

Elimina una política de seguridad de la fila de todas las tablas en todas las bases de datos.

Los superusuarios y los usuarios o roles que tienen el rol sys:secadmin pueden eliminar una política.

## Sintaxis
<a name="r_DROP_RLS_POLICY-synopsis"></a>

```
DROP RLS POLICY [ IF EXISTS ] 
{ policy_name | database_name.policy_name }
[ CASCADE | RESTRICT ]
```

## Parameters
<a name="r_DROP_RLS_POLICY-parameters"></a>

 *IF EXISTS*   
Una cláusula que indica si la política especificada ya existe.

 *policy\$1name*   
El nombre de la política.

database\$1name  
El nombre de la base de datos a partir de la que se elimina la política. La base de datos puede ser la base de datos conectada o una base de datos que admita los permisos federados de Amazon Redshift.

 *CASCADE*   
Una cláusula que indica que se debe desconectar automáticamente la política de todas las tablas adjuntas antes de eliminarla.

 *RESTRICT*   
Una cláusula que indica que no se debe eliminar la política cuando está adjuntada a algunas tablas. Esta es la opción predeterminada.

Para obtener información sobre el uso de DROP RLS POLICY en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Ejemplos
<a name="r_DROP_RLS_POLICY-examples"></a>

En el siguiente ejemplo, se elimina la política de seguridad de la fila.

```
DROP RLS POLICY policy_concerts;
```

# DROP ROLE
<a name="r_DROP_ROLE"></a>

Elimina un rol de una base de datos. Solo pueden eliminar un rol el propietario del rol que lo haya creado, un usuario con la opción WITH ADMIN o un superusuario.

No se puede eliminar un rol que esté concedido a un usuario o si otro rol depende de él.

## Privilegios necesarios
<a name="r_DROP_ROLE-privileges"></a>

Los siguientes privilegios son necesarios para DROP ROLE:
+ Superusuario
+ Propietario del rol que sea el usuario que haya creado el rol o un usuario al que se le haya concedido el rol con el privilegio WITH ADMIN OPTION.

## Sintaxis
<a name="r_DROP_ROLE-synopsis"></a>

```
DROP ROLE role_name [ FORCE | RESTRICT ] 
```

## Parameters
<a name="r_DROP_ROLE-parameters"></a>

*role\$1name*  
Nombre del rol

[ FORCE \$1 RESTRICT ]  
La configuración predeterminada es RESTRICT. Amazon Redshift genera un error cuando se intenta eliminar un rol que ha heredado otro rol. Utilice FORCE para eliminar todas las asignaciones de roles, si existe alguna. 

## Ejemplos
<a name="r_DROP_ROLE-examples"></a>

El siguiente ejemplo elimina el rol `sample_role`.

```
DROP ROLE sample_role FORCE;
```

El siguiente ejemplo intenta eliminar el rol sample\$1role1 que se ha concedido a un usuario con la opción RESTRICT predeterminada.

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
DROP ROLE sample_role1;
ERROR:  cannot drop this role since it has been granted on a user
```

Para eliminar correctamente el rol sample\$1role1 que se haya concedido a un usuario, utilice la opción FORCE.

```
DROP ROLE sample_role1 FORCE;
```

El siguiente ejemplo intenta eliminar el rol sample\$1role2 que tiene otro rol dependiente de él con la opción RESTRICT predeterminada.

```
CREATE ROLE sample_role1;
CREATE ROLE sample_role2;
GRANT ROLE sample_role1 TO sample_role2;
DROP ROLE sample_role2;
ERROR:  cannot drop this role since it depends on another role
```

Para eliminar correctamente el rol sample\$1role2 que tenga otro rol que dependa de él, utilice la opción FORCE.

```
DROP ROLE sample_role2 FORCE;
```

# DROP SCHEMA
<a name="r_DROP_SCHEMA"></a>

Elimina un esquema. Para un esquema externo, también puede eliminar la base de datos externa asociada con el esquema. Este comando no es reversible.

## Privilegios necesarios
<a name="r_DROP_SCHEMA-privileges"></a>

Los siguientes privilegios son necesarios para DROP SCHEMA:
+ Superusuario
+ Propietario del esquema
+ Usuarios con el privilegio DROP SCHEMA

## Sintaxis
<a name="r_DROP_SCHEMA-synopsis"></a>

```
DROP SCHEMA [ IF EXISTS ] name [, ...]
[ DROP EXTERNAL DATABASE ]
[ CASCADE | RESTRICT ]
```

## Parameters
<a name="r_DROP_SCHEMA-parameters"></a>

IF EXISTS  
Cláusula que indica que si el esquema especificado no existe, el comando no debe realizar cambios y debe devolver un mensaje en el que se indique que el esquema no existe, en lugar de terminar con un error.  
Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si DROP SCHEMA se ejecuta contra un esquema que no existe.

 *name*   
Nombres de los esquemas que eliminar. Puede especificar múltiples nombres de esquema separados por comas.

 DROP EXTERNAL DATABASE   
Cláusula que indica que si se elimina un esquema externo, se elimina la base de datos externa asociada con el esquema externo, si existe una. Si no existe ninguna base de datos externa, el comando devuelve un mensaje que indica que no existe ninguna base de datos externa. Si se eliminan múltiples esquemas externos, se eliminan todas las bases de datos externas asociadas con los esquemas especificados.   
Si una base de datos externa contiene objetos dependientes como son las tablas, incluya la opción CASCADE para eliminar también los objetos dependientes.   
Cuando se elimina una base de datos externa, la base de datos también se elimina de cualquier otro esquema externo asociado con la base de datos. Las tablas definidas en otros esquemas externos usando la base de datos también se eliminan.   
DROP EXTERNAL DATABASE no es compatible con bases de datos externas almacenadas en un almacén de metadatos de HIVE. 

CASCADE  
Palabra clave que indica que se deben eliminar automáticamente todos los objetos del esquema. Si se especifica DROP EXTERNAL DATABASE, también se eliminan todos los objetos de la base de datos externa.

RESTRICT  
Palabra clave que indica que no se debe eliminar un esquema o una base de datos externa si contiene objetos. Esta acción es la predeterminada.

## Ejemplo
<a name="r_DROP_SCHEMA-example"></a>

En el siguiente ejemplo, se elimina un esquema denominado S\$1SALES. Este ejemplo usa RESTRICT como mecanismo de seguridad para que no se elimine el esquema si contiene objetos. En este caso, necesita eliminar los objetos del esquema antes de eliminar el esquema.

```
drop schema s_sales restrict;
```

En el siguiente ejemplo, se eliminan un esquema denominado S\$1SALES y todos los objetos que dependen de ese esquema.

```
drop schema s_sales cascade;
```

En el siguiente ejemplo, se elimina el esquema S\$1SALES si existe. Si no existe, no se realiza ninguna acción y se devuelve un mensaje.

```
drop schema if exists s_sales;
```

En el siguiente ejemplo, se elimina un esquema externo denominado S\$1SPECTRUM y la base de datos externa asociada con él. Este ejemplo usa RESTRICT para que no se elimine el esquema ni la base de datos si contienen objetos. En este caso, necesita eliminar los objetos dependientes antes de eliminar el esquema y la base de datos.

```
drop schema s_spectrum drop external database restrict;
```

En el siguiente ejemplo, se eliminan múltiples esquemas y las bases de datos asociadas con ellos, junto con todos los objetos dependientes. 

```
drop schema s_sales, s_profit, s_revenue drop external database cascade;
```

# DROP TABLE
<a name="r_DROP_TABLE"></a>

Elimina una tabla de una base de datos. 

Si desea borrar las filas de una tabla sin eliminar la tabla, use el comando DELETE o TRUNCATE. 

DROP TABLE elimina las restricciones que existen en la tabla de destino. Puede eliminar varias tablas con un solo comando DROP TABLE. 

No se puede ejecutar DROP TABLE con una tabla externa en una transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md).

Para encontrar un ejemplo en el que se conceda el privilegio DROP a un grupo, consulte de GRANT [Ejemplos](r_GRANT-examples.md).

## Privilegios necesarios
<a name="r_DROP_TABLE-privileges"></a>

Los siguientes privilegios son necesarios para DROP TABLE:
+ Superusuario
+ Usuarios con el privilegio DROP TABLE
+ Propietario de la tabla con el privilegio USAGE en el esquema

## Sintaxis
<a name="r_DROP_TABLE-synopsis"></a>

```
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
```

## Parameters
<a name="r_DROP_TABLE-parameters"></a>

IF EXISTS  
Cláusula que indica que si la tabla especificada no existe, el comando no debe realizar cambios y debe devolver un mensaje en el que se indique que la tabla no existe, en lugar de terminar con un error.  
Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si DROP TABLE se ejecuta contra una tabla que no existe.

 *name*   
Nombre de la tabla que se eliminará. 

CASCADE  
Cláusula que indica que se deben eliminar automáticamente los objetos que dependen de la tabla, como las vistas.  
Para crear una vista que no dependa de otros objetos de base de datos, como vistas y tablas, incluya la cláusula WITH NO SCHEMA BINDING en la definición de la vista. Para obtener más información, consulte [CREATE VIEW](r_CREATE_VIEW.md).

RESTRICT   
Cláusula que indica que no se debe eliminar la tabla si tiene objetos dependientes. Esta acción es la predeterminada.

## Ejemplos
<a name="r_DROP_TABLE-examples"></a>

 **Eliminar una tabla sin dependencias** 

En el siguiente ejemplo, se crea y se elimina una tabla denominada FEEDBACK que no tiene dependencias: 

```
create table feedback(a int);

drop table feedback;
```

 Si una tabla contiene columnas que se referencian en las vistas o en otras tablas, Amazon Redshift muestra un mensaje similar al siguiente. 

```
Invalid operation: cannot drop table feedback because other objects depend on it
```

 **Eliminar dos tablas simultáneamente** 

El siguiente conjunto de comandos crea una tabla FEEDBACK y una tabla BUYERS y, luego, elimina ambas tablas con un único comando: 

```
create table feedback(a int);

create table buyers(a int);

drop table feedback, buyers;
```

 **Eliminar una tabla con una dependencia** 

Los siguientes pasos muestran cómo eliminar una tabla denominada FEEDBACK con el comando CASCADE. 

Primero, cree una tabla simple denominada FEEDBACK con el comando CREATE TABLE: 

```
create table feedback(a int);
```

 Luego, use el comando CREATE VIEW para crear una vista denominada FEEDBACK\$1VIEW que dependa de la tabla FEEDBACK: 

```
create view feedback_view as select * from feedback;
```

 En el siguiente ejemplo, se elimina la tabla FEEDBACK y, también, la vista FEEDBACK\$1VIEW, ya que FEEDBACK\$1VIEW depende de la tabla FEEDBACK: 

```
drop table feedback cascade;
```

 **Ver las dependencias de una tabla** 

Para devolver las dependencias de la tabla, utilice el siguiente ejemplo. Sustituya *my\$1schema* y *my\$1table* por su propio esquema y tabla. 

```
SELECT dependent_ns.nspname as dependent_schema
, dependent_view.relname as dependent_view 
, source_ns.nspname as source_schema
, source_table.relname as source_table
, pg_attribute.attname as column_name
FROM pg_depend 
JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid 
JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid 
JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid 
JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid 
    AND pg_depend.refobjsubid = pg_attribute.attnum 
JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
WHERE 
source_ns.nspname = 'my_schema'
AND source_table.relname = 'my_table'
AND pg_attribute.attnum > 0 
ORDER BY 1,2
LIMIT 10;
```

Para eliminar *my\$1table* y sus dependencias, use el siguiente ejemplo. En este ejemplo también se devuelven todas las dependencias de la tabla que se ha eliminado.

```
DROP TABLE my_table CASCADE;
         
SELECT dependent_ns.nspname as dependent_schema
, dependent_view.relname as dependent_view 
, source_ns.nspname as source_schema
, source_table.relname as source_table
, pg_attribute.attname as column_name
FROM pg_depend 
JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid 
JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid 
JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid 
JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid 
    AND pg_depend.refobjsubid = pg_attribute.attnum 
JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
WHERE 
source_ns.nspname = 'my_schema'
AND source_table.relname = 'my_table'
AND pg_attribute.attnum > 0 
ORDER BY 1,2
LIMIT 10;

+------------------+----------------+---------------+--------------+-------------+
| dependent_schema | dependent_view | source_schema | source_table | column_name |
+------------------+----------------+---------------+--------------+-------------+
```

 **Eliminar una tabla con IF EXISTS** 

En el siguiente ejemplo, se elimina la tabla FEEDBACK, si existe. Si no existe, no se realiza ninguna acción y se devuelve un mensaje: 

```
drop table if exists feedback;
```

# DROP TEMPLATE
<a name="r_DROP_TEMPLATE"></a>

Elimina una plantilla de una base de datos.

## Privilegios necesarios
<a name="r_DROP_TEMPLATE-privileges"></a>

Para eliminar una plantilla, debe tener una de las siguientes opciones:
+ Privilegios de superusuario
+ Privilegio DROP TEMPLATE y privilegio USAGE sobre el esquema que contiene la plantilla

## Sintaxis
<a name="r_DROP_TEMPLATE-synopsis"></a>

```
DROP TEMPLATE [database_name.][schema_name.]template_name;
```

## Parameters
<a name="r_DROP_TEMPLATE-parameters"></a>

 *database\$1name*   
(Opcional) El nombre de la base de datos en la que se crea la plantilla. Si no se especifica, se utiliza la base de datos actual. 

 *schema\$1name*   
(Opcional) El nombre del esquema en el que se crea la plantilla. Si no se especifica, la plantilla se busca en la ruta de búsqueda actual. 

 *template\$1name*   
El nombre de la plantilla que se va a eliminar. En el siguiente ejemplo, el nombre de base de datos es `demo_database`, el nombre de esquema es `demo_schema` y el nombre de plantilla es `test`.  

```
DROP TEMPLATE demo_database.demo_schema.test;
```

## Ejemplos
<a name="r_DROP_TEMPLATE-examples"></a>

En el siguiente ejemplo se elimina la plantilla test\$1template del esquema actual:

```
DROP TEMPLATE test_template;
```

En el siguiente ejemplo se elimina la plantilla test\$1template del esquema test\$1schema:

```
DROP TEMPLATE test_schema.test_template;
```

# DROP USER
<a name="r_DROP_USER"></a>

Elimina un usuario de la base de datos. Puede eliminar varios usuarios con un solo comando DROP USER. Debe ser un superusuario de la base de datos o tener el permiso DROP USER para ejecutar este comando.

## Sintaxis
<a name="r_DROP_USER-synopsis"></a>

```
DROP USER [ IF EXISTS ] name [, ... ]
```

## Parameters
<a name="r_DROP_USER-parameters"></a>

IF EXISTS  
Cláusula que indica que si el usuario especificado no existe, el comando no debe realizar cambios y debe devolver un mensaje en el que se indique que el usuario no existe, en lugar de terminar con un error.  
Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si DROP USER se ejecuta en un usuario que no existe.

 *name*   
Nombre del usuario que se eliminará. Puede especificar varios usuarios con una coma separando cada nombre de usuario del siguiente.

## Notas de uso
<a name="r_DROP_USER-notes"></a>

No puede eliminar el usuario denominado `rdsdb` o el usuario administrador de la base de datos, que normalmente se denomina `awsuser` o `admin`.

No puede eliminar un usuario si el usuario es propietario de cualquier objeto de la base de datos, como un esquema, base de datos, tabla o vista, o si el usuario tiene privilegios en una base de datos, tabla, columna o grupo. Si intenta eliminar dicho usuario, recibirá uno de los siguientes errores.

```
ERROR: user "username" can't be dropped because the user owns some object [SQL State=55006]

ERROR: user "username" can't be dropped because the user has a privilege on some object [SQL State=55006]
```

Para obtener instrucciones detalladas sobre cómo encontrar los objetos que pertenecen a un usuario de base de datos, consulte [¿Cómo soluciono el error "no se puede eliminar al usuario" en Amazon Redshift?](https://repost.aws/knowledge-center/redshift-user-cannot-be-dropped) en el *Centro de conocimiento*.

**nota**  
Amazon Redshift verifica solo la base de datos actual antes de eliminar a un usuario. DROP USER no devuelve un error si el usuario es propietario de objetos de la base de datos o si tiene privilegios en objetos de otra base de datos. Si elimina un usuario que es propietario de objetos en otra base de datos, el propietario de esos objetos se cambia a "desconocido". 

Si un usuario es propietario de un objeto, primero elimine el objeto o elija otro usuario como propietario antes de eliminar el usuario original. Si el usuario tiene privilegios para un objeto, elimine los privilegios antes de eliminar el usuario. En el siguiente ejemplo, se muestra cómo se elimina un objeto, se cambia la propiedad de un objeto y se eliminan privilegios antes de eliminar el usuario.

```
drop database dwdatabase;
alter schema dw owner to dwadmin;
revoke all on table dwtable from dwuser;
drop user dwuser;
```

## Ejemplos
<a name="r_DROP_USER-examples"></a>

En el siguiente ejemplo, se elimina un usuario denominado paulo:

```
drop user paulo;
```

En el siguiente ejemplo, se eliminan dos usuarios, paulo y martha:

```
drop user paulo, martha;
```

En el siguiente ejemplo, se elimina el usuario paulo, si existe. Si no es así, no se realiza ninguna acción y se devuelve un mensaje:

```
drop user if exists paulo;
```

# DROP VIEW
<a name="r_DROP_VIEW"></a>

Elimina una vista de la base de datos. Puede eliminar varias vistas con un solo comando DROP VIEW. Este comando no es reversible.

## Privilegios necesarios
<a name="r_DROP_VIEW-privileges"></a>

Los siguientes privilegios son necesarios para DROP VIEW:
+ Superusuario
+ Usuarios con el privilegio DROP VIEW
+ Propietario de la vista

## Sintaxis
<a name="r_DROP_VIEW-synopsis"></a>

```
DROP VIEW [ IF EXISTS ] name [, ... ] [ CASCADE | RESTRICT ] 
```

## Parameters
<a name="r_DROP_VIEW-parameters"></a>

IF EXISTS  
Cláusula que indica que si la vista especificada no existe, el comando no debe realizar cambios y debe devolver un mensaje en el que se indique que la vista no existe, en lugar de terminar con un error.  
Esta cláusula es útil cuando se realiza scripting, para que el script no produzca un error si DROP VIEW se ejecuta contra una vista que no existe.

 *name*   
Nombre de la vista que se eliminará.

CASCADE  
Cláusula que indica que se deben eliminar automáticamente los objetos que dependen de la vista, como otras vistas.  
Para crear una vista que no dependa de otros objetos de base de datos, como vistas y tablas, incluya la cláusula WITH NO SCHEMA BINDING en la definición de la vista. Para obtener más información, consulte [CREATE VIEW](r_CREATE_VIEW.md).  
Tenga en cuenta que si incluye CASCADE y el recuento de objetos de base de datos eliminados asciende a diez o más, es posible que su cliente de base de datos no muestre todos los objetos eliminados en los resultados del resumen. Por lo general, esto se debe a que las herramientas de cliente de SQL tienen limitaciones predeterminadas en los resultados devueltos.

RESTRICT  
Cláusula que indica que no se debe eliminar la vista si tiene objetos dependientes. Esta acción es la predeterminada.

## Ejemplos
<a name="r_DROP_VIEW-examples"></a>

En el siguiente ejemplo, se elimina la vista *event*.

```
drop view event;
```

Para eliminar una vista que tiene dependencias, use la opción CASCADE. Por ejemplo, supongamos que comenzamos con una tabla denominada EVENT. Luego, creamos la vista eventview de la tabla EVENT a través del comando CREATE VIEW, como se muestra en el siguiente ejemplo: 

```
create view eventview as
select dateid, eventname, catid
from event where catid = 1;
```

Ahora, vamos a crear una segunda vista llamada *myeventview*, que se basa en la primera vista *eventview*.

```
create view myeventview as
select eventname, catid
from eventview where eventname <> ' ';
```

Se han creado dos vistas hasta el momento: *eventview* y *myeventview*.

La vista *myeventview* es una vista secundaria de la vista principal *eventview*.

Para eliminar la vista *eventview*, parece obvio que el comando que debe utilizarse es el siguiente: 

```
drop view eventview;
```

Observe, no obstante, que si ejecuta este comando en este caso recibe el siguiente error:

```
drop view eventview;
ERROR: can't drop view eventview because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.
```

Para solucionarlo, ejecute el siguiente comando (como se sugiere en el mensaje de error): 

```
drop view eventview cascade;
```

Ambas vistas, *eventview* y *myeventview*, ahora se han eliminado correctamente.

En el siguiente ejemplo, se elimina la vista *eventview*, si existe. Si no es así, no se realiza ninguna acción y se devuelve un mensaje:

```
drop view if exists eventview;
```

# END
<a name="r_END"></a>

Confirma la transacción actual. Realiza exactamente la misma función que el comando COMMIT.

Consulte [COMMIT](r_COMMIT.md) para obtener información detallada.

## Sintaxis
<a name="r_END-synopsis"></a>

```
END [ WORK | TRANSACTION ]
```

## Parameters
<a name="r_END-parameters"></a>

WORK  
Palabra clave opcional.

TRANSACTION  
Palabra clave opcional; WORK y TRANSACTION son sinónimos.

## Ejemplos
<a name="r_END-examples"></a>

Los siguientes ejemplos finalizan el bloque de transacción y confirman la transacción:

```
end;
```

```
end work;
```

```
end transaction;
```

Después de cualquiera de estos comandos, Amazon Redshift finaliza el bloque de transacción y confirma los cambios.

# EXECUTE
<a name="r_EXECUTE"></a>

Ejecuta una instrucción preparada con anterioridad. 

## Sintaxis
<a name="r_EXECUTE-synopsis"></a>

```
EXECUTE plan_name [ (parameter [, ...]) ]
```

## Parameters
<a name="r_EXECUTE-parameters"></a>

 *plan\$1name*   
Nombre de la instrucción preparada para ejecutarse. 

 *parameter*   
El valor real de un parámetro para la instrucción preparada. Debe ser una expresión que aporta un valor de un tipo compatible con el tipo de datos especificado para este parámetro en el comando PREPARE que creó la instrucción preparada. 

## Notas de uso
<a name="r_EXECUTE_usage_notes"></a>

EXECUTE se utiliza para ejecutar una instrucción preparada con anterioridad. Dado que las instrucciones preparadas solo existen durante una sesión, la instrucción preparada debe crearse con una instrucción PREPARE que se ejecuta anteriormente en la sesión actual. 

Si la instrucción PREPARE anterior especificó algunos parámetros, se debe transferir un conjunto compatible de parámetros a la instrucción EXECUTE, o bien, Amazon Redshift devuelve un error. A diferencia de las funciones, las instrucciones preparadas no se sobrecargan en función del tipo o de la cantidad de parámetros especificados; el nombre de una instrucción preparada debe ser único en una sesión de base de datos. 

Cuando se emite un comando EXECUTE para la instrucción preparada, Amazon Redshift puede optar por revisar el plan de ejecución de la consulta (para mejorar el rendimiento en función de los valores del parámetro especificado) antes de ejecutar la instrucción preparada. Además, para cada ejecución nueva de una instrucción preparada, Amazon Redshift puede revisar el plan de ejecución de la consulta nuevamente en función de los diferentes valores del parámetro especificados con la instrucción EXECUTE. Para examinar el plan de ejecución de la consulta que Amazon Redshift ha elegido para cualquier instrucción EXECUTE, utilice el comando [EXPLAIN](r_EXPLAIN.md). 

Para obtener ejemplos y más información acerca de la creación y del uso de instrucciones preparadas, consulte [PREPARE](r_PREPARE.md). 

## Véase también
<a name="r_EXECUTE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [PREPARE](r_PREPARE.md) 

# EXPLAIN
<a name="r_EXPLAIN"></a>

Muestra el plan de ejecución de una instrucción de consulta sin ejecutar la consulta. Para obtener información sobre el flujo de trabajo del análisis de consultas, consulte [Flujo de trabajo de análisis de consultas](c-query-analysis-process.md).

## Sintaxis
<a name="r_EXPLAIN-synopsis"></a>

```
EXPLAIN [ VERBOSE ] query
```

## Parameters
<a name="r_EXPLAIN-parameters"></a>

VERBOSE   
Muestra el plan de consulta completo en lugar de solo un resumen.

 *query*   
Instrucción de consulta que se explicará. La consulta puede ser una instrucción SELECT, INSERT, CREATE TABLE AS, UPDATE o DELETE.

## Notas de uso
<a name="r_EXPLAIN-usage-notes"></a>

El rendimiento de EXPLAIN a menudo se ve afectado por el tiempo que lleva crear tablas temporales. Por ejemplo, una consulta que usa la optimización de subexpresión común requiere que se creen y analicen tablas temporales para devolver el resultado de EXPLAIN. El plan de consulta depende del esquema y las estadísticas de las tablas temporales. Por lo tanto, el comando EXPLAIN para este tipo de consulta puede tardar más tiempo en ejecutarse que lo esperado.

Puede usar EXPLAIN solo para los siguientes comandos:
+ SELECT
+ SELECT INTO
+ CREATE TABLE AS
+ INSERT
+ UPDATE
+ DELETE

El comando EXPLAIN producirá un error si lo utiliza para otros comandos SQL, como operaciones de base de datos o lenguaje de definición de datos (DDL).

Amazon Redshift utiliza los costos unitarios relativos de los resultados de EXPLAIN para elegir un plan de consultas. Amazon Redshift compara los tamaños de varias estimaciones de recursos para determinar el plan.

## Pasos de planificación y ejecución de consultas
<a name="r_EXPLAIN-query-planning-and-execution-steps"></a>

El plan de ejecución para una instrucción de consulta de Amazon Redshift específica desglosa la ejecución y el cálculo de una consulta en una secuencia discreta de operaciones de tabla y pasos que eventualmente producen un conjunto de resultados finales para la consulta. Para obtener información acerca de la planificación de consultas, consulte [Procesamiento de consultas](c-query-processing.md).

La siguiente tabla proporciona un resumen de los pasos que Amazon Redshift puede utilizar con objeto de desarrollar un plan de ejecución para cualquier consulta que un usuario envíe para su ejecución.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_EXPLAIN.html)

## Uso de EXPLAIN para RLS
<a name="r_EXPLAIN-RLS"></a>

Si una consulta contiene una tabla que está sujeta a políticas de seguridad de la fila (RLS), EXPLAIN muestra un nodo especial SecureScan de RLS. Amazon Redshift también registra el mismo tipo de nodo en la tabla del sistema STL\$1EXPLAIN. EXPLAIN no revela el predicado de RLS que se aplica a dim\$1tbl. El tipo de nodo SecureScan de RLS sirve como indicador de que el plan de ejecución contiene operaciones adicionales que son invisibles para el usuario actual.

En el siguiente ejemplo, se ilustra un nodo SecureScan de RLS.

```
EXPLAIN
SELECT D.cint
FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k
WHERE F.k_dim / 10 > 0;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Hash Join DS_DIST_ALL_NONE  (cost=0.08..0.25 rows=1 width=4)
   Hash Cond: ("outer".k_dim = "inner"."k")
   ->  *XN* *RLS SecureScan f  (cost=0.00..0.14 rows=2 width=4)*
         Filter: ((k_dim / 10) > 0)
   ->  XN Hash  (cost=0.07..0.07 rows=2 width=8)
         ->  XN Seq Scan on dim_tbl d  (cost=0.00..0.07 rows=2 width=8)
               Filter: (("k" / 10) > 0)
```

Para habilitar una investigación completa de los planes de consultas que están sujetos a RLS, Amazon Redshift ofrece los permisos del sistema EXPLAIN RLS. Los usuarios a los que se les haya otorgado este permiso pueden inspeccionar planes de consulta completos que también incluyan predicados de RLS. 

En el siguiente ejemplo, se ilustra un análisis de secuencia adicional debajo del nodo SecureScan de RLS que también incluye el predicado de política de RLS (k\$1dim > 1).

```
EXPLAIN SELECT D.cint
FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k
WHERE F.k_dim / 10 > 0;
                                   QUERY PLAN
---------------------------------------------------------------------------------
 XN Hash Join DS_DIST_ALL_NONE  (cost=0.08..0.25 rows=1 width=4)
   Hash Cond: ("outer".k_dim = "inner"."k")
   *->  XN RLS SecureScan f  (cost=0.00..0.14 rows=2 width=4)
         Filter: ((k_dim / 10) > 0)*
         ->  *XN* *Seq Scan on fact_tbl rls_table  (cost=0.00..0.06 rows=5 width=8)
               Filter: (k_dim > 1)*
   ->  XN Hash  (cost=0.07..0.07 rows=2 width=8)
         ->  XN Seq Scan on dim_tbl d  (cost=0.00..0.07 rows=2 width=8)
               Filter: (("k" / 10) > 0)
```

Mientras se concede el permiso EXPLAIN RLS a un usuario, Amazon Redshift registra el plan de consulta completo, incluidos los predicados de RLS, en la tabla del sistema STL\$1EXPLAIN. Las consultas que se ejecutan mientras no se concede este permiso se registrarán sin los internos de RLS. La concesión o eliminación del permiso EXPLAIN RLS no cambiará lo que Amazon Redshift haya registrado en STL\$1EXPLAIN para consultas anteriores.

### Relaciones de Redshift protegidas por RLS de AWS Lake Formation
<a name="r_EXPLAIN_RLS-LF"></a>

En el siguiente ejemplo se ilustra un nodo LF SecureScan que puede utilizar para ver las relaciones entre Lake Formation y RLS.

```
EXPLAIN
SELECT *
FROM lf_db.public.t_share
WHERE a > 1;
QUERY PLAN
---------------------------------------------------------------
XN LF SecureScan t_share  (cost=0.00..0.02 rows=2 width=11)
(2 rows)
```

## Ejemplos
<a name="r_EXPLAIN-examples"></a>

**nota**  
Para estos ejemplos, la salida de ejemplo puede variar según la configuración de Amazon Redshift.

El siguiente ejemplo devuelve el plan de consulta para una consulta que selecciona EVENTID, EVENTNAME, VENUEID y VENUENAME de la tablas EVENT y VENUE:

```
explain
select eventid, eventname, event.venueid, venuename
from event, venue
where event.venueid = venue.venueid;
```

```
                                QUERY PLAN
--------------------------------------------------------------------------
XN Hash Join DS_DIST_OUTER  (cost=2.52..58653620.93 rows=8712 width=43)
Hash Cond: ("outer".venueid = "inner".venueid)
->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=23)
->  XN Hash  (cost=2.02..2.02 rows=202 width=22)
->  XN Seq Scan on venue  (cost=0.00..2.02 rows=202 width=22)
(5 rows)
```

El siguiente ejemplo devuelve el plan de consulta para la misma consulta con resultados más detallados:

```
explain verbose
select eventid, eventname, event.venueid, venuename
from event, venue
where event.venueid = venue.venueid;
```

```
                                QUERY PLAN
--------------------------------------------------------------------------
{HASHJOIN
:startup_cost 2.52
:total_cost 58653620.93
:plan_rows 8712
:plan_width 43
:best_pathkeys <>
:dist_info DS_DIST_OUTER
:dist_info.dist_keys (
TARGETENTRY
{
VAR
:varno 2
:varattno 1
...

XN Hash Join DS_DIST_OUTER  (cost=2.52..58653620.93 rows=8712 width=43)
Hash Cond: ("outer".venueid = "inner".venueid)
->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=23)
->  XN Hash  (cost=2.02..2.02 rows=202 width=22)
->  XN Seq Scan on venue  (cost=0.00..2.02 rows=202 width=22)
(519 rows)
```

El siguiente ejemplo devuelve el plan de consulta para una instrucción CREATE TABLE AS (CTAS): 

```
explain create table venue_nonulls as
select * from venue
where venueseats is not null;

QUERY PLAN
-----------------------------------------------------------
XN Seq Scan on venue  (cost=0.00..2.02 rows=187 width=45)
Filter: (venueseats IS NOT NULL)
(2 rows)
```

# FETCH
<a name="fetch"></a>

Recupera filas con un cursor. Para obtener información acerca de la declaración de un cursor, consulte [DECLARE](declare.md).

FETCH recupera filas en función de la posición actual dentro del cursor. Cuando se crea un cursor, se posiciona antes de la primera fila. Después de FETCH, el cursor se posiciona en la última fila recuperada. Si FETCH se ejecuta en el extremo de las filas disponibles, como tras un comando FETCH ALL, el cursor queda posicionado después de la última fila. 

FORWARD 0 recupera la fila actual sin mover el cursor; es decir, recupera la fila que se buscó más recientemente. Si el cursor se posiciona antes de la primera fila o después de la última fila, no se devuelve una fila. 

Cuando se recupera la primera fila de un cursor, el conjunto completo de resultados se materializa en el nodo principal, en la memoria o en el disco, si es necesario. Debido al posible impacto negativo en el rendimiento del uso de cursores con conjuntos de resultados grandes, recomendamos usar enfoques alternativos cuando sea posible. Para obtener más información, consulte [Consideraciones acerca del rendimiento cuando se utilizan cursores](declare.md#declare-performance).

Para obtener más información, consulte [DECLARE](declare.md), [CLOSE](close.md). 

## Sintaxis
<a name="fetch-synopsis"></a>

```
FETCH [ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor
```

## Parameters
<a name="fetch-parameters"></a>

NEXT  
Recupera la última fila. Esta es la opción predeterminada.

ALL  
Recupera todas las filas restantes. (Igual que FORWARD ALL). ALL no es compatible con los clústeres de un solo nodo.

FORWARD [ *count (número)* \$1 ALL ]   
Recupera el siguiente *count (número)* de filas o todas las filas restantes. `FORWARD 0` recupera la fila actual. Para los clústeres de un nodo, el valor máximo del valor count es `1000`. FORWARD ALL no es compatible con los clústeres de un solo nodo. 

*cursor*   
Nombre del nuevo cursor. 

## Ejemplo de FETCH
<a name="fetch-example"></a>

En el siguiente ejemplo, se declara un cursor denominado LOLLAPALOOZA para seleccionar información de ventas para el evento Lollapalooza y, luego, se recuperan filas del conjunto de resultados a través del cursor:

```
-- Begin a transaction

begin;

-- Declare a cursor

declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';

-- Fetch the first 5 rows in the cursor lollapalooza:

fetch forward 5 from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-05-01 19:00:00 |   92.00000000 |       3
 Lollapalooza | 2008-11-15 15:00:00 |  222.00000000 |       2
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       3
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       4
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       1
(5 rows)

-- Fetch the next row:

fetch next from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-10-06 14:00:00 |  114.00000000 |       2

-- Close the cursor and end the transaction:

close lollapalooza;
commit;
```

# GRANT
<a name="r_GRANT"></a>

Define permisos de acceso para un usuario o rol.

Los permisos incluyen opciones de acceso, como poder leer datos en tablas y vistas, escribir datos, crear tablas y eliminarlas. Utilice este comando para otorgar permisos específicos a una tabla, base de datos, esquema, función, procedimiento, lenguaje o columna. Para revocar los permisos de un objeto de la base de datos, utilice el comando [REVOKE](r_REVOKE.md). 

Los permisos también incluyen las siguientes opciones de acceso al productor de recursos compartidos de datos:
+  Otorgar acceso a un recurso compartido de datos a los espacios de nombres y las cuentas del consumidor. 
+  Otorgar permiso para modificar un recurso compartido de datos mediante la adición o eliminación de objetos del recurso compartido de datos. 
+  Otorgar permiso para compartir un recurso compartido de datos mediante la adición o eliminación de espacios de nombres del consumidor del recurso compartido de datos. 

Las opciones de acceso para consumidores de recursos compartidos de datos son las siguientes:
+ Otorgar a los usuarios acceso total a las bases de datos creadas a partir de un recurso compartido de datos o a esquemas externos que apuntan a dichas bases de datos.
+ Otorgar a los usuarios permisos de nivel de objeto en las bases de datos creadas a partir de un recurso compartido de datos, tal como se hace con los objetos de bases de datos locales. Para conceder este nivel de permiso, debe utilizar la cláusula WITH PERMISSIONS al crear una base de datos a partir del recurso compartido de datos. Para obtener más información, consulte [CREATE DATABASE](r_CREATE_DATABASE.md).

Para obtener más información sobre permisos de recursos compartidos de datos, consulte [Permisos que puede conceder a los recursos compartidos de datos](permissions-datashares.md).

Los permisos también incluyen el siguiente catálogo de permisos federados de Amazon Redshift:
+ Concesión de permisos por tabla a usuarios y roles.
+ Concesión de permisos detallados por columna sobre tablas, vistas y vistas materializadas.
+ Concesión de permisos acotados a usuarios y roles.
+ Concesión de permisos por base de datos en el catálogo de permisos federados de Amazon Redshift.

Para obtener más información acerca de la administración de permisos en el catálogo de permisos federados de Amazon Redshift, consulte [Administración del control de acceso en el catálogo de permisos federados de Amazon RedshiftConcesión / Revocación](federated-permissions-managing-access.md). Para obtener más información sobre las sintaxis de concesión o revocación compatibles con el catálogo de permisos federados de Amazon Redshift, consulte [Concesión/Revocación](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html#federated-permissions-managing-access-grant-revoke).

Los permisos también incluyen el privilegio CONNECT para los usuarios federados de AWS IAM Identity Center. Este privilegio permite a los administradores controlar el acceso de los usuarios mediante permisos granulares en cada grupo de trabajo o clúster de Amazon Redshift en los que estén habilitados los permisos federados de Amazon Redshift. El administrador de Amazon Redshift puede especificar qué usuarios o grupos de AWS IAM Identity Center federados tienen acceso para conectarse directamente al grupo de trabajo de Amazon Redshift, lo que proporciona un control detallado del acceso de los usuarios a cada grupo de trabajo o clúster de AWS IAM Identity Center.

También puede conceder roles para administrar los permisos de base de datos y controlar lo que los usuarios pueden hacer en relación con los datos. Al definir roles y asignarlos a los usuarios, puede limitar las acciones que estos pueden realizar, como, por ejemplo, limitar a los usuarios solo a los comandos CREATE TABLE e INSERT. Para obtener más información sobre el comando CREATE ROLE, consulte [CREATE ROLE](r_CREATE_ROLE.md). Amazon Redshift dispone de algunos roles definidos por el sistema que también puede utilizar para conceder permisos específicos a sus usuarios. Para obtener más información, consulte [Roles definidos por el sistema de Amazon Redshift](r_roles-default.md).

Solo puede usar permisos GRANT o REVOKE USAGE en un esquema externo de los usuarios de la base de datos y los grupos de usuarios que utilicen la sintaxis ON SCHEMA. Cuando use ON EXTERNAL SCHEMA con AWS Lake Formation, solo puede usar GRANT y REVOKE para conceder y revocar permisos a un rol de AWS Identity and Access Management (IAM). Para obtener una lista de los permisos, consulte la sintaxis.

Para los procedimientos almacenados, el único permiso que puede concederse es EXECUTE.

No se puede ejecutar GRANT (en un recurso externo) en un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

Para ver qué permisos se han concedido a los usuarios para una base de datos, utilice [HAS\$1DATABASE\$1PRIVILEGE](r_HAS_DATABASE_PRIVILEGE.md). Para ver qué permisos se han concedido a los usuarios para un esquema, utilice [HAS\$1SCHEMA\$1PRIVILEGE](r_HAS_SCHEMA_PRIVILEGE.md). Para ver qué permisos se han concedido a los usuarios para una tabla, utilice [HAS\$1TABLE\$1PRIVILEGE](r_HAS_TABLE_PRIVILEGE.md). 

## Sintaxis
<a name="r_GRANT-synopsis"></a>



```
GRANT { { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | ALTER | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE | TEMPORARY | TEMP | ALTER } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE db_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL PROCEDURES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT USAGE
    ON LANGUAGE language_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]             

GRANT { { ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
    ON COPY JOB job_name [,...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON TEMPLATE [database_name.][schema_name.]template_name [,...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Concesión de permisos de nivel de columna para tablas
<a name="grant-column-level"></a>

A continuación, se muestra la sintaxis de los permisos de nivel de columna en tablas y vistas de Amazon Redshift.

```
GRANT { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }

     TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Concesión de permisos ASSUMEROLE
<a name="grant-assumerole-permissions"></a>

A continuación, se muestra la sintaxis de los permisos ASSUMEROLE concedidos a usuarios y grupos con un rol especificado. Para empezar a utilizar el privilegio ASSUMEROLE, consulte [Notas de uso para conceder el permiso ASSUMEROLE](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole).

```
GRANT ASSUMEROLE
       ON { 'iam_role' [, ...] | default | ALL }
       TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
       FOR { ALL | COPY | UNLOAD | EXTERNAL FUNCTION | CREATE MODEL } [, ...]
```

### Concesión de permisos para la integración de Redshift Spectrum con Lake Formation
<a name="grant-spectrum-integration-with-lf-syntax"></a>

A continuación, se muestra la sintaxis para la integración de Redshift Spectrum con Lake Formation. 

```
GRANT { SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    TO { { IAM_ROLE iam_role } [, ...] | PUBLIC } [ WITH GRANT OPTION ]

GRANT { { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]
```

### Concesión de permisos de recurso compartido de datos
<a name="grant-datashare-syntax"></a>

**Permisos de recursos compartidos de datos del lado del productor**  
A continuación, se muestra la sintaxis para utilizar GRANT a fin de conceder permisos ALTER o SHARE a un usuario o rol. El usuario puede modificar el recurso compartido de datos con el permiso ALTER o conceder el uso a un consumidor con el permiso SHARE. ALTER y SHARE son los únicos permisos que se pueden conceder en recursos compartidos de datos a usuarios y a grupos de usuarios.

```
GRANT { ALTER | SHARE } ON DATASHARE datashare_name
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

A continuación, se muestra la sintaxis para utilizar GRANT en los permisos de uso de recurso compartido de datos en Amazon Redshift. Con el permiso USAGE se concede acceso a un recurso compartido de datos a un consumidor. No se puede conceder este permiso a usuarios o grupos de usuarios. Este permiso tampoco admite WITH GRANT OPTION para la instrucción GRANT. Solo los usuarios o los grupos de usuarios a los que se haya concedido el permiso SHARE con anterioridad para el recurso compartido de datos pueden ejecutar este tipo de instrucción GRANT.

```
GRANT USAGE
    ON DATASHARE datashare_name
    TO NAMESPACE 'namespaceGUID' | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]
```

A continuación, se ofrece un ejemplo de cómo conceder el uso de un recurso compartido de datos a una cuenta de Lake Formation.

```
GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '123456789012' VIA DATA CATALOG;
```

**Permisos de recursos compartidos de datos del lado del consumidor**  
A continuación, se muestra la sintaxis para los permisos de uso compartido de datos GRANT en una base de datos específica o un esquema específico creados a partir de un datashare. 

Los demás permisos necesarios para que los consumidores accedan a una base de datos creada a partir de un recurso compartido de datos varían en función de si el comando CREATE DATABASE utilizado para crear la base de datos a partir del recurso compartido de datos ha utilizado o no la cláusula WITH PERMISSIONS. Para obtener más información acerca del comando CREATE DATABASE y la cláusula WITH PERMISSIONS, consulte [CREATE DATABASE](r_CREATE_DATABASE.md).

**Bases de datos creadas sin usar la cláusula WITH PERMISSIONS**  
Al conceder USAGE a una base de datos creada a partir de un recurso compartido de datos sin la cláusula WITH PERMISSIONS, no es necesario conceder permisos por separado a los objetos de la base de datos compartida. Las entidades a las que se concede el uso en bases de datos creadas a partir de recursos compartidos de datos sin la cláusula WITH PERMISSIONS tienen acceso automáticamente a todos los objetos de la base de datos.

**Bases de datos creadas con la cláusula WITH PERMISSIONS**  
Al conceder USAGE a una base de datos en la que se ha creado la base de datos compartida a partir de un recurso compartido de datos con la cláusula WITH PERMISSIONS, a las identidades del lado del consumidor se les deben seguir concediendo los permisos pertinentes para los objetos de la base de datos compartida para acceder a ellas, del mismo modo que se concederían permisos a los objetos de la base de datos local. Para conceder permisos a los objetos de una base de datos creada a partir de un recurso compartido de datos, utilice la sintaxis de tres partes `database_name.schema_name.object_name`. Para conceder permisos a los objetos en un esquema externo que apunte a un esquema compartido dentro de la base de datos compartida, utilice la sintaxis de dos partes `schema_name.object_name`.

```
GRANT USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
    TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Concesión de permisos acotados
<a name="grant-scoped-syntax"></a>

Los permisos limitados le permiten conceder permisos a un usuario o rol en todos los objetos de un tipo dentro de una base de datos o un esquema. Los usuarios y roles con permisos limitados tienen los permisos especificados en todos los objetos actuales y futuros de la base de datos o del esquema.

Puede ver el alcance de los permisos limitados en el nivel de base de datos en [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md). Puede ver el alcance de los permisos limitados en el nivel de esquema en [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md).

Para obtener más información sobre los permisos acotados, consulte [Permisos acotados](t_scoped-permissions.md).

A continuación, se muestra la sintaxis para conceder permisos acotados a usuarios y roles.

```
GRANT { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
FOR SCHEMAS IN
DATABASE db_name 
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]

GRANT 
{ { SELECT | INSERT | UPDATE | DELETE | DROP | ALTER | TRUNCATE | REFERENCES } [, ...] } | ALL [PRIVILEGES] } }
FOR TABLES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name} [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
FOR FUNCTIONS IN 
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name | } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
FOR PROCEDURES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name | } [, ...]

GRANT USAGE
FOR LANGUAGES IN
{DATABASE db_name}
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]  

GRANT { { CREATE | ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
FOR COPY JOBS 
IN DATABASE db_name
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]

GRANT { { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
FOR TEMPLATES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]
```

Tenga en cuenta que los permisos limitados no distinguen entre los permisos de las funciones y los de los procedimientos. Por ejemplo, la siguiente instrucción concede a `bob` el permiso `EXECUTE` tanto para las funciones como para los procedimientos en el esquema `Sales_schema`.

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

### Concesión de permisos de machine learning
<a name="grant-model-syntax"></a>

A continuación, se muestra la sintaxis para los permisos de modelos de machine learning en Amazon Redshift.

```
GRANT CREATE MODEL
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON MODEL model_name [, ...]

    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Concesión de permisos de rol
<a name="grant-roles"></a>

La siguiente es la sintaxis para conceder roles en Amazon Redshift.

```
GRANT { ROLE role_name } [, ...] TO { { user_name [ WITH ADMIN OPTION ] } | ROLE role_name }[, ...]
```

A continuación, se muestra la sintaxis para conceder permisos de sistema a los roles en Amazon Redshift. Tenga en cuenta que solo puede conceder permisos a los roles, no a los usuarios.

```
GRANT
  {
    { CREATE USER | DROP USER | ALTER USER |
    CREATE SCHEMA | DROP SCHEMA |
    ALTER DEFAULT PRIVILEGES |
    ACCESS CATALOG | ACCESS SYSTEM TABLE
    CREATE TABLE | DROP TABLE | ALTER TABLE |
    CREATE OR REPLACE FUNCTION | CREATE OR REPLACE EXTERNAL FUNCTION |
    DROP FUNCTION |
    CREATE OR REPLACE PROCEDURE | DROP PROCEDURE |
    CREATE OR REPLACE VIEW | DROP VIEW |
    CREATE MODEL | DROP MODEL |
    CREATE DATASHARE | ALTER DATASHARE | DROP DATASHARE |
    CREATE LIBRARY | DROP LIBRARY |
    CREATE ROLE | DROP ROLE |
    TRUNCATE TABLE
    VACUUM | ANALYZE | CANCEL |
    IGNORE RLS | EXPLAIN RLS | 
    EXPLAIN MASKING }[, ...]
  }
  | { ALL [ PRIVILEGES ] }
TO ROLE role_name [, ...]
```

### Concesión de permisos EXPLAIN para políticas de seguridad
<a name="grant-row-level-security"></a>

A continuación, se muestra la sintaxis para conceder permisos para explicar los filtros de la política de seguridad de una consulta en el plan EXPLAIN. Las posibles políticas de seguridad incluyen políticas de seguridad por fila y políticas de enmascaramiento de datos dinámico.

```
GRANT EXPLAIN { RLS | MASKING } TO ROLE rolename 
```

Con la siguiente sintaxis, se puede conceder permisos para omitir las políticas de seguridad de la fila para una consulta. Esta sintaxis no se aplica a las políticas de enmascaramiento de datos dinámico.

```
GRANT IGNORE RLS TO ROLE rolename 
```

Con la siguiente sintaxis, se pueden conceder permisos de tabla de búsqueda a la política de seguridad especificada. Las posibles políticas de seguridad incluyen políticas de seguridad por fila y políticas de enmascaramiento de datos dinámico.

```
GRANT SELECT ON [ TABLE ] table_name [, ...]
TO { RLS | MASKING } POLICY policy_name [, ...]
```

### Concesión de permisos de conexión
<a name="grant-connection-permissions"></a>

A continuación, se muestra la sintaxis para conceder permisos a los usuarios (o grupos) federados de AWS IAM Identity Center para que se conecten a un grupo de trabajo o clúster:

```
GRANT CONNECT [ON WORKGROUP]
TO [USER] <prefix>:<username> | ROLE <prefix>:<rolename> | PUBLIC;
```

## Parameters
<a name="r_GRANT-parameters"></a>

SELECT   <a name="grant-select"></a>
Concede permiso para seleccionar datos de una tabla o vista mediante una instrucción SELECT. También se requiere el permiso SELECT para hacer referencia a los valores de columna existentes para las operaciones UPDATE o DELETE.

INSERT   <a name="grant-insert"></a>
Concede el permiso para cargar datos en una tabla mediante una instrucción INSERT o COPY. 

UPDATE   <a name="grant-update"></a>
Concede el privilegio para actualizar una columna de tabla mediante una instrucción UPDATE. Las operaciones UPDATE también requieren el permiso SELECT, ya que deben hacer referencia a las columnas de tabla para determinar cuáles son las filas que se deben actualizar o para calcular nuevos valores para las columnas.

DELETE  <a name="grant-delete"></a>
Concede el permiso para eliminar una fila de datos de una tabla. Las operaciones DELETE también requieren el permiso SELECT, ya que deben hacer referencia a las columnas de tabla para determinar cuáles son las filas que se deben eliminar.

DROP  <a name="grant-drop"></a>
Según el objeto de base de datos, concede los siguientes permisos al usuario o al rol:   
+  En el caso de las tablas, DROP concede permiso para eliminar una tabla o una vista. Para obtener más información, consulte [DROP TABLE](r_DROP_TABLE.md). 
+  En el caso de las bases de datos, DROP concede permiso para eliminar una base de datos. Para obtener más información, consulte [DROP DATABASE](r_DROP_DATABASE.md). 
+  En el caso de los esquemas, DROP concede permiso para eliminar un esquema. Para obtener más información, consulte [DROP SCHEMA](r_DROP_SCHEMA.md). 

REFERENCES   <a name="grant-references"></a>
Concede el permiso para crear una restricción de clave externa. Es necesario conceder este permiso en la tabla a la que se hace referencia y en la tabla que hace la referencia; de lo contrario, el usuario no podrá crear la restricción. 

ALTER  <a name="grant-alter"></a>
Según el objeto de base de datos, concede los siguientes permisos al usuario o al grupo de usuarios:   
+ En el caso de las tablas, ALTER concede permiso para modificar una tabla o una vista. Para obtener más información, consulte [ALTER TABLE](r_ALTER_TABLE.md).
+ En el caso de las bases de datos, ALTER concede permiso para modificar una base de datos. Para obtener más información, consulte [ALTER DATABASE](r_ALTER_DATABASE.md).
+ En el caso de los esquemas, ALTER concede permiso para modificar un esquema. Para obtener más información, consulte [ALTER SCHEMA](r_ALTER_SCHEMA.md).
+ En el caso de las tablas externas, ALTER concede permiso para alterar una tabla en un AWS Glue Data Catalog que esté habilitado para Lake Formation. Este permiso solo se aplica cuando se utiliza Lake Formation.

TRUNCATE  <a name="grant-truncate"></a>
Concede permiso para truncar una tabla. Sin este permiso, solo el propietario de una tabla o un superusuario pueden truncarla. Para obtener más información sobre el comando TRUNCATE, consulte [TRUNCATE](r_TRUNCATE.md).

ALL [ PRIVILEGES ]   <a name="grant-all"></a>
Concede todos los permisos disponibles a la vez al usuario o al rol especificado. La palabra clave PRIVILEGES es opcional.  
GRANT ALL ON SCHEMA no concede permisos CREATE para esquemas externos.  
Puede conceder el permiso ALL a una tabla en un AWS Glue Data Catalog que está habilitado para Lake Formation. En este caso, los permisos individuales (como SELECT, ALTER, etc.) se registran en el catálogo de datos.   
 Amazon Redshift no admite los permisos RULE y TRIGGER. Para obtener más información, consulte [Características no compatibles de PostgreSQL](c_unsupported-postgresql-features.md). 

ASSUMEROLE  <a name="assumerole"></a>
Concede permiso para ejecutar los comandos COPY, UNLOAD, EXTERNAL FUNCTION y CREATE MODEL a usuarios, roles o grupos con un rol especificado. El usuario, el rol o el grupo asume ese rol cuando se ejecuta el comando especificado. Para empezar a utilizar el permiso ASSUMEROLE, consulte [Notas de uso para conceder el permiso ASSUMEROLE](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole).

ON [ TABLE ] *table\$1name*   <a name="grant-on-table"></a>
Concede los permisos especificados en una tabla o vista. La palabra clave TABLE es opcional. Puede enumerar varias tablas y vistas en una instrucción.

ON ALL TABLES IN SCHEMA *schema\$1name (nombre\$1de\$1esquema)*   <a name="grant-all-tables"></a>
Concede los permisos especificados en todas las tablas y vistas en el esquema al que se hace referencia.

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="grant-column-level-privileges"></a>
Concede los permisos especificados a usuarios, grupos o PUBLIC en las columnas especificadas de la tabla o la vista de Amazon Redshift.

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table-column"></a>
Concede los permisos especificados a un rol de IAM en las columnas especificadas de la tabla de Lake Formation en el esquema al que se hace referencia.

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table"></a>
Concede los permisos especificados a un rol de IAM en las tablas de Lake Formation especificadas en el esquema al que se hace referencia.

ON EXTERNAL SCHEMA *schema\$1name*   <a name="grant-external-schema"></a>
Concede los permisos especificados a un rol de IAM en el esquema al que se hace referencia.

ON *iam\$1role*   <a name="grant-iam_role"></a>
Concede los permisos especificados a un rol de IAM.

TO *username*   <a name="grant-to"></a>
Indica el usuario que recibe los permisos.

TO IAM\$1ROLE *iam\$1role*   <a name="grant-to-iam-role"></a>
Indica el rol de IAM que recibe los permisos.

WITH GRANT OPTION   <a name="grant-with-grant"></a>
Indica que el usuario que recibe los permisos puede, a su vez, conceder los mismos permisos a otros usuarios. No se puede conceder WITH GRANT OPTION a un grupo o a PUBLIC.

ROLE *role\$1name*   <a name="grant-role"></a>
Concede el permiso a un rol.

GROUP *group\$1name*   <a name="grant-group"></a>
Concede los permisos para a un grupo de usuarios. Puede ser una lista separada por comas para especificar varios grupos de usuarios.

PUBLIC   <a name="grant-public"></a>
Concede los permisos especificados a todos los usuarios, incluidos los creados posteriormente. PUBLIC representa un grupo que siempre incluye a todos los usuarios. Los permisos de un usuario individual constan de la suma de permisos concedidos a PUBLIC, los permisos concedidos a cualquier grupo al que pertenezca el usuario y los permisos concedidos al usuario de manera individual.  
La concesión de PUBLIC a una tabla externa de Lake Formation da lugar a la concesión del permiso al grupo *everyone* de Lake Formation.

CONNECT [ON WORKGROUP] TO \$1 [USER] <prefix>:<username> \$1 ROLE <prefix>:<rolename> \$1 PUBLIC \$1  
Otorga el permiso para conectarse a un grupo de trabajo o clúster a usuarios o grupos de AWS IAM Identity Center federados. El prefijo identifica al proveedor de identidad. Cuando se concede a PUBLIC, el permiso se aplica a todos los usuarios federados de AWS IAM Identity Center, incluidos los creados posteriormente. Este permiso solo se aplica cuando los permisos federados de Amazon Redshift están habilitados en el grupo de trabajo o el clúster.

CREATE   <a name="grant-create"></a>
Según el objeto de base de datos, concede los siguientes permisos al usuario o al grupo de usuarios:  
+ Para las bases de datos, CREATE permite que los usuarios creen esquemas dentro de la base de datos.
+ Para los esquemas, CREATE permite que los usuarios creen objetos dentro de un esquema. Para cambiar el nombre de un objeto, el usuario debe tener el permiso CREATE y ser propietario del objeto cuyo nombre va a cambiarse.
+ CREATE ON SCHEMA no se admite para esquemas externos de Amazon Redshift Spectrum. Para conceder permisos para usar tablas externas en un esquema externo, conceda el privilegio USAGE ON SCHEMA a los usuarios que necesitan tener acceso. Solo el propietario de un esquema externo o un superusuario pueden crear tablas externas en el esquema externo. Para transferir la propiedad de un esquema externo, use [ALTER SCHEMA](r_ALTER_SCHEMA.md) para cambiar el propietario. 

TEMPORARY \$1 TEMP   <a name="grant-temporary"></a>
Concede el permiso para crear tablas temporales en la base de datos especificada. Para ejecutar consultas de Amazon Redshift Spectrum, el usuario de la base de datos debe tener permiso para crear tablas temporales en la base de datos.   
Por defecto, los usuarios reciben permisos para crear tablas temporales con su membresía automática en el grupo PUBLIC. Para quitar el permiso para que cualquier usuario pueda crear tablas temporales, revoque el permiso TEMP del grupo PUBLIC. A continuación, conceda explícitamente el permiso para crear tablas temporales a usuarios o grupos de usuarios específicos.

ON DATABASE *db\$1name*   <a name="grant-database"></a>
Concede los permisos especificados en una base de datos.

USAGE   <a name="grant-usage"></a>
Concede el permiso USAGE en un esquema específico, lo que permite que los usuarios obtengan acceso a los objetos de ese esquema. Las acciones específicas en estos objetos deben concederse por separado (por ejemplo, permisos SELECT o UPDATE en las tablas) para los esquemas locales de Amazon Redshift. De forma predeterminada, todos los usuarios tienen permisos CREATE y USAGE en el esquema PUBLIC.   
 Al conceder USAGE a esquemas externos mediante la sintaxis ON SCHEMA, no es necesario conceder acciones por separado a los objetos del esquema externo. Los permisos de catálogo correspondientes controlan los permisos detallados de los objetos de esquema externos. 

ON SCHEMA *schema\$1name*   <a name="grant-schema"></a>
Concede los permisos especificados en un esquema.  
GRANT CREATE ON SCHEMA y el permiso CREATE en GRANT ALL ON SCHEMA no se admiten para esquemas externos de Amazon Redshift Spectrum. Para conceder permisos para usar tablas externas en un esquema externo, conceda el privilegio USAGE ON SCHEMA a los usuarios que necesitan tener acceso. Solo el propietario de un esquema externo o un superusuario pueden crear tablas externas en el esquema externo. Para transferir la propiedad de un esquema externo, use [ALTER SCHEMA](r_ALTER_SCHEMA.md) para cambiar el propietario. 

EXECUTE ON ALL FUNCTIONS IN SCHEMA *schema\$1name*  <a name="grant-all-functions"></a>
Concede los permisos especificados en todas las funciones en el esquema al que se hace referencia.  
Amazon Redshift no admite las instrucciones GRANT ni REVOKE para las entradas integradas de pg\$1proc definidas en el espacio de nombres pg\$1catalog. 

EXECUTE ON PROCEDURE *procedure\$1name*   <a name="grant-procedure"></a>
Concede el permiso EXECUTE en un procedimiento almacenado específico. Debido a que los nombres de procedimientos almacenados no se pueden sobrecargar, debe incluir la lista de argumentos para el procedimiento. Para obtener más información, consulte [Nomenclatura de los procedimientos almacenados](stored-procedure-naming.md).

EXECUTE ON ALL PROCEDURES IN SCHEMA *schema\$1name*  <a name="grant-all-procedures"></a>
Concede los permisos especificados en todos los procedimientos almacenados en el esquema al que se hace referencia.

USAGE ON LANGUAGE *language\$1name*   
Concede el permiso USAGE en un lenguaje.   
A partir del 1 de noviembre de 2025, Amazon Redshift dejará de admitir la creación de nuevas UDF de Python. Las UDF de Python existentes seguirán funcionando hasta el 30 de junio de 2026. A partir del 1 de julio de 2026, Amazon Redshift dejará de admitir las UDF de Python. Le recomendamos que migre las UDF de Python existentes a UDF de Lambda antes del 1 de noviembre de 2025. Para obtener información sobre cómo crear y utilizar las UDF de Lambda, consulte [UDF de Lambda escalares](udf-creating-a-lambda-sql-udf.md). Para obtener información sobre cómo convertir las UDF de Python existentes en UDF de Lambda, consulte la [publicación del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/).
Se requiere el permiso USAGE ON LANGUAGE para crear funciones definidas por el usuario (UDF) mediante la ejecución del comando [CREATE FUNCTION](r_CREATE_FUNCTION.md). Para obtener más información, consulte [Seguridad y permisos de UDF](udf-security-and-privileges.md).   
Se requiere el permiso USAGE ON LANGUAGE para crear procedimientos almacenados mediante la ejecución del comando [CREATE PROCEDURE](r_CREATE_PROCEDURE.md). Para obtener más información, consulte [Seguridad y privilegios para procedimientos almacenados](stored-procedure-security-and-privileges.md).  
Para las UDF de Python, use `plpythonu`. Para las UDF de SQL, use `sql`. Para procedimientos almacenados, utilice `plpgsql`.

ON COPY JOB *job\$1name*  <a name="on-copy-job"></a>
Concede los permisos especificados en un trabajo de copia.

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]   <a name="grant-for"></a>
Especifica el comando SQL para el que se concede el permiso. Puede especificar ALL para conceder el permiso en las instrucciones COPY, UNLOAD, EXTERNAL FUNCTION y CREATE MODEL. Esta cláusula se aplica solo a la concesión del permiso ASSUMEROLE.

ALTER  
Concede el permiso ALTER a los usuarios para agregar o quitar objetos de un recurso compartido de datos o para establecer la propiedad PUBLICACCESSIBLE. Para obtener más información, consulte [ALTER DATASHARE](r_ALTER_DATASHARE.md).

SHARE  
Concede permisos a usuarios y grupos de usuarios para agregar consumidores de datos a un recurso compartido de datos. Este permiso es necesario para permitir que un consumidor determinado (cuenta o espacio de nombres) acceda al recurso compartido de datos desde sus clústeres. El consumidor puede ser la misma cuenta de AWS o una diferente, con el mismo espacio de nombres del clúster o con uno diferente, como lo especifica un identificador global único (GUID).

ON DATASHARE *datashare\$1name*   <a name="grant-datashare"></a>
Concede los permisos especificados en el recurso compartido de datos al que se hace referencia. Para obtener información sobre el grado de detalle del control de acceso de los consumidores, consulte [Uso compartido de datos en niveles diferentes en Amazon Redshift](datashare-overview.md#granularity).

USAGE  
Cuando USAGE se concede a una cuenta consumidora o un espacio de nombres de la misma cuenta, estos pueden acceder al datashare y a los objetos del datashare para lectura solamente. 

TO NAMESPACE 'clusternamespace GUID'  
Indica un espacio de nombres en la misma cuenta donde los consumidores pueden recibir los permisos especificados para el recurso compartido de datos. Los espacios de nombres utilizan un GUID alfanumérico de 128 bits.

TO ACCOUNT 'número\$1de\$1cuenta' [ VIA DATA CATALOG ]  
Indica el número de otra cuenta cuyos consumidores pueden recibir los permisos especificados para el recurso compartido de datos. Si especifica “VIA DATA CATALOG”, se indica que concede el uso del recurso compartido de datos a una cuenta de Lake Formation. La omisión de este parámetro significa que concede el uso a una cuenta que es propietaria del clúster.

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="grant-datashare"></a>
Concede los permisos de uso especificados en la base de datos concreta que se crea en el recurso compartido de datos indicado.

ON SCHEMA* shared\$1schema*   <a name="grant-datashare"></a>
Concede los permisos especificados en el esquema concreto que se crea en el recurso compartido de datos indicado.

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
Especifica los objetos de la base de datos a los que se va a conceder permiso. Los parámetros después de IN definen el alcance del permiso concedido.

CREATE MODEL  
Concede el permiso CREATE MODEL a usuarios o grupos de usuarios específicos.

ON MODEL *model\$1name*  
Concede el permiso EXECUTE en un modelo específico. 

ACCESS CATALOG  
Otorga el permiso para ver los metadatos relevantes de los objetos a los que tiene acceso el rol.

\$1 role \$1 [, …]  
Rol que se debe conceder a otro rol, usuario o PUBLIC.  
PUBLIC representa un grupo que siempre incluye a todos los usuarios. Los permisos de un usuario individual constan de la suma de permisos concedidos a PUBLIC, los permisos concedidos a cualquier grupo al que pertenezca el usuario y los permisos concedidos al usuario de manera individual.

TO \$1 \$1 *user\$1name* [ WITH ADMIN OPTION ] \$1 \$1 role \$1[, …]  
Concede el rol especificado a un usuario especificado con WITH ADMIN OPTION, otro rol o PUBLIC.  
La cláusula WITH ADMIN OPTION proporciona las opciones de administración de todos los roles concedidos a todos los beneficiarios de las concesiones. 

EXPLAIN \$1 RLS \$1 MASKING \$1 TO ROLE *rolename*  
Concede a un rol el permiso de explicar los filtros de política de seguridad de una consulta en el plan EXPLAIN. Concesión de permisos de RLS para explicar filtros de políticas de seguridad por fila. MASKING concede permiso para explicar los filtros de la política de enmascaramiento de datos dinámico.

IGNORE RLS TO ROLE *nombre\$1de\$1rol*   
Concede a un rol el permiso de eludir las políticas de seguridad de nivel de fila para una consulta.

TO \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
Indica la política de seguridad que recibe los permisos. TO RLS POLICY indica una política de seguridad por fila. TO MASKING POLICY indica una política de enmascaramiento de datos dinámico.

## Notas de uso
<a name="r_GRANT-usage-notes-link"></a>

Para obtener más información acerca de las notas de uso de GRANT, consulte [Notas de uso](r_GRANT-usage-notes.md).

## Ejemplos
<a name="r_GRANT-examples-link"></a>

Para ver ejemplos de cómo utilizar GRANT, consulte [Ejemplos](r_GRANT-examples.md).

# Notas de uso
<a name="r_GRANT-usage-notes"></a>

Para conceder privilegios en un objeto, debe cumplir con uno de los siguientes criterios:
+ Ser el propietario del objeto.
+ Ser un superusuario.
+ Tener un privilegio concedido para ese objeto y privilegio.

Por ejemplo, el siguiente comando permite al usuario HR realizar comandos SELECT en la tabla de empleados y conceder y revocar el mismo privilegio para otros usuarios:

```
grant select on table employees to HR with grant option;
```

HR no puede conceder privilegios para ninguna operación que no sea SELECT o en ninguna tabla que no sea la de empleados. 

Como otro ejemplo, el siguiente comando permite al usuario HR ejecutar comandos ALTER en la tabla de empleados y conceder y revocar el mismo privilegio para otros usuarios.

```
grant ALTER on table employees to HR with grant option;
```

HR no puede conceder privilegios para ninguna otra operación que no sea ALTER ni sobre ninguna otra tabla que no sea employees. 

Tener privilegios concedidos de una vista no implica tener privilegios en las tablas subyacentes. De manera similar, tener privilegios concedidos de un esquema no implica tener privilegios en las tablas del esquema. En su lugar, debe conceder acceso a las tablas subyacentes de manera explícita.

Para otorgar privilegios a una tabla AWS Lake Formation, el rol IAM asociado con el esquema externo de la tabla debe tener permiso para otorgar privilegios en la tabla externa. El siguiente ejemplo crea un esquema externo con un rol IAM asociado `myGrantor`. El rol IAM `myGrantor` tiene el permiso para otorgar permisos a otros. El comando GRANT utiliza los permisos del rol `myGrantor` IAM que está asociado al esquema externo para otorgar permisos al rol IAM `myGrantee`.

```
create external schema mySchema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myGrantor'
create external database if not exists;
```

```
grant select
on external table mySchema.mytable
to iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

Si concede privilegios GRANT ALL a un rol de IAM, los privilegios individuales se conceden en el catálogo de datos relacionado y habilitado para Lake Formation. Por ejemplo, el siguiente permiso GRANT ALL da lugar a los privilegios individuales concedidos (SELECT, ALTER, DROP, DELETE e INSERT) que se muestran en la consola de Lake Formation.

```
grant all
on external table mySchema.mytable
to iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

Los superusuarios pueden obtener acceso a todos los objetos independientemente de los comandos GRANT y REVOKE que establecen privilegios de objeto.

## Notas de uso para el control de acceso de nivel de columna
<a name="r_GRANT-usage-notes-clp"></a>

Las siguientes notas de uso se aplican a los privilegios del nivel de la columna en tablas y vistas de Amazon Redshift. Estas notas describen tablas; las mismas notas se aplican a las vistas a menos que anotemos explícitamente una excepción. 
+ En una tabla de Amazon Redshift, solo se pueden conceder los privilegios SELECT y UPDATE en el nivel de la columna. En una vista de Amazon Redshift, solo se puede conceder el privilegio SELECT en el nivel de la columna. 
+ La palabra clave ALL es sinónimo de una combinación de los privilegios SELECT y UPDATE cuando se utiliza en el contexto de GRANT en el nivel de columna en una tabla. 
+ Si no tiene el privilegio SELECT en todas las columnas de una tabla, al realizar una operación SELECT \$1 solo se devolverán las columnas a las que tiene acceso. Cuando se utiliza una vista, la operación SELECT \$1 intenta acceder a todas las columnas de la vista. Si no tiene permiso para acceder a todas las columnas, estas consultas producen un error de permiso denegado.
+ SELECT \$1 no se expande solo a columnas accesibles en los siguientes casos:
  + No puede crear una vista normal solo con columnas accesibles mediante SELECT \$1.
  + No puede crear una vista materializada solo con columnas accesibles mediante SELECT \$1.
+ Si tiene privilegios SELECT o UPDATE en una tabla o vista y agrega una columna, seguirá teniendo los mismos privilegios en la tabla o vista y, por tanto, en todas sus columnas. 
+ Sólo el propietario de una tabla o un superusuario pueden conceder privilegios de nivel de columna. 
+ No se admite la cláusula WITH GRANT OPTION para privilegios de nivel de columna.
+ No puede mantener el mismo privilegio tanto en el nivel de tabla como en el nivel de columna. Por ejemplo, el usuario `data_scientist` no puede tener tanto el privilegio SELECT en la tabla `employee` como el privilegio SELECT en la columna `employee.department`. Tenga en cuenta los siguientes resultados al conceder el mismo privilegio a una tabla y a una columna dentro de la tabla:
  + Si un usuario tiene un privilegio de nivel de tabla en una tabla, conceder el mismo privilegio en el nivel de columna no tiene ningún efecto. 
  + Si un usuario tiene un privilegio de nivel de tabla en una tabla, al revocar el mismo privilegio para una o varias columnas de la tabla se devuelve un error. En su lugar, revoque el privilegio en el nivel de tabla. 
  + Si un usuario tiene un privilegio de nivel de columna, conceder el mismo privilegio en el nivel de tabla devuelve un error. 
  + Si un usuario tiene un privilegio de nivel de columna, al revocar el mismo privilegio en el nivel de tabla se revocarán los privilegios de columna y tabla para todas las columnas de la tabla. 
+ No se pueden conceder privilegios de nivel de columna en vistas de enlace en tiempo de ejecución.
+ Debe tener el privilegio SELECT de nivel de tabla en las tablas base para crear una vista materializada. Incluso si tiene privilegios de nivel de columna en columnas específicas, no puede crear una vista materializada solo en esas columnas. No obstante, puede conceder el privilegio SELECT a las columnas de una vista materializada, similar a las vistas normales. 
+ Para buscar concesiones de privilegios de nivel de columna, utilice la vista [PG\$1ATTRIBUTE\$1INFO](r_PG_ATTRIBUTE_INFO.md) . 

## Notas de uso para conceder el permiso ASSUMEROLE
<a name="r_GRANT-usage-notes-assumerole"></a>

Las siguientes notas de uso se aplican cuando se concede el permiso ASSUMEROLE en Amazon Redshift. 

El permiso ASSUMEROLE se utiliza para controlar los permisos de acceso de rol de IAM para usuarios, roles y grupos de base de datos en comandos como COPY, UNLOAD, EXTERNAL FUNCTION o CREATE MODEL. Después de conceder el permiso ASSUMEROLE a un usuario, un rol o un grupo para un rol de IAM, el usuario, el rol o el grupo puede asumir ese rol cuando se ejecute el comando. El permiso ASSUMEROLE permite conceder acceso a los comandos adecuados según sea necesario.

Solo un superusuario de base de datos puede conceder o revocar el permiso ASSUMEROLE para usuarios, roles y grupos. Un superusuario siempre retiene el permiso ASSUMEROLE.

Para habilitar el uso del permiso ASSUMEROLE por parte de usuarios, roles y grupos, un superusuario realiza las dos acciones siguientes:
+ Ejecuta una vez la siguiente instrucción en el clúster:

  ```
  revoke assumerole on all from public for all;
  ```
+ Concede el permiso ASSUMEROLE a usuarios, roles y grupos para los comandos adecuados.

Puede especificar el encadenamiento de roles en la cláusula ON cuando concede el permiso ASSUMEROLE. Utiliza comas para separar los roles en una cadena de roles; por ejemplo, `Role1,Role2,Role3`. Si se especificó el encadenamiento de roles durante la concesión del permiso ASSUMEROLE, deberá especificar la cadena de roles cuando realice operaciones concedidas por el permiso ASSUMEROLE. No se pueden especificar roles individuales en la cadena de roles cuando se realizan operaciones concedidas por el permiso ASSUMEROLE. Por ejemplo, si a un usuario, un rol o un grupo se le concede la cadena de roles `Role1,Role2,Role3`, no se puede especificar solo `Role1` para realizar operaciones. 

Si un usuario intenta realizar una operación COPY, UNLOAD, EXTERNAL FUNCTION o CREATE MODEL, y no se le ha concedido el permiso ASSUMEROLE, aparecerá un mensaje similar al siguiente.

```
ERROR:  User awsuser does not have ASSUMEROLE permission on IAM role "arn:aws:iam::123456789012:role/RoleA" for COPY 
```

Para enumerar los usuarios a los que se les concedió acceso a roles de IAM y comandos a través del permiso ASSUMEROLE, consulte [HAS\$1ASSUMEROLE\$1PRIVILEGE](r_HAS_ASSUMEROLE_PRIVILEGE.md). Para enumerar los roles de IAM y los permisos de comando que se han concedido a un usuario que usted especifica, consulte [PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER](PG_GET_IAM_ROLE_BY_USER.md). Para enumerar los usuarios, los roles y los grupos a los que se les concedió acceso a un rol de IAM que usted especificó, consulte [PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE](PG_GET_GRANTEE_BY_IAMROLE.md).

## Notas de uso para conceder permisos de machine learning
<a name="r_GRANT-usage-notes-create-model"></a>

No puede conceder ni revocar directamente permisos relacionados con una función de ML. Una función de ML pertenece a un modelo de ML y los permisos se controlan mediante el modelo. En su lugar, puede conceder permisos relacionados con el modelo de ML. En el siguiente ejemplo, se muestra cómo conceder permisos a todos los usuarios para ejecutar la función de ML asociada al modelo `customer_churn`.

```
GRANT EXECUTE ON MODEL customer_churn TO PUBLIC;
```

También puede conceder todos los permisos a un usuario para el modelo de ML `customer_churn`.

```
GRANT ALL on MODEL customer_churn TO ml_user;
```

Se producirá un error en la concesión del permiso `EXECUTE` relacionado con una función de ML si existe una función de ML en el esquema, aunque dicha función de ML ya disponga del permiso `EXECUTE` mediante `GRANT EXECUTE ON MODEL`. Recomendamos utilizar un esquema independiente cuando utilice el comando `CREATE MODEL` para mantener las funciones de ML en un esquema independiente por sí mismas. En el siguiente ejemplo, se muestra cómo hacerlo.

```
CREATE MODEL ml_schema.customer_churn
FROM customer_data
TARGET churn
FUNCTION ml_schema.customer_churn_prediction
IAM_ROLE default
SETTINGS (
 S3_BUCKET 'amzn-s3-demo-bucket'
);
```

# Ejemplos
<a name="r_GRANT-examples"></a>

 En el siguiente ejemplo, se le concede el privilegio SELECT en la tabla SALES al usuario `fred`. 

```
grant select on table sales to fred;
```

En el siguiente ejemplo, se le concede el privilegio SELECT en todas las tablas del esquema QA\$1TICKIT al usuario `fred`. 

```
grant select on all tables in schema qa_tickit to fred;
```

En el siguiente ejemplo, se le conceden todos los privilegios del esquema en el esquema QA\$1TICKIT al grupo de usuarios QA\$1USERS. Los privilegios de esquema son CREATE y USAGE. USAGE concede a los usuarios acceso a los objetos del esquema, pero no les concede privilegios (como INSERT o SELECT) sobre esos objetos. Otorga privilegios en cada objeto por separado.

```
create group qa_users;
grant all on schema qa_tickit to group qa_users;
```

En el siguiente ejemplo, se le conceden todos los privilegios de la tabla SALES en el esquema QA\$1TICKIT a todos los usuarios del grupo QA\$1USERS.

```
grant all on table qa_tickit.sales to group qa_users;
```

En el siguiente ejemplo, se conceden todos los privilegios en la tabla SALES del esquema QA\$1TICKIT a todos los usuarios de los grupos QA\$1USERS y RO\$1USERS.

```
grant all on table qa_tickit.sales to group qa_users, group ro_users;
```

En el siguiente ejemplo, se concede el privilegio DROP en la tabla SALES del esquema QA\$1TICKIT a todos los usuarios del grupo QA\$1USERS.

```
grant drop on table qa_tickit.sales to group qa_users;>
```

En la siguiente secuencia de comandos se muestra que obtener acceso a un esquema no concede privilegios en una tabla del esquema. 

```
create user schema_user in group qa_users password 'Abcd1234';
create schema qa_tickit;
create table qa_tickit.test (col1 int);
grant all on schema qa_tickit to schema_user;

set session authorization schema_user;
select current_user;


current_user
--------------
schema_user
(1 row)


select count(*) from qa_tickit.test;


ERROR: permission denied for relation test [SQL State=42501]


set session authorization dw_user;
grant select on table qa_tickit.test to schema_user;
set session authorization schema_user;
select count(*) from qa_tickit.test;


count
-------
0
(1 row)
```

En la siguiente secuencia de comandos se muestra que obtener acceso a una vista no implica el acceso a sus tablas subyacentes. El usuario denominado VIEW\$1USER no puede seleccionar desde la tabla DATE aunque haya recibido todos los privilegios en VIEW\$1DATE. 

```
create user view_user password 'Abcd1234';
create view view_date as select * from date;
grant all on view_date to view_user;
set session authorization view_user;
select current_user;


current_user
--------------
view_user
(1 row)


select count(*) from view_date;


count
-------
365
(1 row)


select count(*) from date;


ERROR:  permission denied for relation date
```

En el siguiente ejemplo, se concede el privilegio SELECT en las columnas `cust_name` y `cust_phone` de la tabla `cust_profile` al usuario `user1`. 

```
grant select(cust_name, cust_phone) on cust_profile to user1;
```

En el siguiente ejemplo, se concede el privilegio SELECT en las columnas `cust_name` y `cust_phone` y el privilegio UPDATE en la columna `cust_contact_preference` de la tabla `cust_profile` al grupo `sales_group`. 

```
grant select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile to group sales_group;
```

En el siguiente ejemplo, se muestra el uso de la palabra clave ALL para otorgar privilegios SELECT y UPDATE en tres columnas de la tabla `cust_profile` al grupo `sales_admin`. 

```
grant ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile to group sales_admin;
```

En el siguiente ejemplo, se concede el privilegio SELECT en la columna `cust_name` de la vista `cust_profile_vw` al usuario `user2`. 

```
grant select(cust_name) on cust_profile_vw to user2;
```

## Ejemplos de concesión de acceso a recursos compartidos de datos
<a name="r_GRANT-examples-datashare"></a>

En los siguientes ejemplos, se muestran permisos de uso compartido de datos GRANT en una base de datos o un esquema específicos creados a partir de un datashare. 

En el siguiente ejemplo, un administrador del lado del productor concede el permiso USAGE del recurso compartido de datos `salesshare` al espacio de nombres especificado. 

```
GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

En el siguiente ejemplo, un administrador del lado del consumidor concede el permiso USAGE en `sales_db` a `Bob`.

```
GRANT USAGE ON DATABASE sales_db TO Bob;
```

En el siguiente ejemplo, un administrador del lado del consumidor concede el permiso GRANT USAGE en el esquema `sales_schema` al rol `Analyst_role`. `sales_schema` es un esquema externo que apunta a sales\$1db.

```
GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
```

En este punto, `Bob` y `Analyst_role` pueden acceder a todos los objetos de la base de datos en `sales_schema` y `sales_db`.

El siguiente ejemplo muestra la concesión de permisos adicionales en el nivel de objeto para los objetos de una base de datos compartida. Estos permisos adicionales solo son necesarios si el comando CREATE DATABASE que se ha utilizado para crear la base de datos compartida ha utilizado la cláusula WITH PERMISSIONS. Si el comando CREATE DATABASE no ha utilizado WITH PERMISSIONS, al conceder USAGE en la base de datos compartida se otorga acceso total a todos los objetos de esa base de datos.

```
GRANT SELECT ON sales_db.sales_schema.tickit_sales_redshift to Bob;
```

## Ejemplos de concesión de permisos acotados
<a name="r_GRANT-examples-scoped"></a>

El siguiente ejemplo concede el uso de todos los esquemas actuales y futuros de la base de datos `Sales_db` al rol `Sales`.

```
GRANT USAGE FOR SCHEMAS IN DATABASE Sales_db TO ROLE Sales;
```

El siguiente ejemplo otorga el permiso SELECT para todas las tablas actuales y futuras de la base de datos `Sales_db` al usuario `alice` y también otorga a `alice` el permiso para conceder permisos acotados en las tablas `Sales_db` a otros usuarios.

```
GRANT SELECT FOR TABLES IN DATABASE Sales_db TO alice WITH GRANT OPTION;
```

En el siguiente ejemplo, se concede el permiso EXECUTE para las funciones del esquema `Sales_schema` al usuario `bob`.

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

En el siguiente ejemplo se conceden todos los permisos para todas las tablas del esquema `ShareSchema` de la base de datos `ShareDb` al rol `Sales`. Al especificar el esquema, puede indicar la base de datos del esquema mediante el formato de dos partes `database.schema`.

```
GRANT ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema TO ROLE Sales;
```

El siguiente ejemplo es el mismo que el anterior. Puede especificar la base de datos mediante la palabra clave `DATABASE` en lugar de utilizar un formato de dos partes.

```
GRANT ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb TO ROLE Sales;
```

## Ejemplos de concesión del privilegio ASSUMEROLE
<a name="r_GRANT-examples-assumerole"></a>

A continuación, se muestran ejemplos de concesión del privilegio ASSUMEROLE.

En el siguiente ejemplo, se muestra la instrucción REVOKE que un superusuario ejecuta una vez en el clúster con objeto de habilitar el uso del privilegio ASSUMEROLE para usuarios y grupos. Luego, el superusuario concede el privilegio ASSUMEROLE a los usuarios y los grupos para los comandos adecuados. Para obtener información sobre cómo habilitar el uso del privilegio ASSUMEROLE para usuarios y grupos, consulte [Notas de uso para conceder el permiso ASSUMEROLE](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole).

```
revoke assumerole on all from public for all;
```

En el siguiente ejemplo, se concede el privilegio ASSUMEROLE al usuario `reg_user1` para el rol de IAM `Redshift-S3-Read` con objeto de realizar operaciones COPY. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-S3-Read'
to reg_user1 for copy;
```

En el siguiente ejemplo, se concede el privilegio ASSUMEROLE al usuario `reg_user1` para la cadena de roles de IAM `RoleA`, `RoleB` con objeto de realizar operaciones UNLOAD. 

```
grant assumerole
on 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB'
to reg_user1
for unload;
```

A continuación, se muestra un ejemplo del comando UNLOAD a través de la cadena de roles de IAM `RoleA`, `RoleB`.

```
unload ('select * from venue limit 10')
to 's3://companyb/redshift/venue_pipe_'
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

En el siguiente ejemplo, se concede el privilegio ASSUMEROLE al usuario `reg_user1` para el rol de IAM `Redshift-Exfunc` con objeto de crear funciones externas. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-Exfunc'
to reg_user1 for external function;
```

En el siguiente ejemplo, se concede el privilegio ASSUMEROLE al usuario `reg_user1` para el rol de IAM `Redshift-model` con objeto de crear modelos de machine learning. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-ML'
to reg_user1 for create model;
```

## Ejemplos de concesión de los privilegios ROLE
<a name="r_GRANT-examples-role"></a>

El siguiente ejemplo concede sample\$1role1 a user1.

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
```

El siguiente ejemplo concede sample\$1role1 a user1 con WITH ADMIN OPTION, establece la sesión actual para user1, y user1 concede sample\$1role1 a user2.

```
GRANT ROLE sample_role1 TO user1 WITH ADMIN OPTION;
SET SESSION AUTHORIZATION user1;
GRANT ROLE sample_role1 TO user2;
```

El siguiente ejemplo concede sample\$1role1 a sample\$1role2.

```
GRANT ROLE sample_role1 TO ROLE sample_role2;
```

El siguiente ejemplo concede sample\$1role2 a sample\$1role3 y sample\$1role4. Luego, intenta conceder sample\$1role3 a sample\$1role1.

```
GRANT ROLE sample_role2 TO ROLE sample_role3;
GRANT ROLE sample_role3 TO ROLE sample_role2;
ERROR: cannot grant this role, a circular dependency was detected between these roles
```

El siguiente ejemplo concede los privilegios del sistema CREATE USER a sample\$1role1.

```
GRANT CREATE USER TO ROLE sample_role1;
```

El siguiente ejemplo concede el rol definido por el sistema `sys:dba` a user1.

```
GRANT ROLE sys:dba TO user1;
```

El siguiente ejemplo intenta conceder sample\$1role3 en una dependencia circular a sample\$1role2.

```
CREATE ROLE sample_role3;
GRANT ROLE sample_role2 TO ROLE sample_role3;
GRANT ROLE sample_role3 TO ROLE sample_role2; -- fail
ERROR:  cannot grant this role, a circular dependency was detected between these roles
```

# INSERT
<a name="r_INSERT_30"></a>

**Topics**
+ [Sintaxis](#r_INSERT_30-synopsis)
+ [Parameters](#r_INSERT_30-parameters)
+ [Notas de uso](#r_INSERT_30_usage_notes)
+ [Ejemplos de INSERT](c_Examples_of_INSERT_30.md)

Inserta nuevas filas en una tabla. Puede insertar una única fila con la sintaxis VALUES, varias filas con la sintaxis VALUES, o una o más filas definidas por los resultados de una consulta (INSERT INTO...SELECT).

**nota**  
Le recomendamos usar el comando [COPY](r_COPY.md) para cargar grandes cantidades de datos. El uso de instrucciones INSERT individuales para completar una tabla podría ser prohibitivamente lento. Además, si los datos ya existen en otras tablas de la base de datos de Amazon Redshift, utilice INSERT INTO SELECT o [CREATE TABLE AS](r_CREATE_TABLE_AS.md) para mejorar el rendimiento. Para obtener más información acerca del comando COPY para cargar tablas, consulte [Carga de datos en Amazon Redshift](t_Loading_data.md).

**nota**  
El tamaño máximo de una instrucción SQL es de 16 MB.

## Sintaxis
<a name="r_INSERT_30-synopsis"></a>

```
INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
```

## Parameters
<a name="r_INSERT_30-parameters"></a>

 *table\$1name*   
Una tabla temporal o persistente. Solo el propietario de la tabla o un usuario con el privilegio INSERT en la tabla puede insertar filas. Si utiliza la cláusula *query* para insertar filas, debe tener el privilegio SELECT en las tablas que aparecen en la consulta.   
Utilice INSERT (tabla externa) para insertar los resultados de una consulta SELECT en tablas existentes del catálogo externo. Para obtener más información, consulte [INSERT (tabla externa)](r_INSERT_external_table.md).

 *columna*   
Puede insertar valores en una o más columnas de la tabla. Puede enumerar los nombres de las columnas de destino en cualquier orden. Si no se especifica una lista de columnas, los valores que se inserten deben coincidir con las columnas de la tabla en el orden en que se declararon en la instrucción CREATE TABLE. Si la cantidad de valores que deben insertarse es menor que la cantidad de columnas de la tabla, se cargarán las primeras *n* columnas.   
O bien se carga el valor predeterminado declarado, o bien se carga un valor nulo en cualquier columna que no aparezca (de forma implícita o explícita) en la instrucción INSERT. 

DEFAULT VALUES   
Si se asignaron valores predeterminados a las columnas de la tabla cuando se creó la tabla, utilice estas palabras clave para insertar una fila que conste completamente de valores predeterminados. Si ninguna de las columnas tiene valores predeterminados, se insertan valores nulos en esas columnas. Si alguna de las columnas se declara NOT NULL, la instrucción INSERT devuelve un error. 

VALUES   
Utilice esta palabra clave para insertar una o más filas; cada fila debe constar de uno o más valores. La lista VALUES para cada fila debe alinearse con la lista de columnas. Para insertar varias filas, utilice un delimitador de comas entre cada lista de expresiones. No repita la palabra clave VALUES. Todas las listas VALUES para una instrucción INSERT de varias filas deben contener la misma cantidad de valores. 

 *expresión*   
Un valor único o una expresión que toma el valor de un valor único. Cada valor debe ser compatible con el tipo de datos de la columna donde se inserta. Si es posible, los valores que tengan un tipo de datos que no coincida con el tipo de datos declarado en la columna se convertirán automáticamente en un tipo de datos compatible. Por ejemplo:   
+ Un valor decimal `1.1` se inserta en una columna INT como `1`. 
+ Un valor decimal `100.8976` se inserta en una columna DEC (5,2) como `100.90`. 
Puede convertir explícitamente un valor a un tipo de datos compatible al incluir la sintaxis de conversión de tipo en la expresión. Por ejemplo, si la columna COL1 de la tabla T1 es una columna CHAR(3):   

```
insert into t1(col1) values('Incomplete'::char(3));
```
Esta instrucción inserta el valor `Inc` en la columna.   
Para una instrucción INSERT VALUES de una fila, puede usar una subconsulta escalar como expresión. El resultado de la subconsulta se inserta en la columna adecuada.   
Las subconsultas no pueden utilizarse como expresiones de instrucciones INSERT VALUES de varias filas. 

DEFAULT   
Utilice esta palabra clave para insertar el valor predeterminado de una columna, como se definió cuando se creó la tabla. Si no existe un valor predeterminado para una columna, se inserta un valor nulo. No se puede insertar un valor predeterminado en una columna que tenga una restricción NOT NULL si esa columna no tiene un valor predeterminado explícito asignado en la instrucción CREATE TABLE. 

 *query*   
Inserte una o más filas en la tabla al definir cualquier consulta. Todas las filas que la consulta produce se insertan en la tabla. La consulta debe devolver una lista de columnas compatible con las columnas de la tabla, pero los nombres de las columnas no tienen que coincidir. 

## Notas de uso
<a name="r_INSERT_30_usage_notes"></a>

**nota**  
Le recomendamos usar el comando [COPY](r_COPY.md) para cargar grandes cantidades de datos. El uso de instrucciones INSERT individuales para completar una tabla podría ser prohibitivamente lento. Además, si los datos ya existen en otras tablas de la base de datos de Amazon Redshift, utilice INSERT INTO SELECT o [CREATE TABLE AS](r_CREATE_TABLE_AS.md) para mejorar el rendimiento. Para obtener más información acerca del comando COPY para cargar tablas, consulte [Carga de datos en Amazon Redshift](t_Loading_data.md).

El formato de datos para los valores insertados debe coincidir con el formato de datos especificado por la definición CREATE TABLE. 

 Después de insertar una gran cantidad de filas nuevas en una tabla: 
+ Limpie la tabla para recuperar espacio de almacenamiento y reordene las filas. 
+ Analice la tabla para actualizar las estadísticas para el planificador de consultas. 

Cuando los valores se insertan en columnas DECIMAL y superan la escala especificada, los valores cargados se redondean según sea adecuado. Por ejemplo, cuando un valor de `20.259` se inserta en una columna DECIMAL(8,2), el valor que se almacena es `20.26`. 

Puede insertar datos en una columna GENERATED BY DEFAULT AS IDENTITY. Puede actualizar las columnas definidas como GENERATED BY DEFAULT AS IDENTITY con los valores proporcionados. Para obtener más información, consulte [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

# Ejemplos de INSERT
<a name="c_Examples_of_INSERT_30"></a>

La tabla CATEGORY de la base de datos TICKIT contiene las siguientes filas: 

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
     1 | Sports   | MLB       | Major League Baseball
     2 | Sports   | NHL       | National Hockey League
     3 | Sports   | NFL       | National Football League
     4 | Sports   | NBA       | National Basketball Association
     5 | Sports   | MLS       | Major League Soccer
     6 | Shows    | Musicals  | Musical theatre
     7 | Shows    | Plays     | All non-musical theatre
     8 | Shows    | Opera     | All opera and light opera
     9 | Concerts | Pop       | All rock and pop music concerts
    10 | Concerts | Jazz      | All jazz singers and bands
    11 | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
```

 Cree una tabla CATEGORY\$1STAGE con un esquema similar a la tabla CATEGORY, pero defina valores predeterminados para las columnas: 

```
create table category_stage
(catid smallint default 0,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');
```

La siguiente instrucción INSERT selecciona todas las filas de la tabla CATEGORY y las inserta en la tabla CATEGORY\$1STAGE. 

```
insert into category_stage
(select * from category);
```

Los paréntesis alrededor de la consulta son opcionales.

Este comando inserta una nueva fila en la tabla CATEGORY\$1STAGE con un valor especificado para cada columna en orden: 

```
insert into category_stage values
(12, 'Concerts', 'Comedy', 'All stand-up comedy performances');
```

También puede insertar una nueva fila que combine valores específicos y valores predeterminados: 

```
insert into category_stage values
(13, 'Concerts', 'Other', default);
```

Ejecute la siguiente consulta para devolver las filas insertadas: 

```
select * from category_stage
where catid in(12,13) order by 1;

 catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
    12 | Concerts | Comedy  | All stand-up comedy performances
    13 | Concerts | Other   | General
(2 rows)
```

En los siguientes ejemplos se muestran algunas instrucciones INSERT VALUES de varias filas. El primer ejemplo inserta valores CATID específicos para dos filas y los valores predeterminados para las otras columnas de ambas filas. 

```
insert into category_stage values
(14, default, default, default),
(15, default, default, default);

select * from category_stage where catid in(14,15) order by 1;
 catid | catgroup | catname | catdesc
-------+----------+---------+---------
    14 | General  | General | General
    15 | General  | General | General
(2 rows)
```

El próximo ejemplo inserta tres filas con diversas combinaciones de valores predeterminados y específicos: 

```
insert into category_stage values
(default, default, default, default),
(20, default, 'Country', default),
(21, 'Concerts', 'Rock', default);

select * from category_stage where catid in(0,20,21) order by 1;
 catid | catgroup | catname | catdesc
-------+----------+---------+---------
     0 | General  | General | General
    20 | General  | Country | General
    21 | Concerts | Rock    | General
(3 rows)
```

El primer conjunto de VALUES en este ejemplo produce los mismos resultados que especificar DEFAULT VALUES para una instrucción INSERT de una sola fila.

En los siguientes ejemplos se muestra un comportamiento INSERT cuando una tabla tiene una columna IDENTITY. Primero, cree una nueva versión de la tabla CATEGORY, luego inserte filas en la tabla desde CATEGORY: 

```
create table category_ident
(catid int identity not null,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');


insert into category_ident(catgroup,catname,catdesc)
select catgroup,catname,catdesc from category;
```

Tenga en cuenta que no puede insertar valores enteros específicos en la columna CATID IDENTITY. Los valores de la columna IDENTITY se generan automáticamente.

En el siguiente ejemplo, se demuestra que las subconsultas no pueden utilizarse como expresiones en instrucciones INSERT VALUES de varias filas: 

```
insert into category(catid) values
((select max(catid)+1 from category)),
((select max(catid)+2 from category));

ERROR: can't use subqueries in multi-row VALUES
```

En el siguiente ejemplo se muestra una inserción en una tabla temporal rellena con datos de la tabla `venue` mediante la cláusula `WITH SELECT`. Para obtener más información sobre la tabla `venue`, consulte [Base de datos de muestra](c_sampledb.md).

Primero, cree la tabla temporal `#venuetemp`.

```
CREATE TABLE #venuetemp AS SELECT * FROM venue;
```

Muestre las filas de la tabla `#venuetemp`.

```
SELECT * FROM #venuetemp ORDER BY venueid;
         
venueid | venuename                | venuecity  | venuestate| venueseats
--------+--------------------------+------------+-----------+------------
1        Toyota Park                Bridgeview   IL          0	
2        Columbus Crew Stadium      Columbus     OH          0	
3        RFK Stadium                Washington   DC          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
5        Gillette Stadium           Foxborough   MA          68756	
...
```

Inserte 10 filas duplicadas en la tabla `#venuetemp` mediante la cláusula `WITH SELECT`.

```
INSERT INTO #venuetemp (WITH venuecopy AS (SELECT * FROM venue) SELECT * FROM venuecopy ORDER BY 1 LIMIT 10);
```

Muestre las filas de la tabla `#venuetemp`.

```
SELECT * FROM #venuetemp ORDER BY venueid;
         
venueid | venuename                | venuecity  | venuestate| venueseats
--------+--------------------------+------------+-----------+------------
1        Toyota Park                Bridgeview   IL          0	
1        Toyota Park                Bridgeview   IL          0	
2        Columbus Crew Stadium      Columbus     OH          0	
2        Columbus Crew Stadium      Columbus     OH          0	
3        RFK Stadium                Washington   DC          0
3        RFK Stadium                Washington   DC          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
5        Gillette Stadium           Foxborough   MA          68756
5        Gillette Stadium           Foxborough   MA          68756
...
```

# INSERT (tabla externa)
<a name="r_INSERT_external_table"></a>

Inserta los resultados de una consulta SELECT en tablas externas existentes en un catálogo externo, como para AWS Glue, AWS Lake Formation o un metastore de Apache Hive. Utilice el mismo rol de AWS Identity and Access Management (IAM) utilizado para el comando CREATE EXTERNAL SCHEMA para interactuar con catálogos externos y Amazon S3.

Para las tablas sin partición, el comando INSERT (tabla externa) escribe los datos en la ubicación de Amazon S3 definida en la tabla, en función de las propiedades de la tabla y el formato de archivo especificados.

Para las tablas con partición, INSERT (tabla externa) escribe datos en la ubicación de Amazon S3 de acuerdo con la clave de partición especificada en la tabla. También registra automáticamente nuevas particiones en el catálogo externo una vez finalizada la operación INSERT.

No se puede ejecutar INSERT (tabla externa) en un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 

## Sintaxis
<a name="r_INSERT_external_table-synopsis"></a>

```
INSERT INTO external_schema.table_name
{ select_statement }
```

## Parameters
<a name="r_INSERT_external_table-parameters"></a>

 *external\$1schema.table\$1name*   
El nombre de un esquema externo existente y una tabla externa de destino en la que se va a insertar.

 *select\$1statement*   
Una instrucción que inserta una o más filas en la tabla externa definiendo cualquier consulta. Todas las filas que produce la consulta se escriben en Amazon S3 en formato de texto o Parquet según la definición de la tabla. La consulta debe devolver una lista de columnas que sea compatible con los tipos de datos de columna de la tabla externa. No obstante, los nombres de columna no tienen que coincidir.

## Notas de uso
<a name="r_INSERT_external_table_usage_notes"></a>

El número de columnas de la consulta SELECT debe ser el mismo que la suma de las columnas de datos y las columnas de partición. La ubicación y el tipo de datos de cada columna de datos deben coincidir con los de la tabla externa. La ubicación de las columnas de partición debe estar al final de la consulta SELECT, en el mismo orden en que se definieron en el comando CREATE EXTERNAL TABLE. Los nombres de columna no tienen que coincidir.

En algunos casos, es posible que desee ejecutar el comando INSERT (tabla externa) en un catálogo de datos de AWS Glue o en un metastore de Hive. En el caso de AWS Glue, el rol de IAM utilizado para crear el esquema externo debe tener permisos de lectura y escritura en Amazon S3 y AWS Glue. Si utiliza un catálogo de AWS Lake Formation, este rol de IAM se convierte en el propietario de la nueva tabla de Lake Formation. Este rol de IAM debe tener al menos los permisos siguientes: 
+ Permisos SELECT, INSERT, UPDATE en la tabla externa
+ Permiso de ubicación de datos en la ruta de Amazon S3 de la tabla externa

Para asegurarse de que los nombres de los archivos son únicos, Amazon Redshift utiliza el siguiente formato para el nombre de cada archivo cargado en Amazon S3 de manera predeterminada. 

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

Un ejemplo es `20200303_004509_810669_1007_0001_part_00.parquet`.

Tenga en cuenta lo siguiente al ejecutar el comando INSERT (tabla externa):
+ No se admiten tablas externas que tengan un formato distinto de PARQUET o TEXTFILE.
+ Este comando admite propiedades de tabla existentes como 'write.parallel', 'write.maxfilesize.mb', 'compression\$1type' y 'serialization.null.format'. Para actualizar esos valores, ejecute el comando ALTER TABLE SET TABLE PROPERTIES.
+ La propiedad de tabla 'numRows' se actualiza automáticamente hacia el final de la operación INSERT. La propiedad de tabla debe definirse o agregarse a la tabla si no se creó mediante la operación CREATE EXTERNAL TABLE AS.
+ La cláusula LIMIT no se admite en la consulta SELECT externa. En su lugar, utilice una cláusula LIMIT anidada.
+ Puede utilizar la tabla [STL\$1UNLOAD\$1LOG](r_STL_UNLOAD_LOG.md) para realizar un seguimiento de los archivos que se escribieron en Amazon S3 mediante cada operación INSERT (tabla externa).
+ Amazon Redshift solo es compatible con el cifrado estándar de Amazon S3 para INSERT (tabla externa).

## Ejemplos de INSERT (tabla externa)
<a name="c_Examples_of_INSERT_external_table"></a>

En el siguiente ejemplo, se insertan los resultados de la instrucción SELECT en la tabla externa.

```
INSERT INTO spectrum.lineitem
SELECT * FROM local_lineitem;
```

En el siguiente ejemplo, se insertan los resultados de la instrucción SELECT en una tabla externa particionada mediante la partición estática. Las columnas de partición están codificadas de forma rígida en la instrucción SELECT. Las columnas de partición deben estar al final de la consulta.

```
INSERT INTO spectrum.customer
SELECT name, age, gender, 'May', 28 FROM local_customer;
```

En el siguiente ejemplo, se insertan los resultados de la instrucción SELECT en una tabla externa particionada mediante la partición dinámica. Las columnas de partición no están codificadas de forma rígida. Los datos se agregan automáticamente a las carpetas de partición existentes o a las nuevas carpetas si se agrega una nueva partición.

```
INSERT INTO spectrum.customer
SELECT name, age, gender, month, day FROM local_customer;
```

# LOCK
<a name="r_LOCK"></a>

Restringe el acceso a una tabla de la base de datos. Este comando solo es significativo cuando se ejecuta dentro de un bloque de transacciones.

El comando LOCK obtiene un bloqueo del nivel de la tabla en el modo "ACCESS EXCLUSIVE", en el que se espera, si es necesario, que se libere cualquier bloqueo en conflicto. Bloquear una tabla explícitamente en esta manera hace que las lecturas y escrituras de la tabla esperen cuando se las intenta desde otras transacciones o sesiones. Un bloqueo de tabla explícito creado por un usuario temporalmente previene que otro usuario seleccione datos de la tabla o cargue datos en ella. El bloqueo se libera cuando se completa la transacción que contiene el comando LOCK.

Los bloqueos de tabla menos restrictivos son adquiridos implícitamente por comandos que hacen referencia a tablas, como operaciones de escritura. Por ejemplo, si un usuario intenta leer datos de una tabla mientras otro usuario actualiza la tabla, los datos que se leen serán una instantánea de los datos que ya se confirmaron. (En algunos casos, las consultas se detienen si infringen las reglas de aislamiento serializable). Consulte [Administración de operaciones de escritura simultáneas](c_Concurrent_writes.md).

Algunas operaciones DDL, como DROP TABLE y TRUNCATE, crean bloqueos exclusivos. Estas operaciones previenen las lecturas de datos.

Si se produce un conflicto de bloqueo, Amazon Redshift muestra un mensaje de error para alertar al usuario que inició la transacción en conflicto. La transacción que recibió el conflicto de bloqueo se detiene. Cada vez que se produce un conflicto de bloqueo, Amazon Redshift escribe una entrada en la tabla [STL\$1TR\$1CONFLICT](r_STL_TR_CONFLICT.md).

## Sintaxis
<a name="section_r_LOCK-synopsis"></a>

```
LOCK [ TABLE ] table_name [, ...]
```

## Parameters
<a name="parameters"></a>

TABLE   
Palabra clave opcional.

 *table\$1name*   
Nombre de la tabla que se bloqueará. Es posible bloquear más de una tabla al utilizar una lista de nombres de tabla delimitada por comas. No es posible bloquear vistas. 

## Ejemplo
<a name="example2"></a>

```
begin;

lock event, sales;

...
```

# MERGE
<a name="r_MERGE"></a>

Fusiona de forma condicional las filas de una tabla de origen con una tabla de destino. Tradicionalmente, esto solo puede conseguirse utilizando varias sentencias de inserción, actualización o eliminación por separado. Para obtener más información sobre las operaciones que MERGE le permite combinar, consulte [UPDATE](https://docs.aws.amazon.com/redshift/latest/dg/r_UPDATE.html), [DELETE](https://docs.aws.amazon.com/redshift/latest/dg/r_DELETE.html) e [INSERT](https://docs.aws.amazon.com/redshift/latest/dg/r_INSERT_30.html).

## Sintaxis
<a name="r_MERGE-synopsis"></a>

```
MERGE INTO target_table 
USING source_table [ [ AS ] alias ] 
ON match_condition 
[ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE }
WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) |
REMOVE DUPLICATES ]
```

## Parameters
<a name="r_MERGE-parameters"></a>

 *target\$1table*  
La tabla temporal o permanente en la que se fusiona la instrucción MERGE.

 *source\$1table*  
Tabla temporal o permanente que proporciona las filas que se van a fusionar en *target\$1table*. *source\$1table* también puede ser una tabla de Spectrum. 

 *alias*  
El nombre alternativo temporal de *source\$1table*.  
Este parámetro es opcional. El *alias* anterior con AS también es opcional.

 *match\$1condition*  
Especifica los predicados iguales entre la columna de la tabla de origen y la columna de la tabla de destino que se utilizan para determinar si las filas de *source\$1table* pueden coincidir con las filas de *target\$1table*. Si se cumple la condición, MERGE ejecuta *matched\$1clause* para esa fila. De lo contrario, MERGE ejecuta *not\$1matched\$1clause* para esa fila.

WHEN MATCHED  
 Especifica la acción que se ejecutará cuando la condición de coincidencia entre una fila de origen y una fila de destino se evalúe como True. Puede especificar una acción UPDATE o una acción DELETE. 

UPDATE  
 Actualiza la fila coincidente en *target\$1table*. Solo se actualizan los valores de *col\$1name* que especifique. 

DELETE  
 Elimina la fila coincidente en *target\$1table*. 

WHEN NOT MATCHED  
 Especifica la acción que se ejecutará cuando la condición de coincidencia se evalúe como False o Unknown. Solo puede especificar la acción de inserción INSERT para esta cláusula. 

INSERT  
 Inserta en *target\$1table* filas de *source\$1table* que no coinciden con ninguna fila de *target\$1table*, según la condición de *match\$1condition*. El valor de *col\$1name* de destino puede enumerarse en cualquier orden. Si no proporciona ningún valor de *col\$1name*, el orden predeterminado será el de todas las columnas de la tabla en su orden declarado. 

 *col\$1name*  
Una o más columnas que desea modificar. No incluya el nombre de la tabla al especificar la columna de destino.

 *expr*  
La expresión que define el nuevo valor de *col\$1name*.

 REMOVE DUPLICATES  
Especifica que el comando MERGE se ejecuta en modo simplificado. El modo simplificado tiene los siguientes requisitos:  
+  *target\$1table* y *source\$1table* deben tener el mismo número de columnas, tipos de columna compatibles y el mismo orden de columnas. 
+  Omita la cláusula WHEN y las cláusulas UPDATE e INSERT de su comando MERGE. 
+  Utilice la cláusula REMOVE DUPLICATES en su comando MERGE. 
En el modo simplificado, MERGE hace lo siguiente:  
+  Las filas de *target\$1table* que tienen una coincidencia en *source\$1table* se actualizan para que coincidan con los valores de *source\$1table*. 
+  Las filas de *source\$1table* que no tengan una coincidencia en *target\$1table* se insertan en *target\$1table*. 
+  Cuando varias filas de *target\$1table* coinciden con la misma fila de *source\$1table*, se eliminan las filas duplicadas. Amazon Redshift mantiene una fila y la actualiza. Las filas duplicadas que no coinciden con una fila de *source\$1table* permanecen sin cambios. 
El uso de REMOVE DUPLICATES ofrece mejor rendimiento que usar WHEN MATCHED y WHEN NOT MATCHED. Recomendamos utilizar REMOVE DUPLICATES si *target\$1table* y *source\$1table* son compatibles y no necesita conservar filas duplicadas en *target\$1table*.

## Notas de uso
<a name="r_MERGE_usage_notes"></a>
+ Para ejecutar instrucciones MERGE, debe ser el propietario tanto de *source\$1table* como de *target\$1table* o tener el permiso SELECT para esas tablas. Además, debe tener los permisos UPDATE, DELETE e INSERT para *target\$1table*, según las operaciones incluidas en la instrucción MERGE.
+  *target\$1table* no puede ser una tabla del sistema, una tabla de catálogo ni una tabla externa. 
+  *source\$1table* y *target\$1table* no pueden ser la misma tabla. 
+  No se puede utilizar la cláusula WITH en una instrucción MERGE. 
+  Las filas de *target\$1table* no pueden coincidir con varias filas de *source\$1table*. 

  Considere el siguiente ejemplo:

  ```
  CREATE TABLE target (id INT, name CHAR(10));
  CREATE TABLE source (id INT, name CHAR(10));
  
  INSERT INTO target VALUES (1, 'Bob'), (2, 'John');
  INSERT INTO source VALUES (1, 'Tony'), (1, 'Alice'), (3, 'Bill');
  
  MERGE INTO target USING source ON target.id = source.id
  WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
  WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
  ERROR: Found multiple matches to update the same tuple.
  
  MERGE INTO target USING source ON target.id = source.id
  WHEN MATCHED THEN DELETE
  WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
  ERROR: Found multiple matches to update the same tuple.
  ```

  En ambas instrucciones MERGE, se produce un error en la operación porque hay varias filas en la tabla `source` con un valor de ID de `1`.
+  *match\$1condition* y *expr* no pueden hacer referencia de forma parcial a columnas de tipo SUPER. Por ejemplo, si el objeto de tipo SUPER es una matriz o una estructura, no puede usar elementos individuales de esa columna para *match\$1condition* ni *expr*, pero puede usar toda la columna. 

  Considere el siguiente ejemplo:

  ```
  CREATE TABLE IF NOT EXISTS target (key INT, value SUPER);
  CREATE TABLE IF NOT EXISTS source (key INT, value SUPER);
  
  INSERT INTO target VALUES (1, JSON_PARSE('{"key": 88}'));
  INSERT INTO source VALUES (1, ARRAY(1, 'John')), (2, ARRAY(2, 'Bill'));
  
  MERGE INTO target USING source ON target.key = source.key
  WHEN matched THEN UPDATE SET value = source.value[0]
  WHEN NOT matched THEN INSERT VALUES (source.key, source.value[0]);
  ERROR: Partial reference of SUPER column is not supported in MERGE statement.
  ```

  Para obtener más información sobre el tipo SUPER, consulte [Tipo SUPER](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html).
+ Si *source\$1table* es grande, definir las columnas de combinación de *target\$1table* y *source\$1table* como claves de distribución puede mejorar el rendimiento.
+ Para utilizar la cláusula REMOVE DUPLICATES, necesita permisos SELECT, INSERT y DELETE para *target\$1table*.
+  *source\$1table* puede ser una vista o una subconsulta. A continuación, se muestra un ejemplo de una instrucción MERGE en la que *source\$1table* es una subconsulta que elimina las filas duplicadas. 

  ```
  MERGE INTO target
  USING (SELECT id, name FROM source GROUP BY 1, 2) as my_source
  ON target.id = my_source.id
  WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name
  WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);
  ```
+ El destino no puede ser un origen de datos de ninguna subconsulta de la misma instrucción MERGE. Por ejemplo, el siguiente comando SQL devuelve un error como ERROR: Source view/subquery in Merge statement cannot reference target table. porque la subconsulta hace referencia a `target` en vez de a `source`.

  ```
  MERGE INTO target
  USING (SELECT id, name FROM target GROUP BY 1, 2) as my_source
  ON target.id = my_source.id
  WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name
  WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);
  ```

## Ejemplos
<a name="sub-examples-merge"></a>

En el siguiente ejemplo, se crean dos tablas y, a continuación, se ejecuta una operación MERGE en ellas, se actualizan las filas coincidentes de la tabla de destino y se insertan las filas que no coinciden. A continuación, inserta otro valor en la tabla de origen y ejecuta otra operación MERGE, esta vez se eliminan las filas coincidentes y se inserta la nueva fila de la tabla de origen.

Primero cree y rellene las tablas de origen y destino.

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (101, 'Bob'), (102, 'John'), (103, 'Susan');
INSERT INTO source VALUES (102, 'Tony'), (103, 'Alice'), (104, 'Bill');

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 102 | John
 103 | Susan
(3 rows)

SELECT * FROM source;
 id  |    name
-----+------------
 102 | Tony
 103 | Alice
 104 | Bill
(3 rows)
```

A continuación, fusione la tabla de origen con la de destino, actualice la tabla de destino con las filas coincidentes e inserte las filas de la tabla de origen que no coincidan.

```
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 102 | Tony
 103 | Alice
 104 | Bill
(4 rows)
```

Tenga en cuenta que las filas con valores de identificación (id) de 102 y 103 se actualizan para que coincidan con los valores de nombre (name) de la tabla de destino. Además, se inserta una nueva fila con un valor de identificación de 104 y el valor de nombre de Bill en la tabla de destino.

A continuación, inserte una nueva fila en la tabla de origen.

```
INSERT INTO source VALUES (105, 'David');

SELECT * FROM source;
 id  |    name
-----+------------
 102 | Tony
 103 | Alice
 104 | Bill
 105 | David
(4 rows)
```

Por último, ejecute una operación de fusión para eliminar las filas coincidentes de la tabla de destino e insertar las filas que no coincidan.

```
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 105 | David
(2 rows)
```

Las filas con los valores de identificación 102, 103 y 104 se eliminan de la tabla de destino y se inserta una nueva fila con un valor de identificación de 105 y un valor de nombre de David en la tabla de destino.

En el siguiente ejemplo, se muestra la sintaxis simplificada de un comando MERGE que utiliza la cláusula REMOVE DUPLICATES.

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (30, 'Tony'), (11, 'Alice'), (23, 'Bill');
INSERT INTO source VALUES (23, 'David'), (22, 'Clarence');

MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES;

SELECT * FROM target;
id | name
---+------------
30 | Tony
11 | Alice
23 | David
22 | Clarence
(4 rows)
```

En el siguiente ejemplo, se muestra la sintaxis simplificada de un comando MERGE que utiliza la cláusula REMOVE DUPLICATES, lo que elimina las filas duplicadas de *target\$1table* si tienen filas coincidentes en *source\$1table*.

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (30, 'Tony'), (30, 'Daisy'), (11, 'Alice'), (23, 'Bill'), (23, 'Nikki');
INSERT INTO source VALUES (23, 'David'), (22, 'Clarence');

MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES;

SELECT * FROM target;
id | name
---+------------
30 | Tony
30 | Daisy
11 | Alice
23 | David
22 | Clarence
(5 rows)
```

Después de ejecutar MERGE, solo hay una fila con un valor de ID de 23 en *target\$1table*. Como no había ninguna fila en *source\$1table* con el valor de ID 30, las dos filas duplicadas con valores de ID 30 permanecen en *target\$1table*.

## Véase también
<a name="r_MERGE-see-also"></a>

 [INSERT](r_INSERT_30.md), [UPDATE](r_UPDATE.md), [DELETE](r_DELETE.md) 

# PREPARE
<a name="r_PREPARE"></a>

Prepare una instrucción para su ejecución. 

PREPARE crea una instrucción preparada. Cuando se ejecuta la instrucción PREPARE, la instrucción especificada (SELECT, INSERT, UPDATE o DELETE) se analiza, reescribe y planifica. Cuando se emite un comando EXECUTE para la instrucción preparada, Amazon Redshift puede revisar el plan de ejecución de la consulta (para mejorar el rendimiento en función de los valores del parámetro especificado) antes de ejecutar la instrucción preparada. 

## Sintaxis
<a name="r_PREPARE-synopsis"></a>

```
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
```

## Parameters
<a name="r_PREPARE-parameters"></a>

 *plan\$1name*   
Un nombre arbitrario proporcionado a esta instrucción preparada particular. Debe ser único en el marco de una sesión y se utiliza posteriormente para ejecutar o anular la asignación de una instrucción preparada con anterioridad.

 *datatype (tipo\$1de\$1datos*   
El tipo de datos de un parámetro para la instrucción preparada. Para hacer referencia a los parámetros de la instrucción preparada, use 1 USD, 2 USD, etc., hasta un máximo de 32 767 USD.

 *statement *   
Cualquier instrucción SELECT, INSERT, UPDATE o DELETE.

## Notas de uso
<a name="r_PREPARE_usage_notes"></a>

Las instrucciones preparadas pueden incluir parámetros: valores que se sustituyen en la instrucción cuando se ejecuta. Para incluir parámetros en una instrucción preparada, proporcione una lista de tipos de datos en la instrucción PREPARE y, en la instrucción que se va a preparar, haga referencia a los parámetros por posición utilizando la notación \$11, \$12, etc. El número máximo de parámetros es 32 767. Cuando ejecute la instrucción, especifique los valores reales de estos parámetros en la instrucción EXECUTE. Para obtener más información, consulte [EXECUTE](r_EXECUTE.md). 

Las instrucciones preparadas solo funcionan durante la sesión actual. Cuando la sesión finaliza, se descarta la instrucción preparada; por lo tanto, debe volver a crearla antes de poder usarla nuevamente. Esto también significa que una instrucción preparada no puede utilizarse por varios clientes de base de datos simultáneos. No obstante, cada cliente puede crear su propia instrucción preparada. La instrucción preparada se puede eliminar manualmente con el comando DEALLOCATE. 

Las instrucciones preparadas ofrecen más rendimiento cuando se utiliza una sola sesión para ejecutar una gran cantidad de instrucciones similares. Como se mencionó, para cada ejecución nueva de una instrucción preparada, Amazon Redshift puede revisar el plan de ejecución de la consulta para mejorar el rendimiento a partir de los valores del parámetro especificados. Para examinar el plan de ejecución de la consulta que Amazon Redshift ha elegido para una instrucción EXECUTE específica, utilice el comando [EXPLAIN](r_EXPLAIN.md). 

Para obtener más información acerca de la planificación de consultas y las estadísticas recopiladas por Amazon Redshift para la optimización de las consultas, consulte el comando [ANALYZE](r_ANALYZE.md). 

## Ejemplos
<a name="sub-examples-prepare"></a>

Cree una tabla temporal, prepare la instrucción INSERT y ejecútela:

```
DROP TABLE IF EXISTS prep1;
CREATE TABLE prep1 (c1 int, c2 char(20));
PREPARE prep_insert_plan (int, char)
AS insert into prep1 values ($1, $2);
EXECUTE prep_insert_plan (1, 'one');
EXECUTE prep_insert_plan (2, 'two');
EXECUTE prep_insert_plan (3, 'three');
DEALLOCATE prep_insert_plan;
```

Prepare una instrucción SELECT y ejecútela:

```
PREPARE prep_select_plan (int)
AS select * from prep1 where c1 = $1;
EXECUTE prep_select_plan (2);
EXECUTE prep_select_plan (3);
DEALLOCATE prep_select_plan;
```

## Véase también
<a name="r_PREPARE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [EXECUTE](r_EXECUTE.md) 

# REFRESH MATERIALIZED VIEW
<a name="materialized-view-refresh-sql-command"></a>

Actualiza una vista materializada.

Cuando crea una vista materializada, su contenido refleja el estado de la tabla o tablas de bases de datos subyacentes en ese momento. Los datos en la vista materializada permanecen sin cambios, incluso cuando las aplicaciones realizan cambios en los datos de las tablas subyacentes.

Para actualizar los datos en una vista materializada, puede utilizar la instrucción `REFRESH MATERIALIZED VIEW` en cualquier momento. Cuando se utiliza esta instrucción, Amazon Redshift identifica los cambios que han tenido lugar en la tabla o las tablas base, para luego aplicar esos cambios en la vista materializada.

Para obtener más información acerca de las vistas materializadas, consulte [Vistas materializadas en Amazon Redshift](materialized-view-overview.md).

## Sintaxis
<a name="mv_REFRESH_MATERIALIZED_VIEW-synopsis"></a>

```
REFRESH MATERIALIZED VIEW mv_name [ RESTRICT | CASCADE ]
```

## Parameters
<a name="mv_REFRESH_MATERIALIZED_VIEW-parameters"></a>

*mv\$1name*  
El nombre de la vista materializada que desea actualizar.

RESTRICT  
Palabra clave opcional. Actualiza la vista materializada especificada, pero no las vistas materializadas dependientes. El valor predeterminado si no se especifica ni RESTRICT ni CASCADE.

CASCADE  
Palabra clave opcional. Actualiza la vista materializada especificada y todas las vistas materializadas dependientes.

## Notas de uso
<a name="mv_REFRESH_MARTERIALIZED_VIEW_usage"></a>

Solo el propietario de una vista materializada puede realizar una operación `REFRESH MATERIALIZED VIEW` en esa vista. Además, el propietario debe tener el privilegio SELECT en las tablas base subyacentes para ejecutar correctamente `REFRESH MATERIALIZED VIEW`. 

El comando `REFRESH MATERIALIZED VIEW` se ejecuta como una transacción propia. Se sigue la semántica de las transacciones de Amazon Redshift para determinar qué datos de las tablas base son visibles para el comando `REFRESH` o cuándo los cambios realizados por el comando `REFRESH` están visibles para otras transacciones que se ejecutan en Amazon Redshift.
+ En las vistas materializadas incrementales, `REFRESH MATERIALIZED VIEW` utiliza solo las filas de la tabla base que ya están confirmadas. Por lo tanto, si la operación de actualización se ejecuta después de una instrucción de lenguaje de manipulación de datos (DML) en la misma transacción, los cambios de esa instrucción DML no son visibles para actualizar. 
+ Para la actualización completa de una vista materializada, `REFRESH MATERIALIZED VIEW` ve todas las filas de la tabla base visibles para la transacción de actualización, de acuerdo con la semántica de transacción habitual de Amazon Redshift. 
+ Según el tipo de argumento de entrada, Amazon Redshift sigue admitiendo la actualización incremental para vistas materializadas de las siguientes funciones con tipos de argumentos de entrada específicos: DATE (marca temporal), DATE\$1PART (fecha, hora, intervalo, tiempo-tz), DATE\$1TRUNC (marca temporal, intervalo).
+ La actualización incremental es compatible con una vista materializada donde la tabla básica se encuentra en un recurso compartido de datos.
+ La actualización de vistas materializadas compartidas desde clústeres de recurso compartido de datos remotos no se admite para las vistas materializadas que contienen referencias a otras vistas materializadas, tablas de Spectrum, tablas definidas en un clúster de Redshift diferente ni UDF. Estas vistas materializadas se pueden actualizar desde el clúster local (productor).

Algunas operaciones de Amazon Redshift interactúan con vistas materializadas. Algunas de estas operaciones pueden forzar que una operación `REFRESH MATERIALIZED VIEW` vuelva a calcular completamente la vista materializada aunque la consulta que define la vista materializada solo utilice las características SQL aptas para la actualización incremental. Por ejemplo:
+ Las operaciones de vacío en segundo plano pueden bloquearse si las vistas materializadas no se actualizan. Después de un periodo de umbral definido internamente, la operación de vacío puede funcionar. Cuando ocurre esta operación de vacío, cualquier vista materializada dependiente se marca para un nuevo cálculo en la siguiente actualización (incluso si es incremental). Para obtener información acerca de VACUUM, consulte [VACUUM](r_VACUUM_command.md). Para obtener más información sobre eventos y cambios de estado, consulte [STL\$1MV\$1STATE](r_STL_MV_STATE.md).
+ Algunas operaciones iniciadas por un usuario en tablas base fuerzan a la vista materializada a que se vuelva a calcular completamente la próxima vez que se ejecute una operación REFRESH. Ejemplos de tales operaciones son una operación VACUUM invocada manualmente, un cambio de tamaño clásico, una operación ALTER DISTKEY, una operación ALTER SORTKEY y una operación truncada. En algunos casos, las operaciones automáticas también pueden hacer que una vista materializada se vuelva a calcular por completo la próxima vez que se ejecute una operación REFRESH. Por ejemplo, una operación de autovacuum puede provocar un recálculo completo. Para obtener más información sobre eventos y cambios de estado, consulte [STL\$1MV\$1STATE](r_STL_MV_STATE.md). 

## Actualización en cascada
<a name="mv_REFRESH_MATERIALIZED_VIEW_cascading"></a>

La opción CASCADE actualiza la vista materializada especificada y todas las vistas materializadas dependientes, en orden de dependencia: las vistas materializadas base se actualizan con REFRESH antes que las vistas materializadas superiores (orden topológico). Esto le permite actualizar un conjunto anidado de vistas materializadas en un solo comando.

La opción RESTRICT (predeterminada si no se especifica ni RESTRICT ni CASCADE) actualiza solo la vista materializada especificada.

Cuando se utiliza la opción CASCADE, se aplican las siguientes reglas:
+ Solo el propietario de la vista materializada o un superusuario pueden ejecutar el comando `REFRESH MATERIALIZED VIEW ... CASCADE`.
+ Si alguna de las vistas materializadas en la cascada no se puede actualizar, toda la operación en cascada se detendrá.

La funcionalidad de actualización en cascada solo se admite en vistas materializadas anidadas en vistas materializadas locales y de streaming. Las vistas materializadas con otros tipos de origen, como Spectrum o Uso compartido de datos, no se admiten en modo en cascada. CASCADE ejecuta la actualización en una sola transacción para todas las vistas materializadas anidadas.

## Actualización incremental para obtener vistas materializadas en un recurso compartido de datos
<a name="mv_REFRESH_MATERIALIZED_VIEW_datashare"></a>

 Amazon Redshift admite la actualización automática e incremental de las vistas materializadas en un recurso compartido de datos de consumidores cuando se comparten las tablas base. La actualización incremental es una operación en la que Amazon Redshift identifica los cambios en la tabla o tablas base que se produjeron después de la actualización anterior y actualiza solo los registros correspondientes de la vista materializada. Para obtener más información sobre este comportamiento, consulte [CREATE MATERIALIZED VIEW](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html#mv_CREATE_MARTERIALIZED_VIEW_datashare). 

## Limitaciones para la actualización incremental
<a name="mv_REFRESH_MARTERIALIZED_VIEW_limitations"></a>

En este momento, Amazon Redshift no es compatible con la actualización progresiva para vistas materializadas que se definen con una consulta a través de cualquiera de los siguientes elementos SQL:
+ OUTER JOIN (RIGHT, LEFT o FULL).
+ Establecer operaciones: UNION, INTERSECT, EXCEPT, MINUS.
+ UNION ALL cuando se produce en una subconsulta y una función de agrupación o una cláusula GROUP BY está presente en la consulta, o la vista materializada contiene una sortkey.
+ Las funciones de agrupación MEDIAN, PERCENTILE\$1CONT, LISTAGG, STDDEV\$1SAMP, STDDEV\$1POP, APPROXIMATE COUNT, APPROXIMATE PERCENTILE y las funciones de agrupación de cada bit.
**nota**  
‎Se admiten las funciones de agregación COUNT, SUM, MIN, MAX y AVG.
+ Funciones de agregación DISTINCT, como DISTINCT COUNT, DISTINCT SUM, etc.
+ Funciones de ventana.
+ Una consulta que utiliza tablas temporales para la optimización de consultas, como la optimización de subexpresiones comunes.
+ subconsultas
+ Tablas externas que hacen referencia a los siguientes formatos de la consulta que definen la vista materializada. 
  +  Delta Lake 
  +  Hudi 

  La actualización incremental es compatible con las vistas materializadas definidas con formatos distintos de los enumerados anteriormente. Para obtener más información, consulte [Vistas materializadas de tablas de lagos de datos externos en Amazon Redshift SpectrumVistas materializadas de tablas de lagos de datos externos](materialized-view-external-table.md). 
+ Funciones mutables, como funciones de fecha y hora, funciones definidas por el usuario RANDOM y no STABLE.
+ Para conocer las limitaciones de la actualización incremental de las integraciones sin ETL, consulte [Consideraciones al usar integraciones sin ETL con Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl.reqs-lims.html).
+ Acceso a tablas desde más de una base de datos.

Para obtener más información sobre las limitaciones de la vista materializada, incluido el efecto de las operaciones en segundo plano, como VACUUM, en las operaciones de actualización de la vista materializada, consulte [Notas de uso](#mv_REFRESH_MARTERIALIZED_VIEW_usage).

## Ejemplos
<a name="mv_REFRESH_MARTERIALIZED_VIEW_examples"></a>

El siguiente ejemplo actualiza la vista materializada de `tickets_mv`.

```
REFRESH MATERIALIZED VIEW tickets_mv;
```

El siguiente actualiza la vista materializada de `products_mv` y todas las vistas materializadas dependientes:

```
REFRESH MATERIALIZED VIEW products_mv CASCADE; 
```

# RESET
<a name="r_RESET"></a>

Restablece el valor de un parámetro de configuración a su valor predeterminado.

Puede restablecer un parámetro especificado o todos los parámetros a la vez. Para establecer un parámetro en un valor específico, use el comando [SET](r_SET.md). Para mostrar el valor actual de un parámetro, use el comando [SHOW](r_SHOW.md).

## Sintaxis
<a name="r_RESET-synopsis"></a>

```
RESET { parameter_name | ALL }
```

La siguiente instrucción establece el valor de una variable de contexto de sesión en NULL.

```
RESET { variable_name | ALL }
```

## Parameters
<a name="r_RESET-parameters"></a>

 *parameter\$1name*   
Nombre del parámetro que se debe restablecer. Consulte [Modificación de la configuración del servidor](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings) para obtener más información acerca de los parámetros.

ALL   
Restablece todos los parámetros de tiempo de ejecución, incluidas todas las variables de contexto de sesión.

*variable*   
El nombre de la variable que restablecer. Si el valor para RESET es una variable de contexto de sesión, Amazon Redshift lo establece en NULL.

## Ejemplos
<a name="r_RESET-examples"></a>

En el siguiente ejemplo, se restablece el parámetro `query_group` a su valor predeterminado: 

```
reset query_group;
```

En el siguiente ejemplo, se restablecen todos los parámetros de tiempo de ejecución a sus valores predeterminados. 

```
reset all;
```

En el ejemplo siguiente, se restablece la variable de contexto.

```
RESET app_context.user_id;
```

# REVOKE
<a name="r_REVOKE"></a>

Quita los permisos de acceso, como los permisos para crear, eliminar o actualizar tablas, a un usuario o rol.

Solo puede dar permisos GRANT o REVOKE USAGE en un esquema externo a los usuarios de la base de datos y los roles con la sintaxis ON SCHEMA. Cuando use ON EXTERNAL SCHEMA con AWS Lake Formation, solo puede usar GRANT y REVOKE para conceder y revocar permisos a un rol de AWS Identity and Access Management (IAM). Para obtener una lista de los permisos, consulte la sintaxis.

Para procedimientos almacenados, se concede el permiso USAGE ON LANGUAGE `plpgsql` a PUBLIC de manera predeterminada. El permiso EXECUTE ON PROCEDURE se concede solo al propietario y a los superusuarios de manera predeterminada.

Especifique en el comando REVOKE los permisos que desea eliminar. Para conceder permisos, utilice el comando [GRANT](r_GRANT.md). 

## Sintaxis
<a name="r_REVOKE-synopsis"></a>

```
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | ALTER | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] }
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | TEMPORARY | TEMP | ALTER } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE db_name [, ...]
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
EXECUTE
    ON FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { EXECUTE } [,...] | ALL [ PRIVILEGES ] }
    ON PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
USAGE
    ON LANGUAGE language_name [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [GRANT OPTION FOR] 
{ { ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
    ON COPY JOB job_name [,...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]    

REVOKE [GRANT OPTION FOR]
{ { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON TEMPLATE template_name [,...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Revocación de permisos de nivel de columna para tablas
<a name="revoke-column-level"></a>

A continuación, se muestra la sintaxis de los permisos de nivel de columna en tablas y vistas de Amazon Redshift. 

```
REVOKE { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }
     FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
     [ RESTRICT ]
```

### Revocación de los permisos ASSUMEROLE
<a name="revoke-assumerole-permissions"></a>

A continuación, se muestra la sintaxis para revocar el permiso ASSUMEROLE a los usuarios y grupos con un rol especificado. 

```
REVOKE ASSUMEROLE
    ON { 'iam_role' [, ...]  | default | ALL }
    FROM { user_name | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    FOR { ALL | COPY | UNLOAD | EXTERNAL FUNCTION | CREATE MODEL }
```

### Revocación de permisos para Redshift Spectrum para Lake Formation
<a name="revoke-spectrum-integration-with-lf-permissions"></a>

A continuación, se muestra la sintaxis para la integración de Redshift Spectrum con Lake Formation.

```
REVOKE [ GRANT OPTION FOR ]
{ SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    FROM { IAM_ROLE iam_role } [, ...]

REVOKE [ GRANT OPTION FOR ]
{ { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    FROM { { IAM_ROLE iam_role } [, ...] | PUBLIC }

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    FROM { IAM_ROLE iam_role } [, ...]
```

### Revocación de permisos de recurso compartido de datos
<a name="revoke-datashare-permissions"></a>

**Permisos de recursos compartidos de datos del lado del productor**  
A continuación, se muestra la sintaxis para utilizar REVOKE para quitar permisos ALTER o SHARE a un usuario o rol. El usuario cuyos permisos se han revocado ya no puede modificar el recurso compartido de datos ni conceder el uso a un consumidor. 

```
REVOKE { ALTER | SHARE } ON DATASHARE datashare_name
 FROM { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

A continuación, se muestra la sintaxis para utilizar REVOKE para eliminar el acceso de un consumidor a un recurso compartido de datos.

```
REVOKE USAGE
 ON DATASHARE datashare_name
 FROM NAMESPACE 'namespaceGUID' [, ...] | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ] [, ...]
```

A continuación, se ofrece un ejemplo de cómo revocar el uso de un recurso compartido de datos de una cuenta de Lake Formation.

```
REVOKE USAGE ON DATASHARE salesshare FROM ACCOUNT '123456789012' VIA DATA CATALOG;
```

**Permisos de recursos compartidos de datos del lado del consumidor**  
A continuación, se muestra la sintaxis de REVOKE para los permisos de uso compartido de datos en una base de datos o un esquema específicos creados a partir de un datashare. La revocación del permiso de uso de una base de datos creada con la cláusula WITH PERMISSIONS no revoca ningún permiso adicional que haya concedido a un usuario o rol, ni siquiera los permisos de nivel de objeto concedidos a los objetos subyacentes. Si vuelve a conceder el permiso de uso a ese usuario o rol, conservarán todos los permisos adicionales que tenían antes de que revocara el uso.

```
REVOKE USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
 FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Revocación de los permisos acotados
<a name="revoke-scoped-permissions"></a>

Los permisos limitados le permiten conceder permisos a un usuario o rol en todos los objetos de un tipo dentro de una base de datos o un esquema. Los usuarios y roles con permisos limitados tienen los permisos especificados en todos los objetos actuales y futuros de la base de datos o del esquema.

Puede ver el alcance de los permisos limitados en el nivel de base de datos en [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md). Puede ver el alcance de los permisos limitados en el nivel de esquema en [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md).

Para obtener más información sobre los permisos acotados, consulte [Permisos acotados](t_scoped-permissions.md).

A continuación, se muestra la sintaxis para revocar permisos acotados a usuarios y roles. 

```
REVOKE [ GRANT OPTION ] 
{ CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
FOR SCHEMAS IN
DATABASE db_name 
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ]
{ { SELECT | INSERT | UPDATE | DELETE | DROP | ALTER | TRUNCATE | REFERENCES } [, ...] } | ALL [PRIVILEGES] } }
FOR TABLES IN
{ SCHEMA schema_name [ DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] { EXECUTE | ALL [ PRIVILEGES ] }
FOR FUNCTIONS IN 
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] { EXECUTE | ALL [ PRIVILEGES ] }
FOR PROCEDURES IN
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] USAGE
FOR LANGUAGES IN
DATABASE db_name
FROM { username | ROLE role_name } [, ...]  

REVOKE [GRANT_OPTION] 
{ { CREATE | ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
FOR COPY JOBS 
IN DATABASE db_name
FROM { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]      

REVOKE [ GRANT OPTION ]
{ {ALTER | DROP  | USAGE } [,...] | ALL [ PRIVILEGES ] }
FOR TEMPLATES IN
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]
```

Tenga en cuenta que los permisos limitados no distinguen entre los permisos de las funciones y los de los procedimientos. Por ejemplo, la siguiente instrucción revoca los permisos `EXECUTE` tanto para las funciones como para los procedimientos de `bob` en el esquema `Sales_schema`. 

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

### Revocación de permisos de machine learning
<a name="revoke-model-permissions"></a>

A continuación, se muestra la sintaxis para los permisos de modelos de machine learning en Amazon Redshift.

```
REVOKE [ GRANT OPTION FOR ]
    CREATE MODEL FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON MODEL model_name [, ...]

    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    [ RESTRICT ]
```

### Revocación de los permisos de rol
<a name="revoke-roles"></a>

A continuación, se muestra la sintaxis para revocar permisos de rol en Amazon Redshift.

```
REVOKE [ ADMIN OPTION FOR ] { ROLE role_name } [, ...] FROM { user_name } [, ...]
```

```
REVOKE { ROLE role_name } [, ...] FROM { ROLE role_name } [, ...]
```

A continuación, se muestra la sintaxis para revocar permisos de sistema a los roles en Amazon Redshift.

```
REVOKE
  {
    { CREATE USER | DROP USER | ALTER USER |
    CREATE SCHEMA | DROP SCHEMA |
    ALTER DEFAULT PRIVILEGES |
    ACCESS CATALOG |
    CREATE TABLE | DROP TABLE | ALTER TABLE |
    CREATE OR REPLACE FUNCTION | CREATE OR REPLACE EXTERNAL FUNCTION |
    DROP FUNCTION |
    CREATE OR REPLACE PROCEDURE | DROP PROCEDURE |
    CREATE OR REPLACE VIEW | DROP VIEW |
    CREATE MODEL | DROP MODEL |
    CREATE DATASHARE | ALTER DATASHARE | DROP DATASHARE |
    CREATE LIBRARY | DROP LIBRARY |
    CREATE ROLE | DROP ROLE
    TRUNCATE TABLE
    VACUUM | ANALYZE | CANCEL }[, ...]
  }
  | { ALL [ PRIVILEGES ] }
FROM { ROLE role_name } [, ...]
```

### Revocación de los permisos de las políticas de seguridad
<a name="revoke-role-level"></a>

Con la siguiente sintaxis, se pueden revocar permisos para explicar los filtros de la política de seguridad de una consulta en el plan EXPLAIN. Las posibles políticas de seguridad incluyen políticas de seguridad por fila y políticas de enmascaramiento de datos dinámico.

```
REVOKE EXPLAIN { RLS | MASKING } FROM ROLE rolename 
```

Con la siguiente sintaxis, se pueden revocar permisos para omitir las políticas de seguridad por fila para una consulta. 

```
REVOKE IGNORE RLS FROM ROLE rolename 
```

A continuación, se muestra la sintaxis para revocar permisos SELECT de la política de seguridad especificada. Las posibles políticas de seguridad incluyen políticas de seguridad por fila y políticas de enmascaramiento de datos dinámico.

```
REVOKE SELECT ON [ TABLE ] table_name [, ...]
            FROM { RLS | MASKING } POLICY policy_name [, ...]
```

## Parameters
<a name="r_REVOKE-parameters"></a>

GRANT OPTION FOR   
Revoca solo la opción de conceder un permiso especificado a otros usuarios y no revoca el permiso en sí. No puede revocar GRANT OPTION de un grupo o de PUBLIC.

SELECT   
Revoca el privilegio para seleccionar datos de una tabla o vista a través de una instrucción SELECT.

INSERT   
Revoca el permiso para cargar datos en una tabla a través de una instrucción INSERT o una instrucción COPY. 

UPDATE   
Revoca el privilegio para actualizar una columna de la tabla a través de una instrucción UPDATE. 

DELETE   
Revoca el permiso para eliminar una fila de datos de una tabla.

REFERENCES   
Revoca el permiso para crear una restricción de clave externa. Debe revocar este permiso en la tabla a la que se hace referencia y en la tabla de referencia.

TRUNCATE  
Revoca el permiso para truncar una tabla. Sin este permiso, solo el propietario de una tabla o un superusuario pueden truncarla. Para obtener más información sobre el comando TRUNCATE, consulte [TRUNCATE](r_TRUNCATE.md).

ALL [ PRIVILEGES ]   
Revoca todos los permisos disponibles a la vez del usuario o grupo especificado. La palabra clave PRIVILEGES es opcional.  
 Amazon Redshift no admite los permisos RULE y TRIGGER. Para obtener más información, consulte [Características no compatibles de PostgreSQL](c_unsupported-postgresql-features.md). 

ALTER  
Según el objeto de base de datos, revoca los siguientes permisos del usuario o grupo de usuarios:   
+ En el caso de las tablas, ALTER revoca el permiso para modificar una tabla o una vista. Para obtener más información, consulte [ALTER TABLE](r_ALTER_TABLE.md).
+ En el caso de las bases de datos, ALTER revoca el permiso para modificar una base de datos. Para obtener más información, consulte [ALTER DATABASE](r_ALTER_DATABASE.md).
+ En el caso de los esquemas, ALTER concede revocaciones para modificar un esquema. Para obtener más información, consulte [ALTER SCHEMA](r_ALTER_SCHEMA.md).
+ En el caso de las tablas externas, ALTER revoca el permiso para alterar una tabla en un AWS Glue Data Catalog que esté habilitado para Lake Formation. Este permiso solo se aplica cuando se utiliza Lake Formation.

DROP  
Según el objeto de base de datos, revoca los siguientes permisos del usuario o rol:  
+  En el caso de las tablas, DROP revoca el permiso para eliminar una tabla o una vista. Para obtener más información, consulte [DROP TABLE](r_DROP_TABLE.md). 
+  En el caso de las bases de datos, DROP revoca el permiso para eliminar una base de datos. Para obtener más información, consulte [DROP DATABASE](r_DROP_DATABASE.md). 
+  En el caso de los esquemas, DROP revoca el permiso para eliminar un esquema. Para obtener más información, consulte [DROP SCHEMA](r_DROP_SCHEMA.md). 

ASSUMEROLE  <a name="assumerole"></a>
Revoca el permiso para ejecutar comandos COPY, UNLOAD, EXTERNAL FUNCTION o CREATE MODEL de usuarios, roles o grupos con un rol especificado. 

ON [ TABLE ] *table\$1name*   
Revoca los permisos especificados en una tabla o vista. La palabra clave TABLE es opcional.

ON ALL TABLES IN SCHEMA *schema\$1name (nombre\$1de\$1esquema)*   
Revoca los permisos especificados en todas las tablas en el esquema al que se hace referencia.

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="revoke-column-level-privileges"></a>
Revoca los permisos especificados de usuarios, grupos o PUBLIC en las columnas especificadas de la tabla o la vista de Amazon Redshift.

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table-column"></a>
Revoca los permisos especificados de un rol de IAM en las columnas especificadas de la tabla de Lake Formation en el esquema de la referencia.

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table"></a>
Revoca los permisos especificados de un rol de IAM en las tablas de Lake Formation especificadas en el esquema de la referencia.

ON EXTERNAL SCHEMA *schema\$1name*   <a name="revoke-external-schema"></a>
Revoca los permisos especificados de un rol de IAM en el esquema al que se hace referencia.

FROM IAM\$1ROLE *iam\$1role*   <a name="revoke-from-iam-role"></a>
Indica el rol de IAM que pierde los permisos.

ROLE *role\$1name*   
Revoca los permisos del rol especificado.

GROUP *group\$1name*   
Revoca los permisos del grupo de usuarios especificado.

PUBLIC   
Revoca los permisos especificados de todos los usuarios. PUBLIC representa un grupo que siempre incluye a todos los usuarios. Los permisos de un usuario individual constan de la suma de permisos concedidos a PUBLIC, los permisos concedidos a cualquier grupo al que pertenezca el usuario y los permisos concedidos al usuario de manera individual.  
La revocación de PUBLIC de una tabla externa de Lake Formation da lugar a la revocación del permiso del grupo *everyone* de Lake Formation.

CREATE   
Según el objeto de base de datos, revoca los siguientes permiso del usuario o grupo de usuarios:  
+ Para las bases de datos, usar la cláusula CREATE para REVOKE previene que los usuarios creen esquemas dentro de la base de datos.
+ Para los esquemas, usar la cláusula CREATE para REVOKE previene que los usuarios creen objetos dentro de un esquema. Para cambiar el nombre de un objeto, el usuario debe tener el permiso CREATE y ser propietario del objeto cuyo nombre va a cambiarse. 
De manera predeterminada, todos los usuarios tienen permisos CREATE y USAGE en el esquema PUBLIC.

TEMPORARY \$1 TEMP   
Revoca el permiso para crear tablas temporales en la base de datos especificada.  
Por defecto, los usuarios reciben permisos para crear tablas temporales con su membresía automática en el grupo PUBLIC. Para eliminar el permiso de cualquier usuario para crear tablas temporales, revoque el permiso TEMP del grupo PUBLIC y, después, conceda explícitamente el permiso para crear tablas temporales solo a usuarios o grupos de usuarios específicos.

ON DATABASE *db\$1name*   
Revoca los permisos en la base de datos especificada.

USAGE   
Revoca los permisos USAGE en objetos de un esquema específico, lo que provoca que los usuarios no puedan acceder a estos objetos. Las acciones específicas en estos objetos deben revocarse por separado (como el permiso EXECUTE en las funciones).  
De manera predeterminada, todos los usuarios tienen permisos CREATE y USAGE en el esquema PUBLIC.

ON SCHEMA *schema\$1name*   
Revoca los permisos en el esquema especificado. Puede usar permisos de esquema para controlar la creación de tablas. El permiso CREATE para una base de datos solo controla la creación de esquemas.

RESTRICT   
Revoca solo los permisos que el usuario concedió directamente. Este es el comportamiento predeterminado.

EXECUTE ON PROCEDURE *procedure\$1name*   
Revoca el permiso EXECUTE en un procedimiento almacenado específico. Debido a que los nombres de procedimientos almacenados no se pueden sobrecargar, debe incluir la lista de argumentos para el procedimiento. Para obtener más información, consulte [Nomenclatura de los procedimientos almacenados](stored-procedure-naming.md).

EXECUTE ON ALL PROCEDURES IN SCHEMA *procedure\$1name*   
Revoca los permisos especificados en todos los procedimientos en el esquema al que se hace referencia.

USAGE ON LANGUAGE *language\$1name*   
Revoca el permiso USAGE en un lenguaje. Para Funciones definidas por el usuario (UDF) utilice `plpythonu`. Para las UDF de SQL, use `sql`. Para procedimientos almacenados, utilice `plpgsql`.   
Para crear una UDF, debe tener permiso para usar el lenguaje de SQL o `plpythonu` (Python). De manera predeterminada, se concede el permiso USAGE ON LANGUAGE SQL a PUBLIC. No obstante, debe conceder explícitamente el permiso de USAGE ON LANGUAGE PLPYTHONU a usuarios o grupos específicos.   
Para revocar los permisos de uso de SQL, primero revoque el uso de PUBLIC. A continuación, conceda los permisos de uso de SQL a solo los usuarios o grupos que tienen permiso para crear UDF de SQL. En el siguiente ejemplo, se revocan los permisos de uso de SQL de PUBLIC y después se conceden permisos de uso al grupo de usuarios `udf_devs`.   

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```
Para obtener más información, consulte [Seguridad y permisos de UDF](udf-security-and-privileges.md).   
Para revocar el uso para procedimientos almacenados, primero revoque el uso de PUBLIC. A continuación, conceda los permisos de uso en `plpgsql` solo a los usuarios o grupos que tienen permiso para crear procedimientos almacenados. Para obtener más información, consulte [Seguridad y privilegios para procedimientos almacenados](stored-procedure-security-and-privileges.md). 

ON COPY JOB *job\$1name*  <a name="on-copy-job-revoke"></a>
Revoca los permisos especificados en un trabajo de copia.

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]  <a name="revoke-for"></a>
Especifica el comando SQL para el cual se revoca el permiso. Puede especificar ALL para revocar el permiso en las instrucciones COPY, UNLOAD, EXTERNAL FUNCTION y CREATE MODEL. Esta cláusula se aplica solo a la revocación del permiso ASSUMEROLE.

ALTER  
Revoca el permisos ALTER para usuarios o grupos de usuarios, lo que permite modificar un recurso compartido de datos a quienes no lo poseen. Este permiso es necesario para agregar o quitar objetos de un recurso compartido de datos o para establecer la propiedad PUBLICACCESSIBLE. Para obtener más información, consulte [ALTER DATASHARE](r_ALTER_DATASHARE.md).

SHARE  
Revoca permisos para usuarios y grupos de usuarios que sirven para agregar consumidores a un recurso compartido de datos. Es necesario revocar este permiso para que un consumidor concreto deje de acceder al recurso compartido de datos desde sus clústeres. 

ON DATASHARE *datashare\$1name *  
Concede los permisos especificados en el recurso compartido de datos al que se hace referencia.

FROM username  
Indica el usuario que pierde los permisos.

FROM GROUP *group\$1name*  
Indica el grupo de usuarios que pierde los permisos.

WITH GRANT OPTION  
Indica que el usuario que pierde los permisos puede, a su vez, revocar los mismos permisos a otros usuarios. No se puede revocar WITH GRANT OPTION para un grupo o para PUBLIC. 

USAGE  
Cuando se revoca USAGE para una cuenta consumidora o un espacio de nombres dentro de la misma cuenta, estos no pueden acceder al datashare y a los objetos del datashare para lectura solamente.   
La revocación del permiso USAGE revoca el acceso de los consumidores a un recurso compartido de datos. 

FROM NAMESPACE 'clusternamespace GUID'   
Indica el espacio de nombres en la misma cuenta que tiene consumidores que pierden los permisos en el recurso compartido de datos. Los espacios de nombres utilizan un identificador único global (GUID) alfanumérico de 128 bits.

FROM ACCOUNT 'número\$1de\$1cuenta' [ VIA DATA CATALOG ]  
Indica el número de otra cuenta que tiene consumidores que pierden los permisos en el recurso compartido de datos. Si especifica “VIA DATA CATALOG”, se indica que revoca el uso del recurso compartido de datos de una cuenta de Lake Formation. Omitir el número de cuenta significa que se revoca de la cuenta que es propietaria del clúster.

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="revoke-datashare"></a>
Revoca los permisos de uso especificados en la base de datos concreta que se creó en el recurso compartido de datos indicado. 

ON SCHEMA* shared\$1schema*   <a name="revoke-datashare"></a>
Revoca los permisos especificados en el esquema concreto que se creó en el recurso compartido de datos indicado.

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
Especifica los objetos de la base de datos a los que se va a revocar el permiso. Los parámetros que siguen a IN definen el alcance del permiso revocado.

CREATE MODEL  
Revoca el permiso CREATE MODEL para crear modelos de machine learning en la base de datos especificada.

ON MODEL *model\$1name*  
Revoca el permiso EXECUTE para un modelo específico. 

ACCESS CATALOG  
Revoca el permiso para ver los metadatos relevantes de los objetos a los que tiene acceso el rol.

[ ADMIN OPTION FOR ] \$1 role \$1 [, …]  
Rol que se revoca a un usuario especificado que tiene WITH ADMIN OPTION.

FROM \$1 role \$1 [, …]  
Rol al que se le revoca el rol especificado.

EXPLAIN \$1 RLS \$1 MASKING \$1 FROM ROLE *rolename*  
Revoca a un rol el permiso de explicar los filtros de política de seguridad de una consulta en el plan EXPLAIN. RLS revoca el permiso para explicar filtros de políticas de seguridad por fila. MASKING revoca permiso para explicar los filtros de la política de enmascaramiento de datos dinámico.

IGNORE RLS FROM ROLE *rolename*   
Revoca a un rol el permiso de eludir las políticas de seguridad por fila para una consulta.

FROM \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
Indica la política de seguridad que pierde los permisos. TO RLS POLICY indica una política de seguridad por fila. TO MASKING POLICY indica una política de enmascaramiento de datos dinámico.

## Notas de uso
<a name="r_REVOKE-usage-notes-link"></a>

Para obtener más información acerca de las notas de uso de REVOKE, consulte [Notas de uso](r_REVOKE-usage-notes.md).

## Ejemplos
<a name="r_REVOKE-examples-link"></a>

Para ver ejemplos de cómo utilizar REVOKE, consulte [Ejemplos](r_REVOKE-examples.md).

# Notas de uso
<a name="r_REVOKE-usage-notes"></a>

Para revocar los privilegios de un objeto, debe cumplir con uno de los siguientes criterios:
+ Ser el propietario del objeto.
+ Ser un superusuario.
+ Tener un privilegio concedido para ese objeto y privilegio.

  Por ejemplo, el siguiente comando permite al usuario HR realizar comandos SELECT en la tabla de empleados y conceder y revocar el mismo privilegio para otros usuarios:

  ```
  grant select on table employees to HR with grant option;
  ```

  HR no puede revocar privilegios para ninguna operación que no sea SELECT o ninguna tabla que no sea la de empleados. 

Los superusuarios pueden obtener acceso a todos los objetos independientemente de los comandos GRANT y REVOKE que establecen privilegios de objeto.

PUBLIC representa un grupo que siempre incluye a todos los usuarios. De manera predeterminada, todos los miembros de PUBLIC, tienen privilegios CREATE y USAGE en el esquema PUBLIC. Para restringir los permisos de los usuarios en el esquema PUBLIC, primero debe revocar todos los permisos de PUBLIC en el esquema PUBLIC y después conceder privilegios a usuarios o grupos específicos. En el siguiente ejemplo, se controlan los privilegios de creación de tablas en el esquema PUBLIC.

```
revoke create on schema public from public;
```

Para revocar privilegios de una tabla de Lake Formation, el rol de IAM asociado al esquema externo de la tabla debe tener permiso para revocar privilegios a la tabla externa. El siguiente ejemplo crea un esquema externo con un rol IAM asociado `myGrantor`. El rol IAM `myGrantor` tiene el permiso para retirar permisos a otros. El comando REVOKE utiliza los permisos del rol `myGrantor` IAM que está asociado al esquema externo para retirar permisos al rol IAM `myGrantee`.

```
create external schema mySchema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myGrantor'
create external database if not exists;
```

```
revoke select
on external table mySchema.mytable
from iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

**nota**  
Si el rol de IAM también tiene el permiso `ALL` en un AWS Glue Data Catalog que está habilitado para Lake Formation, no se revoca el permiso `ALL`. Solo el permiso `SELECT` se retira. Puede ver los permisos de Lake Formation en la consola de dicho servicio.

## Notas de uso para revocar el permiso ASSUMEROLE
<a name="r_REVOKE-usage-notes-assumerole"></a>

Las siguientes notas de uso se aplican para revocar el privilegio ASSUMEROLE en Amazon Redshift. 

Solo un superusuario de base de datos puede revocar el privilegio ASSUMEROLE para usuarios y grupos. Un superusuario siempre conserva el privilegio ASSUMEROLE. 

Para habilitar el uso del privilegio ASSUMEROLE para usuarios y grupos, un superusuario ejecuta una vez la siguiente instrucción en el clúster. Antes de conceder el privilegio ASSUMEROLE a usuarios y grupos, un superusuario debe ejecutar una vez la siguiente instrucción en el clúster. 

```
revoke assumerole on all from public for all;
```

## Notas de uso para revocar permisos de machine learning
<a name="r_REVOKE-usage-notes-create-model"></a>

No puede conceder ni revocar directamente permisos relacionados con una función de ML. Una función de ML pertenece a un modelo de ML y los permisos se controlan mediante el modelo. En su lugar, puede revocar los permisos relacionados con el modelo de ML. En el siguiente ejemplo, se muestra cómo revocar el permiso de ejecución a todos los usuarios asociados al modelo `customer_churn`.

```
REVOKE EXECUTE ON MODEL customer_churn FROM PUBLIC;
```

También puede revocar todos los permisos a un usuario para el modelo de ML `customer_churn`.

```
REVOKE ALL on MODEL customer_churn FROM ml_user;
```

Se producirá un error en la revocación del permiso `EXECUTE` relacionado con una función de ML si existe una función de ML en el esquema, aunque dicha función de ML ya disponga del permiso `EXECUTE` mediante `GRANT EXECUTE ON MODEL`. Recomendamos utilizar un esquema independiente cuando utilice el comando `CREATE MODEL` para mantener las funciones de ML en un esquema independiente por sí mismas. En el siguiente ejemplo, se muestra cómo hacerlo.

```
CREATE MODEL ml_schema.customer_churn
FROM customer_data
TARGET churn
FUNCTION ml_schema.customer_churn_prediction
IAM_ROLE default
SETTINGS (
 S3_BUCKET 'amzn-s3-demo-bucket'
);
```

# Ejemplos
<a name="r_REVOKE-examples"></a>

En el siguiente ejemplo, se revocan privilegios INSERT en la tabla SALES del grupo de usuarios GUESTS. Este comando previene que los miembros de GUESTS puedan cargar datos en la tabla SALES con el comando INSERT. 

```
revoke insert on table sales from group guests;
```

En el siguiente ejemplo, se le revoca el privilegio SELECT en todas las tablas del esquema QA\$1TICKIT al usuario `fred`.

```
revoke select on all tables in schema qa_tickit from fred;
```

En el siguiente ejemplo, se le revoca el privilegio para seleccionar desde una vista al usuario `bobr`.

```
revoke select on table eventview from bobr;
```

En el siguiente ejemplo, se le revoca el privilegio para crear tablas temporales en la base de datos TICKIT a todos los usuarios.

```
revoke temporary on database tickit from public;
```

En el siguiente ejemplo, se revoca el privilegio SELECT en las columnas `cust_name` y `cust_phone` de la tabla `cust_profile` del usuario `user1`. 

```
revoke select(cust_name, cust_phone) on cust_profile from user1;
```

En el siguiente ejemplo, se revoca el privilegio SELECT en las columnas `cust_name` y `cust_phone` y el privilegio UPDATE en la columna `cust_contact_preference` de la tabla `cust_profile` del grupo `sales_group`. 

```
revoke select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile from group sales_group;
```

En el siguiente ejemplo, se muestra el uso de la palabra clave ALL para revocar los privilegios SELECT y UPDATE de las tres columnas de la tabla `cust_profile` del grupo `sales_admin`. 

```
revoke ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile from group sales_admin;
```

En el siguiente ejemplo, se revoca el privilegio SELECT de la columna `cust_name` de la vista `cust_profile_vw` del usuario `user2`. 

```
revoke select(cust_name) on cust_profile_vw from user2;
```

## Ejemplos de revocación del permiso USAGE a bases de datos creadas a partir de recursos compartidos de datos
<a name="r_REVOKE-examples-datashare"></a>

En el ejemplo siguiente se revoca el acceso al recurso compartido de datos `salesshare` desde el espacio de nombres `13b8833d-17c6-4f16-8fe4-1a018f5ed00d`.

```
REVOKE USAGE ON DATASHARE salesshare FROM NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

En el siguiente ejemplo se revoca el permiso USAGE en `sales_db` a `Bob`.

```
REVOKE USAGE ON DATABASE sales_db FROM Bob;
```

El siguiente es un ejemplo de permiso REVOKE USAGE en `sales_schema` para el `Analyst_role`.

```
REVOKE USAGE ON SCHEMA sales_schema FROM ROLE Analyst_role;
```

## Ejemplos de revocación de permisos acotados
<a name="r_REVOKE-examples-scoped"></a>

El siguiente ejemplo revoca el uso de todos los esquemas actuales y futuros de la base de datos `Sales_db` al rol `Sales`.

```
REVOKE USAGE FOR SCHEMAS IN DATABASE Sales_db FROM ROLE Sales;
```

El siguiente ejemplo revoca la posibilidad de conceder el permiso SELECT para todas las tablas actuales y futuras de la base de datos `Sales_db` al usuario `alice`. `alice` conserva el acceso a todas las tablas en `Sales_db`.

```
REVOKE GRANT OPTION SELECT FOR TABLES IN DATABASE Sales_db FROM alice;
```

En el siguiente ejemplo, se revoca el permiso EXECUTE para las funciones del esquema `Sales_schema` al usuario `bob`.

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

En el siguiente ejemplo se revocan todos los permisos para todas las tablas del esquema `ShareSchema` de la base de datos `ShareDb` al rol `Sales`. Al especificar el esquema, también puede indicar la base de datos del esquema mediante el formato de dos partes `database.schema`.

```
REVOKE ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema FROM ROLE Sales;
```

El siguiente ejemplo es el mismo que el anterior. Puede especificar la base de datos del esquema mediante la palabra clave `DATABASE` en lugar de utilizar un formato de dos partes.

```
REVOKE ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb FROM ROLE Sales;
```

## Ejemplos de revocación del privilegio ASSUMEROLE
<a name="r_REVOKE-examples-assumerole"></a>

A continuación, se muestran ejemplos de revocación del privilegio ASSUMEROLE. 

Un superusuario debe habilitar el uso del privilegio ASSUMEROLE para usuarios y grupos al ejecutar una sola vez la siguiente instrucción en el clúster: 

```
revoke assumerole on all from public for all;
```

La siguiente instrucción revoca el privilegio ASSUMEROLE del usuario reg\$1user1 en todos los roles para todas las operaciones. 

```
revoke assumerole on all from reg_user1 for all;
```

## Ejemplos de revocación del privilegio ROLE
<a name="r_REVOKE-examples-role"></a>

El siguiente ejemplo revoca sample\$1role1 a sample\$1role2.

```
CREATE ROLE sample_role2;
GRANT ROLE sample_role1 TO ROLE sample_role2;
REVOKE ROLE sample_role1 FROM ROLE sample_role2;
```

El siguiente ejemplo revoca los privilegios del sistema a user1.

```
GRANT ROLE sys:DBA TO user1;
REVOKE ROLE sys:DBA FROM user1;
```

El siguiente ejemplo revoca sample\$1role1 y sample\$1role2 a user1.

```
CREATE ROLE sample_role1;
CREATE ROLE sample_role2;
GRANT ROLE sample_role1, ROLE sample_role2 TO user1;
REVOKE ROLE sample_role1, ROLE sample_role2 FROM user1;
```

El siguiente ejemplo revoca sample\$1role2 con ADMIN OPTION a user1.

```
GRANT ROLE sample_role2 TO user1 WITH ADMIN OPTION;
REVOKE ADMIN OPTION FOR ROLE sample_role2 FROM user1;
REVOKE ROLE sample_role2 FROM user1;
```

El siguiente ejemplo revoca sample\$1role1 y sample\$1role2 a sample\$1role5.

```
CREATE ROLE sample_role5;
GRANT ROLE sample_role1, ROLE sample_role2 TO ROLE sample_role5;
REVOKE ROLE sample_role1, ROLE sample_role2 FROM ROLE sample_role5;
```

El siguiente ejemplo revoca los privilegios del sistema CREATE SCHEMA y DROP SCHEMA a sample\$1role1.

```
GRANT CREATE SCHEMA, DROP SCHEMA TO ROLE sample_role1;
REVOKE CREATE SCHEMA, DROP SCHEMA FROM ROLE sample_role1;
```

# ROLLBACK
<a name="r_ROLLBACK"></a>

Detiene la transacción actual y descarta todas las actualizaciones realizadas por esa transacción.

Este comando lleva a cabo la misma función que el comando [ABORT](r_ABORT.md).

## Sintaxis
<a name="r_ROLLBACK-synopsis"></a>

```
ROLLBACK [ WORK | TRANSACTION ]
```

## Parameters
<a name="r_ROLLBACK-parameters"></a>

WORK  
Palabra clave opcional. Esta palabra clave no se admite en un proceso almacenado. 

TRANSACTION  
Palabra clave opcional. WORK y TRANSACTION son sinónimos. Ninguna de ellas se admite en un proceso almacenado. 

Para más información sobre el uso de ROLLBACK en un proceso almacenado, vea [Administración de transacciones](stored-procedure-transaction-management.md). 

## Ejemplo
<a name="r_ROLLBACK-example"></a>

En el siguiente ejemplo, se crea una tabla que inicia una transacción donde los datos se insertan en la tabla. El comando ROLLBACK revierte la inserción de datos para dejar la tabla vacía.

El siguiente comando crea una tabla de ejemplo denominada MOVIE\$1GROSS:

```
create table movie_gross( name varchar(30), gross bigint );
```

El siguiente conjunto de comandos inicia una transacción en donde se insertan dos filas de datos en la tabla:

```
begin;

insert into movie_gross values ( 'Raiders of the Lost Ark', 23400000);

insert into movie_gross values ( 'Star Wars', 10000000 );
```

A continuación, el siguiente comando selecciona los datos de la tabla para mostrar que se insertaron correctamente:

```
select * from movie_gross;
```

En el resultado del comando se muestra que ambas filas se insertaron correctamente:

```
name           |  gross
-------------------------+----------
Raiders of the Lost Ark | 23400000
Star Wars               | 10000000
(2 rows)
```

Este comando ahora revierte los cambios de datos para que vuelvan al estado de inicio de la transacción:

```
rollback;
```

Si selecciona los datos de la tabla, ahora se muestra una tabla vacía:

```
select * from movie_gross;

name | gross
------+-------
(0 rows)
```

# SELECT
<a name="r_SELECT_synopsis"></a>

Devuelve filas de tablas, vistas y funciones definidas por el usuario. 

**nota**  
El tamaño máximo de una instrucción SQL es de 16 MB.

## Sintaxis
<a name="r_SELECT_synopsis-synopsis"></a>

```
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number | [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...] ]
[ EXCLUDE column_list ]
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ [ START WITH expression ] CONNECT BY expression ]
[ GROUP BY ALL | expression [, ...] ]
[ HAVING condition ]
[ QUALIFY condition ]
[ { UNION | ALL | INTERSECT | EXCEPT | MINUS } query ]
[ ORDER BY expression [ ASC | DESC ] ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
```

**Topics**
+ [Sintaxis](#r_SELECT_synopsis-synopsis)
+ [Cláusula WITH](r_WITH_clause.md)
+ [Lista SELECT](r_SELECT_list.md)
+ [EXCLUDE column\$1list](r_EXCLUDE_list.md)
+ [Cláusula FROM](r_FROM_clause30.md)
+ [Cláusula WHERE](r_WHERE_clause.md)
+ [Cláusula GROUP BY](r_GROUP_BY_clause.md)
+ [Cláusula HAVING](r_HAVING_clause.md)
+ [Cláusula QUALIFY](r_QUALIFY_clause.md)
+ [UNION, INTERSECT y EXCEPT](r_UNION.md)
+ [Cláusula ORDER BY](r_ORDER_BY_clause.md)
+ [Cláusula CONNECT BY](r_CONNECT_BY_clause.md)
+ [Ejemplos de subconsultas](r_Subquery_examples.md)
+ [Subconsultas correlacionadas](r_correlated_subqueries.md)

# Cláusula WITH
<a name="r_WITH_clause"></a>

Una cláusula WITH es una cláusula opcional que precede a la lista SELECT en una consulta. La cláusula WITH define una o más *common\$1table\$1expressions*. Cada expresión común de tabla (CTE) define una tabla temporal, que es similar a la definición de una vista. Puede referenciar estas tablas temporales en la cláusula FROM. Solo se utilizan mientras se ejecuta la consulta a la que pertenecen. Cada CTE en la cláusula WITH especifica un nombre de tabla, una lista opcional de nombres de columnas y una expresión de consulta que toma el valor de una tabla (una instrucción SELECT). Cuando se referencia el nombre de la tabla temporal en la cláusula FROM de la misma expresión de consulta que lo define, la CTE es recursiva. 

Las subconsultas de la cláusula WITH son una manera eficiente de definir tablas que puede utilizarse al ejecutar una única consulta. En todos los casos, se pueden obtener los mismos resultados al utilizar subconsultas en el cuerpo principal de la instrucción SELECT, pero las subconsultas de la cláusula WITH pueden resultar más sencillas de escribir y leer. Cuando es posible, las subconsultas de la cláusula WITH a las que se hace referencia varias veces se optimizan como subexpresiones comunes; es decir, puede ser posible evaluar una subconsulta WITH una vez y reutilizar sus resultados (tenga en cuenta que las subexpresiones comunes no se limitan a aquellas definidas en la cláusula WITH).

## Sintaxis
<a name="r_WITH_clause-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
```

Donde *common\$1table\$1expression* puede ser recursiva o no recursiva. A continuación, se presenta la forma no recursiva: 

```
CTE_table_name [ ( column_name [, ...] ) ] AS ( query )
```

A continuación, se presenta la forma recursiva de *common\$1table\$1expression*:

```
CTE_table_name (column_name [, ...] ) AS ( recursive_query )
```

## Parameters
<a name="r_WITH_clause-parameters"></a>

 RECURSIVE   
Se trata de la palabra clave que identifica la consulta como una CTE recursiva. Esta palabra clave es necesaria si alguna *common\$1table\$1expression* definida en la cláusula WITH es recursiva. Solo puede especificar la palabra clave RECURSIVE una vez, inmediatamente después de la palabra clave WITH, incluso si la cláusula WITH contiene varias CTE recursivas. En general, una CTE recursiva es una subconsulta UNION ALL con dos partes. 

 *common\$1table\$1expression*   
Define una tabla temporal a la que se puede referenciar en [Cláusula FROM](r_FROM_clause30.md) y se utiliza solo durante la ejecución de la consulta a la que pertenece. 

 *CTE\$1table\$1name*   
Un nombre único para una tabla temporal que define los resultados de una subconsulta de la cláusula WITH. No se pueden usar nombres duplicados dentro de una cláusula WITH. Cada subconsulta debe tener un nombre de tabla al que se pueda hacer referencia en la [Cláusula FROM](r_FROM_clause30.md).

 *column\$1name*   
 Se trata de una lista de nombres de columnas de salida para la subconsulta de la cláusula WITH, separados por comas. La cantidad de nombres de columnas especificada debe ser igual o menor a la cantidad de columnas definidas por la subconsulta. Para una CTE que no es recursiva, *column\$1name* es opcional. Para una CTE recursiva, la lista de *column\$1name* es obligatoria.

 *query*   
 Se trata de cualquier consulta SELECT compatible con Amazon Redshift. Consulte [SELECT](r_SELECT_synopsis.md). 

 *recursive\$1query*   
Una consulta UNION ALL que consta de dos subconsultas SELECT:  
+ La primera subconsulta SELECT no tiene una referencia recursiva al mismo *CTE\$1table\$1name*. Devuelve un conjunto de resultados que es la inicialización de la recursión. Esta parte se denomina miembro inicial o miembro de inicialización.
+ La segunda subconsulta SELECT referencia el mismo *CTE\$1table\$1name* en su cláusula FROM. Esto se conoce como el miembro recursivo. La *recursive\$1query* contiene una condición WHERE para finalizar la *recursive\$1query*. 

## Notas de uso
<a name="r_WITH_clause-usage-notes"></a>

Puede usar una cláusula WITH en las siguientes instrucciones SQL: 
+ SELECT 
+ SELECT INTO
+ CREATE TABLE AS
+ CREATE VIEW
+ DECLARE
+ EXPLAIN
+ INSERT INTO...SELECT 
+ PREPARE
+ UPDATE (dentro de una subconsulta de la cláusula WHERE. No puede definir una CTE recursiva en la subconsulta. La CTE recursiva debe ubicarse antes de la cláusula UPDATE).
+ DELETE

Si la cláusula FROM de una consulta que contiene una cláusula WITH no referencia ninguna de las tablas definidas por la cláusula WITH, se ignora la cláusula WITH y la consulta se ejecuta como siempre.

Se puede hacer referencia a una tabla definida por una subconsulta de la cláusula WITH solo en el alcance de la consulta SELECT que inicia la cláusula WITH. Por ejemplo, se puede hacer referencia a dicha tabla en la cláusula FROM de una subconsulta en la lista SELECT, la cláusula WHERE o la cláusula HAVING. No se puede usar una cláusula WITH en una subconsulta y hacer referencia a su tabla en la cláusula FROM de una consulta principal o de otra subconsulta. Este patrón de consulta provoca un mensaje de error `relation table_name doesn't exist` para la tabla de la cláusula WITH.

No se puede especificar otra cláusula WITH dentro de una subconsulta de la cláusula WITH.

No se pueden realizar referencias futuras a tablas definidas por las subconsultas de la cláusula WITH. Por ejemplo, la siguiente consulta devuelve un error debido a la referencia futura a la tabla W2 en la definición de la tabla W1: 

```
with w1 as (select * from w2), w2 as (select * from w1)
select * from sales;
ERROR:  relation "w2" does not exist
```

Una subconsulta de la cláusula WITH no puede constar de una instrucción SELECT INTO. No obstante, puede usar una cláusula WITH en una instrucción SELECT INTO.

## Expresiones de tabla comunes recursivas
<a name="r_WITH_clause-recursive-cte"></a>

Una *expresión común de tabla (CTE)* recursiva es una CTE que se referencia a sí misma. Una CTE recursiva es útil para consultar datos jerárquicos, como gráficos de la organización que muestran las relaciones de informe entre los empleados y los administradores. Consulte [Ejemplo: CTE recursiva](#r_WITH_clause-recursive-cte-example).

Otro uso común es una factura de materiales multinivel, en la que un producto consta de muchos componentes, y cada componente, a su vez, consta de otros componentes o subconjuntos.

Asegúrese de limitar la profundidad de la recursividad al incluir una cláusula WHERE en la segunda subconsulta SELECT de la consulta recursiva. Para ver un ejemplo, consulta [Ejemplo: CTE recursiva](#r_WITH_clause-recursive-cte-example). De lo contrario, puede producirse un error similar a los siguientes:
+ `Recursive CTE out of working buffers.`
+ `Exceeded recursive CTE max rows limit, please add correct CTE termination predicates or change the max_recursion_rows parameter.`

**nota**  
`max_recursion_rows` es un parámetro que establece el número máximo de filas que puede devolver una CTE recursiva para evitar bucles de recursión infinitos. No recomendamos cambiarlo por un valor superior al predeterminado. De este modo, se evita que los problemas de recursión infinita en las consultas ocupen un espacio excesivo en el clúster.

 Puede especificar un criterio de ordenación y un límite en el resultado de la CTE recursiva. Puede incluir las opciones GROUP BY y DISTINCT en el resultado final de la CTE recursiva.

No se puede especificar una cláusula WITH RECURSIVE dentro de una subconsulta. El miembro de *recursive\$1query* no puede incluir una cláusula de ordenación o de límite. 

## Ejemplos
<a name="r_WITH_clause-examples"></a>

En el siguiente ejemplo, se muestra el caso posible más simple de una consulta que contiene una cláusula WITH. La consulta WITH denominada VENUECOPY selecciona todas las filas de la tabla VENUE. La consulta principal, a su vez, selecciona todas las filas de VENUECOPY. La tabla VENUECOPY existe solo durante esta consulta. 

```
with venuecopy as (select * from venue)
select * from venuecopy order by 1 limit 10;
```

```
 venueid |         venuename          |    venuecity    | venuestate | venueseats
---------+----------------------------+-----------------+------------+------------
1 | Toyota Park                | Bridgeview      | IL         |          0
2 | Columbus Crew Stadium      | Columbus        | OH         |          0
3 | RFK Stadium                | Washington      | DC         |          0
4 | CommunityAmerica Ballpark  | Kansas City     | KS         |          0
5 | Gillette Stadium           | Foxborough      | MA         |      68756
6 | New York Giants Stadium    | East Rutherford | NJ         |      80242
7 | BMO Field                  | Toronto         | ON         |          0
8 | The Home Depot Center      | Carson          | CA         |          0
9 | Dick's Sporting Goods Park | Commerce City   | CO         |          0
v     10 | Pizza Hut Park             | Frisco          | TX         |          0
(10 rows)
```

En el siguiente ejemplo, se muestra una cláusula WITH que produce dos tablas, denominadas VENUE\$1SALES y TOP\$1VENUES. La segunda tabla de la consulta WITH selecciona desde la primera. A su vez, la cláusula WHERE del bloque de la consulta principal contiene una subconsulta que limita la tabla TOP\$1VENUES. 

```
with venue_sales as
(select venuename, venuecity, sum(pricepaid) as venuename_sales
from sales, venue, event
where venue.venueid=event.venueid and event.eventid=sales.eventid
group by venuename, venuecity),

top_venues as
(select venuename
from venue_sales
where venuename_sales > 800000)

select venuename, venuecity, venuestate,
sum(qtysold) as venue_qty,
sum(pricepaid) as venue_sales
from sales, venue, event
where venue.venueid=event.venueid and event.eventid=sales.eventid
and venuename in(select venuename from top_venues)
group by venuename, venuecity, venuestate
order by venuename;
```

```
        venuename       |   venuecity   | venuestate | venue_qty | venue_sales
------------------------+---------------+------------+-----------+-------------
August Wilson Theatre   | New York City | NY         |      3187 |  1032156.00
Biltmore Theatre        | New York City | NY         |      2629 |   828981.00
Charles Playhouse       | Boston        | MA         |      2502 |   857031.00
Ethel Barrymore Theatre | New York City | NY         |      2828 |   891172.00
Eugene O'Neill Theatre  | New York City | NY         |      2488 |   828950.00
Greek Theatre           | Los Angeles   | CA         |      2445 |   838918.00
Helen Hayes Theatre     | New York City | NY         |      2948 |   978765.00
Hilton Theatre          | New York City | NY         |      2999 |   885686.00
Imperial Theatre        | New York City | NY         |      2702 |   877993.00
Lunt-Fontanne Theatre   | New York City | NY         |      3326 |  1115182.00
Majestic Theatre        | New York City | NY         |      2549 |   894275.00
Nederlander Theatre     | New York City | NY         |      2934 |   936312.00
Pasadena Playhouse      | Pasadena      | CA         |      2739 |   820435.00
Winter Garden Theatre   | New York City | NY         |      2838 |   939257.00
(14 rows)
```

En los siguientes dos ejemplos se muestran las reglas para el alcance de las referencias de la tabla en función de las subconsultas de la cláusula WITH. La primera consulta se ejecuta, pero en la segunda se produce un error inesperado. La primera consulta tiene una subconsulta de la cláusula WITH dentro de la lista SELECT de la consulta principal. Se hace referencia a la tabla definida por la cláusula WITH (HOLIDAYS) en la cláusula FROM de la subconsulta de la lista SELECT: 

```
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join date on sales.dateid=date.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;

caldate   | daysales | dec25sales
-----------+----------+------------
2008-12-25 | 70402.00 |   70402.00
2008-12-31 | 12678.00 |   70402.00
(2 rows)
```

La segunda consulta falla porque intenta hacer referencia a la tabla HOLIDAYS en la consulta principal, así como en la subconsulta de la lista SELECT. Las referencias de la consulta principal están fuera de alcance. 

```
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join holidays on sales.dateid=holidays.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;

ERROR:  relation "holidays" does not exist
```

## Ejemplo: CTE recursiva
<a name="r_WITH_clause-recursive-cte-example"></a>

A continuación se muestra un ejemplo de CTE recursivo que devuelve los empleados que dependen directa o indirectamente de John. La consulta recursiva contiene una cláusula WHERE para limitar la profundidad de la recursividad a menos de 4 niveles.

```
--create and populate the sample table
  create table employee (
  id int,
  name varchar (20),
  manager_id int
  );
  
  insert into employee(id, name, manager_id)  values
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
  
--run the recursive query
  with recursive john_org(id, name, manager_id, level) as
( select id, name, manager_id, 1 as level
  from employee
  where name = 'John'
  union all
  select e.id, e.name, e.manager_id, level + 1 as next_level
  from employee e, john_org j
  where e.manager_id = j.id and level < 4
  )
 select distinct id, name, manager_id from john_org order by manager_id;
```

A continuación, se muestra el resultado de la consulta.

```
    id        name      manager_id
  ------+-----------+--------------
   101    John           100
   102    Jorge          101
   103    Kwaku          101
   110    Liu            101
   201    Sofía          102
   106    Mateo          102
   110    Nikki          103
   104    Paulo          103
   105    Richard        103
   120    Saanvi         104
   200    Shirley        104
   205    Zhang          104
```

A continuación, se muestra un gráfico de la organización del departamento de John.

![\[Un diagrama del organigrama del departamento de John.\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/images/org-chart.png)


# Lista SELECT
<a name="r_SELECT_list"></a>

**Topics**
+ [Sintaxis](#r_SELECT_list-synopsis)
+ [Parameters](#r_SELECT_list-parameters)
+ [Notas de uso](#r_SELECT_list_usage_notes)
+ [Ejemplos](#r_SELECT_list-examples)

La lista SELECT designa un nombre a las columnas, funciones y expresiones que desea que la consulta devuelva. La lista representa el resultado de la consulta. 

Para obtener más información sobre las funciones SQL, consulte [Referencia de funciones SQL](c_SQL_functions.md). Para obtener más información sobre las expresiones, consulte [Expresiones condicionales](c_conditional_expressions.md).

## Sintaxis
<a name="r_SELECT_list-synopsis"></a>

```
SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
```

## Parameters
<a name="r_SELECT_list-parameters"></a>

TOP *number*   
TOP toma un entero positivo como su argumento, lo que define la cantidad de filas que se devuelven al cliente. El comportamiento con la cláusula TOP es el mismo que el comportamiento con la cláusula LIMIT. El número de filas devueltas es fijo, pero el conjunto de filas no lo es. Para devolver un conjunto de filas coherente, utilice TOP o LIMIT junto con la cláusula ORDER BY. 

ALL   
Palabra clave redundante que define el comportamiento predeterminado si no se especifica DISTINCT. `SELECT ALL *` significa lo mismo que `SELECT *` (se seleccionen todas las filas de todas las columnas y se mantienen los duplicados). 

DISTINCT   
Opción que elimina las filas duplicadas del conjunto de resultados basándose en los valores coincidentes de una o más columnas.   
Si su aplicación admite claves externas o principales no válidas, algunas consultas podrían devolver resultados incorrectos. Por ejemplo, una consulta SELECT DISTINCT podría devolver filas duplicadas si la columna de clave principal no contiene todos los valores únicos. Para obtener más información acerca de estas restricciones, consulte [Definición de restricciones de tabla](https://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html).

\$1 (asterisco)   
Devuelve todo el contenido de la tabla (todas las columnas y filas). 

 *expresión*   
Una expresión formada a partir de una o más columnas que existen en las tablas a las que hace referencia la consulta. Una expresión puede contener funciones SQL. Por ejemplo:   

```
avg(datediff(day, listtime, saletime))
```

AS *column\$1alias*   
Un nombre temporal para la columna que se utiliza en el conjunto de resultados finales. La palabra clave AS es opcional. Por ejemplo:   

```
avg(datediff(day, listtime, saletime)) as avgwait
```
Si no se especifica un alias para una expresión que no sea un nombre de columna simple, el conjunto de resultados aplica un nombre predeterminado a esa columna.   
El alias se reconoce justo después de definirlo en la lista de destino. Puede usar un alias en otras expresiones definidas después de él en la misma lista objetivo. En el siguiente ejemplo, se ilustra este caso.   

```
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
```
La referencia de alias lateral aporta un beneficio en el sentido de que no es necesario repetir la expresión con alias cuando se crean expresiones más complejas en la misma lista objetivo. Cuando Amazon Redshift analiza este tipo de referencia simplemente incorpora los alias definidos previamente. Si en la cláusula `FROM` hay una columna definida con el mismo nombre que en la expresión con alias anterior, tendrá prioridad la columna de la cláusula `FROM`. Por ejemplo en la consulta anterior si hay una columna denominada "probability" en la tabla raw\$1data, la "probability" de la segunda expresión en la lista objetivo hace referencia a dicha columna en vez de hacer referencia al nombre de alias "probability". 

## Notas de uso
<a name="r_SELECT_list_usage_notes"></a>

TOP es una extensión SQL; proporciona una alternativa al comportamiento LIMIT. No se puede usar TOP y LIMIT en la misma consulta.

## Ejemplos
<a name="r_SELECT_list-examples"></a>

En el siguiente ejemplo, se devuelven 10 filas desde la tabla SALES. Aunque la consulta usa la cláusula TOP, sigue devolviendo un conjunto de filas impredecible porque no se especifica ninguna cláusula ORDER BY,

```
select top 10 *
from sales;
```

La siguiente consulta es funcionalmente equivalente, pero usa una cláusula LIMIT en lugar de una cláusula TOP:

```
select *
from sales
limit 10;
```

En el siguiente ejemplo se devuelven las primeras 10 filas de la tabla SALES con la cláusula TOP, ordenadas por la columna QTYSOLD en orden descendente.

```
select top 10 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
8 |      574
8 |      718
8 |      868
8 |     2663
8 |     3396
8 |     3726
8 |     5250
8 |     6216
(10 rows)
```

El ejemplo siguiente devuelve los primeros dos valores QTYSOLD y SELLERID de la tabla SALES, ordenados por la columna QTYSOLD:

```
select top 2 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
(2 rows)
```

El siguiente ejemplo muestra la lista de grupos de categorías distintos de la tabla CATEGORY:

```
select distinct catgroup from category
order by 1;

catgroup
----------
Concerts
Shows
Sports
(3 rows)

--the same query, run without distinct
select catgroup from category
order by 1;

catgroup
----------
Concerts
Concerts
Concerts
Shows
Shows
Shows
Sports
Sports
Sports
Sports
Sports
(11 rows)
```

El ejemplo siguiente devuelve el conjunto distinto de números de semana de diciembre de 2008. Sin la cláusula DISTINCT, la instrucción devolvería 31 filas o una para cada día del mes.

```
select distinct week, month, year
from date
where month='DEC' and year=2008
order by 1, 2, 3;

week | month | year
-----+-------+------
49 | DEC   | 2008
50 | DEC   | 2008
51 | DEC   | 2008
52 | DEC   | 2008
53 | DEC   | 2008
(5 rows)
```



# EXCLUDE column\$1list
<a name="r_EXCLUDE_list"></a>

La cláusula EXCLUDE column\$1list asigna un nombre a las columnas que se excluyen de los resultados de la consulta. El uso de la opción EXCLUDE resulta útil cuando se necesita excluir solo un subconjunto de columnas de una tabla *ancha*, que es una tabla que contiene muchas columnas. 

**Topics**
+ [Sintaxis](#r_EXCLUDE_list-synopsis)
+ [Parameters](#r_EXCLUDE_list-parameters)
+ [Ejemplos](#r_EXCLUDE_list-examples)

## Sintaxis
<a name="r_EXCLUDE_list-synopsis"></a>

```
EXCLUDE column_list
```

## Parameters
<a name="r_EXCLUDE_list-parameters"></a>

 *column\$1list*   
Una lista separada por comas de uno o varios de los nombres de columna que existen en las tablas a las que hace referencia la consulta. De manera opcional, *column\$1list* se puede incluir entre paréntesis. En la lista de exclusiones de nombres de columna solo se admiten nombres de columna, no expresiones (como`upper(col1)`) o el asterisco (\$1).  

```
column-name, ... | ( column-name, ... )
```
Por ejemplo:   

```
SELECT * EXCLUDE col1, col2 FROM tablea;
```

```
SELECT * EXCLUDE (col1, col2) FROM tablea;
```

## Ejemplos
<a name="r_EXCLUDE_list-examples"></a>

Los ejemplos siguientes utilizan la tabla SALES que contiene las columnas: salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission y saletime. Para obtener más información sobre la tabla SALES, consulte [Base de datos de muestra](c_sampledb.md).

En el siguiente ejemplo, se devuelven filas de la tabla SALES, pero se excluye la columna SALETIME.

```
SELECT * EXCLUDE saletime FROM sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

En el siguiente ejemplo, se devuelven filas de la tabla SALES, pero se excluyen las columnas QTYSOLD y SALETIME.

```
SELECT * EXCLUDE (qtysold, saletime) FROM sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 482        |  72.3	
...
```

En el siguiente ejemplo, se crea una vista que devuelve filas de la tabla SALES, pero excluye la columna SALETIME.

```
CREATE VIEW sales_view AS SELECT * EXCLUDE saletime FROM sales;
SELECT * FROM sales_view;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

En el siguiente ejemplo, se seleccionan únicamente las columnas que no están excluidas de una tabla temporal.

```
SELECT * EXCLUDE saletime INTO TEMP temp_sales FROM sales;
SELECT * FROM temp_sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

# Cláusula FROM
<a name="r_FROM_clause30"></a>

La cláusula FROM en una consulta enumera las referencias de la tabla (tablas, vistas y subconsultas) desde las que se seleccionan los datos. Si se enumeran varias referencias de tabla, se deben combinar las tablas a través de la sintaxis adecuada en la cláusula FROM o en la cláusula WHERE. Si no se especifican criterios de combinación, el sistema procesa la consulta como una combinación cruzada (producto cartesiano). 

**Topics**
+ [Sintaxis](#r_FROM_clause30-synopsis)
+ [Parameters](#r_FROM_clause30-parameters)
+ [Notas de uso](#r_FROM_clause_usage_notes)
+ [Ejemplos de PIVOT y UNPIVOT](r_FROM_clause-pivot-unpivot-examples.md)
+ [Ejemplos de JOIN](r_Join_examples.md)
+ [Ejemplos de UNNEST](r_FROM_clause-unnest-examples.md)

## Sintaxis
<a name="r_FROM_clause30-synopsis"></a>

```
FROM table_reference [, ...]
```

donde *table\$1reference* es uno de los siguientes: 

```
with_subquery_table_name [ table_alias ]
table_name [ * ] [ table_alias ]
( subquery ) [ table_alias ]
table_reference [ NATURAL ] join_type table_reference
   [ ON join_condition | USING ( join_column [, ...] ) ]
table_reference  join_type super_expression 
   [ ON join_condition ]
table_reference PIVOT ( 
   aggregate(expr) [ [ AS ] aggregate_alias ]
   FOR column_name IN ( expression [ AS ] in_alias [, ...] )
) [ table_alias ]
table_reference UNPIVOT [ INCLUDE NULLS | EXCLUDE NULLS ] ( 
   value_column_name 
   FOR name_column_name IN ( column_reference [ [ AS ]
   in_alias ] [, ...] )
) [ table_alias ]
UNPIVOT expression AS value_alias [ AT attribute_alias ]
( super_expression.attribute_name ) AS value_alias [ AT index_alias ]
UNNEST ( column_reference )
  [AS] table_alias ( unnested_column_name )
UNNEST ( column_reference ) WITH OFFSET
  [AS] table_alias ( unnested_column_name, [offset_column_name] )
```

El *table\$1alias* opcional se puede usar para dar nombres temporales a tablas y referencias de tablas complejas y, si se desea, también a sus columnas, como se muestra a continuación: 

```
[ AS ] alias [ ( column_alias [, ...] ) ]
```

## Parameters
<a name="r_FROM_clause30-parameters"></a>

 *with\$1subquery\$1table\$1name*   
Una tabla definida por una subconsulta en la [Cláusula WITH](r_WITH_clause.md). 

 *table\$1name*   
Nombre de una tabla o vista. 

 *alias*   
Nombre alternativo temporal para una tabla o vista. Se debe proporcionar un alias para una tabla obtenida de una subconsulta. En otras referencias de tabla, los alias son opcionales La palabra clave AS es siempre opcional. Los alias de la tabla brindan un acceso directo para identificar tablas en otras partes de una consulta, como la cláusula WHERE. Por ejemplo:   

```
select * from sales s, listing l
where s.listid=l.listid
```

 *column\$1alias*   
Nombre alternativo temporal para una columna en una tabla o vista. 

 *subquery*   
Una expresión de consulta que toma el valor de una tabla. La tabla solo existe mientras dura la consulta y, por lo general, se le asigna un nombre o un *alias*. No obstante, no es obligatorio tener un alias. También puede definir nombres de columnas para tablas que derivan de subconsultas. Designar un nombre a los alias de las columnas es importante cuando desea combinar los resultados de las subconsultas con otras tablas y cuando desea seleccionar o limitar esas columnas en otros sitios de la consulta.   
Una subconsulta puede contener una cláusula ORDER BY, pero es posible que esta cláusula no tenga ningún efecto si no se especifica también una cláusula OFFSET o LIMIT. 

NATURAL   
Define una combinación que utiliza automáticamente todos los pares de columnas con nombres idénticos en las dos tablas como las columnas de combinación. No se requiere una condición de combinación explícita. Por ejemplo, si las tablas CATEGORY y EVENT tienen columnas denominadas CATID, una combinación natural de estas tablas es una combinación de las columnas CATID.   
Si se especifica una combinación NATURAL, pero no existen pares de columnas con nombres idénticos en las tablas que deben combinarse, la consulta se establece en una combinación cruzada. 

 *join\$1type*   
Especifique uno de los siguientes tipos de combinación:   
+ [INNER] JOIN 
+ LEFT [OUTER] JOIN 
+ RIGHT [OUTER] JOIN 
+ FULL [OUTER] JOIN 
+ CROSS JOIN 
Las combinaciones cruzadas son combinaciones no calificadas; devuelven el producto cartesiano de dos tablas.   
Las combinaciones internas y externas son combinaciones calificadas. Están calificadas implícitamente (en combinaciones naturales), con la sintaxis ON o USING en la cláusula FROM, o con una condición WHERE.   
Una combinación interna devuelve filas coincidentes únicamente en función a la condición de combinación o a la lista de columnas de combinación. Una combinación externa devuelve todas las filas que la combinación interna equivalente devolvería, además de filas no coincidentes de la tabla "izquierda", tabla "derecha" o ambas tablas. La tabla izquierda es la primera tabla de la lista, y la tabla derecha es la segunda tabla de la lista. Las filas no coincidentes contienen valores NULL para llenar el vacío de las columnas de salida. 

ON *join\$1condition*   
Especificación del tipo de combinación donde las columnas de combinación se establecen como una condición que sigue la palabra clave ON. Por ejemplo:   

```
sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
```

USING ( *join\$1column* [, ...] )   
Especificación del tipo de combinación donde las columnas de combinación aparecen enumeradas entre paréntesis. Si se especifican varias columnas de combinación, se delimitan por comas. La palabra clave USING debe preceder a la lista. Por ejemplo:   

```
sales join listing
using (listid,eventid)
```

PIVOT  
Rota la salida de filas a columnas, con el fin de representar datos tabulares en un formato fácil de leer. La salida se representa horizontalmente en varias columnas. PIVOT es similar a una consulta GROUP BY con una agregación, utilizando una expresión de agregación para especificar un formato de salida. No obstante, a diferencia de GROUP BY, los resultados se devuelven en columnas en lugar de filas.  
Para ver ejemplos que muestran cómo realizar consultas con PIVOT y UNPIVOT, consulte [Ejemplos de PIVOT y UNPIVOT](r_FROM_clause-pivot-unpivot-examples.md).

UNPIVOT  
*Rotación de columnas en filas con UNPIVOT*: el operador transforma las columnas de resultados, de una tabla de entrada o resultados de consultas, en filas, para facilitar la lectura de la salida. UNPIVOT combina los datos de sus columnas de entrada en dos columnas de resultados: una columna de nombres y una columna de valores. La columna de nombres contiene nombres de columna de la entrada, como entradas de fila. La columna de valores contiene valores de las columnas de entrada, como los resultados de una agregación. Por ejemplo, el recuento de elementos de varias categorías.  
*Anulación de la dinamización de objetos con UNPIVOT (SUPER)*: puede realizar una anulación de la dinamización de objetos, donde la *expresión* es una expresión SUPER que hace referencia a otro elemento de la cláusula FROM. Para obtener más información, consulte [Anulación de la dinamización de los objetos](query-super.md#unpivoting). Tiene también ejemplos que muestran cómo realizar consultas de datos semiestructurados, como datos con formato JSON.

*super\$1expression*  
Una expresión SUPER válida. Amazon Redshift devuelve una fila para cada valor del atributo especificado. Para obtener más información acerca del tipo de datos SUPER, consulte [Tipo SUPER](r_SUPER_type.md). Para obtener más información sobre los valores SUPER no anidados, consulte [Consultas de eliminación del anidamiento](query-super.md#unnest).

*attribute\$1name*  
El nombre de un atributo de la expresión SUPER.

*index\$1alias*  
Alias del índice que indica la posición del valor en la expresión SUPER.

UNNEST  
Expande una estructura anidada, normalmente una matriz SUPER, en columnas que contienen los elementos no anidados. Para obtener más información sobre cómo eliminar el anidamiento de datos SUPER, consulte [Consulta de datos semiestructurados](query-super.md). Para ver ejemplos, consulte [Ejemplos de UNNEST](r_FROM_clause-unnest-examples.md). 

*unnested\$1column\$1name*  
Nombre de la columna que contiene los elementos no anidados. 

UNNEST … WITH OFFSET  
Agrega una columna de desplazamiento a la salida no anidada, donde el desplazamiento representa el índice basado en cero de cada elemento de la matriz. Esta variante es útil cuando se desea ver la posición de los elementos en una matriz. Para obtener más información sobre cómo eliminar el anidamiento de datos SUPER, consulte [Consulta de datos semiestructurados](query-super.md). Para ver ejemplos, consulte [Ejemplos de UNNEST](r_FROM_clause-unnest-examples.md). 

*offset\$1column\$1name*  
Un nombre personalizado para la columna de desplazamiento que le permite definir explícitamente cómo aparecerá la columna de índice en la salida. Este parámetro es opcional. De forma predeterminada, el nombre de la columna de desplazamiento es `offset_col`. 

## Notas de uso
<a name="r_FROM_clause_usage_notes"></a>

Las columnas de combinación deben tener tipos de datos comparables. 

Una combinación NATURAL o USING retiene solo uno de cada par de columnas de combinación en el conjunto de resultados intermedios. 

Una combinación con la sintaxis ON retiene ambas columnas de combinación en su conjunto de resultados intermedios. 

Consulte también [Cláusula WITH](r_WITH_clause.md). 

# Ejemplos de PIVOT y UNPIVOT
<a name="r_FROM_clause-pivot-unpivot-examples"></a>

PIVOT y UNPIVOT son parámetros de la cláusula FROM que alternan la salida de la consulta de filas a columnas y de columnas a filas, respectivamente. Representan resultados de consultas tabulares en un formato fácil de leer. En los siguientes ejemplos se utilizan datos y consultas de prueba para mostrar cómo utilizarlos.

Para obtener más información sobre estos parámetros y sus opciones predeterminadas, consulte [Cláusula FROM](https://docs.aws.amazon.com/redshift/latest/dg/r_FROM_clause30.html).

## Ejemplos de PIVOT
<a name="r_FROM_clause-pivot-examples"></a>

Configure la tabla y los datos de muestra y utilícelos para ejecutar las consultas de ejemplo posteriores.

```
CREATE TABLE part (
    partname varchar,
    manufacturer varchar,
    quality int,
    price decimal(12, 2)
);

INSERT INTO part VALUES ('prop', 'local parts co', 2, 10.00);
INSERT INTO part VALUES ('prop', 'big parts co', NULL, 9.00);
INSERT INTO part VALUES ('prop', 'small parts co', 1, 12.00);

INSERT INTO part VALUES ('rudder', 'local parts co', 1, 2.50);
INSERT INTO part VALUES ('rudder', 'big parts co', 2, 3.75);
INSERT INTO part VALUES ('rudder', 'small parts co', NULL, 1.90);

INSERT INTO part VALUES ('wing', 'local parts co', NULL, 7.50);
INSERT INTO part VALUES ('wing', 'big parts co', 1, 15.20);
INSERT INTO part VALUES ('wing', 'small parts co', NULL, 11.80);
```

PIVOT en `partname` con una agregación `AVG` en `price`.

```
SELECT *
FROM (SELECT partname, price FROM part) PIVOT (
    AVG(price) FOR partname IN ('prop', 'rudder', 'wing')
);
```

La consulta genera el siguiente resultado.

```
  prop   |  rudder  |  wing
---------+----------+---------
 10.33   | 2.71     | 11.50
```

En el ejemplo anterior, los resultados se transforman en columnas. En el siguiente ejemplo se muestra una consulta de `GROUP BY` que devuelve los precios promedio en filas, en lugar de hacerlo en columnas.

```
SELECT partname, avg(price)
FROM (SELECT partname, price FROM part)
WHERE partname IN ('prop', 'rudder', 'wing')
GROUP BY partname;
```

La consulta genera el siguiente resultado.

```
 partname |  avg
----------+-------
 prop     | 10.33
 rudder   |  2.71
 wing     | 11.50
```

Un ejemplo de `PIVOT` con `manufacturer` como columna implícita.

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) FOR quality IN (1, 2, NULL)
);
```

La consulta genera el siguiente resultado.

```
 manufacturer      | 1  | 2  | null
-------------------+----+----+------
 local parts co    | 1  | 1  |  1
 big parts co      | 1  | 1  |  1
 small parts co    | 1  | 0  |  2
```

 Columnas de tabla de entrada a las que no se hace referencia en la definición de `PIVOT` se agregan implícitamente a la tabla de resultados. Este es el caso de la columna `manufacturer` del ejemplo anterior. En el ejemplo también se muestra que `NULL` es un valor válido para el operador `IN`. 

`PIVOT` en el ejemplo anterior devuelve información similar a la siguiente consulta, lo que incluye `GROUP BY`. La diferencia es que `PIVOT` devuelve el valor `0` para la columna `2` y el fabricante `small parts co`. La consulta `GROUP BY` no contiene una fila correspondiente. En la mayoría de los casos, `PIVOT` inserta `NULL` si una fila no tiene datos de entrada para una columna determinada. No obstante, el agregado de recuento no devuelve `NULL` y `0` es el valor predeterminado.

```
SELECT manufacturer, quality, count(*)
FROM (SELECT quality, manufacturer FROM part)
WHERE quality IN (1, 2) OR quality IS NULL
GROUP BY manufacturer, quality
ORDER BY manufacturer;
```

La consulta genera el siguiente resultado.

```
 manufacturer        | quality | count
---------------------+---------+-------
 big parts co        |         |     1
 big parts co        |       2 |     1
 big parts co        |       1 |     1
 local parts co      |       2 |     1
 local parts co      |       1 |     1
 local parts co      |         |     1
 small parts co      |       1 |     1
 small parts co      |         |     2
```

 El operador PIVOT acepta alias opcionales en la expresión agregada y en cada valor para el operador `IN`. Utilice alias para personalizar los nombres de las columnas. Si no hay alias agregados, solo se utilizan alias de la lista `IN`. De lo contrario, el alias agregado se agrega al nombre de la columna con un guion bajo para separar los nombres. 

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) AS count FOR quality IN (1 AS high, 2 AS low, NULL AS na)
);
```

La consulta genera el siguiente resultado.

```
 manufacturer      | high_count  | low_count | na_count
-------------------+-------------+-----------+----------
 local parts co    |           1 |         1 |        1
 big parts co      |           1 |         1 |        1
 small parts co    |           1 |         0 |        2
```

Configure la tabla y los datos de muestra siguientes y utilícelos para ejecutar las consultas de ejemplo posteriores. Los datos representan las fechas de reserva de una colección de hoteles.

```
CREATE TABLE bookings (
    booking_id int,
    hotel_code char(8),
    booking_date date,
    price decimal(12, 2)
);

INSERT INTO bookings VALUES (1, 'FOREST_L', '02/01/2023', 75.12);
INSERT INTO bookings VALUES (2, 'FOREST_L', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (3, 'FOREST_L', '02/04/2023', 85.54);

INSERT INTO bookings VALUES (4, 'FOREST_L', '02/08/2023', 75.00);
INSERT INTO bookings VALUES (5, 'FOREST_L', '02/11/2023', 75.00);
INSERT INTO bookings VALUES (6, 'FOREST_L', '02/14/2023', 90.00);

INSERT INTO bookings VALUES (7, 'FOREST_L', '02/21/2023', 60.00);
INSERT INTO bookings VALUES (8, 'FOREST_L', '02/22/2023', 85.00);
INSERT INTO bookings VALUES (9, 'FOREST_L', '02/27/2023', 90.00);

INSERT INTO bookings VALUES (10, 'DESERT_S', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (11, 'DESERT_S', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (12, 'DESERT_S', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (13, 'DESERT_S', '02/05/2023', 75.00);
INSERT INTO bookings VALUES (14, 'DESERT_S', '02/06/2023', 34.00);
INSERT INTO bookings VALUES (15, 'DESERT_S', '02/09/2023', 85.00);

INSERT INTO bookings VALUES (16, 'DESERT_S', '02/12/2023', 23.00);
INSERT INTO bookings VALUES (17, 'DESERT_S', '02/13/2023', 76.00);
INSERT INTO bookings VALUES (18, 'DESERT_S', '02/14/2023', 85.00);

INSERT INTO bookings VALUES (19, 'OCEAN_WV', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (20, 'OCEAN_WV', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (21, 'OCEAN_WV', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (22, 'OCEAN_WV', '02/06/2023', 75.00);
INSERT INTO bookings VALUES (23, 'OCEAN_WV', '02/09/2023', 34.00);
INSERT INTO bookings VALUES (24, 'OCEAN_WV', '02/12/2023', 85.00);

INSERT INTO bookings VALUES (25, 'OCEAN_WV', '02/13/2023', 23.00);
INSERT INTO bookings VALUES (26, 'OCEAN_WV', '02/14/2023', 76.00);
INSERT INTO bookings VALUES (27, 'OCEAN_WV', '02/16/2023', 85.00);

INSERT INTO bookings VALUES (28, 'CITY_BLD', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (29, 'CITY_BLD', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (30, 'CITY_BLD', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (31, 'CITY_BLD', '02/12/2023', 75.00);
INSERT INTO bookings VALUES (32, 'CITY_BLD', '02/13/2023', 34.00);
INSERT INTO bookings VALUES (33, 'CITY_BLD', '02/17/2023', 85.00);

INSERT INTO bookings VALUES (34, 'CITY_BLD', '02/22/2023', 23.00);
INSERT INTO bookings VALUES (35, 'CITY_BLD', '02/23/2023', 76.00);
INSERT INTO bookings VALUES (36, 'CITY_BLD', '02/24/2023', 85.00);
```

 En este ejemplo de consulta, los registros de reserva se suman para obtener un total de cada semana. La fecha de finalización de cada semana se convierte en un nombre de columna.

```
SELECT * FROM
    (SELECT
       booking_id,
       (date_trunc('week', booking_date::date) + '5 days'::interval)::date as enddate,
       hotel_code AS "hotel code"
FROM bookings
) PIVOT (
    count(booking_id) FOR enddate IN ('2023-02-04','2023-02-11','2023-02-18') 
);
```

La consulta genera el siguiente resultado.

```
 hotel code | 2023-02-04  | 2023-02-11 | 2023-02-18
------------+-------------+------------+----------
 FOREST_L   |           3 |          2 |        1
 DESERT_S   |           4 |          3 |        2
 OCEAN_WV   |           3 |          3 |        3
 CITY_BLD   |           3 |          1 |        2
```

 Amazon Redshift no admite CROSSTAB para dinamizar en varias columnas. Pero puede cambiar los datos de filas a columnas, de forma similar a una agregación con PIVOT, con una consulta como la siguiente. Para ello se utilizan los mismos datos de muestra de reservas que en el ejemplo anterior.

```
SELECT 
  booking_date,
  MAX(CASE WHEN hotel_code = 'FOREST_L' THEN 'forest is booked' ELSE '' END) AS FOREST_L,
  MAX(CASE WHEN hotel_code = 'DESERT_S' THEN 'desert is booked' ELSE '' END) AS DESERT_S,
  MAX(CASE WHEN hotel_code = 'OCEAN_WV' THEN 'ocean is booked' ELSE '' END)  AS OCEAN_WV
FROM bookings
GROUP BY booking_date
ORDER BY booking_date asc;
```

La consulta de ejemplo da como resultado las fechas de reserva que aparecen junto a frases cortas que indican qué hoteles están reservados.

```
 booking_date  | forest_l         | desert_s         | ocean_wv
---------------+------------------+------------------+--------------------
 2023-02-01    | forest is booked | desert is booked |  ocean is booked
 2023-02-02    | forest is booked | desert is booked |  ocean is booked
 2023-02-04    | forest is booked | desert is booked |  ocean is booked
 2023-02-05    |                  | desert is booked |        
 2023-02-06    |                  | desert is booked |
```

Las siguientes notas de uso se indican a continuación para `PIVOT`:
+ `PIVOT` se puede aplicar a tablas, subconsultas y expresiones de tabla comunes (CTE). `PIVOT` no se puede aplicar a ninguna expresión `JOIN`, CTE recursivos, expresiones `PIVOT` o `UNPIVOT`. Tampoco se admiten expresiones `SUPER` sin anidar ni tablas anidadas Redshift Spectrum.
+  `PIVOT` admite las funciones de agregación `COUNT`, `SUM`, `MIN`, `MAX` y `AVG`. 
+ La expresión de agregación `PIVOT` tiene que ser una llamada de una función de agregación admitida. No se admiten expresiones complejas además de las de agregación. Los argumentos de agregación no pueden contener referencias a tablas distintas de las tablas `PIVOT` de entrada. Tampoco se admiten las referencias correlacionadas a una consulta principal. El argumento agregado puede contener subconsultas. Se pueden correlacionar internamente o en la tabla de entrada `PIVOT`.
+  Los valores de la lista `PIVOT IN` no pueden ser referencias de columna ni subconsultas. Cada valor debe ser compatible con el tipo de referencia de columna `FOR`. 
+  Si los valores de la lista `IN` no tienen alias, `PIVOT` genera nombres de columna predeterminados. Para valores `IN` constantes como “abc” o 5, el nombre de columna predeterminado es la constante en sí. Para cualquier expresión compleja, el nombre de la columna es un nombre predeterminado estándar de Amazon Redshift, como `?column?`. 

## Ejemplos de UNPIVOT
<a name="r_FROM_clause-unpivot-examples"></a>

Configure los datos de muestra y utilícelos para ejecutar los ejemplos posteriores.

```
CREATE TABLE count_by_color (quality varchar, red int, green int, blue int);

INSERT INTO count_by_color VALUES ('high', 15, 20, 7);
INSERT INTO count_by_color VALUES ('normal', 35, NULL, 40);
INSERT INTO count_by_color VALUES ('low', 10, 23, NULL);
```

`UNPIVOT` en las columnas de entrada roja, verde y azul.

```
SELECT *
FROM (SELECT red, green, blue FROM count_by_color) UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

La consulta genera el siguiente resultado.

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |  23
 blue  |   7
 blue  |  40
```

De manera predeterminada, los valores `NULL` de la columna de entrada se omiten y no producen una fila de resultados. 

En el siguiente ejemplo, se muestra `UNPIVOT` con `INCLUDE NULLS`.

```
SELECT *
FROM (
    SELECT red, green, blue
    FROM count_by_color
) UNPIVOT INCLUDE NULLS (
    cnt FOR color IN (red, green, blue)
);
```

Se genera el siguiente resultado.

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |
 green |  23
 blue  |   7
 blue  |  40
 blue  |
```

Si se configura el parámetro `INCLUDING NULLS`, los valores de entrada `NULL` generan filas de resultados.

Un ejemplo de `The following query shows UNPIVOT` con `quality` como columna implícita.

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

La consulta genera el siguiente resultado.

```
 quality | color | cnt
---------+-------+-----
 high    | red   |  15
 normal  | red   |  35
 low     | red   |  10
 high    | green |  20
 low     | green |  23
 high    | blue  |   7
 normal  | blue  |  40
```

Columnas de tabla de entrada a las que no se hace referencia en la definición de `UNPIVOT`, se agregan implícitamente a la tabla de resultados. Este es el caso de la columna `quality` del ejemplo.

En el siguiente ejemplo, se muestra `UNPIVOT` con alias para valores en la lista `IN`.

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red AS r, green AS g, blue AS b)
);
```

La consulta anterior genera el siguiente resultado.

```
 quality | color | cnt
---------+-------+-----
 high    | r     |  15
 normal  | r     |  35
 low     | r     |  10
 high    | g     |  20
 low     | g     |  23
 high    | b     |   7
 normal  | b     |  40
```

El operador `UNPIVOT` acepta alias opcionales en cada valor de la lista `IN`. Cada alias proporciona personalización de los datos de cada columna `value`.

Las siguientes notas de uso se indican a continuación para `UNPIVOT`.
+ `UNPIVOT` se puede aplicar a tablas, subconsultas y expresiones de tabla comunes (CTE). `UNPIVOT` no se puede aplicar a ninguna expresión `JOIN`, CTE recursivos, expresiones `PIVOT` o `UNPIVOT`. Tampoco se admiten expresiones `SUPER` sin anidar ni tablas anidadas Redshift Spectrum.
+ La lista `UNPIVOT IN` debe contener solo referencias de columna de tabla de entrada. Las columnas de la lista `IN` deben tener un tipo común con el que todas sean compatibles. La columna de valor `UNPIVOT` tiene este tipo común. La columna de nombre `UNPIVOT` es de tipo `VARCHAR`.
+ Si un valor de la lista `IN` no tiene un alias, `UNPIVOT` utiliza el nombre de la columna como valor predeterminado.

# Ejemplos de JOIN
<a name="r_Join_examples"></a>

Se utiliza una cláusula JOIN de SQL para combinar los datos de dos o más tablas en función de los campos comunes. Es posible que los resultados cambien o no cambien según el método de combinación especificado. Para obtener más información acerca de la sintaxis de la cláusula JOIN, consulte [Parameters](r_FROM_clause30.md#r_FROM_clause30-parameters). 

En los siguientes ejemplos se usan datos de los ejemplos de `TICKIT`. Para obtener más información acerca del esquema de base de datos, consulte [Base de datos de muestra](c_sampledb.md). Para obtener información sobre cómo cargar datos de ejemplo, consulte [Carga de datos](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html) en la *Guía de introducción a Amazon Redshift*.

La siguiente consulta es una combinación interna (sin la palabra clave JOIN) entre la tabla LISTING y la tabla SALES, donde LISTID de la tabla LISTING está entre 1 y 5. Esta consulta relaciona los valores de la columna LISTID en la tabla LISTING (la tabla izquierda) y la tabla SALES (la tabla derecha). Los resultados muestran que LISTID 1, 4 y 5 coinciden con los criterios.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing, sales
where listing.listid = sales.listid
and listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La siguiente consulta es una combinación externa izquierda. Las combinaciones externas izquierdas y derechas conservan valores de una de las tablas combinadas cuando no se encuentra una coincidencia en la otra tabla. Las tablas izquierda y derecha son la primera tabla y la segunda tabla que aparecen en la sintaxis. Los valores NULL se utilizan para rellenar los "espacios" en el conjunto de resultados. Esta consulta relaciona los valores de la columna LISTID en la tabla LISTING (la tabla izquierda) y la tabla SALES (la tabla derecha). Los resultados muestran que LISTID 2 y 3 no tienen ventas.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing left outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La siguiente consulta es una combinación externa derecha. Esta consulta relaciona los valores de la columna LISTID en la tabla LISTING (la tabla izquierda) y la tabla SALES (la tabla derecha). Los resultados muestran que LISTID 1, 4 y 5 coinciden con los criterios.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing right outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La siguiente consulta es una combinación completa. Las combinaciones completas retienen valores de las tablas combinadas cuando no se encuentra una coincidencia en la otra tabla. Las tablas izquierda y derecha son la primera tabla y la segunda tabla que aparecen en la sintaxis. Los valores NULL se utilizan para rellenar los "espacios" en el conjunto de resultados. Esta consulta relaciona los valores de la columna LISTID en la tabla LISTING (la tabla izquierda) y la tabla SALES (la tabla derecha). Los resultados muestran que LISTID 2 y 3 no tienen ventas.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La siguiente consulta es una combinación completa. Esta consulta relaciona los valores de la columna LISTID en la tabla LISTING (la tabla izquierda) y la tabla SALES (la tabla derecha). Solo se encuentran en los resultados filas que no dan lugar a ninguna venta (LISTID 2 y 3).

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
and (listing.listid IS NULL or sales.listid IS NULL)
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     2 | NULL   | NULL
     3 | NULL   | NULL
```

El siguiente ejemplo es una combinación interna con la cláusula ON. En este caso, las filas NULL no se devuelven.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La siguiente consulta es una combinación cruzada o cartesiana de la tabla LISTING y la tabla SALES con un predicado para limitar los resultados. Esta consulta coincide con los valores de columna LISTID de la tabla SALES y la tabla LISTING para LISTID 1, 2, 3, 4 y 5 de ambas tablas. Los resultados muestran que 20 filas coinciden con los criterios.

```
select sales.listid as sales_listid, listing.listid as listing_listid
from sales cross join listing
where sales.listid between 1 and 5
and listing.listid between 1 and 5
order by 1,2;

sales_listid | listing_listid
-------------+---------------
1            | 1
1            | 2
1            | 3
1            | 4
1            | 5
4            | 1
4            | 2
4            | 3
4            | 4
4            | 5
5            | 1
5            | 1
5            | 2
5            | 2
5            | 3
5            | 3
5            | 4
5            | 4
5            | 5
5            | 5
```

El ejemplo siguiente es una combinación natural entre dos tablas. En este caso, las columnas listid, sellerid, eventid y dateid tienen nombres y tipos de datos idénticos en ambas tablas y, por lo tanto, se utilizan como columnas de combinación. Los resultados tienen un límite de cinco filas.

```
select listid, sellerid, eventid, dateid, numtickets
from listing natural join sales
order by 1
limit 5;

listid | sellerid  | eventid | dateid | numtickets
-------+-----------+---------+--------+-----------
113    | 29704     | 4699    | 2075   | 22
115    | 39115     | 3513    | 2062   | 14
116    | 43314     | 8675    | 1910   | 28
118    | 6079      | 1611    | 1862   | 9
163    | 24880     | 8253    | 1888   | 14
```

El ejemplo siguiente es una combinación entre dos tablas con la cláusula USING. En este caso, las columnas listid y eventid se utilizan como columnas de combinación. Los resultados tienen un límite de cinco filas.

```
select listid, listing.sellerid, eventid, listing.dateid, numtickets
from listing join sales
using (listid, eventid)
order by 1
limit 5;

listid | sellerid | eventid | dateid | numtickets
-------+----------+---------+--------+-----------
1      | 36861    | 7872    | 1850   | 10
4      | 8117     | 4337    | 1970   | 8
5      | 1616     | 8647    | 1963   | 4
5      | 1616     | 8647    | 1963   | 4
6      | 47402    | 8240    | 2053   | 18
```

La siguiente consulta es una combinación interna de dos subconsultas en la cláusula FROM. La consulta busca la cantidad de tickets vendidos y sin vender para diferentes categorías de eventos (conciertos y espectáculos). Estas subconsultas de la cláusula FROM son subconsultas de *tabla*; pueden devolver varias columnas y filas.

```
select catgroup1, sold, unsold
from
(select catgroup, sum(qtysold) as sold
from category c, event e, sales s
where c.catid = e.catid and e.eventid = s.eventid
group by catgroup) as a(catgroup1, sold)
join
(select catgroup, sum(numtickets)-sum(qtysold) as unsold
from category c, event e, sales s, listing l
where c.catid = e.catid and e.eventid = s.eventid
and s.listid = l.listid
group by catgroup) as b(catgroup2, unsold)

on a.catgroup1 = b.catgroup2
order by 1;

catgroup1 |  sold  | unsold
----------+--------+--------
Concerts  | 195444 |1067199
Shows     | 149905 | 817736
```

# Ejemplos de UNNEST
<a name="r_FROM_clause-unnest-examples"></a>

UNNEST es un parámetro de la cláusula FROM que expande los datos anidados en columnas que contienen los elementos no anidados de los datos. Para obtener información sobre cómo anular el anidamiento de los datos, consulte [Consulta de datos semiestructurados](query-super.md).

La siguiente instrucción crea y rellena la tabla `orders`, que contiene una columna `products` con matrices de ID de productos. En los ejemplos de esta sección se utilizan los datos de ejemplo de esta tabla. 

```
CREATE TABLE orders (
    order_id INT,
    products SUPER
);

-- Populate table
INSERT INTO orders VALUES
(1001, JSON_PARSE('[
        {
            "product_id": "P456",
            "name": "Monitor",
            "price": 299.99,
            "quantity": 1,
            "specs": {
                "size": "27 inch",
                "resolution": "4K"
            }
        }
    ]
')),
(1002, JSON_PARSE('
    [
        {
            "product_id": "P567",
            "name": "USB Cable",
            "price": 9.99,
            "quantity": 3
        },
        {
            "product_id": "P678",
            "name": "Headphones",
            "price": 159.99,
            "quantity": 1,
            "specs": {
                "type": "Wireless",
                "battery_life": "20 hours"
            }
        }
    ]
'));
```

A continuación se muestran algunos ejemplos de consultas de anulación de anidamiento con los datos de ejemplo mediante la sintaxis PartiQL.

## Anulación del anidamiento de una matriz sin una columna OFFSET
<a name="r_FROM_clause-unnest-examples-no-offset"></a>

La siguiente consulta anula el anidamiento de las matrices SUPER en la columna products, donde cada fila representa un elemento del pedido en `order_id`.

```
SELECT o.order_id, unnested_products.product
FROM orders o, UNNEST(o.products) AS unnested_products(product);

 order_id |                                                           product                                                           
----------+-----------------------------------------------------------------------------------------------------------------------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}}
(3 rows)
```

La siguiente consulta encuentra el producto más caro de cada pedido.

```
SELECT o.order_id, MAX(unnested_products.product)
FROM orders o, UNNEST(o.products) AS unnested_products(product);

 order_id |                                                           product                                                           
----------+-----------------------------------------------------------------------------------------------------------------------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}}
(2 rows)
```

## Anulación del anidamiento de una matriz con una columna OFFSET implícita
<a name="r_FROM_clause-unnest-examples-implicit-offset"></a>

La siguiente consulta utiliza el parámetro `UNNEST ... WITH OFFSET` para mostrar la posición basada en cero de cada producto en la matriz de pedidos.

```
SELECT o.order_id, up.product, up.offset_col
FROM orders o, UNNEST(o.products) WITH OFFSET AS up(product);

 order_id |                                                           product                                                           | offset_col 
----------+-----------------------------------------------------------------------------------------------------------------------------+------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}             |          0
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}                                                          |          0
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} |          1
(3 rows)
```

Dado que la instrucción no especifica un alias para la columna de desplazamiento, Amazon Redshift le asigna el nombre predeterminado `offset_col`.

## Anulación del anidamiento de una matriz con una columna OFFSET explícita
<a name="r_FROM_clause-unnest-examples-explicit-offset"></a>

La siguiente consulta también utiliza el parámetro `UNNEST ... WITH OFFSET` para mostrar los productos en las matrices de pedidos. La diferencia entre esta consulta y la del ejemplo anterior es que designa explícitamente la columna de desplazamiento con el alias `idx`.

```
SELECT o.order_id, up.product, up.idx
FROM orders o, UNNEST(o.products) WITH OFFSET AS up(product, idx);

 order_id |                                                           product                                                           | idx 
----------+-----------------------------------------------------------------------------------------------------------------------------+-----
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}             |   0
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}                                                          |   0
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} |   1
(3 rows)
```

# Cláusula WHERE
<a name="r_WHERE_clause"></a>

La cláusula WHERE contiene condiciones que combinan tablas o que aplican predicados a columnas de las tablas. Las tablas pueden combinarse de manera interna a través de la sintaxis adecuada en la cláusula WHERE o en la cláusula FROM. Los criterios de combinación externa deben especificarse en la cláusula FROM. 

## Sintaxis
<a name="r_WHERE_clause-synopsis"></a>

```
[ WHERE condition ]
```

## *condition*
<a name="r_WHERE_clause-synopsis-condition"></a>

Cualquier condición de búsqueda con un resultado booleano, como una condición de combinación o un predicado en una columna de la tabla. Los siguientes ejemplos son condiciones de combinación válidas: 

```
sales.listid=listing.listid
sales.listid<>listing.listid
```

Los siguientes ejemplos son condiciones válidas de columnas en tablas: 

```
catgroup like 'S%'
venueseats between 20000 and 50000
eventname in('Jersey Boys','Spamalot')
year=2008
length(catdesc)>25
date_part(month, caldate)=6
```

Las condiciones pueden ser simples o complejas. Para las condiciones complejas, puede utilizar paréntesis para aislar las unidades lógicas. En el siguiente ejemplo, la condición de combinación está entre paréntesis. 

```
where (category.catid=event.catid) and category.catid in(6,7,8)
```

## Notas de uso
<a name="r_WHERE_clause_usage_notes"></a>

Puede usar alias en la cláusula WHERE para hacer referencia a expresiones de listas de selección. 

No puede limitar los resultados de las funciones de agregación en la cláusula WHERE; utilice la cláusula HAVING con este fin. 

Las columnas que están limitadas en la cláusula WHERE deben derivar de referencias de tabla en la cláusula FROM. 

## Ejemplo
<a name="r_SELECT_synopsis-example"></a>

La siguiente consulta utiliza una combinación de diferentes restricciones de la cláusula WHERE, incluida una condición de combinación para las tablas SALES y EVENT, un predicado en la columna EVENTNAME y dos predicados en la columna STARTTIME. 

```
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Hannah Montana'
and date_part(quarter, starttime) in(1,2)
and date_part(year, starttime) = 2008
order by 3 desc, 4, 2, 1 limit 10;

eventname    |      starttime      |   costperticket   | qtysold
----------------+---------------------+-------------------+---------
Hannah Montana | 2008-06-07 14:00:00 |     1706.00000000 |       2
Hannah Montana | 2008-05-01 19:00:00 |     1658.00000000 |       2
Hannah Montana | 2008-06-07 14:00:00 |     1479.00000000 |       1
Hannah Montana | 2008-06-07 14:00:00 |     1479.00000000 |       3
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       1
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       2
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       4
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       1
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       2
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       4
(10 rows)
```

# Combinaciones externas de estilo Oracle en la cláusula WHERE
<a name="r_WHERE_oracle_outer"></a>

Para la compatibilidad con Oracle, Amazon Redshift admite el operador de combinación externa de Oracle (\$1) en condiciones de combinación de la cláusula WHERE. Este operador está diseñado para utilizarse exclusivamente en la definición de condiciones de combinación externa; no intente utilizarlo en otros contextos. En la mayoría de casos, otros usos de este operador se omiten silenciosamente. 

Una combinación externa devuelve todas las filas que la combinación interna equivalente devolvería, además de filas no coincidentes de una o ambas tablas. En la cláusula FROM, puede especificar combinaciones externas izquierdas, derechas y completas. En la cláusula WHERE, puede especificar combinaciones externas izquierdas y derechas únicamente. 

Para realizar una combinación externa en las tablas TABLE1 y TABLE2, y devolver filas no coincidentes de la TABLE1 (una combinación externa izquierda), especifique `TABLE1 LEFT OUTER JOIN TABLE2` en la cláusula FROM o aplique el operador (\$1) en todas las columnas de combinación de la TABLE2 en la cláusula WHERE. Para todas las filas en la TABLE1 que tengan filas no coincidentes en la TABLE2, el resultado de la consulta contiene valores nulos para cualquier expresión de lista de selección que contiene columnas de la TABLE2. 

Para producir el mismo comportamiento para todas las filas en la TABLE2 que no tienen filas coincidentes en la TABLE1, especifique `TABLE1 RIGHT OUTER JOIN TABLE2` en la cláusula FROM o aplique el operador (\$1) en todas las columnas de combinación de la TABLE1 en la cláusula WHERE. 

## Sintaxis básica
<a name="r_WHERE_oracle_outer-basic-syntax"></a>

```
[ WHERE {
[ table1.column1 = table2.column1(+) ]
[ table1.column1(+) = table2.column1 ]
}
```

La primera condición equivale a lo siguiente: 

```
from table1 left outer join table2
on table1.column1=table2.column1
```

La segunda condición equivale a lo siguiente: 

```
from table1 right outer join table2
on table1.column1=table2.column1
```

**nota**  
La sintaxis que se muestra aquí cubre el caso simple de una equijoin sobre un par de columnas de combinación. No obstante, también son válidos otros tipos de condiciones de comparación y varios pares de columnas de combinación. 

Por ejemplo, la siguiente cláusula WHERE define una combinación externa sobre dos pares de columnas. El operador (\$1) debe estar adjunto a la misma tabla en ambas condiciones: 

```
where table1.col1 > table2.col1(+)
and table1.col2 = table2.col2(+)
```

## Notas de uso
<a name="r_WHERE_oracle_outer_usage_notes"></a>

Siempre que sea posible, use la sintaxis OUTER JOIN de la cláusula FROM estándar en lugar del operador (\$1) en la cláusula WHERE. Las consultas que contienen el operador (\$1) están sujetas a las siguientes reglas: 
+ Solo se puede usar el operador (\$1) en la cláusula WHERE, y solo en referencia a las columnas de tablas o vistas. 
+ No se puede aplicar el operador (\$1) a las expresiones. No obstante, una expresión puede contener columnas que utilicen el operador (\$1). Por ejemplo, la siguiente condición de combinación devuelve un error de sintaxis: 

  ```
  event.eventid*10(+)=category.catid
  ```

  No obstante, la siguiente condición de combinación es válida: 

  ```
  event.eventid(+)*10=category.catid
  ```
+ No se puede usar el operador (\$1) en un bloque de consulta que también contiene una sintaxis de combinación de la cláusula FROM. 
+ Si se combinan dos tablas sobre varias condiciones de combinación, debe usar el operador (\$1) en todas o ninguna de las siguientes condiciones. Una combinación con estilos de sintaxis mixtos se ejecuta como una combinación interna, sin advertencia. 
+ El operador (\$1) no produce una combinación externa si se combina una tabla de la consulta externa con una tabla derivada de una consulta interna. 
+ Para usar el operador (\$1) para combinar de manera externa una tabla consigo misma, debe definir los alias de tabla en la cláusula FROM y hacer referencia a ellos en la condición de combinación: 

  ```
  select count(*)
  from event a, event b
  where a.eventid(+)=b.catid;
  
  count
  -------
  8798
  (1 row)
  ```
+ No se puede combinar una condición de combinación que contiene el operador (\$1) con una condición OR o una condición IN. Por ejemplo: 

  ```
  select count(*) from sales, listing
  where sales.listid(+)=listing.listid or sales.salesid=0;
  ERROR:  Outer join operator (+) not allowed in operand of OR or IN.
  ```
+  En la cláusula WHERE que combina de manera externa más de dos tablas, el operador (\$1) puede aplicarse solo una vez en determinada tabla. En el siguiente ejemplo, no se puede hacer referencia a la tabla SALES con el operador (\$1) en dos combinaciones consecutivas. 

  ```
  select count(*) from sales, listing, event
  where sales.listid(+)=listing.listid and sales.dateid(+)=date.dateid;
  ERROR:  A table may be outer joined to at most one other table.
  ```
+  Si la condición de combinación externa de la cláusula WHERE compara una columna de la TABLE2 con una constante, aplique el operador (\$1) a la columna. Si no se incluye el operador, se eliminan las filas combinadas de manera externa de TABLE1, que contienen valores nulos para la columna restringida. Consulte la sección de ejemplos a continuación. 

## Ejemplos
<a name="r_WHERE_oracle_outer-examples"></a>

La siguiente consulta de combinación especifica una combinación externa izquierda de las tablas SALES y LISTING sobre sus columnas LISTID: 

```
select count(*)
from sales, listing
where sales.listid = listing.listid(+);

count
--------
172456
(1 row)
```

La siguiente consulta equivalente produce el mismo resultado pero utiliza la sintaxis de combinación de la cláusula FROM: 

```
select count(*)
from sales left outer join listing on sales.listid = listing.listid;

count
--------
172456
(1 row)
```

La tabla SALES no contiene registros de todas las listas de la tabla LISTING, ya que no todas las listas generan ventas. La siguiente consulta combina de manera externa SALES y LISTING, y devuelve filas de LISTING incluso cuando la tabla SALES no informa ventas para un determinado ID de lista. Las columnas PRICE y COMM, que derivan de la tabla SALES, contienen valores nulos en el conjunto de resultados para esas filas no coincidentes. 

```
select listing.listid, sum(pricepaid) as price,
sum(commission) as comm
from listing, sales
where sales.listid(+) = listing.listid and listing.listid between 1 and 5
group by 1 order by 1;

listid | price  |  comm
--------+--------+--------
1 | 728.00 | 109.20
2 |        |
3 |        |
4 |  76.00 |  11.40
5 | 525.00 |  78.75
(5 rows)
```

Tenga en cuenta que, cuando se utiliza un operador de combinación de la cláusula WHERE, el orden de las tablas en la cláusula FROM no es importante. 

Un ejemplo de una condición de combinación externa más compleja de la cláusula WHERE es el caso en el que la condición consta de una comparación entre dos columnas de tablas *y* una comparación con una constante: 

```
where category.catid=event.catid(+) and eventid(+)=796;
```

Tenga en cuenta que el operador (\$1) se utiliza en dos lugares: primero, en la comparación de igualdad entre las tablas y, segundo, en la condición de comparación para la columna EVENTID. El resultado de esta sintaxis es la preservación de las filas combinadas de manera externa cuando se evalúa la restricción de EVENTID. Si elimina el operador (\$1) de la restricción de EVENTID, la consulta trata esta restricción como un filtro, no como parte de la condición de combinación externa. A su vez, las filas combinadas de manera externa que contienen valores nulos para EVENTID se eliminan del conjunto de resultados. 

A continuación se muestra una consulta completa que ilustra este comportamiento: 

```
select catname, catgroup, eventid
from category, event
where category.catid=event.catid(+) and eventid(+)=796;

catname | catgroup | eventid
-----------+----------+---------
Classical | Concerts |
Jazz | Concerts |
MLB | Sports   |
MLS | Sports   |
Musicals | Shows    | 796
NBA | Sports   |
NFL | Sports   |
NHL | Sports   |
Opera | Shows    |
Plays | Shows    |
Pop | Concerts |
(11 rows)
```

La consulta equivalente a través de la sintaxis de la cláusula FROM es de la siguiente manera: 

```
select catname, catgroup, eventid
from category left join event
on category.catid=event.catid and eventid=796;
```

Si elimina el segundo operador (\$1) de la versión de la cláusula WHERE de esta consulta, devuelve solo 1 fila (la fila donde `eventid=796`). 

```
select catname, catgroup, eventid
from category, event
where category.catid=event.catid(+) and eventid=796;

catname | catgroup | eventid
-----------+----------+---------
Musicals | Shows    | 796
(1 row)
```

# Cláusula GROUP BY
<a name="r_GROUP_BY_clause"></a>

La cláusula GROUP BY identifica las columnas de agrupación para la consulta. Se utiliza para agrupar las filas de una tabla que tienen los mismos valores en todas las columnas de la lista. No importa el orden en el que aparecen las columnas. El resultado es la combinación de cada conjunto de filas que tienen valores comunes en una fila de grupo que representa todas las filas del grupo. Utilice GROUP BY para eliminar la redundancia en la salida y calcular los agregados que se aplican a los grupos. Las columnas de agrupación deben declararse cuando la consulta computa las agregaciones con funciones estándar como SUM, AVG y COUNT. Para obtener más información, consulte [Funciones de agregación](c_Aggregate_Functions.md).

## Sintaxis
<a name="r_GROUP_BY_clause-syntax"></a>

```
[ GROUP BY  expression [, ...] | ALL | aggregation_extension  ]
```

donde *aggregation\$1extension* es una de las siguientes opciones:

```
GROUPING SETS ( () | aggregation_extension [, ...] ) |
ROLLUP ( expr [, ...] ) |
CUBE ( expr [, ...] )
```

## Parameters
<a name="r_GROUP_BY_clause-parameters"></a>

 *expression*  
La lista de columnas o expresiones debe coincidir con la lista de expresiones no agregadas en la lista de selección de la consulta. Por ejemplo, considere la siguiente consulta simple.  

```
select listid, eventid, sum(pricepaid) as revenue,
count(qtysold) as numtix
from sales
group by listid, eventid
order by 3, 4, 2, 1
limit 5;

listid | eventid | revenue | numtix
-------+---------+---------+--------
89397  |      47 |   20.00 |      1
106590 |      76 |   20.00 |      1
124683 |     393 |   20.00 |      1
103037 |     403 |   20.00 |      1
147685 |     429 |   20.00 |      1
(5 rows)
```
En esta consulta, la lista de selección consta de dos expresiones agregadas. La primera usa la función SUM y la segunda usa la función COUNT. Las dos columnas restantes, LISTID y EVENTID, deben declararse como columnas de agrupación.  
Las expresiones de la cláusula GROUP BY también pueden hacer referencia a la lista de selección a través de números ordinales. Por ejemplo, el caso anterior podría abreviarse de la siguiente manera.  

```
select listid, eventid, sum(pricepaid) as revenue,
count(qtysold) as numtix
from sales
group by 1,2
order by 3, 4, 2, 1
limit 5;

listid | eventid | revenue | numtix
-------+---------+---------+--------
89397  |      47 |   20.00 |      1
106590 |      76 |   20.00 |      1
124683 |     393 |   20.00 |      1
103037 |     403 |   20.00 |      1
147685 |     429 |   20.00 |      1
(5 rows)
```

ALL  
ALL indica que se deben agrupar por todas las columnas especificadas en la lista SELECT, excepto las que están agregadas. Por ejemplo, considere la siguiente consulta, que agrupa por `col1` y `col2` sin tener que especificarlas individualmente en la cláusula GROUP BY. La columna `col3` es el argumento de la función `SUM` y, por lo tanto, no está agrupada.  

```
SELECT col1, col2 sum(col3) FROM testtable GROUP BY ALL
```
Si aplica EXCLUDE a una columna de la lista SELECT, la cláusula GROUP BY ALL no agrupa los resultados en función de esa columna específica.  

```
SELECT * EXCLUDE col3 FROM testtable GROUP BY ALL
```

 * *aggregation\$1extension* *   
Puede utilizar las extensiones de agregación GROUPING SETS, ROLLUP y CUBE para realizar el trabajo de varias operaciones GROUP BY en una sola instrucción. Para obtener más información sobre las extensiones de agregación y las funciones relacionadas, consulte [Extensiones de agregación](r_GROUP_BY_aggregation-extensions.md). 

## Ejemplos
<a name="r_GROUP_BY_clause-examples"></a>

Los ejemplos siguientes utilizan la tabla SALES que contiene las columnas: salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission y saletime. Para obtener más información sobre la tabla SALES, consulte [Base de datos de muestra](c_sampledb.md).

En el siguiente ejemplo, se agrupan consultas por `salesid` y `listid` sin tener que especificarlas individualmente en la cláusula GROUP BY. La columna `qtysold` es el argumento de la función `SUM` y, por lo tanto, no está agrupada.

```
SELECT salesid, listid, sum(qtysold) FROM sales GROUP BY ALL;

salesid | listid  | sum
--------+---------+------
33095   | 36572   | 2	
88268   | 100813  | 4	
110917  | 127048  | 1	
...
```

El siguiente ejemplo de consulta excluye varias columnas de la lista SELECT, por lo que GROUP BY ALL solo agrupa salesid y listid.

```
SELECT * EXCLUDE sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime 
FROM sales GROUP BY ALL;

salesid | listid 
--------+---------
33095   | 36572   	
88268   | 100813 	
110917  | 127048 	
...
```

# Extensiones de agregación
<a name="r_GROUP_BY_aggregation-extensions"></a>

Amazon Redshift admite extensiones de agregación para realizar el trabajo de varias operaciones GROUP BY en una sola instrucción.

 Los ejemplos de extensiones de agregación utilizan la tabla `orders`, que contiene los datos de ventas de una empresa de electrónica. Para crear `orders`, puede realizar lo siguiente.

```
CREATE TABLE ORDERS (
    ID INT,
    PRODUCT CHAR(20),
    CATEGORY CHAR(20),
    PRE_OWNED CHAR(1),
    COST DECIMAL
);

INSERT INTO ORDERS VALUES
    (0, 'laptop',       'computers',    'T', 1000),
    (1, 'smartphone',   'cellphones',   'T', 800),
    (2, 'smartphone',   'cellphones',   'T', 810),
    (3, 'laptop',       'computers',    'F', 1050),
    (4, 'mouse',        'computers',    'F', 50);
```

## *GROUPING SETS*
<a name="r_GROUP_BY_aggregation-extensions-grouping-sets"></a>

 Calcula uno o más conjuntos de agrupación en una sola instrucción. Un conjunto de agrupación es el conjunto de una sola cláusula GROUP BY, un conjunto de 0 o más columnas mediante el que se puede agrupar el conjunto de resultados de una consulta. GROUP BY GROUPING SETS equivale a ejecutar una consulta UNION ALL en un conjunto de resultados agrupado por columnas diferentes. Por ejemplo, GROUP BY GROUPING SETS((a), (b)) equivale a GROUP BY a UNION ALL GROUP BY b. 

 En el siguiente ejemplo se devuelve el costo de los productos de la tabla de pedidos agrupados en función tanto de las categorías de los productos como del tipo de productos vendidos. 

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY GROUPING SETS(category, product);

       category       |       product        | total
----------------------+----------------------+-------
 computers            |                      |  2100
 cellphones           |                      |  1610
                      | laptop               |  2050
                      | smartphone           |  1610
                      | mouse                |    50

(5 rows)
```

## *ROLLUP*
<a name="r_GROUP_BY_aggregation-extensions-rollup"></a>

 Se supone una jerarquía en la que las columnas anteriores se consideran las principales de las columnas posteriores. ROLLUP agrupa los datos por las columnas proporcionadas y devuelve filas de subtotales adicionales que representan los totales de todos los niveles de agrupación de columnas, además de las filas agrupadas. Por ejemplo, puede usar GROUP BY ROLLUP ((a), (b)) para devolver un conjunto de resultados agrupado primero por a y luego por b, suponiendo que b es una subsección de a. ROLLUP también devuelve una fila con todo el conjunto de resultados sin agrupar columnas. 

GROUP BY ROLLUP((a), (b)) equivale a GROUP BY GROUPING SETS((a,b), (a), ()). 

En el siguiente ejemplo se devuelve el costo de los productos de la tabla de pedidos agrupados primero por categoría y, a continuación, por producto, con el producto como una subdivisión de la categoría.

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY ROLLUP(category, product) ORDER BY 1,2;

       category       |       product        | total
----------------------+----------------------+-------
 cellphones           | smartphone           |  1610
 cellphones           |                      |  1610
 computers            | laptop               |  2050
 computers            | mouse                |    50
 computers            |                      |  2100
                      |                      |  3710
(6 rows)
```

## *CUBE*
<a name="r_GROUP_BY_aggregation-extensions-cube"></a>

 Agrupa los datos por las columnas proporcionadas y devuelve filas de subtotales adicionales que representan los totales de todos los niveles de agrupación de columnas, además de las filas agrupadas. CUBE devuelve las mismas filas que ROLLUP, a la vez que agrega filas de subtotales adicionales por cada combinación de columnas de agrupación no incluidas en ROLLUP. Por ejemplo, puede usar GROUP BY CUBE ((a), (b)) para devolver un conjunto de resultados agrupado primero por a y luego por b, suponiendo que b es una subsección de a. CUBE también devuelve una fila con todo el conjunto de resultados sin agrupar columnas.

GROUP BY CUBE((a), (b)) equivale a GROUP BY GROUPING SETS((a, b), (a), (b), ()). 

En el siguiente ejemplo se devuelve el costo de los productos de la tabla de pedidos agrupados primero por categoría y, a continuación, por producto, con el producto como una subdivisión de la categoría. A diferencia del ejemplo anterior de ROLLUP, la instrucción devuelve resultados para cada combinación de columnas de agrupación. 

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY CUBE(category, product) ORDER BY 1,2;

       category       |       product        | total
----------------------+----------------------+-------
 cellphones           | smartphone           |  1610
 cellphones           |                      |  1610
 computers            | laptop               |  2050
 computers            | mouse                |    50
 computers            |                      |  2100
                      | laptop               |  2050
                      | mouse                |    50
                      | smartphone           |  1610
                      |                      |  3710
(9 rows)
```

## *Funciones de GROUPING/GROUPING\$1ID*
<a name="r_GROUP_BY_aggregation-extentions-grouping"></a>

 ROLLUP y CUBE agregan valores NULL al conjunto de resultados para indicar las filas del subtotal. Por ejemplo, GROUP BY ROLLUP((a), (b)) devuelve una o varias filas que tienen un valor NULL en la columna de agrupación b para indicar que son subtotales de campos de la columna de agrupación a. Estos valores NULL solo sirven para satisfacer el formato de las tuplas devueltas.

 Al ejecutar las operaciones GROUP BY con ROLLUP y CUBE en relaciones que almacenan valores NULL por sí mismas, se pueden producir conjuntos de resultados con filas que parecen tener columnas de agrupación idénticas. Volviendo al ejemplo anterior, si la columna de agrupación b contiene un valor NULL almacenado, GROUP BY ROLLUP((a), (b)) devuelve una fila con un valor NULL en la columna de agrupación b que no es un subtotal. 

 Para distinguir entre los valores NULL creados por ROLLUP y CUBE, y los valores NULL almacenados en las propias tablas, puede utilizar la función GROUPING o su alias GROUPING\$1ID. GROUPING toma un único conjunto de agrupación como argumento y, para cada fila del conjunto de resultados, devuelve un valor de bit 0 o 1 correspondiente a la columna de agrupación en esa posición y, a continuación, convierte el valor en un entero. Si el valor de esa posición es un valor NULL creado por una extensión de agregación, GROUPING devuelve 1. Devuelve 0 para todos los demás valores, incluidos los valores NULL almacenados.

 Por ejemplo, GROUPING(category, product) puede devolver los siguientes valores para una fila determinada, en función de los valores de la columna de agrupación de esa fila. Para los fines de este ejemplo, todos los valores NULL de la tabla son valores NULL creados por una extensión de agregación.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_GROUP_BY_aggregation-extensions.html)

Las funciones de GROUPING aparecen en la parte de la lista SELECT de la consulta en el siguiente formato.

```
SELECT ... [GROUPING( expr )...] ...
  GROUP BY ... {CUBE | ROLLUP| GROUPING SETS} ( expr ) ...
```

El siguiente ejemplo es el mismo que el anterior de CUBE, pero con la adición de funciones de GROUPING para sus conjuntos de agrupación.

```
SELECT category, product,
       GROUPING(category) as grouping0,
       GROUPING(product) as grouping1,
       GROUPING(category, product) as grouping2,
       sum(cost) as total
FROM orders
GROUP BY CUBE(category, product) ORDER BY 3,1,2;

       category       |       product        | grouping0 | grouping1 | grouping2 | total
----------------------+----------------------+-----------+-----------+-----------+-------
 cellphones           | smartphone           |         0 |         0 |         0 |  1610
 cellphones           |                      |         0 |         1 |         1 |  1610
 computers            | laptop               |         0 |         0 |         0 |  2050
 computers            | mouse                |         0 |         0 |         0 |    50
 computers            |                      |         0 |         1 |         1 |  2100
                      | laptop               |         1 |         0 |         2 |  2050
                      | mouse                |         1 |         0 |         2 |    50
                      | smartphone           |         1 |         0 |         2 |  1610
                      |                      |         1 |         1 |         3 |  3710
(9 rows)
```

## *ROLLUP y CUBE parciales*
<a name="r_GROUP_BY_aggregation-extentions-partial"></a>

 Puede ejecutar las operaciones ROLLUP y CUBE con solo una parte de los subtotales. 

 La sintaxis de las operaciones ROLLUP y CUBE parciales es la siguiente.

```
GROUP BY expr1, { ROLLUP | CUBE }(expr2, [, ...])
```

En este caso, la cláusula GROUP BY solo crea filas de subtotales en el nivel de *expr2* y posteriores.

En los siguientes ejemplos se muestran operaciones parciales de ROLLUP y CUBE en la tabla orders. Primero se agrupan si un producto es de segunda mano y, a continuación, se ejecutan ROLLUP y CUBE en las columnas category y product.

```
SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY pre_owned, ROLLUP(category, product) ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
(9 rows)

SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY pre_owned, CUBE(category, product) ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
 F         |                      | laptop               |        4 |  1050
 F         |                      | mouse                |        4 |    50
 T         |                      | laptop               |        4 |  1000
 T         |                      | smartphone           |        4 |  1610
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
(13 rows)
```

Como la columna de segunda mano (pre\$1owned) no se incluye en las operaciones ROLLUP y CUBE, no existe una fila de total general que incluya todas las demás filas. 

## *Agrupación concatenada*
<a name="r_GROUP_BY_aggregation-extentions-concat"></a>

 Puede concatenar varias cláusulas GROUPING SETS/ROLLUP/CUBE para calcular diferentes niveles de subtotales. Las agrupaciones concatenadas devuelven el producto cartesiano de los conjuntos de agrupación proporcionados. 

 La sintaxis para concatenar cláusulas GROUPING SETS/ROLLUP/CUBE es la siguiente.

```
GROUP BY {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...]),
         {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...])[, ...]
```

Considere el siguiente ejemplo para ver cómo una agrupación concatenada pequeña puede producir un gran conjunto de resultados finales.

```
SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY CUBE(category, product), GROUPING SETS(pre_owned, ())
ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
           | cellphones           | smartphone           |        1 |  1610
           | computers            | laptop               |        1 |  2050
           | computers            | mouse                |        1 |    50
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
           | cellphones           |                      |        3 |  1610
           | computers            |                      |        3 |  2100
 F         |                      | laptop               |        4 |  1050
 F         |                      | mouse                |        4 |    50
 T         |                      | laptop               |        4 |  1000
 T         |                      | smartphone           |        4 |  1610
           |                      | laptop               |        5 |  2050
           |                      | mouse                |        5 |    50
           |                      | smartphone           |        5 |  1610
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
           |                      |                      |        7 |  3710
(22 rows)
```

## *Agrupación anidada*
<a name="r_GROUP_BY_aggregation-extentions-nested"></a>

 Puede utilizar las operaciones GROUPING SETS/ROLLUP/CUBE como GROUPING SETS *expr* para formar una agrupación anidada. La subagrupación dentro de GROUPING SETS anidado está aplanada. 

 La sintaxis de la agrupación anidada es la siguiente.

```
GROUP BY GROUPING SETS({ROLLUP|CUBE|GROUPING SETS}(expr[, ...])[, ...])
```

Considere el siguiente ejemplo.

```
SELECT category, product, pre_owned,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY GROUPING SETS(ROLLUP(category), CUBE(product, pre_owned))
ORDER BY 4,1,2,3;

       category       |       product        | pre_owned | group_id | total
----------------------+----------------------+-----------+----------+-------
 cellphones           |                      |           |        3 |  1610
 computers            |                      |           |        3 |  2100
                      | laptop               | F         |        4 |  1050
                      | laptop               | T         |        4 |  1000
                      | mouse                | F         |        4 |    50
                      | smartphone           | T         |        4 |  1610
                      | laptop               |           |        5 |  2050
                      | mouse                |           |        5 |    50
                      | smartphone           |           |        5 |  1610
                      |                      | F         |        6 |  1100
                      |                      | T         |        6 |  2610
                      |                      |           |        7 |  3710
                      |                      |           |        7 |  3710
(13 rows)
```

Tenga en cuenta que, como ROLLUP(category) y CUBE(product, pre\$1owned) contienen el conjunto de agrupación (), la fila que representa el total general está duplicada.

## *Notas de uso*
<a name="r_GROUP_BY_aggregation-extensions-usage-notes"></a>
+ La cláusula GROUP BY admite hasta 64 conjuntos de agrupación. En el caso de ROLLUP y CUBE, o de alguna combinación de GROUPING SETS, ROLLUP y CUBE, esta limitación se aplica al número implícito de conjuntos de agrupación. Por ejemplo, GROUP BY CUBE((a), (b)) cuenta como cuatro conjuntos de agrupación, no como dos.
+ No puede utilizar constantes como columnas de agrupación cuando utilice extensiones de agregación.
+ No puede hacer un conjunto de agrupación que contenga columnas duplicadas.

# Cláusula HAVING
<a name="r_HAVING_clause"></a>

La cláusula HAVING aplica una condición al conjunto de resultados agrupado intermedio que una consulta devuelve.

## Sintaxis
<a name="r_HAVING_clause-synopsis"></a>

```
[ HAVING condition ]
```

Por ejemplo, puede limitar los resultados de una función SUM:

```
having sum(pricepaid) >10000
```

La condición HAVING se aplica después de que se aplican todas las condiciones de la cláusula WHERE y se completan todas las operaciones de GROUP BY.

La condición toma la misma forma que cualquier condición de la cláusula WHERE.

## Notas de uso
<a name="r_HAVING_clause_usage_notes"></a>
+ Cualquier columna a la que se haga referencia en una condición de la cláusula HAVING debe ser una columna de agrupación o una columna que haga referencia al resultado de una función agregada.
+ En una cláusula HAVING, no se puede especificar:
  + Un número ordinal que hace referencia a un elemento de la lista de selección. Solo las cláusulas GROUP BY y ORDER BY aceptan números ordinales.

## Ejemplos
<a name="r_HAVING_clause-examples"></a>

La siguiente consulta calcula las ventas de tickets totales para todos los eventos por nombre y, luego, elimina eventos donde las ventas totales sean inferiores a \$1800 000. La condición HAVING se aplica a los resultados de la función agregada en la lista de selección: `sum(pricepaid)`.

```
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(pricepaid) > 800000
order by 2 desc, 1;

eventname        |    sum
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
```

La siguiente consulta calcula un conjunto de resultados similar. No obstante, en este caso, la condición HAVING se aplica a una agregación que no se especifica en la lista de selección: `sum(qtysold)`. Los eventos que no vendieron más de 2 000 tickets se eliminan del resultado final.

```
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(qtysold) >2000
order by 2 desc, 1;

eventname        |    sum
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
Chicago          |  790993.00
Spamalot         |  714307.00
```

La siguiente consulta calcula las ventas de tickets totales para todos los eventos por nombre y, luego, elimina eventos donde las ventas totales sean inferiores a \$1800 000. La condición HAVING se aplica a los resultados de la función agregada en la lista de selección utilizando el alias `pp` para `sum(pricepaid)`.

```
select eventname, sum(pricepaid) as pp
from sales join event on sales.eventid = event.eventid
group by 1
having pp > 800000
order by 2 desc, 1;

eventname        |    pp
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
```

# Cláusula QUALIFY
<a name="r_QUALIFY_clause"></a>

La cláusula QUALIFY filtra los resultados de una función de ventana calculada previamente en función de las condiciones de búsqueda especificadas por el usuario. Puede utilizar la cláusula para aplicar condiciones de filtrado al resultado de una función de ventana sin utilizar una subconsulta.

Es similar a la [cláusula HAVING](https://docs.aws.amazon.com/redshift/latest/dg/r_HAVING_clause.html), que aplica una condición para filtrar aún más las filas de una cláusula WHERE. La diferencia entre QUALIFY y HAVING es que los resultados filtrados de la cláusula QUALIFY se pueden basar en el resultado de ejecutar funciones de ventana en los datos. Puede utilizar las cláusulas QUALITY y HAVING en una consulta.

## Sintaxis
<a name="r_QUALIFY-synopsis"></a>

```
QUALIFY condition
```

**nota**  
Si utiliza la cláusula QUALIFY directamente después de la cláusula FROM, el nombre de la relación FROM debe tener un alias especificado antes de la cláusula QUALIFY.

## Ejemplos
<a name="r_QUALIFY-examples"></a>

En los ejemplos de esta sección se utilizan los datos de ejemplo que se muestran a continuación.

```
create table store_sales (ss_sold_date date, ss_sold_time time, 
               ss_item text, ss_sales_price float);
insert into store_sales values ('2022-01-01', '09:00:00', 'Product 1', 100.0),
                               ('2022-01-01', '11:00:00', 'Product 2', 500.0),
                               ('2022-01-01', '15:00:00', 'Product 3', 20.0),
                               ('2022-01-01', '17:00:00', 'Product 4', 1000.0),
                               ('2022-01-01', '18:00:00', 'Product 5', 30.0),
                               ('2022-01-02', '10:00:00', 'Product 6', 5000.0),
                               ('2022-01-02', '16:00:00', 'Product 7', 5.0);
```

El siguiente ejemplo muestra cómo encontrar los dos artículos más caros que se venden después de las 12:00 cada día.

```
SELECT *
FROM store_sales ss
WHERE ss_sold_time > time '12:00:00'
QUALIFY row_number()
OVER (PARTITION BY ss_sold_date ORDER BY ss_sales_price DESC) <= 2
               

 ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price 
--------------+--------------+-----------+----------------
 2022-01-01   | 17:00:00     | Product 4 |           1000
 2022-01-01   | 18:00:00     | Product 5 |             30
 2022-01-02   | 16:00:00     | Product 7 |              5
```

A continuación, podrá encontrar el último artículo vendido cada día.

```
SELECT *
FROM store_sales ss
QUALIFY last_value(ss_item)
OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) = ss_item;
               
ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price 
--------------+--------------+-----------+----------------
 2022-01-01   | 18:00:00     | Product 5 |             30
 2022-01-02   | 16:00:00     | Product 7 |              5
```

El siguiente ejemplo devuelve los mismos registros que la consulta anterior, el último artículo vendido cada día, pero no utiliza la cláusula QUALIFY.

```
SELECT * FROM (
  SELECT *,
  last_value(ss_item)
  OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) ss_last_item
  FROM store_sales ss
)
WHERE ss_last_item = ss_item;
               
 ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price | ss_last_item 
--------------+--------------+-----------+----------------+--------------
 2022-01-02   | 16:00:00     | Product 7 |              5 | Product 7
 2022-01-01   | 18:00:00     | Product 5 |             30 | Product 5
```

# UNION, INTERSECT y EXCEPT
<a name="r_UNION"></a>

**Topics**
+ [Sintaxis](#r_UNION-synopsis)
+ [Parameters](#r_UNION-parameters)
+ [Orden de evaluación para los operadores de conjunto](#r_UNION-order-of-evaluation-for-set-operators)
+ [Notas de uso](#r_UNION-usage-notes)
+ [Ejemplo de consultas UNION](c_example_union_query.md)
+ [Ejemplo de consultas UNION ALL](c_example_unionall_query.md)
+ [Ejemplo de consultas INTERSECT](c_example_intersect_query.md)
+ [Ejemplo de consulta EXCEPT](c_Example_MINUS_query.md)

Los *operadores de conjunto* UNION, INTERSECT y EXCEPT se utilizan para comparar y fusionar los resultados de dos expresiones de consulta diferentes. Por ejemplo, si desea saber qué usuarios de un sitio web son compradores y vendedores pero los nombres de usuario están almacenados en diferentes columnas o tablas, puede buscar la *intersección* de estos dos tipos de usuarios. Si desea saber qué usuarios de un sitio web son compradores pero no vendedores, puede usar el operador EXCEPT para buscar la *diferencia* entre las dos listas de usuarios. Si desea crear una lista de todos los usuarios, independientemente de la función, puede usar el operador UNION.

## Sintaxis
<a name="r_UNION-synopsis"></a>

```
query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query
```

## Parameters
<a name="r_UNION-parameters"></a>

 *query*   
Una expresión de consulta que corresponde, en la forma de su lista de selección, a una segunda expresión de consulta que sigue el operador UNION, INTERSECT o EXCEPT. Las dos expresiones deben contener la misma cantidad de columnas de salida con tipos de datos compatibles; de lo contrario, no se podrán comparar ni fusionar los dos conjuntos de resultados. Las operaciones de conjunto no permiten conversiones implícitas entre diferentes categorías de tipos de datos. Para obtener más información, consulte [Conversión y compatibilidad de tipos](c_Supported_data_types.md#r_Type_conversion).  
Puede crear consultas que contengan una cantidad ilimitada de expresiones de consulta y vincularlas con operadores UNION, INTERSECT y EXCEPT en cualquier combinación. Por ejemplo, la siguiente estructura de consulta es válida, suponiendo que las tablas T1, T2 y T3 contienen conjuntos de columnas compatibles:   

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

UNION   
Operación de conjunto que devuelve filas de dos expresiones de consulta, independientemente de si las filas provienen de una o ambas expresiones.

INTERSECT   
Operación de conjunto que devuelve filas que provienen de dos expresiones de consulta. Las filas que no se devuelven en las dos expresiones se descartan.

EXCEPT \$1 MINUS   
Operación de conjunto que devuelve filas que provienen de una de las dos expresiones de consulta. Para calificar para el resultado, las filas deben existir en la primera tabla de resultados, pero no en la segunda. MINUS y EXCEPT son sinónimos exactos. 

ALL   
La palabra clave ALL conserva cualquier fila duplicada que UNION produce. El comportamiento predeterminado cuando no se usa la palabra clave ALL es descartar todos estos duplicados. No se admiten las expresiones INTERSECT ALL, EXCEPT ALL y MINUS ALL.

## Orden de evaluación para los operadores de conjunto
<a name="r_UNION-order-of-evaluation-for-set-operators"></a>

Los operadores de conjunto UNION y EXCEPT se asocian por la izquierda. Si no se especifican paréntesis para establecer el orden de prioridad, los operadores se evalúan de izquierda a derecha. Por ejemplo, en la siguiente consulta, UNION de T1 y T2 se evalúa primero, luego se realiza la operación EXCEPT en el resultado de UNION: 

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

El operador INTERSECT prevalece sobre los operadores UNION y EXCEPT cuando se utiliza una combinación de operadores en la misma consulta. Por ejemplo, la siguiente consulta evalúa la intersección de T2 y T3, y luego unirá el resultado con T1: 

```
select * from t1
union
select * from t2
intersect
select * from t3
order by c1;
```

Al agregar paréntesis, puede aplicar un orden diferente de evaluación. En el siguiente caso, el resultado de la unión de T1 y T2 está intersectado con T3, y la consulta probablemente produzca un resultado diferente. 

```
(select * from t1
union
select * from t2)
intersect
(select * from t3)
order by c1;
```

## Notas de uso
<a name="r_UNION-usage-notes"></a>
+ Los nombres de la columnas que se devuelven en el resultado de una consulta de operación de conjunto son los nombres (o alias) de la columnas de las tablas de la primera expresión de consulta. Debido a que estos nombres de columnas pueden ser confusos, porque los valores de la columna provienen de tablas de cualquier lado del operador de conjunto, se recomienda proporcionar alias significativos para el conjunto de resultados.
+ Una expresión de consulta que precede a un operador de conjunto no debería contener una cláusula ORDER BY. Una cláusula ORDER BY produce resultados significativos ordenados solo cuando se utiliza al final de una consulta que contiene operadores de conjunto. En este caso, la cláusula ORDER BY se aplica a los resultados finales de todas las operaciones de conjunto. La consulta extrema también puede contener cláusula LIMIT y OFFSET estándar. 
+ Cuando las consultas del operador de conjunto devuelven resultados decimales, las columnas de resultado correspondientes se promueven a devolver la misma precisión y escala. Por ejemplo, en la siguiente consulta, donde T1.REVENUE es una columna DECIMAL(10,2) y T2.REVENUE es una columna DECIMAL(8,4), el resultado decimal se promueve a DECIMAL(12,4): 

  ```
  select t1.revenue union select t2.revenue;
  ```

  La escala es `4` ya que es la escala máxima de las dos columnas. La precisión es `12` ya que T1.REVENUE requiere 8 dígitos a la izquierda del punto decimal (12 - 4 = 8). Este tipo de promoción garantiza que todos los valores de ambos lados de UNION encajen en el resultado. Para valores de 64 bits, la precisión de resultados máxima es 19 y la escala de resultados máxima es 18. Para valores de 128 bits, la precisión de resultados máxima es 38 y la escala de resultados máxima es 37.

  Si el tipo de datos resultante supera los límites de precisión y escala de Amazon Redshift, la consulta devuelve un error.
+ En el caso de las operaciones de conjunto, las dos filas se tratan como idénticas si, para cada par de columnas correspondiente, los dos valores de datos son *iguales* o *NULL*. Por ejemplo, si las tablas T1 y T2 contienen una columna y una fila, y esa fila es NULL en ambas tablas, una operación INTERSECT sobre esas tablas devuelve esa fila.

# Ejemplo de consultas UNION
<a name="c_example_union_query"></a>

En la siguiente consulta UNION, las filas de la tabla SALES se fusionan con las filas de la tabla LISTING. Se seleccionan tres columnas compatibles de cada tabla. En este caso, las columnas correspondientes tienen los mismos nombres y tipos de datos. 

El conjunto de resultados finales está ordenado por la primera columna de la tabla LISTING y limitado a las 5 filas con el mayor valor LISTID. 

```
select listid, sellerid, eventid from listing
union select listid, sellerid, eventid from sales
order by listid, sellerid, eventid desc limit 5;

listid | sellerid | eventid
--------+----------+---------
1 |    36861 |    7872
2 |    16002 |    4806
3 |    21461 |    4256
4 |     8117 |    4337
5 |     1616 |    8647
(5 rows)
```

En el siguiente ejemplo, se muestra cómo puede agregar un valor literal para el resultado de una consulta UNION para ver cuál expresión de consulta produjo cada fila en el conjunto de resultados. La consulta identifica filas de la primera expresión de consulta como "B" (por compradores, "buyers" en inglés) y filas de la segunda expresión de consulta como "S" (por vendedores, "sellers" en inglés). 

La consulta identifica compradores y vendedores para transacciones de ticket que cuestan \$110 000 o más. La única diferencia entre las dos expresiones de consulta de cualquier lado del operador UNION es la columna de combinación para la tabla SALES. 

```
select listid, lastname, firstname, username,
pricepaid as price, 'S' as buyorsell
from sales, users
where sales.sellerid=users.userid
and pricepaid >=10000
union
select listid, lastname, firstname, username, pricepaid,
'B' as buyorsell
from sales, users
where sales.buyerid=users.userid
and pricepaid >=10000
order by 1, 2, 3, 4, 5;

listid | lastname | firstname | username |   price   | buyorsell
--------+----------+-----------+----------+-----------+-----------
209658 | Lamb     | Colette   | VOR15LYI |  10000.00 | B
209658 | West     | Kato      | ELU81XAA |  10000.00 | S
212395 | Greer    | Harlan    | GXO71KOC |  12624.00 | S
212395 | Perry    | Cora      | YWR73YNZ |  12624.00 | B
215156 | Banks    | Patrick   | ZNQ69CLT |  10000.00 | S
215156 | Hayden   | Malachi   | BBG56AKU |  10000.00 | B
(6 rows)
```

En el siguiente ejemplo, se utiliza un operador UNION ALL porque las filas duplicadas, si se encuentran, deben conservarse en el resultado. Para una serie específica de ID de eventos, la consulta devuelve 0 o más filas para cada venta asociada a cada evento, y 0 o 1 fila para cada lista de ese evento. Los ID de eventos son únicos en cada fila de las tablas LISTING y EVENT, pero es posible que haya varias ventas para la misma combinación de ID de lista y evento en la tabla SALES. 

La tercera columna en el conjunto de resultados identifica la fuente de la fila. Si viene de la tabla SALES, se marca "Sí" en la columna SALESROW. (SALESROW es un alias para SALES.LISTID). Si la fila proviene de la tabla LISTING, se marca "No" en la columna SALESROW. 

En este caso, el conjunto de resultados consta de tres filas de ventas para la lista 500, evento 7787. En otras palabras, se llevaron a cabo tres transacciones diferentes para esta combinación de lista y evento. Las otras dos listas, 501 y 502, no produjeron ventas, por lo que la única fila que la consulta produce para estos ID de lista provienen de la tabla LISTING (SALESROW = 'No'). 

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
7787 |    500 | Yes
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(6 rows)
```

Si ejecuta la misma consulta sin la palabra clave ALL, el resultado conserva solo una de las transacciones de ventas. 

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(4 rows)
```

# Ejemplo de consultas UNION ALL
<a name="c_example_unionall_query"></a>

En el siguiente ejemplo, se utiliza un operador UNION ALL porque las filas duplicadas, si se encuentran, deben conservarse en el resultado. Para una serie específica de ID de eventos, la consulta devuelve 0 o más filas para cada venta asociada a cada evento, y 0 o 1 fila para cada lista de ese evento. Los ID de eventos son únicos en cada fila de las tablas LISTING y EVENT, pero es posible que haya varias ventas para la misma combinación de ID de lista y evento en la tabla SALES.

La tercera columna en el conjunto de resultados identifica la fuente de la fila. Si viene de la tabla SALES, se marca "Sí" en la columna SALESROW. (SALESROW es un alias para SALES.LISTID). Si la fila proviene de la tabla LISTING, se marca "No" en la columna SALESROW.

En este caso, el conjunto de resultados consta de tres filas de ventas para la lista 500, evento 7787. En otras palabras, se llevaron a cabo tres transacciones diferentes para esta combinación de lista y evento. Las otras dos listas, 501 y 502, no produjeron ventas, por lo que la única fila que la consulta produce para estos ID de lista provienen de la tabla LISTING (SALESROW = 'No').

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
7787 |    500 | Yes
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(6 rows)
```

Si ejecuta la misma consulta sin la palabra clave ALL, el resultado conserva solo una de las transacciones de ventas. 

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(4 rows)
```

# Ejemplo de consultas INTERSECT
<a name="c_example_intersect_query"></a>

Compare el siguiente ejemplo con el primer ejemplo de UNION. La única diferencia entre los dos ejemplos es el operador de conjunto que se utiliza, pero los resultados son muy diferentes. Solo una de las filas es igual: 

```
235494 |    23875 |    8771
```

 Esta es la única fila en el resultado limitado de 5 filas que se encontró en ambas tablas.

```
select listid, sellerid, eventid from listing
intersect
select listid, sellerid, eventid from sales
order by listid desc, sellerid, eventid
limit 5;

listid | sellerid | eventid
--------+----------+---------
235494 |    23875 |    8771
235482 |     1067 |    2667
235479 |     1589 |    7303
235476 |    15550 |     793
235475 |    22306 |    7848
(5 rows)
```

La siguiente consulta busca eventos (para los que se vendieron tickets) que ocurrieron en lugares en la Ciudad de Nueva York y Los Ángeles en marzo. La diferencia entre las dos expresiones de consulta es la restricción en la columna VENUECITY.

```
select distinct eventname from event, sales, venue
where event.eventid=sales.eventid and event.venueid=venue.venueid
and date_part(month,starttime)=3 and venuecity='Los Angeles'
intersect
select distinct eventname from event, sales, venue
where event.eventid=sales.eventid and event.venueid=venue.venueid
and date_part(month,starttime)=3 and venuecity='New York City'
order by eventname asc;

eventname
----------------------------
A Streetcar Named Desire
Dirty Dancing
Electra
Running with Annalise
Hairspray
Mary Poppins
November
Oliver!
Return To Forever
Rhinoceros
South Pacific
The 39 Steps
The Bacchae
The Caucasian Chalk Circle
The Country Girl
Wicked
Woyzeck
(16 rows)
```

# Ejemplo de consulta EXCEPT
<a name="c_Example_MINUS_query"></a>

La tabla CATEGORY de la base de datos TICKIT contiene las siguientes 11 filas: 

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
   1   | Sports   | MLB       | Major League Baseball
   2   | Sports   | NHL       | National Hockey League
   3   | Sports   | NFL       | National Football League
   4   | Sports   | NBA       | National Basketball Association
   5   | Sports   | MLS       | Major League Soccer
   6   | Shows    | Musicals  | Musical theatre
   7   | Shows    | Plays     | All non-musical theatre
   8   | Shows    | Opera     | All opera and light opera
   9   | Concerts | Pop       | All rock and pop music concerts
  10   | Concerts | Jazz      | All jazz singers and bands
  11   | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
```

Supongamos que una tabla CATEGORY\$1STAGE (una tabla provisional) contiene una fila adicional: 

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
1 | Sports   | MLB       | Major League Baseball
2 | Sports   | NHL       | National Hockey League
3 | Sports   | NFL       | National Football League
4 | Sports   | NBA       | National Basketball Association
5 | Sports   | MLS       | Major League Soccer
6 | Shows    | Musicals  | Musical theatre
7 | Shows    | Plays     | All non-musical theatre
8 | Shows    | Opera     | All opera and light opera
9 | Concerts | Pop       | All rock and pop music concerts
10 | Concerts | Jazz      | All jazz singers and bands
11 | Concerts | Classical | All symphony, concerto, and choir concerts
12 | Concerts | Comedy    | All stand up comedy performances
(12 rows)
```

Devuelve la diferencia entre las dos tablas. En otras palabras, devuelve filas que están en la tabla CATEGORY\$1STAGE pero no en la tabla CATEGORY: 

```
select * from category_stage
except
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

La siguiente consulta equivalente usa el sinónimo MINUS. 

```
select * from category_stage
minus
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

Si revierte el orden de las expresiones SELECT, la consulta no devuelve filas. 

# Cláusula ORDER BY
<a name="r_ORDER_BY_clause"></a>

**Topics**
+ [Sintaxis](#r_ORDER_BY_clause-synopsis)
+ [Parameters](#r_ORDER_BY_clause-parameters)
+ [Notas de uso](#r_ORDER_BY_usage_notes)
+ [Ejemplos con ORDER BY](r_Examples_with_ORDER_BY.md)

La cláusula ORDER BY ordena el conjunto de resultados de una consulta.

## Sintaxis
<a name="r_ORDER_BY_clause-synopsis"></a>

```
[ ORDER BY expression [ ASC | DESC ] ]
[ NULLS FIRST | NULLS LAST ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
```

## Parameters
<a name="r_ORDER_BY_clause-parameters"></a>

 *expression*   
Expresión que define el orden del conjunto de resultados de la consulta, por lo general al especificar una o más columnas en la lista de selección. Los resultados se devuelven en función de la ordenación UTF-8 binaria. También puede especificar lo siguiente:  
+ Columnas que no estén en la lista de selección
+ Expresiones formadas por una o más columnas que existen en las tablas a las que la consulta hace referencia
+ Números ordinales que representan la posición de las entradas de la lista de selección (o la posición de columnas en la tabla si no existe una lista de selección)
+ Alias que definen las entradas de la lista de selección
Cuando la cláusula ORDER BY contiene varias expresiones, el conjunto de resultados se ordena según la primera expresión, luego se aplica la segunda expresión a las filas que tienen valores coincidentes de la primera expresión, etc.

ASC \$1 DESC   
Opción que define el orden de ordenación para la expresión, de la siguiente manera:   
+ ASC: ascendente (por ejemplo, de menor a mayor para valores numéricos y de la A a la Z para cadenas con caracteres). Si no se especifica ninguna opción, los datos se ordenan, de manera predeterminada, en orden ascendente. 
+ DESC: descendente (de mayor a menor para valores numéricos y de la Z a la A para cadenas). 

NULLS FIRST \$1 NULLS LAST  
Opción que especifica si los valores NULL se deben ordenar en primer lugar, antes de los valores no nulos, o al final, después de los valores no nulos. De manera predeterminada, los valores NULL se ordenan y clasificación al final en orden ASC, y se ordenan y se clasifican primero en orden DESC.

LIMIT *number (número)* \$1 ALL   <a name="order-by-clause-limit"></a>
Opción que controla la cantidad de filas ordenadas que una consulta devuelve. El número LIMIT deber ser un entero positivo; el valor máximo es `2147483647`.   
LIMIT 0 no devuelve filas. Puede usar la sintaxis para realizar pruebas: para verificar que una consulta se ejecuta (sin mostrar filas) o para devolver una lista de columnas de una tabla. Una cláusula ORDER BY es redundante si está utilizando LIMIT 0 para devolver una lista de columnas. El predeterminado es LIMIT ALL. 

OFFSET *start (inicio)*   <a name="order-by-clause-offset"></a>
Opción que especifica que se omita el número de filas que hay delante de *start (inicio)* antes de comenzar a devolver filas. El número OFFSET deber ser un entero positivo; el valor máximo es `2147483647`. Cuando se utiliza con la opción LIMIT, las filas OFFSET se omiten antes de comenzar a contar las filas LIMIT que se devuelven. Si no se utiliza la opción LIMIT, la cantidad de filas del conjunto de resultados se reduce por la cantidad de filas que se omiten. Las filas omitidas por una cláusula OFFSET aún deben analizarse, por lo que puede ser ineficiente utilizar un valor OFFSET grande.

## Notas de uso
<a name="r_ORDER_BY_usage_notes"></a>

 Tenga en cuenta el siguiente comportamiento esperado con las cláusulas ORDER BY: 
+ Los valores NULL son considerados "superiores" a todos los otros valores. Con el orden ascendente predeterminado, los valores NULL se ordenan al final. Para cambiar este comportamiento, utilice la opción NULLS FIRST.
+ Cuando una consulta no contiene una cláusula ORDER BY, el sistema devuelve conjuntos de resultados sin un orden predecible de las filas. Si se ejecuta la misma consulta dos veces, puede devolver el conjunto de resultados en un orden diferente. 
+ Las opciones LIMIT y OFFSET pueden utilizarse sin una cláusula ORDER BY; no obstante, para devolver un conjunto consistente de filas, use estas opciones junto con ORDER BY. 
+ En cualquier sistema paralelo como Amazon Redshift, cuando una cláusula ORDER BY no produce un solo orden, el orden de las filas no es determinístico Es decir, si la expresión ORDER BY produce valores duplicados, el orden devuelto de esas filas puede variar de otros sistemas o de una ejecución de Amazon Redshift a la siguiente. 
+ Amazon Redshift no admite literales de cadena en cláusulas ORDER BY.

# Ejemplos con ORDER BY
<a name="r_Examples_with_ORDER_BY"></a>

Devuelva todas las 11 filas de la tabla CATEGORY, ordenadas por la segunda columna, CATGROUP. Para los resultados que tienen el mismo valor CATGROUP, ordene los valores de la columna CATDESC por la longitud de la cadena de caracteres. Ordene, a continuación, por columna CATID y CATNAME. 

```
select * from category order by 2, length(catdesc), 1, 3;

catid | catgroup |  catname  |                  catdesc
------+----------+-----------+----------------------------------------
10    | Concerts | Jazz      | All jazz singers and bands
9     | Concerts | Pop       | All rock and pop music concerts
11    | Concerts | Classical | All symphony, concerto, and choir conce
6     | Shows    | Musicals  | Musical theatre
7     | Shows    | Plays     | All non-musical theatre
8     | Shows    | Opera     | All opera and light opera
5     | Sports   | MLS       | Major League Soccer
1     | Sports   | MLB       | Major League Baseball
2     | Sports   | NHL       | National Hockey League
3     | Sports   | NFL       | National Football League
4     | Sports   | NBA       | National Basketball Association
(11 rows)
```

Devuelva las columnas seleccionadas de la tabla SALES, ordenadas por los valores QTYSOLD más altos. Limite el resultado a las primeras 10 filas: 

```
select salesid, qtysold, pricepaid, commission, saletime from sales
order by qtysold, pricepaid, commission, salesid, saletime desc
limit 10;

salesid | qtysold | pricepaid | commission |      saletime
--------+---------+-----------+------------+---------------------
15401   |       8 |    272.00 |      40.80 | 2008-03-18 06:54:56
61683   |       8 |    296.00 |      44.40 | 2008-11-26 04:00:23
90528   |       8 |    328.00 |      49.20 | 2008-06-11 02:38:09
74549   |       8 |    336.00 |      50.40 | 2008-01-19 12:01:21
130232  |       8 |    352.00 |      52.80 | 2008-05-02 05:52:31
55243   |       8 |    384.00 |      57.60 | 2008-07-12 02:19:53
16004   |       8 |    440.00 |      66.00 | 2008-11-04 07:22:31
489     |       8 |    496.00 |      74.40 | 2008-08-03 05:48:55
4197    |       8 |    512.00 |      76.80 | 2008-03-23 11:35:33
16929   |       8 |    568.00 |      85.20 | 2008-12-19 02:59:33
(10 rows)
```

Devuelve una lista de columnas y ninguna fila a través de la sintaxis LIMIT 0: 

```
select * from venue limit 0;
venueid | venuename | venuecity | venuestate | venueseats
---------+-----------+-----------+------------+------------
(0 rows)
```

# Cláusula CONNECT BY
<a name="r_CONNECT_BY_clause"></a>

La cláusula CONNECT BY especifica la relación entre las filas de una jerarquía. Puede utilizar CONNECT BY para seleccionar filas en orden jerárquico mediante la combinación de la tabla consigo misma y el procesamiento los datos jerárquicos. Por ejemplo, puede utilizarla para recorrer recursivamente un organigrama y enumerar los datos.

Las consultas jerárquicas se procesan en el siguiente orden:

1. Si la cláusula FROM tiene una combinación, se procesa primero.

1. Se evalúa la cláusula CONNECT BY.

1. Se evalúa la cláusula WHERE.

## Sintaxis
<a name="r_CONNECT_BY_clause-synopsis"></a>

```
[START WITH start_with_conditions]
CONNECT BY connect_by_conditions
```

**nota**  
Aunque START y CONNECT no son palabras reservadas, utilice identificadores delimitados (comillas dobles) o AS si utiliza START y CONNECT como alias de tabla en su consulta para evitar errores en tiempo de ejecución.

```
SELECT COUNT(*)
FROM Employee "start"
CONNECT BY PRIOR id = manager_id
START WITH name = 'John'
```

```
SELECT COUNT(*)
FROM Employee AS start
CONNECT BY PRIOR id = manager_id
START WITH name = 'John'
```

## Parameters
<a name="r_CONNECT_BY_parameters"></a>

 *start\$1with\$1conditions*   
Condiciones que especifican las filas raíz de la jerarquía

 *connect\$1by\$1conditions*   
Condiciones que especifican la relación entre las filas principales y las secundarias de la jerarquía. Se debe calificar al menos una condición con el operador ` ` unario que se usa para hacer referencia a la fila principal.  

```
PRIOR column = expression
-- or
expression > PRIOR column
```

## Operadores
<a name="r_CONNECT_BY_operators"></a>

Puede utilizar los siguientes operadores en una consulta CONNECT BY.

 *LEVEL*   
Pseudocolumna que devuelve el nivel de fila actual en la jerarquía. Devuelve 1 para la fila raíz, 2 para el elemento secundario de la fila raíz, etc.

 *PRIOR*   
Operador unario que evalúa la expresión correspondiente a la fila principal de la fila actual de la jerarquía.

## Ejemplos
<a name="r_CONNECT_BY_example"></a>

En el siguiente ejemplo se muestra una consulta CONNECT BY que devuelve la cantidad de empleados subordinados directos o indirectos de John, sin una profundidad superior a cuatro niveles. 

```
SELECT id, name, manager_id
FROM employee
WHERE LEVEL < 4
START WITH name = 'John'
CONNECT BY PRIOR id = manager_id;
```

A continuación, se muestra el resultado de la consulta.

```
id      name      manager_id
------+----------+--------------
  101     John        100
  102     Jorge       101
  103     Kwaku       101
  110     Liu         101
  201     Sofía       102
  106     Mateo       102
  110     Nikki       103
  104     Paulo       103
  105     Richard     103
  120     Saanvi      104
  200     Shirley     104
  205     Zhang       104
```

 Definición de la tabla para este ejemplo: 

```
CREATE TABLE employee (
   id INT,
   name VARCHAR(20),
   manager_id INT
   );
```

 A continuación, se presentan las filas insertadas en la tabla. 

```
INSERT INTO employee(id, name, manager_id)  VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
```

A continuación, se muestra un gráfico de la organización del departamento de John.

![\[Un diagrama del organigrama del departamento de John.\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/images/org-chart.png)


# Ejemplos de subconsultas
<a name="r_Subquery_examples"></a>

En los siguientes ejemplos se muestran diferentes maneras en que las subconsultas encajan en las consultas SELECT. Para ver otro ejemplo del uso de las subconsultas, consulte [Ejemplos de JOIN](r_Join_examples.md). 

## Subconsulta de la lista SELECT
<a name="r_Subquery_examples-select-list-subquery"></a>

En el siguiente ejemplo, se observa una subconsulta en la lista SELECT. Esta subconsulta es *escalar*: devuelve solamente una columna y un valor, que se repite en el resultado de cada fila que se devuelve desde la consulta externa. La consulta compara el valor Q1SALES que la subconsulta computa con valores de venta de otros dos trimestres (2 y 3) en 2008, como la consulta externa lo define. 

```
select qtr, sum(pricepaid) as qtrsales,
(select sum(pricepaid)
from sales join date on sales.dateid=date.dateid
where qtr='1' and year=2008) as q1sales
from sales join date on sales.dateid=date.dateid
where qtr in('2','3') and year=2008
group by qtr
order by qtr;

qtr  |  qtrsales   |   q1sales
-------+-------------+-------------
2     | 30560050.00 | 24742065.00
3     | 31170237.00 | 24742065.00
(2 rows)
```

## Subconsulta de la cláusula WHERE
<a name="r_Subquery_examples-where-clause-subquery"></a>

En el siguiente ejemplo, se observa una subconsulta de tabla en la cláusula WHERE. Esta subconsulta produce varias filas. En este caso, las filas contienen solo una columna, pero las subconsultas de la tabla pueden contener varias columnas y filas, como cualquier otra tabla. 

La consulta busca los principales 10 vendedores en términos de cantidad máxima de tickets vendidos. La lista de los 10 principales está limitada por la subconsulta, que elimina usuarios que viven en ciudades donde hay lugares de venta de tickets. Esta consulta puede escribirse en diferentes maneras; por ejemplo, se puede volver a escribir la subconsulta como una combinación dentro de la consulta principal. 

```
select firstname, lastname, city, max(qtysold) as maxsold
from users join sales on users.userid=sales.sellerid
where users.city not in(select venuecity from venue)
group by firstname, lastname, city
order by maxsold desc, city desc
limit 10;

firstname | lastname  |      city      | maxsold
-----------+-----------+----------------+---------
Noah       | Guerrero | Worcester      |       8
Isadora    | Moss     | Winooski       |       8
Kieran     | Harrison | Westminster    |       8
Heidi      | Davis    | Warwick        |       8
Sara       | Anthony  | Waco           |       8
Bree       | Buck     | Valdez         |       8
Evangeline | Sampson  | Trenton        |       8
Kendall    | Keith    | Stillwater     |       8
Bertha     | Bishop   | Stevens Point  |       8
Patricia   | Anderson | South Portland |       8
(10 rows)
```

## Subconsultas de la cláusula WITH
<a name="r_Subquery_examples-with-clause-subqueries"></a>

Consulte [Cláusula WITH](r_WITH_clause.md). 

# Subconsultas correlacionadas
<a name="r_correlated_subqueries"></a>

En el siguiente ejemplo, se observa una *subconsulta correlacionada* en la cláusula WHERE; este tipo de subconsulta contiene una o varias correlaciones entre sus columnas y las columnas producidas por la consulta externa. En este caso, la correlación es `where s.listid=l.listid`. Para cada fila que la consulta externa produce, se ejecuta la subconsulta para calificar o descalificar la fila. 

```
select salesid, listid, sum(pricepaid) from sales s
where qtysold=
(select max(numtickets) from listing l
where s.listid=l.listid)
group by 1,2
order by 1,2
limit 5;

salesid | listid |   sum
--------+--------+----------
 27     |     28 | 111.00
 81     |    103 | 181.00
 142    |    149 | 240.00
 146    |    152 | 231.00
 194    |    210 | 144.00
(5 rows)
```

## Patrones de subconsultas correlacionadas que no se admiten
<a name="r_correlated_subqueries-correlated-subquery-patterns-that-are-not-supported"></a>

El planificador de consultas usa un método de reescritura de consulta denominado descorrelación de subconsulta para optimizar varios patrones de subconsultas correlacionadas para la ejecución en un entorno MPP. Algunos tipos de subconsultas correlacionadas siguen patrones para los cuales Amazon Redshift no puede anular la correlación y que no admite. Las consultas que contienen las siguientes referencias de correlación devuelven errores: 
+  Referencias de correlación que omiten un bloque de consulta, también conocidas como "referencias de correlación con nivel omitido". Por ejemplo, en la siguiente consulta, el bloque que contiene la referencia de correlación y el bloque omitido están conectados por un predicado NOT EXISTS: 

  ```
  select event.eventname from event
  where not exists
  (select * from listing
  where not exists
  (select * from sales where event.eventid=sales.eventid));
  ```

  En este caso, el bloque omitido es la subconsulta que se ejecuta contra la tabla LISTING. La referencia de correlación correlaciona las tablas EVENT y SALES. 
+  Referencias de correlación de una subconsulta que es parte de una cláusula ON en una consulta externa: 

  ```
  select * from category
  left join event
  on category.catid=event.catid and eventid =
  (select max(eventid) from sales where sales.eventid=event.eventid);
  ```

  La cláusula ON contiene una referencia de correlación de SALES en la subconsulta a EVENT en la consulta externa. 
+ La correlación que distingue valores nulos referencia una tabla de sistema de Amazon Redshift. Por ejemplo: 

  ```
  select attrelid
  from stv_locks sl, pg_attribute
  where sl.table_id=pg_attribute.attrelid and 1 not in
  (select 1 from pg_opclass where sl.lock_owner = opcowner);
  ```
+ Referencias de correlación de una subconsulta que contiene una función de ventana. 

  ```
  select listid, qtysold
  from sales s
  where qtysold not in
  (select sum(numtickets) over() from listing l where s.listid=l.listid);
  ```
+ Referencias en una columna GROUP BY a los resultados de una subconsulta correlacionada. Por ejemplo: 

  ```
  select listing.listid,
  (select count (sales.listid) from sales where sales.listid=listing.listid) as list
  from listing
  group by list, listing.listid;
  ```
+ Referencias de correlación de una subconsulta con una función agregada y una cláusula GROUP BY, conectadas a la consulta externa por un predicado IN. (Esta restricción no se aplica a las funciones agregadas MIN y MAX). Por ejemplo: 

  ```
  select * from listing where listid in
  (select sum(qtysold)
  from sales
  where numtickets>4
  group by salesid);
  ```

# SELECT INTO
<a name="r_SELECT_INTO"></a>

Selecciona las filas definidas por una consulta y las inserta en una nueva tabla. Puede especificar si va a crear una tabla temporal o persistente. 

## Sintaxis
<a name="r_SELECT_INTO-synopsis"></a>

```
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number | [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...] ]
[ EXCLUDE column_list ]
INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ [ START WITH expression ] CONNECT BY expression ]
[ GROUP BY ALL | expression [, ...] ]
[ HAVING condition ]
[ QUALIFY condition ]
[ { UNION | ALL | INTERSECT | EXCEPT | MINUS } query ]
[ ORDER BY expression [ ASC | DESC ] ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
```

 Para obtener información acerca de los parámetros de este comando, consulte [SELECT](r_SELECT_synopsis.md). 

## Ejemplos
<a name="r_SELECT_INTO-examples"></a>

Seleccione todas las filas de la tabla EVENT y cree la tabla NEWEVENT: 

```
select * into newevent from event;
```

Seleccione el resultado de una consulta agregada en una tabla temporal denominada PROFITS: 

```
select username, lastname, sum(pricepaid-commission) as profit
into temp table profits
from sales, users
where sales.sellerid=users.userid
group by 1, 2
order by 3 desc;
```

# SET
<a name="r_SET"></a>

Establece el valor de un parámetro de configuración de un servidor. Utilice el comando SET para invalidar un valor solo mientras dure la sesión o la transacción actual.

Utilice el comando [RESET](r_RESET.md) para devolver un parámetro a su valor predeterminado. 

Puede cambiar los parámetros de configuración del servidor de varias maneras. Para obtener más información, consulte [Modificación de la configuración del servidor](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings). 

## Sintaxis
<a name="r_SET-synopsis"></a>

```
SET { [ SESSION | LOCAL ]
{ SEED | parameter_name } { TO | = }
{ value | 'value' | DEFAULT } |
SEED TO value }
```

La siguiente instrucción establece el valor de una variable de contexto de sesión.

```
SET { [ SESSION | LOCAL ]
variable_name { TO | = }
{ value | 'value'  }
```

## Parameters
<a name="r_SET-parameters"></a>

SESSION   
Especifica que el ajuste es válido para la sesión actual. Valor predeterminado.

*variable\$1name*   
Especifica el nombre del conjunto de variables de contexto de la sesión.  
La convención de nomenclatura es un nombre de dos partes separado por un punto, por ejemplo *identificador.identificador*. Solo se permite un punto de separador. Utilice un *identificador* que sigue las reglas de identificador estándar de Amazon Redshift Para obtener más información, consulte [Nombres e identificadores](r_names.md). No se permiten identificadores delimitados.

LOCAL   
Especifica que el ajuste es válido para la transacción actual. 

SEED TO *value (valor)*   
Establece el uso de un inicio interno de la función RANDOM para la generación aleatoria de números.  
SET SEED toma un *valor* numérico comprendido entre 0 y 1, y lo multiplica por (231-1) para utilizarlo con la función [Función RANDOM](r_RANDOM.md). Si utiliza SET SEED antes de realizar varias ejecuciones RANDOM, RANDOM genera números en una secuencia predecible.

 *parameter\$1name*   
Nombre del parámetro que se debe establecer. Para obtener información acerca de los parámetros, consulte [Modificación de la configuración del servidor](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings).

 *valor de*   
Nuevo valor del parámetro. Utilice comillas simples para establecer el valor en una cadena específica. Si utiliza SET SEED, este parámetro contiene el valor SEED. 

DEFAULT   
Establece el parámetro al valor predeterminado.

## Ejemplos
<a name="r_SET-examples"></a>

 **Cambio de un parámetro en la sesión actual** 

En el siguiente ejemplo, se establece el estilo de fecha:

```
set datestyle to 'SQL,DMY';
```

 **Establecimiento de un grupo de consultas para la administración de cargas de trabajo** 

Si los grupos de consultas están enumerados en la definición de una cola como parte de la configuración WLM del clúster, puede establecer el parámetro QUERY\$1GROUP con el nombre de un grupo de consultas enumerado. Las consultas posteriores se asignan a la cola de la consulta asociada. El ajuste QUERY\$1GROUP permanece en vigor durante la sesión o hasta que se aplica un comando RESET QUERY\$1GROUP.

Este ejemplo ejecuta dos consultas como parte de la "prioridad" del grupo de consultas y, luego, restablece el grupo de consultas. 

```
set query_group to 'priority';
select tbl, count(*)from stv_blocklist;
select query, elapsed, substring from svl_qlog order by query desc limit 5;
reset query_group;
```

Para obtener más información, consulte [Administración de la carga de trabajo](cm-c-implementing-workload-management.md). 

 **Cambio del espacio de nombres de identidad predeterminado para la sesión** 

Un usuario de la base de datos puede establecer `default_identity_namespace`. En este ejemplo, se muestra cómo usar `SET SESSION` para invalidar la configuración durante la sesión actual y, a continuación, mostrar el nuevo valor del proveedor de identidades. Esto se utiliza con más frecuencia cuando utiliza un proveedor de identidades con Redshift e IAM Identity Center. Para obtener más información sobre cómo usar un proveedor de identidades con Redshift, consulte [Conectar Redshift con IAM Identity Center para ofrecer a los usuarios una experiencia de inicio de sesión único](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

```
SET SESSION default_identity_namespace = 'MYCO';
         
SHOW default_identity_namespace;
```

Tras ejecutar el comando, puede ejecutar una instrucción GRANT o CREATE como la siguiente:

```
GRANT SELECT ON TABLE mytable TO alice;

GRANT UPDATE ON TABLE mytable TO salesrole;
         
CREATE USER bob password 'md50c983d1a624280812631c5389e60d48c';
```

En este caso, el efecto de establecer el espacio de nombres de identidad predeterminado equivale a anteponer cada identidad con el espacio de nombres. En este ejemplo, `alice` se sustituye por `MYCO:alice`. Para obtener más información acerca de los ajustes relacionados con la configuración de Redshift con IAM Identity Center, consulte [ALTER SYSTEM](r_ALTER_SYSTEM.md) y [MODIFICAR PROVEEDOR DE IDENTIDADES](r_ALTER_IDENTITY_PROVIDER.md).

 **Establecimiento de una etiqueta para un grupo de consultas** 

El parámetro QUERY\$1GROUP define una etiqueta para una o más consultas que se ejecutan en la misma sesión después de un comando SET. A su vez, se registra esta etiqueta cuando se ejecutan las consultas y se puede utilizar para limitar los resultados que devuelven las tablas de sistema STL\$1QUERY y STV\$1INFLIGHT, además de la vista SVL\$1QLOG. 

```
show query_group;
query_group
-------------
unset
(1 row)

set query_group to '6 p.m.';


show query_group;
query_group
-------------
6 p.m.
(1 row)

select * from sales where salesid=500;
salesid | listid | sellerid | buyerid | eventid | dateid | ...
---------+--------+----------+---------+---------+--------+-----
500 |    504 |     3858 |    2123 |    5871 |   2052 | ...
(1 row)

reset query_group;

select query, trim(label) querygroup, pid, trim(querytxt) sql
from stl_query
where label ='6 p.m.';
query | querygroup |  pid  |                  sql
-------+------------+-------+----------------------------------------
57 | 6 p.m.     | 30711 | select * from sales where salesid=500;
(1 row)
```

Las etiquetas del grupo de consultas son un mecanismo útil para aislar consultas individuales o grupos de consultas que se ejecutan como parte de scripts. No es necesario identificar y rastrear las consultas por sus ID; puede rastrearlas por sus etiquetas.

 **Establecimiento de un valor de inicio para la generación aleatoria de números** 

En el siguiente ejemplo, se utiliza la opción SEED con SET para que la función RANDOM genere números en una secuencia predecible.

Primero, se devuelven tres valores enteros RANDOM sin establecer antes el valor SEED: 

```
select cast (random() * 100 as int);
int4
------
6
(1 row)

select cast (random() * 100 as int);
int4
------
68
(1 row)

select cast (random() * 100 as int);
int4
------
56
(1 row)
```

Ahora, establezca el valor SEED en `.25` y devuelva tres números RANDOM más: 

```
set seed to .25;

select cast (random() * 100 as int);
int4
------
21
(1 row)

select cast (random() * 100 as int);
int4
------
79
(1 row)

select cast (random() * 100 as int);
int4
------
12
(1 row)
```

Finalmente, restablezca el valor SEED a `.25` y verifique que RANDOM devuelva los mismos resultados que en las tres ejecuciones anteriores: 

```
set seed to .25;

select cast (random() * 100 as int);
int4
------
21
(1 row)

select cast (random() * 100 as int);
int4
------
79
(1 row)

select cast (random() * 100 as int);
int4
------
12
(1 row)
```

En el siguiente ejemplo, se establece una variable de contexto personalizada. 

```
SET app_context.user_id TO 123;
SET app_context.user_id TO 'sample_variable_value';
```

# SET SESSION AUTHORIZATION
<a name="r_SET_SESSION_AUTHORIZATION"></a>

Establece el nombre de usuario para la sesión actual.

Puede usar el comando SET SESSION AUTHORIZATION, por ejemplo, para probar el acceso a la base de datos al ejecutar temporalmente una sesión o transacción como usuario sin privilegios. Debe ser un superusuario de base de datos para ejecutar este comando.

## Sintaxis
<a name="r_SET_SESSION_AUTHORIZATION-synopsis"></a>

```
SET [ LOCAL ] SESSION AUTHORIZATION { user_name | DEFAULT }
```

## Parameters
<a name="r_SET_SESSION_AUTHORIZATION-parameters"></a>

LOCAL  
Especifica que el ajuste es válido para la transacción actual. Omitir este parámetro especifica que el ajuste es válido para la sesión actual.

 *user\$1name*   
Nombre del usuario que se debe establecer. El nombre de usuario puede escribirse como identificador o como literal de cadena.

DEFAULT  
Establece el nombre de usuario de la sesión al valor predeterminado.

## Ejemplos
<a name="r_SET_SESSION_AUTHORIZATION-examples"></a>

En el siguiente ejemplo, se establece el nombre de usuario para la sesión actual en `dwuser`:

```
SET SESSION AUTHORIZATION 'dwuser';
```

En el siguiente ejemplo, se establece el nombre de usuario para la transacción actual en `dwuser`:

```
SET LOCAL SESSION AUTHORIZATION 'dwuser';
```

Este siguiente ejemplo establece el nombre de usuario para la sesión actual en el nombre de usuario predeterminado:

```
SET SESSION AUTHORIZATION DEFAULT;
```

# SET SESSION CHARACTERISTICS
<a name="r_SET_SESSION_CHARACTERISTICS"></a>

Este comando no está disponible.

# SHOW
<a name="r_SHOW"></a>

Muestra el valor actual de un parámetro de configuración de un servidor. Este valor puede ser específico de la sesión actual si hay un comando SET en vigor. Para obtener una lista de parámetros de configuración, consulte [Referencia de la configuración](cm_chap_ConfigurationRef.md).

## Sintaxis
<a name="r_SHOW-synopsis"></a>

```
SHOW { parameter_name | ALL }
```

La siguiente instrucción muestra el valor actual de una variable de contexto de sesión. Si la variable no existe, Amazon Redshift emite un error.

```
SHOW variable_name
```

## Parameters
<a name="r_SHOW-parameters"></a>

 *parameter\$1name*   
Muestra el valor actual del parámetro especificado.

ALL   
Muestra los valores actuales de todos los parámetros.

*variable\$1name*   
Muestra el valor actual de la variable especificada.

## Ejemplos
<a name="r_SHOW-examples"></a>

En el siguiente ejemplo, se muestra el valor para el parámetro query\$1group: 

```
show query_group;

query_group

unset
(1 row)
```

En el siguiente ejemplo, se muestra una lista de todos los parámetros y sus valores: 

```
show all;
name        |   setting
--------------------+--------------
datestyle          | ISO, MDY
extra_float_digits | 0
query_group        | unset
search_path        | $user,public
statement_timeout  | 0
```

En el siguiente ejemplo se muestra el valor actual de la variable especificada.

```
SHOW app_context.user_id;
```

# SHOW COLUMN GRANTS
<a name="r_SHOW_COLUMN_GRANTS"></a>

Muestra las concesiones en una columna de una tabla.

## Permisos necesarios
<a name="r_SHOW_COLUMN_GRANTS-required-permissions"></a>

SHOW GRANTS para un objeto de destino solo mostrará las concesiones que estén visibles para el usuario actual. El usuario actual podrá ver una concesión si cumple uno de los siguientes criterios:
+ Ser un superusuario
+ Ser el usuario que recibe la concesión
+ Ser el propietario al que se le otorga el rol concedido
+ Ser a quien se le concede el rol al que se destina la concesión del objeto

## Sintaxis
<a name="r_SHOW_COLUMN_GRANTS-synopsis"></a>

```
SHOW COLUMN GRANTS ON TABLE
{ database_name.schema_name.table_name | schema_name.table_name }
[FOR {username | ROLE role_name | PUBLIC}]
[LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_COLUMN_GRANTS-parameters"></a>

database\$1name  
El nombre de la base de datos que contiene la tabla de destino

schema\$1name  
El nombre del esquema que contiene la tabla de destino

table\$1name  
El nombre de la tabla de destino

nombre de usuario  
Incluya solo las concesiones al nombre de usuario en el resultado

role\$1name  
Incluya solo las concesiones al role\$1name en el resultado

PUBLIC  
Incluya solo las concesiones a PUBLIC en el resultado

row\$1limit  
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000.

## Ejemplos
<a name="r_SHOW_COLUMN_GRANTS-examples"></a>

En el ejemplo siguiente, se muestran las concesiones de columnas en la tabla demo\$1db.demo\$1schema.t100:

```
SHOW COLUMN GRANTS ON TABLE demo_db.demo_schema.t100;
 database_name | schema_name | table_name | column_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+-------------+------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | demo_schema | t100       | b           | COLUMN      | UPDATE         |         134 | bob           | user          | f            | COLUMN          | dbadmin
 demo_db       | demo_schema | t100       | a           | COLUMN      | SELECT         |         130 | alice         | user          | f            | COLUMN          | dbadmin
 demo_db       | demo_schema | t100       | a           | COLUMN      | UPDATE         |         130 | alice         | user          | f            | COLUMN          | dbadmin
```

En el ejemplo siguiente, se muestran las concesiones de columnas en la tabla demo\$1schema.t100 para el usuario Bob:

```
SHOW COLUMN GRANTS ON TABLE demo_schema.t100 for bob;
 database_name | schema_name | table_name | column_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+-------------+------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | demo_schema | t100       | b           | COLUMN      | UPDATE         |         135 | bob           | user          | f            | COLUMN          | dbadmin
```

# SHOW COLUMNS
<a name="r_SHOW_COLUMNS"></a>

Muestra una lista de columnas de una tabla, junto con algunos atributos de columna.

Cada fila de salida consta de una lista separada por comas con el nombre de la base de datos, el nombre del esquema, el nombre de la tabla, el nombre de la columna, la posición ordinal, la columna predeterminada, indicación de si se puede anular, el tipo de datos, la longitud máxima de los caracteres, la precisión numérica, comentarios, el tipo de clave de clasificación, el orden de clave de clasificación, la clave de distribución, codificación e intercalación. Para obtener más información sobre estos atributos, consulte [SVV\$1ALL\$1COLUMNS](r_SVV_ALL_COLUMNS.md).

Si el comando SHOW COLUMNS diera como resultado más de 10 000 columnas, se devolvería un error.

## Permisos necesarios
<a name="r_SHOW_COLUMNS-privileges"></a>

Para ver una columna de una tabla de Amazon Redshift, el usuario actual debe cumplir uno de los siguientes criterios:
+ Ser un superusuario.
+ Ser el propietario de la tabla.
+ Tener concedido el privilegio USAGE en el esquema principal y el privilegio SELECT en la tabla o el privilegio SELECT en la columna.

## Sintaxis
<a name="r_SHOW_COLUMNS-synopsis"></a>

```
SHOW COLUMNS FROM TABLE database_name.schema_name.table_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parameters
<a name="r_SHOW_COLUMNS-parameters"></a>

 *database\$1name*   
Nombre de la base de datos que contiene las tablas que se enumerarán.   
Para mostrar tablas en un AWS Glue Data Catalog, especifique (`awsdatacatalog`) como nombre de base de datos y asegúrese de que la configuración del sistema `data_catalog_auto_mount` está establecida a `true`. Para obtener más información, consulte [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *schema\$1name*   
Nombre del esquema que contiene las tablas que se enumerarán.   
Para mostrar las tablas de AWS Glue Data Catalog, indique el nombre de la base de datos de AWS Glue como nombre del esquema.

 *table\$1name*   
Nombre de la tabla que contiene las columnas que se enumerarán. 

 *filter\$1pattern*   
Expresión de caracteres UTF-8 válida con un patrón para hacer coincidir los nombres de tabla. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_SHOW_COLUMNS.html)
Si *filter\$1pattern* no contiene metacaracteres, solo representa la propia cadena; en ese caso, LIKE actúa igual que el operador de igualdad. 

 *row\$1limit*   
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000. 

## Ejemplos
<a name="r_SHOW_COLUMNS-examples"></a>

En el siguiente ejemplo se muestran las columnas de la base de datos de Amazon Redshift denominada `sample_data_dev` que se encuentran en el esquema `tickit` y la tabla `event`.

```
SHOW COLUMNS FROM TABLE demo_schema.compound_sort_table;

  database_name | schema_name |     table_name      | column_name | ordinal_position | column_default | is_nullable |     data_type     | character_maximum_length | numeric_precision | numeric_scale | remarks | sort_key_type | sort_key | dist_key | encoding | collation 
---------------+-------------+---------------------+-------------+------------------+----------------+-------------+-------------------+--------------------------+-------------------+---------------+---------+---------------+----------+----------+----------+-----------
 demo_db       | demo_schema | compound_sort_table | id          |                1 |                | YES         | integer           |                          |                32 |             0 |         | COMPOUND      |        1 |        1 | delta32k | 
 demo_db       | demo_schema | compound_sort_table | name        |                2 |                | YES         | character varying |                       50 |                   |               |         | COMPOUND      |        2 |          | lzo      | default
 demo_db       | demo_schema | compound_sort_table | date_col    |                3 |                | YES         | date              |                          |                   |               |         |               |        0 |          | delta    | 
 demo_db       | demo_schema | compound_sort_table | amount      |                4 |                | YES         | numeric           |                          |                10 |             2 |         |               |        0 |          | mostly16 |
```

En el siguiente ejemplo se muestran las columnas de la base de datos de AWS Glue Data Catalog denominada `awsdatacatalog` que se encuentran en el esquema `batman` y la tabla `nation`. La salida está limitada a `2` filas.

```
SHOW COLUMNS FROM TABLE second_db.public.t22;

 database_name | schema_name | table_name | column_name | ordinal_position | column_default | is_nullable |          data_type          | character_maximum_length | numeric_precision | numeric_scale | remarks | sort_key_type | sort_key | dist_key | encoding | collation 
---------------+-------------+------------+-------------+------------------+----------------+-------------+-----------------------------+--------------------------+-------------------+---------------+---------+---------------+----------+----------+----------+-----------
 second_db     | public      | t22        | col1        |                1 |                | YES         | integer                     |                          |                32 |             0 |         | INTERLEAVED   |       -1 |          | mostly8  | 
 second_db     | public      | t22        | col2        |                2 |                | YES         | character varying           |                      100 |                   |               |         | INTERLEAVED   |        2 |          | text255  | default
 second_db     | public      | t22        | col3        |                3 |                | YES         | timestamp without time zone |                          |                   |               |         |               |        0 |          | raw      | 
 second_db     | public      | t22        | col4        |                4 |                | YES         | numeric                     |                          |                10 |             2 |         |               |        0 |          | az64     |
```

# SHOW CONSTRAINTS
<a name="r_SHOW_CONSTRAINTS"></a>

Muestra una lista de restricciones para la clave principal y la clave externa en una tabla.

## Permisos necesarios
<a name="r_SHOW_CONSTRAINTS-required-permissions"></a>

Para ejecutar SHOW CONSTRAINTS en una tabla, el usuario actual debe cumplir uno de los siguientes criterios:
+ Ser un superusuario
+ Ser el propietario de la tabla
+ Ser quien recibe la concesión del privilegio USAGE en el esquema principal y el privilegio SELECT en la tabla

## Sintaxis
<a name="r_SHOW_CONSTRAINTS-synopsis"></a>

```
SHOW CONSTRAINTS {PRIMARY KEYS | FOREIGN KEYS [EXPORTED]}
FROM TABLE
{ database_name.schema_name.table_name | schema_name.table_name }
[LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_CONSTRAINTS-parameters"></a>

*database\$1name*  
El nombre de la base de datos que contiene la tabla de destino

*schema\$1name*  
El nombre del esquema que contiene la tabla de destino

*table\$1name*  
El nombre de la tabla de destino

EXPORTED  
Cuando se especifique EXPORTED, muestre todas las claves externas de otras tablas que hacen referencia a la tabla de destino.

*row\$1limit*  
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000.

## Ejemplos
<a name="r_SHOW_CONSTRAINTS-examples"></a>

En el siguiente ejemplo, se muestran las restricciones de la clave principal de la tabla demo\$1db.demo\$1schema.pk1:

```
SHOW CONSTRAINTS PRIMARY KEYS FROM TABLE demo_db.demo_schema.pk1;
 database_name | schema_name | table_name | pk_name  | column_name | key_seq 
---------------+-------------+------------+----------+-------------+---------
 demo_db       | demo_schema | pk1        | pk1_pkey | i           |       1
 demo_db       | demo_schema | pk1        | pk1_pkey | j           |       2
 demo_db       | demo_schema | pk1        | pk1_pkey | c           |       3
```

En el siguiente ejemplo, se muestran las restricciones de la clave principal de la tabla demo\$1schema.fk2:

```
SHOW CONSTRAINTS FOREIGN KEYS FROM TABLE demo_schema.fk2;
 pk_database_name | pk_schema_name | pk_table_name | pk_column_name | fk_database_name | fk_schema_name | fk_table_name | fk_column_name | key_seq |  fk_name   | pk_name  | update_rule | delete_rule | deferrability 
------------------+----------------+---------------+----------------+------------------+----------------+---------------+----------------+---------+------------+----------+-------------+-------------+---------------
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | fk2           | i              |       1 | fk2_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | fk2           | j              |       2 | fk2_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | fk2           | c              |       3 | fk2_i_fkey | pk1_pkey |             |             |
```

En el siguiente ejemplo, se muestran las restricciones de la clave externa exportada de la tabla demo\$1schema.pk1:

```
SHOW CONSTRAINTS FOREIGN KEYS EXPORTED FROM TABLE demo_schema.pk1;
 pk_database_name | pk_schema_name | pk_table_name | pk_column_name | fk_database_name | fk_schema_name | fk_table_name | fk_column_name | key_seq |     fk_name     | pk_name  | update_rule | delete_rule | deferrability 
------------------+----------------+---------------+----------------+------------------+----------------+---------------+----------------+---------+-----------------+----------+-------------+-------------+---------------
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | fk2           | i              |       1 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | fk2           | j              |       2 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | fk2           | c              |       3 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | other_fk      | i              |       1 | other_fk_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | other_fk      | j              |       2 | other_fk_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | other_fk      | c              |       3 | other_fk_i_fkey | pk1_pkey |             |             |
```

# SHOW EXTERNAL TABLE
<a name="r_SHOW_EXTERNAL_TABLE"></a>

Muestra la definición de una tabla externa, incluidos los atributos de tabla y los atributos de columna. Puede utilizar la salida de la instrucción SHOW EXTERNAL TABLE para recrear la tabla. 

Para obtener más información acerca de la creación de tablas externas, consulte [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). 

## Sintaxis
<a name="r_SHOW_EXTERNAL_TABLE-synopsis"></a>

```
SHOW EXTERNAL TABLE [external_database].external_schema.table_name [ PARTITION ]
```

## Parameters
<a name="r_SHOW_EXTERNAL_TABLE-parameters"></a>

 *external\$1database*   
Se trata del nombre de la base de datos externa asociada. Este parámetro es opcional.

 *external\$1schema*   
Se trata del nombre del esquema externo asociado. 

 *table\$1name*   
Se trata del nombre de la tabla que se mostrará. 

PARTITION   
Muestra instrucciones ALTER TABLE para agregar particiones a la definición de la tabla. 

## Ejemplos
<a name="r_SHOW_EXTERNAL_TABLE-examples"></a>

Los siguientes ejemplos se basan en una tabla externa definida de la siguiente manera:

```
CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
     csmallint smallint,
     cint int,
     cbigint bigint,
     cfloat float4,
     cdouble float8,
     cchar char(10),
     cvarchar varchar(255),
     cdecimal_small decimal(18,9),
     cdecimal_big decimal(30,15),
     ctimestamp TIMESTAMP,
     cboolean boolean,
     cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime TIMESTAMP)
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';
```

A continuación, se presenta un ejemplo del comando SHOW EXTERNAL TABLE y la salida para la tabla `my_schema.alldatatypes_parquet_test_partitioned`.

```
SHOW EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned;
```

```
"CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime timestamp)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';"
```

A continuación, se presenta un ejemplo del comando SHOW EXTERNAL TABLE y la salida para la misma tabla, pero con la base de datos especificada también en el parámetro.

```
SHOW EXTERNAL TABLE my_database.my_schema.alldatatypes_parquet_test_partitioned;
```

```
"CREATE EXTERNAL TABLE my_database.my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime timestamp)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';"
```

A continuación, se presenta un ejemplo del comando SHOW EXTERNAL TABLE y la salida cuando se utiliza el parámetro `PARTITION`. La salida contiene instrucciones ALTER TABLE para agregar particiones a la definición de la tabla.

```
SHOW EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned PARTITION;
```

```
"CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';
ALTER TABLE my_schema.alldatatypes_parquet_test_partitioned ADD IF NOT EXISTS PARTITION (cdate='2021-01-01') LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned2/cdate=2021-01-01';
ALTER TABLE my_schema.alldatatypes_parquet_test_partitioned ADD IF NOT EXISTS PARTITION (cdate='2021-01-02') LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned2/cdate=2021-01-02';"
```

# SHOW DATABASES
<a name="r_SHOW_DATABASES"></a>

Muestra las bases de datos de un catálogo de datos o un almacenamiento de datos de Amazon Redshift. SHOW DATABASES enumera todas las bases de datos accesibles, como las que se encuentran dentro del almacenamiento de datos, las bases de datos de AWS Glue Data Catalog (awsdatacatalog), las bases de datos de uso compartido de datos y las bases de datos de Lake Formation.

## Permisos necesarios
<a name="r_SHOW_DATABASES-privileges"></a>

Los usuarios pueden ver todas las bases de datos, excepto:
+ En el caso de las bases de datos creadas a partir de un recurso compartido de datos con permisos para ser visibles, se debe conceder al usuario actual el permiso USAGE en la base de datos.

## Sintaxis
<a name="r_SHOW_DATABASES-syntax"></a>

Para mostrar las bases de datos de un almacenamiento de datos de Amazon Redshift:

```
SHOW DATABASES 
[ LIKE '<expression>' ]
[ LIMIT row_limit ]
```

Para mostrar las bases de datos de un catálogo de datos:

```
SHOW DATABASES FROM DATA CATALOG 
[ ACCOUNT  '<id1>', '<id2>', ... ]
[ LIKE '<expression>' ]
[ IAM_ROLE default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' ]
[ LIMIT row_limit ]
```

## Parameters
<a name="r_SHOW_DATABASES-parameters"></a>

ACCOUNT '<id1>', '<id2>', ...   
Las cuentas de AWS Glue Data Catalog desde las que se enumeran las bases de datos. La omisión de este parámetro indica que Amazon Redshift debe mostrar las bases de datos de la cuenta propietaria del clúster.

LIKE '<expresión>'  
Filtra la lista de bases de datos para obtener las que coinciden con la que especifica. Este parámetro admite patrones que utilizan los caracteres comodín % (porcentaje) y \$1 (subrayado).

IAM\$1ROLE default \$1 'SESSION' \$1 'arn:aws:iam::<id-cuenta>:role/<nombre-rol>'  
Si especifica un rol de IAM asociado al clúster al ejecutar el comando SHOW DATABASES, 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 la base de datos externa creada con el comando [CREATE DATABASE](r_CREATE_DATABASE.md). 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](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html), 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 las bases de datos creadas a partir AWS Glue Data Catalog de los recursos compartidos de datos y utilizar IAM\$1ROLE, consulte [Uso de los recursos compartidos de datos administrados por Lake Formation como consumidor](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html).  
A continuación se muestra la sintaxis de la cadena del parámetro IAM\$1ROLE 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](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 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](federated-create-secret-iam-role.md).   
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>'
```

LIMIT *row\$1limit*  
Cláusula para LIMITAR la cantidad de filas devueltas Donde *row\$1limit* es el número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000.

## Ejemplos
<a name="r_SHOW_DATABASES-examples"></a>

En el siguiente ejemplo, se muestran todas las bases de datos del catálogo de datos del ID de cuenta 123456789012.

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012'

  catalog_id  | database_name |                        database_arn                    |     type     |                                             target_database                                      | location | parameters
--------------+---------------+--------------------------------------------------------+--------------+--------------------------------------------------------------------------------------------------+----------+------------
 123456789012 |   database1   | arn:aws:glue:us-east-1:123456789012:database/database1 | Data Catalog |                                                                                                  |          |
 123456789012 |   database2   | arn:aws:glue:us-east-1:123456789012:database/database2 | Data Catalog | arn:aws:redshift:us-east-1:123456789012:datashare:035c45ea-61ce-86f0-8b75-19ac6102c3b7/database2 |          |
```

Los siguientes son ejemplos que demuestran cómo visualizar todas las bases de datos del catálogo de datos desde el ID de cuenta 123456789012 utilizando las credenciales de un rol de IAM.

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE default;
```

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE <iam-role-arn>;
```

En el siguiente ejemplo, se muestran todas las bases de datos del almacenamiento de datos de Amazon Redshift conectado.

```
SHOW DATABASES

database_name  | database_owner | database_type        | database_acl | parameters | database_isolation_level
---------------+----------------+----------------------+--------------+------------+--------------------
awsdatacatalog | 1              | auto mounted catalog | NULL         | UNKNOWN    | UNKNOWN
dev            | 1              | local                | NULL         | NULL       | Snapshot Isolation
```

# SHOW FUNCTIONS
<a name="r_SHOW_FUNCTIONS"></a>

Muestra una lista de funciones de un esquema, junto con información acerca de los objetos mostrados.

Cada fila de salida tiene las columnas database\$1name, schema\$1name, function\$1name, number\$1of\$1arguments, argument\$1list, return\$1type y comentarios.

Si SHOW FUNCTIONS diera como resultado más de 10 000 filas, el comando generaría un error.

## Permisos necesarios
<a name="r_SHOW_FUNCTIONS-required-permissions"></a>

Para ver una función en un esquema de Redshift, el usuario actual debe cumplir uno de los siguientes criterios:
+ Ser un superusuario
+ Ser el propietario de la función
+ Tener concedido el privilegio USAGE en el esquema principal y EXECUTE en la función

## Sintaxis
<a name="r_SHOW_FUNCTIONS-synopsis"></a>

```
SHOW FUNCTIONS FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_FUNCTIONS-parameters"></a>

*database\$1name*  
El nombre de la base de datos que contiene las funciones para mostrar.

*schema\$1name*  
El nombre del esquema que contiene las funciones para mostrar.

*filter\$1pattern*  
Una expresión de caracteres UTF-8 válida con un patrón para hacer coincidir los nombres de funciones. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_SHOW_FUNCTIONS.html)
Tenga en cuenta que filter\$1pattern solo coincide con el nombre de la función.

*row\$1limit*  
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000.

## Ejemplos
<a name="r_SHOW_FUNCTIONS-examples"></a>

En el ejemplo siguiente, se muestran las funciones del esquema demo\$1db.demo\$1schema:

```
SHOW FUNCTIONS FROM SCHEMA demo_db.demo_schema;
 database_name | schema_name |    function_name     | number_of_arguments |                                  argument_list                                  |    return_type    | remarks 
---------------+-------------+----------------------+---------------------+---------------------------------------------------------------------------------+-------------------+---------
 demo_db       | demo_schema | f2                   |                   6 | integer, character varying, numeric, date, timestamp without time zone, boolean | character varying | 
 demo_db       | demo_schema | f_calculate_discount |                   2 | numeric, integer                                                                | numeric           | 
 demo_db       | demo_schema | f_days_between       |                   2 | date, date                                                                      | integer           |
```

En el ejemplo siguiente, se muestran las funciones del esquema demo\$1schema con nombres que terminan en “discount”:

```
SHOW FUNCTIONS FROM SCHEMA demo_schema like '%discount';
 database_name | schema_name |    function_name     | number_of_arguments |  argument_list   | return_type | remarks 
---------------+-------------+----------------------+---------------------+------------------+-------------+---------
 demo_db       | demo_schema | f_calculate_discount |                   2 | numeric, integer | numeric     |
```

# SHOW GRANTS
<a name="r_SHOW_GRANTS"></a>

Muestra las concesiones para un usuario, rol u objeto. El objeto puede ser una base de datos, un esquema, una tabla, una función o una plantilla. Al especificar un objeto, como una tabla o una función, debe calificarlo con una notación de dos o tres partes. Por ejemplo, `schema_name.table_name` o `database_name.schema_name.table_name`.

Si SHOW GRANTS diera como resultado más de 10 000 filas, el comando generaría un error.

## Permisos necesarios
<a name="r_SHOW_GRANTS-permissions"></a>

Para ejecutar SHOW GRANTS para un usuario o rol de destino, el usuario actual debe cumplir uno de los siguientes criterios:
+ Ser un superusuario
+ Ser el usuario de destino
+ Ser el propietario del rol de destino
+ Ser a quien se le ha concedido el rol

SHOW GRANTS para un objeto de destino solo mostrará las concesiones que estén visibles para el usuario actual. El usuario actual podrá ver una concesión si cumple uno de los siguientes criterios:
+ Ser un superusuario
+ Ser el usuario de destino
+ Ser el propietario al que se le otorga el rol concedido
+ Ser a quien se le concede el rol al que se destina la concesión del objeto

## Sintaxis
<a name="r_SHOW_GRANTS-syntax"></a>

A continuación, se muestra la sintaxis para mostrar los permisos de un objeto. Tenga en cuenta que la segunda forma de especificar una función solo es válida para esquemas y bases de datos externos creados a partir de un recurso compartido de datos.

```
SHOW GRANTS ON
{
 DATABASE database_name |
 FUNCTION {database_name.schema_name.function_name | schema_name.function_name } ( [ [ argname ] argtype [, ...] ] ) |
 FUNCTION {database_name.schema_name.function_name | schema_name.function_name } |
 SCHEMA {database_name.schema_name | schema_name} | 
 { TABLE {database_name.schema_name.table_name | schema_name.table_name} | table_name }
 TEMPLATE {database_name.schema_name.template_name | template_name}
}
[FOR {username | ROLE role_name | PUBLIC}]
[LIMIT row_limit]
```

A continuación, se muestra la sintaxis para mostrar los permisos de un usuario o rol. 

```
SHOW GRANTS FOR
{username | ROLE role_name}
[FROM DATABASE database_name]
[LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_GRANTS-parameters"></a>

 *database\$1name*   
Nombre de la base de datos en la que se muestran las concesiones.

 *function\$1name*   
Nombre de la función en la que se muestran las concesiones.

template\$1name  
El nombre de la plantilla en la que se muestran las concesiones.

 *schema\$1name*   
Nombre del esquema en el que se muestran las concesiones.

 *table\$1name*   
Nombre de la tabla en la que se muestran las concesiones.

FOR *username*   
Indica que se muestran concesiones para un usuario.

FOR ROLE *role\$1name*   
Indica que se muestran concesiones para un rol.

FOR PUBLIC  
Indica que se muestran concesiones para PUBLIC.

 *row\$1limit*   
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000. 

## Ejemplos
<a name="r_SHOW_GRANTS-examples"></a>

El siguiente ejemplo muestra todas las concesiones en una base de datos denominada `dev`.

```
SHOW GRANTS on database demo_db;

  database_name | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | ALTER          |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | TRUNCATE       |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | DROP           |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | INSERT         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | TEMP           |           0 | public        | public        | f            | DATABASE        | dbadmin
 demo_db       | SELECT         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | UPDATE         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | DELETE         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | REFERENCES     |         112 | alice         | user          | f            | TABLES          | dbadmin
```

El siguiente comando muestra todas las concesiones en un esquema denominado `demo`.

```
SHOW GRANTS ON SCHEMA demo_schema;

 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | demo_schema | SCHEMA      | ALTER          |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | DROP           |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | USAGE          |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | CREATE         |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
```

El siguiente comando muestra todas las concesiones para un usuario denominado `alice`.

```
SHOW GRANTS FOR alice;

 database_name | schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | privilege_scope | grantor_name 
---------------+-------------+-------------+-------------+----------------+-------------+---------------+---------------+-----------------+--------------
 demo_db       |             |             | DATABASE    | INSERT         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | SELECT         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | UPDATE         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | DELETE         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | REFERENCES     |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | DROP           |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | TRUNCATE       |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | ALTER          |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | USAGE          |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | CREATE         |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | DROP           |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | ALTER          |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | INSERT         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | SELECT         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | UPDATE         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | DELETE         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | RULE           |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | REFERENCES     |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | TRIGGER        |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | DROP           |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | TRUNCATE       |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | ALTER          |         124 | alice         | user          | TABLE           | dbadmin
```

```
SHOW GRANTS FOR alice FROM DATABASE second_db;
 database_name | schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | privilege_scope | grantor_name 
---------------+-------------+-------------+-------------+----------------+-------------+---------------+---------------+-----------------+--------------
 second_db     | public      | t22         | TABLE       | SELECT         |         101 | alice         | user          | TABLE           | dbadmin
```

El siguiente comando muestra todas las concesiones en una tabla denominada `t3` para un usuario denominado `alice`. Tenga en cuenta que puede utilizar una notación de dos o tres partes para especificar el nombre de la tabla.

```
SHOW GRANTS ON TABLE demo_db.demo_schema.t3 FOR ALICE;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | t3          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin


SHOW GRANTS ON TABLE demo_schema.t3 FOR ALICE;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | t3          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
```

El siguiente ejemplo muestra todas las concesiones en una tabla denominada `t4`. Tenga en cuenta las diferentes formas en que puede especificar el nombre de la tabla.

```
SHOW GRANTS ON t4;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 public      | t4          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 
SHOW GRANTS ON TABLE public.t4;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 public      | t4          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
```

# SHOW MODEL
<a name="r_SHOW_MODEL"></a>

Muestra información útil sobre un modelo de machine learning, incluido el estado, los parámetros utilizados para crearlo y la función de predicción con los tipos de argumentos de entrada. Puede utilizar la información de SHOW MODEL para volver a crear el modelo. Si se han modificado las tablas base, cuando se ejecuta CREATE MODEL con la misma instrucción SQL, se obtiene un modelo diferente. La información que devuelve SHOW MODEL es diferente para el propietario del modelo y para un usuario con el privilegio EXECUTE. SHOW MODEL muestra diferentes salidas cuando un modelo se forma en Amazon Redshift o cuando el modelo es un modelo BYOM.

## Sintaxis
<a name="r_SHOW_MODEL-synopsis"></a>

```
SHOW MODEL ( ALL | model_name )
```

## Parameters
<a name="r_SHOW_MODEL-parameters"></a>

ALL   
Devuelve todos los modelos que el usuario puede utilizar y sus esquemas.

 *model\$1name*   
El nombre del modelo. El nombre del modelo en un esquema debe ser único.

## Notas de uso
<a name="r_SHOW_MODEL_usage_notes"></a>

El comando SHOW MODEL devuelve la siguiente información: 
+ El nombre del modelo.
+ El esquema en el que se creó el modelo.
+ El propietario del modelo.
+ La hora de creación del modelo.
+ El estado del modelo, como READY, TRAINING o FAILED.
+ El mensaje de motivo de un modelo que presente error.
+ El error de validación si el modelo finalizó la formación.
+ El costo estimado necesario para derivar el modelo para un enfoque distinto de BYOM. Solo el propietario del modelo puede ver esta información.
+ Una lista de parámetros especificados por el usuario y sus valores, concretamente los siguientes:
  + La columna TARGET especificada.
  + El tipo de modelo, AUTO o XGBoost.
  + El tipo de problema, como REGRESSION, BINARY\$1CLASSIFICATION, MULTICLASS\$1CLASSIFICATION. Este parámetro es específico para AUTO.
  + El nombre del trabajo de entrenamiento de Amazon SageMaker AI o del trabajo del Piloto automático de Amazon SageMaker AI que creó el modelo. Puede utilizar este nombre de trabajo para encontrar más información acerca del modelo en Amazon SageMaker AI.
  + El objetivo, como MSE, F1, Accuracy. Este parámetro es específico para AUTO.
  + El nombre de la función creada.
  + El tipo de inferencia, local o remota.
  + Los argumentos de entrada de la función de predicción.
  + Los tipos de argumentos de entrada de la función de predicción para modelos que no empleen el enfoque Bring your own model (BYOM).
  + El tipo de retorno de la función de predicción. Este parámetro es específico de BYOM.
  + El nombre del punto de conexión de Amazon SageMaker AI para un modelo BYOM con inferencia remota.
  + El rol de IAM. Solo el propietario del modelo puede ver esto.
  + El bucket de S3 utilizado. Solo el propietario del modelo puede ver esto.
  + La clave de AWS KMS, si se proporcionó una. Solo el propietario del modelo puede ver esto.
  + El tiempo máximo que se puede ejecutar el modelo.
+ Si el tipo de modelo no es AUTO, Amazon Redshift también muestra la lista de hiperparámetros proporcionados y sus valores.

También puede ver parte de la información proporcionada por SHOW MODEL en otras tablas de catálogo, como pg\$1proc. Amazon Redshift devuelve información sobre la función de predicción registrada en la tabla de catálogo pg\$1proc. Esta información incluye los nombres de los argumentos de entrada y los tipos para la función de predicción. Amazon Redshift devuelve la misma información en el comando SHOW MODEL.

```
SELECT * FROM pg_proc WHERE proname ILIKE '%<function_name>%';
```

## Ejemplos
<a name="r_SHOW_MODEL-examples"></a>

En el siguiente ejemplo, se muestra la salida de SHOW MODEL.

```
SHOW MODEL ALL;

Schema Name |  Model Name
------------+---------------
 public     | customer_churn
```

El propietario de customer\$1churn puede ver la siguiente salida. Un usuario que tiene solo el privilegio EXECUTE no puede ver el rol de IAM, el bucket de Amazon S3 ni el costo estimado del modo.

```
SHOW MODEL customer_churn;

       Key                 |           Value
---------------------------+-----------------------------------
 Model Name                | customer_churn
 Schema Name               | public
 Owner                     | 'owner'
 Creation Time             | Sat, 15.01.2000 14:45:20
 Model State               | READY
 validation:F1             | 0.855
 Estimated Cost            | 5.7
                           |
 TRAINING DATA:            |
 Table                     | customer_data
 Target Column             | CHURN
                           |
 PARAMETERS:               |
 Model Type                | auto
 Problem Type              | binary_classification
 Objective                 | f1
 Function Name             | predict_churn
 Function Parameters       | age zip average_daily_spend average_daily_cases
 Function Parameter Types  | int int float float
 IAM Role                  | 'iam_role'
 KMS Key                   | 'kms_key'
 Max Runtime               | 36000
```

# SHOW DATASHARES
<a name="r_SHOW_DATASHARES"></a>

Muestra los datashares entrantes y salientes en un clúster desde la misma cuenta o entre cuentas. Si no especifica un nombre de datashare, Amazon Redshift mostrará todos los datashares de todas las bases de datos en el clúster. Los usuarios que tengan los privilegios ALTER y SHARE pueden ver los datashares para los que tienen privilegios. 

## Sintaxis
<a name="r_SHOW_DATASHARES-synopsis"></a>

```
SHOW DATASHARES [ LIKE 'namepattern' ] 
```

## Parameters
<a name="r_SHOW_DATASHARES-parameters"></a>

LIKE  
Se trata de una cláusula opcional que compara el patrón de nombre especificado con la descripción del datashare. Cuando se utiliza esta cláusula, Amazon Redshift muestra solo los datashares con nombres que coinciden con el patrón de nombre especificado.

*namepattern*  
Se trata del nombre del datashare solicitado o parte del nombre que coincidirá mediante caracteres comodín.

## Ejemplos
<a name="r_SHOW_DATASHARES-examples"></a>

En el siguiente ejemplo, se muestran los datashares entrantes y salientes de un clúster. 

```
SHOW DATASHARES;
SHOW DATASHARES LIKE 'sales%';

share_name   | share_owner | source_database | consumer_database | share_type | createdate          | is_publicaccessible | share_acl | producer_account |           producer_namespace
-------------+-------------+-----------------+-------------------+------------+---------------------+---------------------+-----------+------------------+---------------------------------------
'salesshare' | 100         | dev             |                   | outbound   | 2020-12-09 01:22:54.| False               |           |   123456789012   | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d
```

# SHOW PARAMETERS
<a name="r_SHOW_PARAMETERS"></a>

Muestra una lista de parámetros de una función o procedimiento, junto con información sobre los parámetros.

Cada fila de salida tiene las columnas database\$1name, schema\$1name, procedure\$1name o function\$1name, parameter\$1name, ordinal\$1position, parameter\$1type (DENTRO/FUERA), data\$1type, character\$1maximum\$1length, numeric\$1precision, numeric\$1scale y comentarios.

## Permisos necesarios
<a name="r_SHOW_PARAMETERS-required-permissions"></a>

Para ver una función o procedimiento en un esquema de Redshift, el usuario actual debe cumplir uno de los siguientes criterios:
+ Ser un superusuario
+ Ser el propietario de la función
+ Tener concedido el privilegio USAGE en el esquema principal y EXECUTE en la función

## Sintaxis
<a name="r_SHOW_PARAMETERS-synopsis"></a>

```
SHOW PARAMETERS OF {FUNCTION| PROCEDURE}
[database_name.]schema_name.function_name(argtype [, ...] )
[LIKE 'filter_pattern'];
```

## Parameters
<a name="r_SHOW_PARAMETERS-parameters"></a>

*database\$1name*  
El nombre de la base de datos que contiene la función para mostrar.

*schema\$1name*  
El nombre del esquema que contiene la función para mostrar.

*filter\$1pattern*  
Expresión de caracteres UTF-8 válida con un patrón para hacer coincidir los nombres de tabla. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_SHOW_PARAMETERS.html)

## Ejemplos
<a name="r_SHOW_PARAMETERS-examples"></a>

En el ejemplo siguiente, se muestran los parámetros del procedimiento demo\$1db.demo\$1schema.f1:

```
SHOW PARAMETERS OF PROCEDURE demo_db.demo_schema.f1(VARCHAR, DECIMAL, DECIMAL, DECIMAL);
 database_name | schema_name | procedure_name |  parameter_name  | ordinal_position | parameter_type |          data_type          | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+----------------+------------------+------------------+----------------+-----------------------------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f1             | operation        |                1 | IN             | character varying           |                       10 |                   |              
 demo_db       | demo_schema | f1             | value1           |                2 | IN             | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | value2           |                3 | IN             | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | result           |                4 | INOUT          | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | operation_status |                5 | OUT            | character varying           |                       50 |                   |              
 demo_db       | demo_schema | f1             | calculation_time |                6 | OUT            | timestamp without time zone |                          |                   |              
 demo_db       | demo_schema | f1             | is_successful    |                7 | OUT            | boolean                     |                          |                   |
```

En el ejemplo siguiente, se muestran los parámetros del procedimiento demo\$1schema.f1 con nombres que comienzan por “val”:

```
SHOW PARAMETERS OF PROCEDURE demo_schema.f1(VARCHAR, DECIMAL, DECIMAL, DECIMAL) like 'val%';
 database_name | schema_name | procedure_name | parameter_name | ordinal_position | parameter_type | data_type | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+----------------+----------------+------------------+----------------+-----------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f1             | value1         |                2 | IN             | numeric   |                          |                18 |             0
 demo_db       | demo_schema | f1             | value2         |                3 | IN             | numeric   |                          |                18 |             0
```

En el ejemplo siguiente, se muestran los parámetros de la función demo\$1schema.f2:

```
SHOW PARAMETERS OF FUNCTION demo_schema.f2(INT, VARCHAR, DECIMAL, DATE, TIMESTAMP, BOOLEAN);
 database_name | schema_name | function_name | parameter_name  | ordinal_position | parameter_type |          data_type          | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+---------------+-----------------+------------------+----------------+-----------------------------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f2            |                 |                0 | RETURN         | character varying           |                       -1 |                   |              
 demo_db       | demo_schema | f2            | int_param       |                1 | IN             | integer                     |                          |                32 |             0
 demo_db       | demo_schema | f2            | varchar_param   |                2 | IN             | character varying           |                       -1 |                   |              
 demo_db       | demo_schema | f2            | decimal_param   |                3 | IN             | numeric                     |                          |                   |              
 demo_db       | demo_schema | f2            | date_param      |                4 | IN             | date                        |                          |                   |              
 demo_db       | demo_schema | f2            | timestamp_param |                5 | IN             | timestamp without time zone |                          |                   |              
 demo_db       | demo_schema | f2            | boolean_param   |                6 | IN             | boolean                     |                          |                   |
```

# SHOW POLICIES
<a name="r_SHOW_POLICIES"></a>

Muestra las políticas de seguridad a nivel de fila (RLS) y de enmascaramiento dinámico de datos (DDM) definidas en una base de datos, así como las políticas de RLS y DDM aplicadas a relaciones específicas. Solo un superusuario o un usuario con el rol `sys:secadmin` en la base de datos puede ver los resultados de estas políticas.

## Sintaxis
<a name="r_SHOW_POLICIES-synopsis"></a>

```
SHOW { RLS | MASKING } POLICIES
[
    ON { database_name.schema_name.relation_name
       | schema_name.relation_name
       }
    [ FOR { user_name | ROLE role_name | PUBLIC } ]
  |
    FROM DATABASE database_name
]
[ LIMIT row_limit ];
```

## Parameters
<a name="r_SHOW_POLICIES-parameters"></a>

*database\$1name*  
El nombre de la base de datos de la que se muestran las políticas.

*schema\$1name*  
Nombre de esquema de la relación en la que se muestran las políticas asociadas.

*relation\$1name*  
El nombre de la relación en la que se muestran las políticas asociadas.

*user\$1name*  
El nombre del usuario para el que está asociada la política sobre la relación.

*role\$1name*  
El nombre del rol para el que está asociada la política sobre la relación.

*row\$1limit*  
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000.

**nota**  
El catálogo de permisos federados de Amazon Redshift admite mostrar políticas de una base de datos diferente de la base de datos conectada. El comando SHOW POLICIES admite consultas entre bases de datos para todas las bases de datos de almacenes con permisos federados de Amazon Redshift

## Ejemplos
<a name="r_SHOW_POLICIES-examples"></a>

El comando siguiente muestra las políticas de RLS de la base de datos conectada.

```
SHOW RLS POLICIES;

  policy_name   | policy_alias |                           policy_atts                            |                                                                  policy_qual                                                                         | policy_enabled | policy_modified_by |    policy_modified_time    
----------------+--------------+------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+--------------------+----------------------------
 policy_america | rls_table    | [{"colname":"region","type":"character varying(10)"}]            | (("rls_table"."region" = CAST('USA' AS TEXT)) OR ("rls_table"."region" = CAST('CANADA' AS TEXT)) OR ("rls_table"."region" = CAST('Mexico' AS TEXT))) | t              | admin              | 2025-11-07 14:57:27
```

El comando siguiente muestra las políticas de enmascaramiento de la base de datos “sales\$1db.finance-catalog”.

```
SHOW MASKING POLICIES FROM DATABASE "sales_db@finance-catalog";

  policy_name  |                          input_columns                           |                                                  policy_expression                                                  | policy_modified_by |    policy_modified_time    
---------------+------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+----------------------------
 hash_credit   | [{"colname":"credit_card","type":"character varying(256)"}]      | [{"expr":"SHA2((\"masked_table\".\"credit_card\" + CAST('testSalt' AS TEXT)), CAST(256 AS INT4))","type":"text"}]   | admin              | 2025-11-07 16:05:54
 hash_username | [{"colname":"username","type":"character varying(256)"}]         | [{"expr":"SHA2((\"masked_table\".\"username\" + CAST('otherTestSalt' AS TEXT)), CAST(256 AS INT4))","type":"text"}] | admin              | 2025-11-07 16:07:08
(2 rows)
```

El comando siguiente muestra las políticas de RLS asociadas a la relación sales\$1table.

```
SHOW RLS POLICIES ON sales_schema.sales_table;

  policy_name   | schema_name  | relation_name | relation_kind | grantor  |          grantee          | grantee_kind | is_policy_on | is_rls_on | rls_conjunction_type 
----------------+--------------+---------------+---------------+----------+---------------------------+--------------+--------------+-----------+----------------------
 policy_global  | sales_schema | sales_table   | table         | admin    | sales_analyst_role_global | role         | t            | t         | and
 policy_america | sales_schema | sales_table   | table         | admin    | sales_analyst_usa         | user         | t            | t         | and
```

El comando siguiente muestra las políticas de enmascaramiento asociadas a la relación transaction\$1table de la base de datos “sales\$1db.finance-catalog”.

```
SHOW MASKING POLICIES ON "sales_db@finance-catalog".sales_schema.transaction_table LIMIT 1;

  policy_name  | schema_name  |   relation_name   | relation_type | grantor  |         grantee          | grantee_type | priority |   input_columns   |   output_columns   
---------------+--------------+-------------------+---------------+----------+--------------------------+--------------+----------+-------------------+-------------------
 hash_username | sales_schema | transaction_table | table         | admin    | transaction_analyst_role | role         |      100 | ["user_name"]     | ["user_name"]
```

El comando siguiente muestra las políticas de RLS asociadas a la relación sales\$1table de la base de datos “sales\$1db.finance-catalog” para el usuario “IAMR:sales\$1analyst\$1usa”.

```
SHOW RLS POLICIES ON "sales_db@finance-catalog".sales_schema.sales_table FOR "IAMR:sales_analyst_usa";

  policy_name   | schema_name  | relation_name | relation_kind | grantor  |      grantee           | grantee_kind | is_policy_on | is_rls_on | rls_conjunction_type 
----------------+--------------+---------------+---------------+----------+------------------------+--------------+--------------+-----------+----------------------
 policy_america | sales_schema | sales_table   | table         | admin    | IAMR:sales_analyst_usa | user         | t            | t         | and
```

El comando siguiente muestra las políticas de RLS asociadas a la relación transaction\$1table de la base de datos “sales\$1db.finance-catalog” para el rol transaction\$1analyst\$1role”.

```
SHOW MASKING POLICIES ON sales_schema.transaction_table FOR ROLE transaction_analyst_role;

  policy_name  | schema_name  |   relation_name   | relation_type | grantor  |         grantee          | grantee_type | priority | input_columns | output_columns 
---------------+--------------+-------------------+---------------+----------+--------------------------+--------------+----------+---------------+----------------
 hash_username | sales_schema | transaction_table | table         | admin    | transaction_analyst_role | role         |      100 | ["user_name"] | ["user_name"]
```

# SHOW PROCEDURE
<a name="r_SHOW_PROCEDURE"></a>

Muestra la definición de un procedimiento almacenado dado, incluida su firma. Puede utilizar la salida de un SHOW PROCEDURE para recrear el procedimiento almacenado. 

## Sintaxis
<a name="r_SHOW_PROCEDURE-synopsis"></a>

```
SHOW PROCEDURE sp_name [( [ [ argname ] [ argmode ] argtype [, ...] ] )]
```

## Parameters
<a name="r_SHOW_PROCEDURE-parameters"></a>

 *sp\$1name*   
El nombre del procedimiento que debe mostrarse. 

*[argname] [ argmode] argtype*   
Tipos de argumento de entrada para identificar el procedimiento almacenado. De manera opción, puede incluir los tipos de datos del argumento completo, incluidos los argumentos OUT. Esta parte es opcional si el nombre del procedimiento almacenado es único (esto es, no está sobrecargado).

## Ejemplos
<a name="r_SHOW_PROCEDURE-examples"></a>

En el siguiente ejemplo, se muestra la definición del procedimiento `test_spl2`.

```
show procedure test_sp2(int, varchar);
                                        Stored Procedure Definition
------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE public.test_sp2(f1 integer, INOUT f2 character varying, OUT character varying)
LANGUAGE plpgsql
AS $_$
DECLARE
out_var alias for $3;
loop_var int;
BEGIN
IF f1 is null OR f2 is null THEN
RAISE EXCEPTION 'input cannot be null';
END IF;
CREATE TEMP TABLE etl(a int, b varchar);
FOR loop_var IN 1..f1 LOOP
insert into etl values (loop_var, f2);
f2 := f2 || '+' || f2;
END LOOP;
SELECT INTO out_var count(*) from etl;
END;
$_$

(1 row)
```

# SHOW PROCEDURES
<a name="r_SHOW_PROCEDURES"></a>

Muestra una lista de procedimientos de un esquema, junto con información acerca de los objetos mostrados.

Cada fila de salida tiene columnas `database_name`, `schema_name`, `procedure_name`, `number_of_arguments`, `argument_list`, `return_type`, comentarios.

Si SHOW PROCEDURES diera como resultado más de 10 000 filas, el comando generaría un error.

## Permisos necesarios
<a name="r_SHOW_PROCEDURES-required-permissions"></a>

Para ver un procedimiento en un esquema de Redshift, el usuario actual debe cumplir uno de los siguientes criterios:
+ Ser un superusuario
+ Ser el propietario del procedimiento
+ Tener concedido el privilegio USAGE en el esquema principal y EXECUTE en el procedimiento

## Sintaxis
<a name="r_SHOW_PROCEDURES-synopsis"></a>

```
SHOW PROCEDURES FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_PROCEDURES-parameters"></a>

database\$1name  
El nombre de la base de datos que contiene los procedimientos a mostrar.

schema\$1name  
El nombre del esquema que contiene los procedimientos a mostrar.

filter\$1pattern  
Una expresión de caracteres UTF-8 válida con un patrón para hacer coincidir los nombres del procedimiento. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_SHOW_PROCEDURES.html)
Tenga en cuenta que filter\$1pattern solo coincide con el nombre del procedimiento.

row\$1limit  
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000.

## Ejemplos
<a name="r_SHOW_PROCEDURES-examples"></a>

En el ejemplo siguiente, se muestran los procedimientos del esquema demo\$1db.demo\$1schema:

```
SHOW PROCEDURES FROM SCHEMA demo_db.demo_schema;
 database_name | schema_name |  procedure_name   | number_of_arguments |                argument_list                 |                           return_type                            | remarks 
---------------+-------------+-------------------+---------------------+----------------------------------------------+------------------------------------------------------------------+---------
 demo_db       | demo_schema | f1                |                   4 | character varying, numeric, numeric, numeric | numeric, character varying, timestamp without time zone, boolean | 
 demo_db       | demo_schema | sp_get_result_set |                   2 | integer, refcursor                           | refcursor                                                        | 
 demo_db       | demo_schema | sp_process_data   |                   2 | numeric, numeric                             | numeric, character varying                                       |
```

En el ejemplo siguiente, se muestran los procedimientos del esquema demo\$1schema con nombres que terminan en “data”:

```
SHOW PROCEDURES FROM SCHEMA demo_schema like '%data';
 database_name | schema_name | procedure_name  | number_of_arguments |  argument_list   |        return_type         | remarks 
---------------+-------------+-----------------+---------------------+------------------+----------------------------+---------
 demo_db       | demo_schema | sp_process_data |                   2 | numeric, numeric | numeric, character varying |
```

# MOSTRAR ESQUEMAS
<a name="r_SHOW_SCHEMAS"></a>

Muestra una lista de esquemas de una base de datos, junto con algunos atributos de esquema.

Cada fila de salida consta del nombre de base de datos, el nombre de esquema, el propietario de esquema, el tipo de esquema, la ACL de esquema, la base de datos de origen y la opción de esquema. Para obtener más información sobre estos atributos, consulte [SVV\$1ALL\$1SCHEMAS](r_SVV_ALL_SCHEMAS.md).

Si el comando SHOW SCHEMAS puede dar como resultado más de 10 000 esquemas, se devuelve un error.

## Permisos necesarios
<a name="r_SHOW_SCHEMAS-privileges"></a>

Para ver un esquema de una tabla de Amazon Redshift, el usuario actual debe cumplir uno de los siguientes criterios:
+ Ser un superusuario.
+ Ser el nuevo propietario del esquema.
+ Tener concedido el privilegio USAGE en el esquema.

## Sintaxis
<a name="r_SHOW_SCHEMAS-synopsis"></a>

```
SHOW SCHEMAS FROM DATABASE database_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parameters
<a name="r_SHOW_SCHEMAS-parameters"></a>

 *database\$1name*   
Nombre de la base de datos que contiene las tablas que se enumerarán.   
Para mostrar tablas en un AWS Glue Data Catalog, especifique (`awsdatacatalog`) como nombre de base de datos y asegúrese de que la configuración del sistema `data_catalog_auto_mount` está establecida a `true`. Para obtener más información, consulte [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *filter\$1pattern*   
Expresión de caracteres UTF-8 válida con un patrón para hacer coincidir los nombres de esquema. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_SHOW_SCHEMAS.html)
Si *filter\$1pattern* no contiene metacaracteres, solo representa la propia cadena; en ese caso, LIKE actúa igual que el operador de igualdad. 

 *row\$1limit*   
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000. 

## Ejemplos
<a name="r_SHOW_SCHEMAS-examples"></a>

En el siguiente ejemplo se muestran los esquemas de la base de datos de Amazon Redshift denominada `dev`.

```
SHOW SCHEMAS FROM DATABASE dev;

 database_name |     schema_name      | schema_owner | schema_type |         schema_acl          | source_database | schema_option 
---------------+----------------------+--------------+-------------+-----------------------------+-----------------+---------------
 dev           | pg_automv            |            1 | local       |                             |                 | 
 dev           | pg_catalog           |            1 | local       | jpuser=UC/jpuser~=U/jpuser  |                 | 
 dev           | public               |            1 | local       | jpuser=UC/jpuser~=UC/jpuser |                 | 
 dev           | information_schema   |            1 | local       | jpuser=UC/jpuser~=U/jpuser  |                 | 
 dev           | schemad79cd6d93bf043 |            1 | local       |                             |                 |
```

En el siguiente ejemplo se muestran los esquemas de la base de datos de AWS Glue Data Catalog denominada `awsdatacatalog`. El número máximo de filas de salida es `5`.

```
SHOW SCHEMAS FROM DATABASE awsdatacatalog LIMIT 5;

 database_name  |     schema_name      | schema_owner | schema_type | schema_acl | source_database | schema_option 
----------------+----------------------+--------------+-------------+------------+-----------------+---------------
 awsdatacatalog | 000_too_many_glue_db |              | EXTERNAL    |            |                 | 
 awsdatacatalog | 123_default          |              | EXTERNAL    |            |                 | 
 awsdatacatalog | adhoc                |              | EXTERNAL    |            |                 | 
 awsdatacatalog | all_shapes_10mb      |              | EXTERNAL    |            |                 | 
 awsdatacatalog | all_shapes_1g        |              | EXTERNAL    |            |                 |
```

# SHOW TABLE
<a name="r_SHOW_TABLE"></a>

Muestra la definición de una tabla, incluidos los atributos de tabla, las restricciones de tabla, los atributos de columna, la intercalación de columnas y las restricciones de columnas. Puede utilizar la salida de la instrucción SHOW TABLE para recrear la tabla. 

Para obtener más información acerca de la creación de tablas, consulte [CREATE TABLE](r_CREATE_TABLE_NEW.md). 

## Sintaxis
<a name="r_SHOW_TABLE-synopsis"></a>

```
SHOW TABLE [schema_name.]table_name 
```

## Parameters
<a name="r_SHOW_TABLE-parameters"></a>

 *schema\$1name*   
(Opcional) Se trata del nombre del esquema relacionado. 

 *table\$1name*   
Se trata del nombre de la tabla que se mostrará. 

## Ejemplos
<a name="r_SHOW_TABLE-examples"></a>

A continuación, se presenta un ejemplo de la salida de SHOW TABLE para la tabla `sales`.

```
show table sales;
```

```
CREATE TABLE public.sales (
salesid integer NOT NULL ENCODE az64,
listid integer NOT NULL ENCODE az64 distkey,
sellerid integer NOT NULL ENCODE az64,
buyerid integer NOT NULL ENCODE az64,
eventid integer NOT NULL ENCODE az64,
dateid smallint NOT NULL,
qtysold smallint NOT NULL ENCODE az64,
pricepaid numeric(8,2) ENCODE az64,
commission numeric(8,2) ENCODE az64,
saletime timestamp without time zone ENCODE az64
)
DISTSTYLE KEY SORTKEY ( dateid );
```

A continuación, se presenta un ejemplo de la salida de SHOW TABLE para la tabla `category` en el esquema `public`. La intercalación de la base de datos es CASE\$1SENSITIVE.

```
show table public.category;
```

```
CREATE TABLE public.category (
catid smallint NOT NULL distkey,
catgroup character varying(10) ENCODE lzo COLLATE case_sensitive,
catname character varying(10) ENCODE lzo COLLATE case_sensitive,
catdesc character varying(50) ENCODE lzo COLLATE case_sensitive
) 
DISTSTYLE KEY SORTKEY ( catid );
```

En el siguiente ejemplo, se crea la tabla `foo` con una clave principal.

```
create table foo(a int PRIMARY KEY, b int);
```

Los resultados de SHOW TABLE muestran la instrucción de creación con todas las propiedades de la tabla `foo`.

```
show table foo;
```

```
CREATE TABLE public.foo ( 
a integer NOT NULL ENCODE az64, 
b integer ENCODE az64, PRIMARY KEY (a) 
) 
DISTSTYLE AUTO;
```

En este ejemplo, creamos una tabla en la que la columna `a` hereda la intercalación CASE\$1SENSITIVE predeterminada de la base de datos, mientras que `b` y `c` se establecen explícitamente en la intercalación CASE\$1INSENSITIVE.

```
CREATE TABLE public.foo (
a CHAR, 
b VARCHAR(10) COLLATE CASE_INSENSITIVE, 
c SUPER COLLATE CASE_INSENSITIVE
);
```

Los resultados de SHOW TABLE muestran la instrucción de creación con todas las propiedades de la tabla `foo`.

```
show table public.foo;
```

```
CREATE TABLE public.foo (
a character(1) ENCODE lzo COLLATE case_sensitive,
b character varying(10) ENCODE lzo COLLATE case_insensitive,
c super COLLATE case_insensitive
)
DISTSTYLE AUTO;
```

# SHOW TABLES
<a name="r_SHOW_TABLES"></a>

Muestra una lista de tablas de un esquema, junto con algunos atributos de tabla.

Cada fila de salida consta del nombre de base de datos, el nombre de esquema, el nombre de tabla, el tipo de tabla, la ACL de tabla, los comentarios, el propietario de tabla, la última vez que se cambió, la última vez que se modificó, dist\$1style y el subtipo de tabla. Para obtener más información sobre estos atributos, consulte [SVV\$1ALL\$1TABLES](r_SVV_ALL_TABLES.md).

Las marcas temporales de modificación y cambio pueden retrasarse aproximadamente 20 minutos con respecto a las actualizaciones de la tabla.

Si el comando SHOW TABLES diera como resultado más de 10 000 tablas, se devolvería un error.

## Permisos necesarios
<a name="r_SHOW_TABLES-privileges"></a>

Para ver una tabla de un esquema de Amazon Redshift, el usuario actual debe cumplir uno de los siguientes criterios:
+ Ser un superusuario.
+ Ser el propietario de la tabla.
+ Tener concedido el privilegio USAGE en el esquema principal y el privilegio SELECT en la tabla o el privilegio SELECT en cualquier columna de la tabla.

## Sintaxis
<a name="r_SHOW_TABLES-synopsis"></a>

```
SHOW TABLES FROM SCHEMA database_name.schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parameters
<a name="r_SHOW_TABLES-parameters"></a>

 *database\$1name*   
Nombre de la base de datos que contiene las tablas que se enumerarán.   
Para mostrar tablas en un AWS Glue Data Catalog, especifique (`awsdatacatalog`) como nombre de base de datos y asegúrese de que la configuración del sistema `data_catalog_auto_mount` está establecida a `true`. Para obtener más información, consulte [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *schema\$1name*   
Nombre del esquema que contiene las tablas que se enumerarán.   
Para mostrar las tablas de AWS Glue Data Catalog, indique el nombre de la base de datos de AWS Glue como nombre del esquema.

 *filter\$1pattern*   
Expresión de caracteres UTF-8 válida con un patrón para hacer coincidir los nombres de tabla. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_SHOW_TABLES.html)
Si *filter\$1pattern* no contiene metacaracteres, solo representa la propia cadena; en ese caso, LIKE actúa igual que el operador de igualdad. 

 *row\$1limit*   
Número máximo de filas que se devolverán. El valor de *row\$1limit* está entre 0 y 10 000. 

## Ejemplos
<a name="r_SHOW_TABLES-examples"></a>

```
SHOW TABLES FROM SCHEMA s1;

 database_name | schema_name |    table_name     | table_type |              table_acl              | remarks | owner |     last_altered_time      |     last_modified_time     | dist_style |   table_subtype   
---------------+-------------+-------------------+------------+-------------------------------------+---------+-------+----------------------------+----------------------------+------------+-------------------
 dev           | s1          | late_binding_view | VIEW       | alice=arwdRxtDPA/alice~bob=d/alice  |         | alice |                            |                            |            | LATE BINDING VIEW
 dev           | s1          | manual_mv         | VIEW       | alice=arwdRxtDPA/alice~bob=P/alice  |         | alice |                            |                            |            | MATERIALIZED VIEW
 dev           | s1          | regular_view      | VIEW       | alice=arwdRxtDPA/alice~bob=r/alice  |         | alice |                            |                            |            | REGULAR VIEW
 dev           | s1          | test_table        | TABLE      | alice=arwdRxtDPA/alice~bob=rw/alice |         | alice | 2025-11-18 15:52:00.010452 | 2025-11-18 15:44:34.856073 | AUTO (ALL) | REGULAR TABLE
```

```
SHOW TABLES FROM SCHEMA dev.s1 LIKE '%view' LIMIT 1;

 database_name | schema_name |    table_name     | table_type |              table_acl               | remarks | owner | last_altered_time | last_modified_time | dist_style |   table_subtype   
---------------+-------------+-------------------+------------+--------------------------------------+---------+-------+-------------------+--------------------+------------+-------------------
 dev           | s1          | late_binding_view | VIEW       | {alice=arwdRxtDPA/alice,bob=d/alice} |         | alice |                   |                    |            | LATE BINDING VIEW
```

# SHOW TEMPLATE
<a name="r_SHOW_TEMPLATE"></a>

Muestra la definición completa de una plantilla, incluido el nombre completo (base de datos, esquema y nombre de la plantilla) y todos los parámetros. El resultado es una instrucción CREATE TEMPLATE válida que puede utilizar para volver a crear la plantilla o crear una plantilla similar con modificaciones. 

Para obtener más información sobre la creación de plantillas, consulte [CREATE TEMPLATE](r_CREATE_TEMPLATE.md). 

## Permisos necesarios
<a name="r_SHOW_TEMPLATE-privileges"></a>

Para ver la definición de una plantilla, debe tener una de las siguientes opciones:
+ Privilegios de superusuario
+ Privilegio USAGE sobre la plantilla y privilegio USAGE sobre el esquema que contiene la plantilla

## Sintaxis
<a name="r_SHOW_TEMPLATE-synopsis"></a>

```
SHOW TEMPLATE [database_name.][schema_name.]template_name;
```

## Parameters
<a name="r_SHOW_TEMPLATE-parameters"></a>

 *database\$1name*   
(Opcional) El nombre de la base de datos en la que se crea la plantilla. Si no se especifica, se utiliza la base de datos actual. 

 *schema\$1name*   
(Opcional) El nombre del esquema en el que se crea la plantilla. Si no se especifica, la plantilla se busca en la ruta de búsqueda actual. 

 *template\$1name*   
El nombre de la plantilla. 

## Ejemplos
<a name="r_SHOW_TEMPLATE-examples"></a>

En el siguiente ejemplo se muestra el resultado de SHOW TEMPLATE para la plantilla `test_template`:

```
CREATE TEMPLATE test_template FOR COPY AS NOLOAD DELIMITER ',' ENCODING UTF16 ENCRYPTED;
```

```
SHOW TEMPLATE test_template;

CREATE OR REPLACE TEMPLATE dev.public.test_template FOR COPY AS ENCRYPTED NOLOAD ENCODING UTF16 DELIMITER ',';
```

En el siguiente ejemplo, se crea una plantilla `demo_template` en el esquema `demo_schema`.

```
CREATE OR REPLACE TEMPLATE demo_schema.demo_template FOR COPY AS
ACCEPTANYDATE ACCEPTINVCHARS DATEFORMAT 'DD-MM-YYYY' EXPLICIT_IDS ROUNDEC
TIMEFORMAT  AS 'DD.MM.YYYY HH:MI:SS' TRUNCATECOLUMNS NULL  AS 'null_string';
```

```
SHOW TEMPLATE demo_schema.demo_template;

CREATE OR REPLACE TEMPLATE dev.demo_schema.demo_template FOR COPY AS TRUNCATECOLUMNS NULL 'null_string' EXPLICIT_IDS TIMEFORMAT 'DD.MM.YYYY HH:MI:SS' ACCEPTANYDATE ROUNDEC ACCEPTINVCHARS DATEFORMAT 'DD-MM-YYYY';
```

# SHOW TEMPLATES
<a name="r_SHOW_TEMPLATES"></a>

Muestra una lista de plantillas en un esquema, junto con sus atributos.

Cada fila de salida consta del nombre de la plantilla, el ID de la plantilla, el tipo de plantilla, el propietario de la plantilla, el nombre de la base de datos, el nombre del esquema, la hora de creación, la hora de la última modificación y quién realizó la última modificación. 

Para obtener información detallada sobre las plantillas, incluidos los parámetros de las plantillas, consulte [SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md).

## Permisos necesarios
<a name="r_SHOW_TEMPLATES-privileges"></a>

Para ver las plantillas de un esquema de Amazon Redshift, debe tener una de las siguientes opciones:
+ Privilegios de superusuario
+ Privilegio USAGE sobre el esquema que contiene las plantillas

## Sintaxis
<a name="r_SHOW_TEMPLATES-synopsis"></a>

```
SHOW TEMPLATES FROM SCHEMA [database_name.]schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ];
```

## Parameters
<a name="r_SHOW_TEMPLATES-parameters"></a>

 *database\$1name*   
(Opcional) El nombre de la base de datos que contiene las plantillas que se van a enumerar. Si no se proporciona, utiliza la base de datos actual.

 *schema\$1name*   
El nombre del esquema que contiene las plantillas que se enumerarán. 

 *filter\$1pattern*   
(Opcional) Una expresión de caracteres UTF-8 válida con un patrón que coincida con los nombres de las plantillas. La opción LIKE realiza una coincidencia que distingue entre mayúsculas y minúsculas y admite los siguientes metacaracteres de coincidencia de patrones:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/r_SHOW_TEMPLATES.html)
Si *filter\$1pattern* no contiene metacaracteres, solo representa la propia cadena; en ese caso, LIKE actúa igual que el operador de igualdad. 

 *row\$1limit*   
Número máximo de filas que se devolverán. El rango válido es de 0 al límite de la plantilla en el clúster (el valor predeterminado es 1000).

## Ejemplos
<a name="r_SHOW_TEMPLATES-examples"></a>

```
SHOW TEMPLATES FROM SCHEMA s1;

 template_name          | template_id | template_type | template_owner | database_name | schema_name |        create_time         |     last_modified_time     | last_modified_by
------------------------+-------------+---------------+----------------+---------------+-------------+----------------------------+----------------------------+------------------
 template_maxerror      |      107685 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:10.514076 | 2025-12-16 19:31:10.514076 |              100
 json_template          |      107687 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:33.229566 | 2025-12-16 19:31:33.229567 |              100
 noload_template        |      107686 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:17.370547 | 2025-12-16 19:31:17.370547 |              100
 csv_delimiter_template |      107688 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:42.354044 | 2025-12-16 19:31:42.354045 |              100
```

```
SHOW TEMPLATES FROM SCHEMA dev.s1 LIKE '%template' LIMIT 1;

 template_name  | template_id | template_type | template_owner | database_name | schema_name |        create_time         |     last_modified_time     | last_modified_by 
-----------------+-------------+---------------+----------------+---------------+-------------+----------------------------+----------------------------+------------------
 noload_template |      107686 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:17.370547 | 2025-12-16 19:31:17.370547 |              100
```

# SHOW VIEW
<a name="r_SHOW_VIEW"></a>

Muestra la definición de una vista, incluidas las vistas materializadas y las vistas de enlace de tiempo de ejecución. Puede utilizar la salida de la instrucción SHOW VIEW para recrear la vista. 

## Sintaxis
<a name="r_SHOW_VIEW-synopsis"></a>

```
SHOW VIEW [schema_name.]view_name 
```

## Parameters
<a name="r_SHOW_VIEW-parameters"></a>

 *schema\$1name*   
(Opcional) Se trata del nombre del esquema relacionado. 

 *view\$1name*   
Se trata del nombre de la vista que se mostrará. 

## Ejemplos
<a name="r_SHOW_VIEW-examples"></a>

 A continuación, se presenta la definición de la vista `LA_Venues_v`.

```
create view LA_Venues_v as select * from venue where venuecity='Los Angeles';
```

A continuación, se presenta un ejemplo del comando SHOW VIEW y la salida para la vista definida anteriormente.

```
show view LA_Venues_v;
```

```
SELECT venue.venueid,
venue.venuename,
venue.venuecity,
venue.venuestate,
venue.venueseats
FROM venue WHERE ((venue.venuecity)::text = 'Los Angeles'::text);
```

A continuación, se presenta la definición de la vista `public.Sports_v` en el esquema `public`.

```
create view public.Sports_v as select * from category where catgroup='Sports';
```

A continuación, se presenta un ejemplo del comando SHOW VIEW y la salida para la vista definida anteriormente.

```
show view public.Sports_v;
```

```
SELECT category.catid,
category.catgroup,
category.catname,
category.catdesc
FROM category WHERE ((category.catgroup)::text = 'Sports'::text);
```

# START TRANSACTION
<a name="r_START_TRANSACTION"></a>

Sinónimo de la función BEGIN. 

Consulte [BEGIN](r_BEGIN.md). 

# TRUNCATE
<a name="r_TRUNCATE"></a>

Elimina todas las filas de una tabla sin realizar un análisis de la tabla: esta operación es una alternativa más rápida a una operación DELETE no calificada. Para ejecutar un comando TRUNCATE, debe tener el permiso TRUNCATE de la tabla, ser el propietario de la tabla o ser un superusuario. Para conceder permisos para truncar una tabla, utilice el comando [GRANT](r_GRANT.md).

TRUNCATE es mucho más eficiente que DELETE y no requiere VACUUM ni ANALYZE. No obstante, tenga en cuenta que TRUNCATE confirma la transacción en la que se ejecuta.

## Sintaxis
<a name="r_TRUNCATE-synopsis"></a>

```
TRUNCATE [ TABLE ] table_name
```

El comando también funciona en una vista materializada.

```
TRUNCATE materialized_view_name
```

## Parameters
<a name="r_TRUNCATE-parameters"></a>

TABLE   
Palabra clave opcional. 

 *table\$1name*   
Una tabla temporal o persistente. Solo el propietario de la tabla o un superusuario puede truncarla.   
Puede truncar cualquier tabla, incluidas las tablas a las que se hace referencia en limitaciones de clave externa.   
No es necesario limpiar una tabla después de truncarla. 

 *materialized\$1view\$1name*   
Una vista materializada.  
Puede truncar una vista materializada que se utilice para [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md). 

## Notas de uso
<a name="r_TRUNCATE_usage_notes"></a>
+  El comando TRUNCATE confirma la transacción en la que se ejecuta; por lo tanto, no se puede revertir una operación TRUNCATE, y un comando TRUNCATE puede confirmar otras operaciones cuando se confirma a sí mismo. 
+ Las operaciones TRUNCATE mantienen bloqueos exclusivos cuando se ejecutan en vistas materializadas de streaming de Amazon Redshift conectadas a cualquiera de las siguientes opciones:
  +  Un flujo de datos de Amazon Kinesis 
  +  Una transmisión gestionada de Amazon para el tema de Apache Kafka 
  +  Una transmisión externa compatible, como un tema de Confluent Cloud Kafka 

  Para obtener más información, consulte [Ingesta de streaming a una vista materializada](materialized-view-streaming-ingestion.md).

## Ejemplos
<a name="r_TRUNCATE-examples"></a>

Utilice el comando TRUNCATE para eliminar todas las filas de la tabla CATEGORY: 

```
truncate category;
```

Intento de revertir una operación TRUNCATE: 

```
begin;

truncate date;

rollback;

select count(*) from date;
count
-------
0
(1 row)
```

La tabla DATE permanece vacía después del comando ROLLBACK ya que el comando TRUNCATE se confirmó automáticamente. 

En el siguiente ejemplo, se utiliza el comando TRUNCATE para eliminar todas las filas de una vista materializada. 

```
truncate my_materialized_view;
```

Elimina todos los registros de la vista materializada y deja intactos la vista materializada y su esquema. En la consulta, el nombre de la vista materializada es un ejemplo.

# UNLOAD
<a name="r_UNLOAD"></a>


|  | 
| --- |
|  El cifrado del cliente para los comandos COPY y UNLOAD dejará de estar abierto a nuevos clientes a partir del 30 de abril de 2025. Si ha utilizado el cifrado del cliente con los comandos COPY y UNLOAD en los 12 meses anteriores al 30 de abril de 2025, puede seguir utilizando el cifrado del cliente con los comandos COPY o UNLOAD hasta el 30 de abril de 2026. Después del 30 de abril de 2026, no podrá utilizar el cifrado del cliente para COPY y UNLOAD. Le recomendamos que pase a utilizar el cifrado del servidor para COPY y UNLOAD lo antes posible. Si ya está utilizando el cifrado del servidor para COPY y UNLOAD, no hay ningún cambio y puede seguir utilizándolo sin alterar las consultas. Para obtener más información sobre el cifrado para COPY y UNLOAD, consulte el parámetro ENCRYPTED a continuación.  | 

Descarga el resultado de una consulta en uno o más archivos de texto, JSON o Apache Parquet en Amazon S3 con cifrado del lado del servidor (SSE-S3) de Amazon S3. También puede especificar el cifrado del servidor con una clave de AWS Key Management Service (SSE-KMS).

De manera predeterminada, el formato del archivo descargado es texto delimitado por barras verticales (`|`).

Puede administrar el tamaño de los archivos en Amazon S3 y, por extensión, la cantidad de archivos mediante la configuración del parámetro MAXFILESIZE. Asegúrese de que los rangos de IP de S3 estén agregados a la lista de permitidos. Para obtener más información acerca de los rangos de IP de S3 necesarios, consulte [Aislamiento de red](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation).

Puede descargar el resultado de una consulta de Amazon Redshift en su lago de datos de Amazon S3 en Apache Parquet, un formato de almacenamiento en columnas, abierto y eficiente para análisis. El formato Parquet es hasta 2 veces más rápido de descargar y consume hasta 6 veces menos almacenamiento en Amazon S3, en comparación con los formatos de texto. Esto le permite guardar la transformación y el enriquecimiento de datos que haya realizado en Amazon S3, en el lago de datos de Amazon S3 en un formato abierto. Luego, puede analizar los datos con Redshift Spectrum y otros servicios de AWS, como Amazon Athena, Amazon EMR y Amazon SageMaker AI. 

Para obtener más información y ejemplos de escenarios sobre el uso del comando UNLOAD, consulte [Descarga de datos en Amazon Redshift](c_unloading_data.md).

## Privilegios y permisos necesarios
<a name="r_UNLOAD-permissions"></a>

Para que el comando UNLOAD se ejecute correctamente, se necesita al menos el privilegio SELECT en los datos de la base de datos, junto con el permiso para escribir en la ubicación de Amazon S3. Para obtener información sobre los permisos de acceso a los recursos de AWS para el comando UNLOAD, consulte [Permisos para acceder a otros recursos de AWS](copy-usage_notes-access-permissions.md).

Para aplicar permisos con privilegios mínimos, siga estas recomendaciones para conceder únicamente los permisos necesarios al usuario que ejecute el comando.
+ El usuario también debe tener el privilegio SELECT sobre los datos. Para obtener información acerca de cómo limitar los privilegios en las bases de datos, consulte [GRANT](r_GRANT.md).
+ El usuario necesita permiso para asumir el rol de IAM para escribir en el bucket de Amazon S3 de su Cuenta de AWS. Para restringir el acceso a un usuario de la base de datos para que asuma un rol, consulte [Restricción de acceso a los roles de IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service-database-users.html) en la *Guía de administración de Amazon Redshift*.
+ El usuario necesita tener acceso al bucket de Amazon S3. Para restringir los permisos mediante una política de bucket de Amazon S3, consulte [Políticas de bucket para Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html) en la *Guía del usuario de Amazon Simple Storage Service*.

## Sintaxis
<a name="r_UNLOAD-synopsis"></a>

```
UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
authorization
[ option, ...] 

where authorization is
IAM_ROLE { default | 'arn:aws:iam::<Cuenta de AWS-id-1>:role/<role-name>[,arn:aws:iam::<Cuenta de AWS-id-2>:role/<role-name>][,...]' }
            
where option is
| [ FORMAT [ AS ] ] CSV | PARQUET | JSON
| PARTITION BY ( column_name [, ... ] ) [ INCLUDE ]
| MANIFEST [ VERBOSE ]
| HEADER
| DELIMITER [ AS ] 'delimiter-char'
| FIXEDWIDTH [ AS ] 'fixedwidth-spec'
| ENCRYPTED [ AUTO ]
| BZIP2
| GZIP
| ZSTD
| ADDQUOTES
| NULL [ AS ] 'null-string'
| ESCAPE
| ALLOWOVERWRITE
| CLEANPATH
| PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
| MAXFILESIZE [AS] max-size [ MB | GB ]
| ROWGROUPSIZE [AS] size [ MB | GB ]
| REGION [AS] 'aws-region' }
| EXTENSION 'extension-name'
```

## Parameters
<a name="unload-parameters"></a>

('*select-statement [instrucción-select*')   
Una consulta SELECT. Se descargan los resultados de la consulta. En la mayoría de casos, es útil descargar datos en un orden al especificar una cláusula ORDER BY en la consulta. Este enfoque permite ahorrar el tiempo que se requiere para ordenar los datos cuando se vuelven a cargar.   
La consulta debe escribirse entre comillas simples, como se muestra a continuación:   

```
('select * from venue order by venueid')
```
Si la consulta contiene comillas (por ejemplo, para encerrar valores literales), coloque el literal entre dos conjuntos de comillas simples. También debe incluir la consulta entre comillas simples:   

```
('select * from venue where venuestate=''NV''')
```

TO 's3://*object-path/name-prefix*'   
Se trata de la ruta completa, incluido el nombre del bucket, a la ubicación en Amazon S3 donde Amazon Redshift escribe los objetos del archivo de salida, incluido el archivo de manifiesto si se especifica MANIFEST. Los nombres del objeto tienen el prefijo *name-prefix*. Si utiliza `PARTITION BY`, se agrega automáticamente una barra diagonal (/) al final del valor *nombre-prefijo*, si es necesario. Para mayor seguridad, UNLOAD se conecta a Amazon S3 con una conexión HTTPS. Por defecto, UNLOAD escribe uno o más archivos por sector. UNLOAD agrega un número de sector y un número de parte al prefijo del nombre especificado, como se muestra a continuación:  
`<object-path>/<name-prefix><slice-number>_part_<part-number>`.   
Si se especifica MANIFEST, el archivo de manifiesto se escribe de la siguiente manera:  
`<object_path>/<name_prefix>manifest`.   
Si se especifica PARALLEL en OFF, los archivos de datos se escriben de la siguiente manera:  
`<object_path>/<name_prefix><part-number>`.   
UNLOAD crea de forma automática archivos cifrados a través del cifrado del lado del servidor (SSE) de Amazon S3, incluido el archivo de manifiesto si se utiliza MANIFEST. El comando COPY lee automáticamente los archivos cifrados del servidor durante la operación de carga. Puede descargar de manera transparente los archivos cifrados del lado del servidor desde el bucket a través de la API o la consola de Amazon S3. Para obtener más información, consulte [Protección de los datos con el cifrado del servidor](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html).   
REGION es necesario cuando el bucket de Amazon S3 no está en la misma región de Región de AWS que la base de datos de Amazon Redshift. 

*authorization*  
El comando UNLOAD necesita autorización para escribir datos en Amazon S3. El comando UNLOAD usa los mismos parámetros que el comando COPY usa para la autorización. Para obtener más información, consulte [Parámetros de autorización](copy-parameters-authorization.md) en la referencia de sintaxis del comando COPY.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::*<Cuenta de AWS-id-1>*:role/*<role-name>*'   <a name="unload-iam"></a>
Utilice la palabra clave predeterminada para que Amazon Redshift utilice el rol de IAM configurado como predeterminado y asociado al clúster cuando se ejecuta el comando UNLOAD.  
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. Si especifica IAM\$1ROLE, no puede utilizar ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN ni CREDENTIALS. El IAM\$1ROLE se puede encadenar. Para obtener más información, consulte [Encadenar roles de IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles) en la *Guía de administración de Amazon Redshift*.

[ FORMAT [AS] ] CSV \$1 PARQUET \$1 JSON  <a name="unload-csv"></a>
Se trata de las palabras clave para especificar el formato de descarga con objeto de anular el formato predeterminado.   
Cuando CSV, descarga en un archivo de texto en formato CSV utilizando un carácter de coma ( , ) como delimitador predeterminado. Si un campo contiene delimitadores, comillas dobles, caracteres de nueva línea o retornos de carro, el campo en el archivo descargado se encuentra entre comillas dobles. Se aplica escape a un carácter de comillas dobles dentro de un campo de datos mediante un carácter de comillas dobles adicional. Cuando se descargan cero filas, es posible que Amazon Redshift escriba objetos de Amazon S3 vacíos.  
Si es PARQUET, se descarga en un archivo en formato de Apache Parquet versión 1.0. De manera predeterminada, cada grupo de filas se comprime mediante la compresión SNAPPY. Para obtener más información sobre el formato de Apache Parquet, consulte [Parquet](https://parquet.apache.org/).   
Si es JSON, se descarga en un archivo JSON con cada línea que contiene un objeto JSON, lo que representa un registro completo en el resultado de la consulta. Amazon Redshift admite escribir JSON anidado cuando el resultado de la consulta contiene columnas SUPER. Para crear un objeto JSON válido, el nombre de cada columna de la consulta debe ser único. En el archivo JSON, los valores booleanos se descargan como `t` o `f`, y los valores NULL se descargan como `null`. Cuando se descargan cero filas, Amazon Redshift no escribe objetos de Amazon S3.  
Las palabras clave FORMAT y AS son opcionales. No puede usar CSV con ESCAPE, FIXEDWIDTH ni ADDQUOTES. No puede utilizar PARQUET con DELIMITER, FIXEDWIDTH, ADDQUOTES, ESCAPE, NULL AS, HEADER, GZIP, BZIP2 o ZSTD. PARQUET con ENCRYPTED solo se admite con el cifrado en el servidor con una clave AWS Key Management Service (SSE-KMS). No puede utilizar JSON con DELIMITER, HEADER, FIXEDWIDTH, ADDQUOTES, ESCAPE, o NULL AS.

PARTITION BY ( *column\$1name* [, ... ] ) [INCLUDE]  <a name="unload-partitionby"></a>
Especifica las claves de partición para la operación de descarga. UNLOAD automáticamente particiona los archivos de salida en carpetas de partición basándose en los valores de las claves de partición, siguiendo la convención de la Apache Hive. Por ejemplo, un archivo Parquet que pertenece al año de partición 2019 y al mes de septiembre tiene el siguiente prefijo: `s3://amzn-s3-demo-bucket/my_prefix/year=2019/month=September/000.parquet`.   
El valor de *column\$1name* debe ser una columna en los resultados de consulta que se están descargando.   
Si especifica PARTITION BY con la opción INCLUDE, las columnas de partición no se quitarán de los archivos descargados.   
Amazon Redshift no admite literales de cadena en cláusulas PARTITION BY.

MANIFEST [ VERBOSE ]  
Crea un archivo de manifiesto que enumera explícitamente detalles de los archivos de datos que son creados por el proceso UNLOAD. El manifiesto es un archivo de texto en formato JSON que enumera las direcciones URL de cada archivo escrito en Amazon S3.   
Si se especifica MANIFEST con la opción VERBOSE, el manifiesto incluye los siguientes detalles:   
+ Los nombres de columnas y los tipos de datos y, para los tipos de datos CHAR, VARCHAR o NUMERIC, las dimensiones para cada columna. Para los tipos de datos CHAR y VARCHAR, la dimensión es la longitud. Para un tipo de datos DECIMAL o NUMERIC, las dimensiones son la precisión y la escala. 
+ La cantidad de filas descargadas en cada archivo. Si se especifica la opción HEADER, la cantidad de filas incluye la línea de encabezado. 
+ El tamaño de archivo total de todos los archivos descargados y el recuento de filas total descargadas en todos los archivos. Si se especifica la opción HEADER, el recuento de filas incluye las líneas de encabezado. 
+ El autor. El autor es siempre "Amazon Redshift".
Solo puede especificar VERBOSE después de MANIFEST.   
El archivo de manifiesto se escribe en el mismo prefijo de ruta de Amazon S3 que los archivos de descarga en el formato `<object_path_prefix>manifest`. Por ejemplo, si UNLOAD especifica el prefijo de ruta “`s3://amzn-s3-demo-bucket/venue_`” de Amazon S3, la ubicación del archivo de manifiesto es “`s3://amzn-s3-demo-bucket/venue_manifest`”.

HEADER  
Agrega una línea de encabezado que contiene los nombres de columna situados al comienzo de cada archivo de salida. Las opciones de transformación de texto, como CSV, DELIMITER, ADDQUOTES y ESCAPE, también se aplican a la línea de encabezado. No puede usar HEADER con FIXEDWIDTH.

DELIMITER AS '*delimiter\$1character*'   
Especifica un carácter ASCII único que se utiliza para separar campos en el archivo de salida, como un carácter de barra vertical ( \$1 ), una coma ( , ) o una tabulación ( \$1t ). El delimitador predeterminado para los archivos de texto es un carácter de barra vertical. El delimitador predeterminado para los archivos CSV es un carácter de coma. La palabra clave AS es opcional. No puede usar DELIMITER con FIXEDWIDTH. Si los datos contienen el carácter delimitador, necesita especificar la opción ESCAPE para aplicar escape al delimitador, o utilizar ADDQUOTES para encerrar los datos entre comillas dobles. También puede especificar un delimitador que no esté contenido en los datos.

FIXEDWIDTH '*fixedwidth\$1spec*'   
Descarga los datos a un archivo donde el ancho de cada columna tiene una longitud fija, en lugar de estar separadas por un delimitador. La cadena *fixedwidth\$1spec* especifica la cantidad de columnas y el ancho de las mismas. La palabra clave AS es opcional. Como FIXEDWIDTH no trunca los datos, la especificación de cada columna en la instrucción UNLOAD debe tener al menos la misma longitud que la entrada más larga de esa columna, A continuación, se muestra el formato de *fixedwidth\$1spec*:   

```
'colID1:colWidth1,colID2:colWidth2, ...'
```
No puede usar FIXEDWIDTH con DELIMITER o HEADER.

ENCRYPTED [AUTO]  <a name="unload-parameters-encrypted"></a>
Especifica que los archivos de salida en Amazon S3 se cifran mediante el cifrado del servidor de Amazon S3. Si se especifica MANIFEST, también se cifra el archivo de manifiesto. Para obtener más información, consulte [Descarga de archivos de datos cifrados](t_unloading_encrypted_files.md). Si no especifica el parámetro ENCRYPTED, UNLOAD crea de forma automática archivos cifrados a través del cifrado del lado del servidor de Amazon S3, con claves de cifrado administradas por AWS (SSE-S3).   
Para ENCRYPTED, es posible que desee descargar el contenido en Amazon S3 mediante el cifrado del lado del servidor con una clave de AWS KMS (SSE-KMS). Si es así, utilice el parámetro [KMS_KEY_ID](#unload-parameters-kms-key-id) para proporcionar el ID de la clave. No puede utilizar el parámetro [Uso del parámetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials) con el parámetro KMS\$1KEY\$1ID. Si ejecuta un comando UNLOAD para datos mediante KMS\$1KEY\$1ID, puede realizar una operación COPY para los mismos datos sin especificar una clave.   
Si se utiliza ENCRYPTED AUTO, el comando UNLOAD obtiene la clave de cifrado de AWS KMS predeterminada en la propiedad del bucket de Amazon S3 de destino y cifra los archivos escritos en Amazon S3 con la clave de AWS KMS. Si el bucket no tiene la clave de cifrado de AWS KMS predeterminada, UNLOAD crea automáticamente archivos cifrados a través del cifrado del lado del servidor de Amazon Redshift con claves de cifrado administradas por AWS (SSE-S3). No puede utilizar esta opción con KMS\$1KEY\$1ID, MASTER\$1SYMMETRIC\$1KEY ni CREDENTIALS que contiene master\$1symmetric\$1key. 

KMS\$1KEY\$1ID '*key-id*'  <a name="unload-parameters-kms-key-id"></a>
Especifica el ID de una clave de AWS Key Management Service (AWS KMS) que se utilizará para cifrar archivos de datos en Amazon S3. Para obtener más información, consulte [¿Qué es AWS Key Management Service?](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) Si especifica KMS\$1KEY\$1ID, también debe especificar el parámetro [ENCRYPTED](#unload-parameters-encrypted). Si especifica KMS\$1KEY\$1ID, no puede autenticar con el parámetro CREDENTIALS. En su lugar, utilice [Uso del parámetro IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role) o [Uso de los parámetros ACCESS\$1KEY\$1ID y SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id). 

BZIP2   
Descarga datos en uno o más archivos comprimidos en bzip2 por sector. Cada archivo resultante se adjunta con una extensión `.bz2`. 

GZIP   
Descarga datos en uno o más archivos comprimidos en gzip por sector. Cada archivo resultante se adjunta con una extensión `.gz`. 

ZSTD   
Descarga datos en uno o más archivos comprimidos en Zstandard por sector. Cada archivo resultante se adjunta con una extensión `.zst`. 

ADDQUOTES   
Coloca comillas alrededor de cada campo de datos descargado para que Amazon Redshift pueda descargar los valores de datos que contienen el propio delimitador. Por ejemplo, si el delimitador es una coma, podría descargar y volver a cargar los siguientes datos de manera correcta:   

```
 "1","Hello, World" 
```
Sin las comillas agregadas, la cadena `Hello, World` se analizaría como dos campos separados.  
Algunos formatos de salida no admiten ADDQUOTES.  
Si utiliza ADDQUOTES, debe especificar REMOVEQUOTES en el comando COPY si vuelve a cargar los datos.

NULL AS '*null-string*'   
Especifica una cadena que representa un valor nulo en archivos de descarga. Si se utiliza esta opción, todos los archivos de salida contienen la cadena especificada en lugar de valores nulos encontrados en los datos seleccionados. Si no se especifica esta opción, los valores nulos se descargan como:   
+ Cadenas de longitud cero para un resultado delimitado 
+ Cadenas con espacios en blanco para un resultado de ancho fijo
Si se especifica una cadena nula para una descarga de ancho fijo, y el ancho de una columna de resultado es menor que el ancho de la cadena nula, ocurre el siguiente comportamiento:   
+ Un campo vacío es el resultado para columnas sin caracteres 
+ Se reporta un error para columnas con caracteres 
A diferencia de otros tipos de datos en los que una cadena definida por el usuario representa un valor nulo, Amazon Redshift exporta las columnas de datos SUPER mediante el formato JSON y lo representa como nulo, de acuerdo con lo determinado por el formato JSON. Como resultado, las columnas de datos SUPER ignoran la opción NULL [AS] utilizada en los comandos UNLOAD.

ESCAPE   
Para las columnas CHAR y VARCHAR en archivos de descarga delimitados, se coloca un carácter de escape (`\`) antes de cada ocurrencia de los siguientes caracteres:  
+ Salto de línea: `\n`
+ Retorno de carro: `\r`
+ El carácter delimitador especificado para los datos descargados. 
+ El carácter de escape: `\`
+ Un carácter de comillas: `"` o `'` (si se especifican ESCAPE y ADDQUOTES en el comando UNLOAD).
Si cargó los datos a través de un comando COPY con la opción ESCAPE, también debe especificar la opción ESCAPE con el comando UNLOAD para generar el archivo de salida recíproco. De manera similar, si utiliza UNLOAD con la opción ESCAPE, necesita usar ESCAPE cuando aplica COPY en los mismos datos.

ALLOWOVERWRITE   <a name="allowoverwrite"></a>
Por defecto, UNLOAD produce un error si encuentra archivos que podría sobrescribir. Si se especifica ALLOWOVERWRITE, UNLOAD sobrescribe los archivos existentes, incluido el archivo de manifiesto. 

CLEANPATH  <a name="cleanpath"></a>
La opción CLEANPATH quita los archivos existentes ubicados en la ruta de Amazon S3 especificada en la cláusula TO antes de descargar archivos en la ubicación determinada.   
Si incluye la cláusula PARTITION BY, los archivos existentes se quitan solo de las carpetas de partición para recibir archivos nuevos generados por la operación UNLOAD.  
Debe tener el permiso `s3:DeleteObject` en el bucket de Amazon S3. Para obtener información, consulte [Políticas y permisos en Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html) en la *Guía del usuario de Amazon Simple Storage Service*. Los archivos que quita con la opción CLEANPATH se eliminan de forma permanente y no se pueden recuperar. Si el bucket de Amazon S3 de destino tiene activado el control de versiones, UNLOAD con la opción CLEANPATH no elimina las versiones anteriores de los archivos.  
No se puede especificar la opción CLEANPATH si ya se especificó la opción ALLOWOVERWRITE.

PARALLEL   <a name="unload-parallel"></a>
Por defecto, el comando UNLOAD escribe datos simultáneamente en varios archivos, según la cantidad de sectores que haya en el clúster. La opción predeterminada es ON o TRUE. Si PARALLEL es OFF o FALSE, UNLOAD escribe en uno o más archivos de datos en serie, ordenados absolutamente en función de la cláusula ORDER BY, si se utiliza una. El tamaño máximo de un archivo de datos es de 6,2 GB. Por ejemplo, si descarga 13,4 GB de datos, UNLOAD crea los siguientes tres archivos.  

```
s3://amzn-s3-demo-bucket/key000    6.2 GB
s3://amzn-s3-demo-bucket/key001    6.2 GB
s3://amzn-s3-demo-bucket/key002    1.0 GB
```
El comando UNLOAD está diseñado para utilizar procesamiento en paralelo. Le recomendamos dejar PARALLEL habilitado para la mayoría de casos, especialmente si los archivos se utilizan para cargar tablas mediante un comando COPY.

MAXFILESIZE [AS] max-size [ MB \$1 GB ]   <a name="unload-maxfilesize"></a>
Especifica el tamaño máximo de los archivos que UNLOAD crea en Amazon S3. Especifique un valor decimal entre 5 MB y 6,2 GB. La palabra clave AS es opcional. La unidad predeterminada es MB. Si no se especifica MAXFILESIZE, el tamaño máximo predeterminado de un archivo es de 6,2 GB. El tamaño del archivo de manifiesto, si se utiliza uno, no se ve afectado por MAXFILESIZE.

ROWGROUPSIZE [AS] size [ MB \$1 GB ]   <a name="unload-rowgroupsize"></a>
Especifica el tamaño de los grupos de filas. La elección de un tamaño mayor puede reducir el número de grupos de filas y reducir la cantidad de comunicación de red. Especifique un valor entero entre 32 MB y 128 MB. La palabra clave AS es opcional. La unidad predeterminada es MB.  
Si no se especifica ROWGROUPSIZE, el tamaño predeterminado es 32 MB. Para utilizar este parámetro, el formato de almacenamiento debe ser Parquet y el tipo de nodo debe ser ra3.4xlarge, ra3.16xlarge o dc2.8xlarge.

REGION [AS] '*aws\$1region*'  <a name="unload-region"></a>
Especifica la Región de AWS donde está ubicado el bucket de Amazon S3 de destino. REGION es obligatorio para la operación UNLOAD en un bucket de Amazon S3 que no esté en la misma Región de AWS que la base de datos de Amazon Redshift.   
El valor de *aws\$1region* debe coincidir con una región de AWS incluida en la tabla [Regiones y puntos de conexión de Amazon Redshift](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region) en la *Referencia general de AWS*.  
De manera predeterminada, UNLOAD asume que el bucket de Amazon S3 de destino se encuentra en la misma Región de AWS que la base de datos de Amazon Redshift.

EXTENSION “*extension-name*”  <a name="unload-extension"></a>
Especifica la extensión del archivo que se va a agregar a los nombres de los archivos descargados. Amazon Redshift no ejecuta ninguna validación, por lo que debe comprobar que la extensión de archivo especificada es correcta. Si especifica un método de compresión sin proporcionar una extensión, Amazon Redshift solo agrega la extensión del método de compresión al nombre del archivo. Si no proporciona ninguna extensión y no especifica un método de compresión, Amazon Redshift no añade nada al nombre del archivo. 

## Notas de uso
<a name="unload-usage-notes"></a>

### Uso de ESCAPE para todas las operaciones UNLOAD de texto delimitado
<a name="unload-usage-escape"></a>

Cuando utiliza UNLOAD con un delimitador, sus datos pueden incluir ese delimitador o cualquiera de los caracteres enumerados en la descripción de la opción ESCAPE. En este caso, debe usar la opción ESCAPE con la instrucción UNLOAD. Si no utiliza la opción ESCAPE con UNLOAD, las operaciones de COPY subsiguientes que utilicen datos descargados producirán un error.

**importante**  
Le recomendamos encarecidamente que siempre use ESCAPE con ambas instrucciones UNLOAD y COPY. Solo puede saltarse esta regla si sabe con seguridad que los datos no contienen delimitadores u otros caracteres que puedan necesitar escape. 

### Pérdida de precisión de punto flotante
<a name="unload-usage-floating-point-precision"></a>

Puede enfrentarse a una pérdida de precisión para datos de punto flotante que se descargan y vuelven a cargar de manera sucesiva. 

### Cláusula de límite
<a name="unload-usage-limit-clause"></a>

La consulta SELECT no puede utilizar una cláusula LIMIT en SELECT externo. Por ejemplo, la siguiente instrucción UNLOAD produce un error.

```
unload ('select * from venue limit 10')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

En su lugar, use una cláusula LIMIT anidada, como en el siguiente ejemplo.

```
unload ('select * from venue where venueid in
(select venueid from venue order by venueid desc limit 10)')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

También puede rellenar una tabla con SELECT…INTO o CREATE TABLE AS a través de una cláusula LIMIT y, luego, descargar desde esa tabla.

### Descarga de una columna de tipo de datos GEOMETRY
<a name="unload-usage-geometry"></a>

Solo puede descargar columnas GEOMETRY para texto o formato CSV. No puede descargas datos GEOMETRY con la opción `FIXEDWIDTH`. Los datos se descargan en forma hexadecimal del formato binario conocido extendido (EWKB). Si el tamaño de los datos EWKB es mayor de 4 MB, se producirá una advertencia porque los datos no se podrán luego cargar en una tabla. 

### Descarga del tipo de datos HLLSKETCH
<a name="unload-usage-hll"></a>

Solo puede descargar columnas HLLSKETCH en formato de texto o CSV. No puede descargar datos HLLSKETCH con la opción `FIXEDWIDTH`. Los datos se descargan en el formato Base64 para bocetos densos de HyperLogLog o en el formato JSON para bocetos dispersos de HyperLogLog. Para obtener más información, consulte [Funciones HyperLogLog](hyperloglog-functions.md).

En el siguiente ejemplo, se exporta una tabla que contiene columnas HLLSKETCH a un archivo.

```
CREATE TABLE a_table(an_int INT, b_int INT);
INSERT INTO a_table VALUES (1,1), (2,1), (3,1), (4,1), (1,2), (2,2), (3,2), (4,2), (5,2), (6,2);

CREATE TABLE hll_table (sketch HLLSKETCH);
INSERT INTO hll_table select hll_create_sketch(an_int) from a_table group by b_int;

UNLOAD ('select * from hll_table') TO 's3://amzn-s3-demo-bucket/unload/'
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' ALLOWOVERWRITE CSV;
```

### Descarga de una columna de tipo de datos VARBYTE
<a name="unload-usage-varbyte"></a>

Solo puede descargar columnas VARBYTE para formato de texto o CSV. Los datos se descargan en forma hexadecimal. No se pueden descargar datos VARBYTE con la opción `FIXEDWIDTH`. No se admite la opción `ADDQUOTES` para DESCARGAR en un CSV. Una columna VARBYTE no se puede utilizar como columna PARTITIONED BY. 

### Cláusula FORMAT AS PARQUET
<a name="unload-parquet-usage"></a>

Tenga en cuenta estas consideraciones al usar FORMAT AS PARQUET:
+ La descarga en Parquet no utiliza la compresión de nivel de archivo. Cada grupo de filas se comprime con SNAPPY.
+ Si no se especifica MAXFILESIZE, el tamaño máximo predeterminado de un archivo es de 6,2 GB. Puede utilizar MAXFILESIZE para especificar el tamaño de un archivo de entre 5 MB y 6,2 GB. El tamaño real del archivo es aproximado cuando se está escribiendo el archivo, por lo que es posible que no sea exactamente igual al número que especifique.

  Para maximizar el rendimiento del análisis, Amazon Redshift intenta crear archivos Parquet que contengan grupos de filas de 32 MB del mismo tamaño. El valor MAXFILESIZE que especifique se redondea automáticamente al múltiplo más cercano de 32 MB. Por ejemplo, si especifica MAXFILESIZE 200 MB, cada archivo Parquet descargado es de aproximadamente 192 MB (grupo de filas de 32 MB x 6 = 192 MB).
+ Si una columna utiliza el formato de datos TIMESTAMPTZ, solo se descargan los valores de marca temporal. La información de zona horaria no se descarga.
+ No especifique prefijos de nombre de archivo que comience por los caracteres de subrayado (\$1) o punto (.). Redshift Spectrum trata los archivos que comienzan por estos caracteres como archivos ocultos y los ignora.

### Cláusula PARTITION BY
<a name="unload-partitionby-usage"></a>

Tenga en cuenta estas consideraciones al usar PARTITION BY:
+ Las columnas de partición no se incluyen en el archivo de salida.
+ Asegúrese de incluir las columnas de partición en la consulta SELECT utilizada en la instrucción UNLOAD. Puede especificar cualquier número de columnas de partición en el comando UNLOAD. No obstante, existe una limitación de que debe haber al menos una columna que no sea de partición para formar parte del archivo.
+ Si el valor de clave de partición es nulo, Amazon Redshift descarga de forma automática esos datos en una partición predeterminada que se conoce como `partition_column=__HIVE_DEFAULT_PARTITION__`. 
+ El comando UNLOAD no realiza ninguna llamada a un catálogo externo. Para registrar las nuevas particiones para que formen parte de la tabla externa existente, use un comando ALTER ... ADD PARTITION ... independiente. O puede ejecutar un comando CREATE EXTERNAL TABLE para registrar los datos descargados como una nueva tabla externa. También puede utilizar un rastreador de AWS Glue para completar el catálogo de datos. Para obtener más información, consulte [Definición de rastreadores](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) en la *Guía para desarrolladores de AWS Glue*. 
+ Si utiliza la opción MANIFEST, Amazon Redshift generará solo un archivo de manifiesto en la carpeta raíz de Amazon S3.
+ Los tipos de datos de columna que puede utilizar como clave de partición son SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, BOOLEAN, CHAR, VARCHAR, DATE y TIMESTAMP. 

### Uso del privilegio ASSUMEROLE para conceder acceso a un rol de IAM para operaciones UNLOAD
<a name="unload-assumerole-privilege-usage"></a>

Para brindar acceso a usuarios y grupos específicos a un rol de IAM para operaciones UNLOAD, un superusuario puede conceder el privilegio ASSUMEROLE en un rol de IAM a dichos usuarios y grupos. Para obtener más información, consulte [GRANT](r_GRANT.md). 

### UNLOAD no admite alias de puntos de acceso de Amazon S3
<a name="unload-usage-s3-access-point-alias"></a>

Puede utilizar los alias de puntos de acceso de Amazon S3 con el comando UNLOAD. 

## Ejemplos
<a name="r_UNLOAD-examples"></a>

Para ver ejemplos que muestran cómo utilizar el comando UNLOAD, consulte [Ejemplos de UNLOAD](r_UNLOAD_command_examples.md).

# Ejemplos de UNLOAD
<a name="r_UNLOAD_command_examples"></a>

Estos ejemplos demuestran varios parámetros del comando UNLOAD. En muchos de los ejemplos se utilizan los datos de muestra de TICKIT. Para obtener más información, consulte [Base de datos de muestra](c_sampledb.md).

**nota**  
Estos ejemplos contienen saltos de línea por motivos de legibilidad. No incluya saltos de líneas ni espacios en la cadena *credentials-args (credenciales-argumentos)*.

## Descargar VENUE en un archivo delimitado por la barra vertical (delimitador predeterminado)
<a name="unload-examples-venue"></a>

En el siguiente ejemplo, se descarga la tabla VENUE y se escriben los datos en `s3://amzn-s3-demo-bucket/unload/`: 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Por defecto, UNLOAD escribe uno o más archivos por sector. Suponiendo que un clúster de dos nodos con dos sectores por nodo, el ejemplo anterior crea estos archivos en `amzn-s3-demo-bucket`:

```
unload/0000_part_00
unload/0001_part_00
unload/0002_part_00
unload/0003_part_00
```

Para diferenciar mejor los archivos de salida, puede incluir un prefijo en la ubicación. En el siguiente ejemplo, se descarga la tabla VENUE y se escriben los datos en `s3://amzn-s3-demo-bucket/unload/venue_pipe_`: 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

El resultado es estos cuatro archivos en la carpeta `unload`, suponiendo nuevamente que hay cuatro secciones.

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## Descargar la tabla LINEITEM en archivos Parquet particionados
<a name="unload-examples-partitioned-parquet"></a>

En el siguiente ejemplo, se descarga la tabla LINEITEM en formato Parquet, particionada por la columna `l_shipdate`. 

```
unload ('select * from lineitem')
to 's3://amzn-s3-demo-bucket/lineitem/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
PARQUET
PARTITION BY (l_shipdate);
```

Suponiendo que hay cuatro sectores, los archivos Parquet resultantes se dividen dinámicamente en varias carpetas. 

```
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-02/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-03/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-04/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
...
```

**nota**  
En algunos casos, el comando UNLOAD utiliza la opción INCLUDE como se muestra en la siguiente instrucción SQL.   

```
unload ('select * from lineitem')
to 's3://amzn-s3-demo-bucket/lineitem/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
PARQUET
PARTITION BY (l_shipdate) INCLUDE;
```
En estos casos, la columna `l_shipdate` también está en los datos de los archivos Parquet. De lo contrario, los datos de la columna `l_shipdate` no están en los archivos Parquet.

## Descargar la tabla VENUE en un archivo JSON
<a name="unload-examples-json"></a>

En el siguiente ejemplo, se descarga la tabla VENUE y se escriben los datos en formato JSON en `s3://amzn-s3-demo-bucket/unload/`.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
JSON;
```

A continuación, se incluyen ejemplos de filas de la tabla VENUE.

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-----------
      1 | Pinewood Racetrack         | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

Después de descargar en JSON, el formato del archivo es similar al siguiente.

```
{"venueid":1,"venuename":"Pinewood Racetrack","venuecity":"Akron","venuestate":"OH","venueseats":0}
{"venueid":2,"venuename":"Columbus \"Crew\" Stadium ","venuecity":"Columbus","venuestate":"OH","venueseats":0}
{"venueid":4,"venuename":"Community, Ballpark, Arena","venuecity":"Kansas City","venuestate":"KS","venueseats":0}
```

## Descargar VENUE en un archivo CSV
<a name="unload-examples-csv"></a>

En el siguiente ejemplo, se descarga la tabla VENUE y se escriben los datos en formato CSV en `s3://amzn-s3-demo-bucket/unload/`.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
CSV;
```

Suponga que la tabla VENUE contiene las siguientes filas.

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-----------
      1 | Pinewood Racetrack         | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

El archivo de descarga tiene un aspecto similar al siguiente.

```
1,Pinewood Racetrack,Akron,OH,0
2,"Columbus ""Crew"" Stadium",Columbus,OH,0
4,"Community, Ballpark, Arena",Kansas City,KS,0
```

## Descargar VENUE en un archivo CSV mediante un delimitador
<a name="unload-examples-csv-delimiter"></a>

En el siguiente ejemplo, se descarga la tabla VENUE y se escriben los datos en formato CSV utilizando el carácter de barra vertical (\$1) como delimitador. El archivo descargado se escribe en `s3://amzn-s3-demo-bucket/unload/`. La tabla VENUE de este ejemplo contiene el carácter de barra vertical en el valor de la primera fila (`Pinewood Race|track`). Esto se hace para mostrar que el valor del resultado está entre comillas dobles. Las comillas dobles utilizan la secuencia de escape con una comilla doble y todo el campo se encierra entre comillas dobles. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
CSV DELIMITER AS '|';
```

Suponga que la tabla VENUE contiene las siguientes filas.

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-------------
      1 | Pinewood Race|track        | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

El archivo de descarga tiene un aspecto similar al siguiente.

```
1|"Pinewood Race|track"|Akron|OH|0
2|"Columbus ""Crew"" Stadium"|Columbus|OH|0
4|Community, Ballpark, Arena|Kansas City|KS|0
```

## Descargar VENUE con un archivo de manifiesto
<a name="unload-examples-manifest"></a>

Para crear un archivo de manifiesto, incluya la opción MANIFEST. En el siguiente ejemplo, se descarga la tabla VENUE y se escriben un archivo de manifiesto junto con los archivos de datos en s3://amzn-s3-demo-bucket/venue\$1pipe\$1: 

**importante**  
Si descarga archivos con la opción MANIFEST, debe utilizar la opción MANIFEST con el comando COPY cuando carga los archivos. Si utiliza el mismo prefijo para cargar los archivos y no especifica la opción MANIFEST, COPY produce un error porque supone que el archivo de manifiesto es un archivo de datos.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

El resultado es estos cinco archivos:

```
s3://amzn-s3-demo-bucket/venue_pipe_0000_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0001_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0002_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0003_part_00
s3://amzn-s3-demo-bucket/venue_pipe_manifest
```

A continuación se muestra el contenido de un archivo de manifiesto. 

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0000_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0001_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0002_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0003_part_00"}
  ]
}
```

## Descargar VENUE con MANIFEST VERBOSE
<a name="unload-examples-manifest-verbose"></a>

Cuando se especifica la opción MANIFEST VERBOSE, el archivo de manifiesto incluye las siguientes secciones: 
+ La sección `entries` enumera la ruta de Amazon S3, el tamaño del archivo y el recuento de filas de cada archivo. 
+ La sección `schema` enumera los nombres de columnas, los tipos de datos y la dimensión para cada columna. 
+ La sección `meta` muestra el tamaño del archivo total y el recuento de filas de todos los archivos. 

En el siguiente ejemplo, se descarga la tabla VENUE usando la opción MANIFEST VERBOSE. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload_venue_folder/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest verbose;
```

A continuación se muestra el contenido de un archivo de manifiesto.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0000_part_00", "meta": { "content_length": 32295, "record_count": 10 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0001_part_00", "meta": { "content_length": 32771, "record_count": 20 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0002_part_00", "meta": { "content_length": 32302, "record_count": 10 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0003_part_00", "meta": { "content_length": 31810, "record_count": 15 }}
  ],
  "schema": {
    "elements": [
      {"name": "venueid", "type": { "base": "integer" }},
      {"name": "venuename", "type": { "base": "character varying", 25 }},
      {"name": "venuecity", "type": { "base": "character varying", 25 }},
      {"name": "venuestate", "type": { "base": "character varying", 25 }},
      {"name": "venueseats", "type": { "base": "character varying", 25 }}
    ]
  },
  "meta": {
    "content_length": 129178,
    "record_count": 55
  },
  "author": {
    "name": "Amazon Redshift",
    "version": "1.0.0"
  }
}
```

## Descargar VENUE con un encabezado
<a name="unload-examples-header"></a>

En el siguiente ejemplo, se descarga VENUE con una fila de encabezado.

```
unload ('select * from venue where venueseats > 75000')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
header
parallel off;
```

A continuación, se muestra el contenido del archivo de salida con una fila de encabezado.

```
venueid|venuename|venuecity|venuestate|venueseats
6|New York Giants Stadium|East Rutherford|NJ|80242
78|INVESCO Field|Denver|CO|76125
83|FedExField|Landover|MD|91704
79|Arrowhead Stadium|Kansas City|MO|79451
```

## Descargar VENUE en archivos más pequeños
<a name="unload-examples-maxfilesize"></a>

Por defecto, el tamaño máximo de archivo es de 6,2 GB. Si los datos de descarga superan 6.2 GB, UNLOAD crea un nuevo archivo para cada segmento de datos de 6,2 GB. Para crear archivos más pequeños, incluya el parámetro MAXFILESIZE. Suponiendo que el tamaño de los datos en el ejemplo anterior era de 20 GB, el siguiente comando UNLOAD crea 20 archivos, cada uno de 1 GB.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
maxfilesize 1 gb;
```

## Descargar VENUE en serie
<a name="unload-examples-serial"></a>

Para descargar en serie, especifique PARALLEL OFF. UNLOAD escribe un archivo a la vez, hasta un máximo de 6,2 GB por archivo. 

En el siguiente ejemplo, se descarga la tabla VENUE y se escriben los datos en serie en `s3://amzn-s3-demo-bucket/unload/`. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_serial_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
parallel off;
```

El resultado es un archivo denominado venue\$1serial\$1000. 

Si los datos de descarga superan 6.2 GB, UNLOAD crea un nuevo archivo para cada segmento de datos de 6,2 GB. En el siguiente ejemplo, se descarga la tabla LINEORDER y se escriben los datos en serie en `s3://amzn-s3-demo-bucket/unload/`. 

```
unload ('select * from lineorder')
to 's3://amzn-s3-demo-bucket/unload/lineorder_serial_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
parallel off gzip;
```

El resultado es la siguiente serie de archivos.

```
lineorder_serial_0000.gz
lineorder_serial_0001.gz
lineorder_serial_0002.gz
lineorder_serial_0003.gz
```

Para diferenciar mejor los archivos de salida, puede incluir un prefijo en la ubicación. En el siguiente ejemplo, se descarga la tabla VENUE y se escriben los datos en `s3://amzn-s3-demo-bucket/venue_pipe_`: 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

El resultado es estos cuatro archivos en la carpeta `unload`, suponiendo nuevamente que hay cuatro secciones.

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## Cargar VENUE desde los archivos de descarga
<a name="unload-examples-load"></a>

Para cargar una tabla desde un conjunto de archivos de descarga, simplemente debe revertir el proceso al utilizar un comando COPY. En el siguiente ejemplo, se crea una nueva tabla, LOADVENUE, y se carga la tabla desde los archivos de datos creados en el ejemplo anterior.

```
create table loadvenue (like venue);

copy loadvenue from 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Si utilizó la opción MANIFEST para crear un archivo de manifiesto con los archivos de descarga, puede cargar los datos a través del mismo archivo de manifiesto. Para ello, debe usar un comando COPY con la opción MANIFEST. En el siguiente ejemplo, se cargan datos a través de un archivo de manifiesto.

```
copy loadvenue
from 's3://amzn-s3-demo-bucket/venue_pipe_manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

## Descargar VENUE en archivos cifrados
<a name="unload-examples-unload-encrypted"></a>

En el siguiente ejemplo, se descarga la tabla VENUE en un conjunto de archivos cifrados mediante una clave de AWS KMS. Si especifica un archivo de manifiesto con la opción ENCRYPTED, también se cifra el archivo de manifiesto. Para obtener más información, consulte [Descarga de archivos de datos cifrados](t_unloading_encrypted_files.md).

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_encrypt_kms'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
kms_key_id '1234abcd-12ab-34cd-56ef-1234567890ab'
manifest
encrypted;
```

En el siguiente ejemplo, se descarga la tabla VENUE en un conjunto de archivos cifrados a través de una clave raíz simétrica. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_encrypt_cmk'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key 'EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DMCDIK722'
encrypted;
```

## Cargar VENUE desde archivos cifrados
<a name="unload-examples-load-encrypted"></a>

Para cargar tablas desde un conjunto de archivos que se crearon usando UNLOAD con la opción ENCRYPT, revierta el proceso utilizando un comando COPY. Con ese comando, use la opción ENCRYPTED y especifique la misma clave raíz simétrica que se utilizó para el comando UNLOAD. En el siguiente ejemplo, se carga la tabla LOADVENUE desde los archivos de datos cifrados creados en el ejemplo anterior.

```
create table loadvenue (like venue);

copy loadvenue
from 's3://amzn-s3-demo-bucket/venue_encrypt_manifest'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key 'EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DMCDIK722'
manifest
encrypted;
```

## Descargar datos de VENUE en un archivo delimitado por tabulaciones
<a name="unload-examples-venue-tab"></a>

```
unload ('select venueid, venuename, venueseats from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter as '\t';
```

Los archivos de datos de salida tendrán este aspecto: 

```
1	Toyota Park	Bridgeview	IL	0
2	Columbus Crew Stadium	Columbus	OH	0
3	RFK Stadium	Washington	DC	0
4	CommunityAmerica Ballpark	Kansas City	KS	0
5	Gillette Stadium	Foxborough	MA	68756
...
```

## Descargar VENUE en un archivo de datos de ancho fijo
<a name="unload-venue-fixed-width"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_fw_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth as 'venueid:3,venuename:39,venuecity:16,venuestate:2,venueseats:6';
```

Los archivos de datos de salida tendrán un aspecto similar al siguiente. 

```
1  Toyota Park              Bridgeview  IL0
2  Columbus Crew Stadium    Columbus    OH0
3  RFK Stadium              Washington  DC0
4  CommunityAmerica BallparkKansas City KS0
5  Gillette Stadium         Foxborough  MA68756
...
```

## Descargar VENUE en un conjunto de archivos comprimidos GZIP delimitados por tabulaciones
<a name="unload-examples-venue-gzip"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter as '\t'
gzip;
```

## Descargar VENUE en un archivo de texto comprimido con GZIP
<a name="unload-examples-venue-extension-gzip"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
extension 'txt.gz'
gzip;
```

## Descargar datos que contienen un delimitador
<a name="unload-examples-delimiter"></a>

Este ejemplo usa la opción ADDQUOTES para descargar datos delimitados por comas donde algunos campos de datos contienen una coma.

Primero, cree una tabla que contenga comillas.

```
create table location (id int, location char(64));

insert into location values (1,'Phoenix, AZ'),(2,'San Diego, CA'),(3,'Chicago, IL');
```

Luego, descargue los datos con la opción ADDQUOTES.

```
unload ('select id, location from location')
to 's3://amzn-s3-demo-bucket/location_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter ',' addquotes;
```

Los archivos de datos descargados tendrán este aspecto: 

```
1,"Phoenix, AZ"
2,"San Diego, CA"
3,"Chicago, IL"
...
```

## Descargar los resultados de una consulta de combinación
<a name="unload-examples-join"></a>

En el siguiente ejemplo, se descargan los resultados de una consulta de combinación que contiene una función de ventana. 

```
unload ('select venuecity, venuestate, caldate, pricepaid,
sum(pricepaid) over(partition by venuecity, venuestate
order by caldate rows between 3 preceding and 3 following) as winsum
from sales join date on sales.dateid=date.dateid
join event on event.eventid=sales.eventid
join venue on event.venueid=venue.venueid
order by 1,2')
to 's3://amzn-s3-demo-bucket/tickit/winsum'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Los archivos de salida tendrán este aspecto: 

```
Atlanta|GA|2008-01-04|363.00|1362.00
Atlanta|GA|2008-01-05|233.00|2030.00
Atlanta|GA|2008-01-06|310.00|3135.00
Atlanta|GA|2008-01-08|166.00|8338.00
Atlanta|GA|2008-01-11|268.00|7630.00
...
```

## Descargar con NULL AS
<a name="unload-examples-null-as"></a>

Los valores nulos de resultado de UNLOAD son cadenas vacías por defecto. En los siguientes ejemplos se muestra cómo utilizar NULL AS para sustituir una cadena de texto para los valores nulos.

Para estos ejemplos, agregamos algunos valores nulos a la tabla VENUE.

```
update venue set venuestate = NULL
where venuecity = 'Cleveland';
```

Seleccione en VENUE donde VENUESTATE toma el valor nulo para verificar que las columnas contienen NULL.

```
select * from venue where venuestate is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
```

Ahora, aplique UNLOAD en la tabla VENUE con la opción NULL AS para reemplazar valores nulos con la cadena de caracteres "". '`fred`'. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
null as 'fred';
```

En el siguiente ejemplo del archivo de descarga se muestra que los valores nulos se reemplazaron con `fred`. Resulta que algunos valores para VENUESEATS también eran valores nulos y se reemplazaron con `fred`. Aunque el tipo de datos para VENUESEATS es entero, el comando UNLOAD convierte los valores a texto en los archivos de descarga y, luego, el comando COPY los convierte nuevamente a valores enteros. Si está descargando un archivo de ancho fijo, la cadena NULL AS no debe ser más grande que el ancho del campo.

```
248|Charles Playhouse|Boston|MA|0
251|Paris Hotel|Las Vegas|NV|fred
258|Tropicana Hotel|Las Vegas|NV|fred
300|Kennedy Center Opera House|Washington|DC|0
306|Lyric Opera House|Baltimore|MD|0
308|Metropolitan Opera|New York City|NY|0
  5|Gillette Stadium|Foxborough|MA|5
 22|Quicken Loans Arena|Cleveland|fred|0
101|Progressive Field|Cleveland|fred|43345
...
```

Para cargar una tabla desde los archivos de descarga, utilice un comando COPY con la misma opción NULL AS. 

**nota**  
Si intenta cargar valores nulos en una columna definida como NOT NULL, el comando COPY produce un error.

```
create table loadvenuenulls (like venue);

copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
null as 'fred';
```

Para verificar que las columnas contienen un valor nulo, no solo cadenas vacías, seleccione LOADVENUENULLS y filtre en busca de valores nulos.

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
     251 | Paris Hotel              | Las Vegas | NV         |

...
```

Puede utilizar UNLOAD en una tabla que contiene valores nulos con el comportamiento NULL AS predeterminado y, luego, aplicar COPY para copiar los datos nuevamente en una tabla a través del comportamiento NULL AS predeterminado. No obstante, los campos no numéricos en la tabla de destino tendrá cadenas vacías, no nulas. Por defecto, UNLOAD convierte valores nulos en cadenas vacías (espacio en blanco o longitud cero). COPY convierte cadenas vacías en valores NULL para columnas numéricas, pero inserta cadenas vacías en columnas no numéricas. En el siguiente ejemplo, se muestra cómo realizar un UNLOAD seguido de un comando COPY a través del comportamiento NULL AS predeterminado. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' allowoverwrite;

truncate loadvenuenulls;
copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

En este caso, cuando filtró en busca de valores nulos, solo las filas donde VENUESEATS contenía valores nulos. Donde VENUESTATE contenía valores nulos en la tabla (VENUE), VENUESTATE en la tabla de destino (LOADVENUENULLS) contenía cadenas vacías.

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
     251 | Paris Hotel              | Las Vegas | NV         |
...
```

Para cargar cadenas vacías en columnas no numéricas como NULL, incluya las opciones EMPTYASNULL o BLANKSASNULL. Se pueden utilizar ambas.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' allowoverwrite;

truncate loadvenuenulls;
copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' EMPTYASNULL;
```

Para verificar que las columnas contienen un valor NULL, no solo espacios en blanco o cadenas vacías, seleccione LOADVENUENULLS y filtre el contenido en busca de valores nulos.

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
     251 | Paris Hotel              | Las Vegas | NV         |
     ...
```

## Descargar mediante el parámetro ALLOWOVERWRITE
<a name="unload-examples-allowoverwrite"></a>

De manera predeterminada, UNLOAD no sobrescribe los archivos existentes en el bucket de destino. Por ejemplo, si ejecuta la misma instrucción UNLOAD dos veces sin modificar los archivos en el bucket de destino, el segundo comando UNLOAD produce un error. Para sobrescribir los archivos existentes, incluido el archivo de manifiesto, especifique la opción ALLOWOVERWRITE.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest allowoverwrite;
```

## Descargar la tabla EVENT mediante los parámetros PARALLEL y MANIFEST
<a name="unload-examples-manifest-parallel"></a>

Puede usar UNLOAD para descargar una tabla en paralelo y generar un archivo de manifiesto. Los archivos de datos de Amazon S3 se crean todos al mismo nivel y los nombres tienen como sufijo el patrón `0000_part_00`. El archivo de manifiesto se encuentra en el mismo nivel de carpeta que los archivos de datos y tiene como sufijo el texto `manifest`. El siguiente código SQL descarga la tabla EVENT y crea archivos con el nombre base `parallel`

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/parallel'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
parallel on
manifest;
```

La lista de archivos de Amazon S3 es similar a la siguiente.

```
 Name                       Last modified                        Size                  
 parallel0000_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 52.1 KB  
 parallel0001_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 53.4 KB
 parallel0002_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 52.1 KB
 parallel0003_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 51.1 KB
 parallel0004_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 54.6 KB
 parallel0005_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 53.4 KB
 parallel0006_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 54.1 KB
 parallel0007_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 55.9 KB
 parallelmanifest       -   August 2, 2023, 14:54:39 (UTC-07:00) 886.0 B
```

El contenido del archivo `parallelmanifest` es similar al siguiente.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/parallel0000_part_00", "meta": { "content_length": 53316 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0001_part_00", "meta": { "content_length": 54704 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0002_part_00", "meta": { "content_length": 53326 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0003_part_00", "meta": { "content_length": 52356 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0004_part_00", "meta": { "content_length": 55933 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0005_part_00", "meta": { "content_length": 54648 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0006_part_00", "meta": { "content_length": 55436 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0007_part_00", "meta": { "content_length": 57272 }}
  ]
}
```

## Descargar la tabla EVENT mediante los parámetros PARALLEL OFF y MANIFEST
<a name="unload-examples-manifest-serial"></a>

Puede usar UNLOAD para descargar una tabla en serie (PARALLEL OFF) y generar un archivo de manifiesto. Los archivos de datos de Amazon S3 se crean todos al mismo nivel y los nombres tienen como sufijo el patrón `0000`. El archivo de manifiesto se encuentra en el mismo nivel de carpeta que los archivos de datos y tiene como sufijo el texto `manifest`.

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/serial'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
parallel off
manifest;
```

La lista de archivos de Amazon S3 es similar a la siguiente.

```
 Name                       Last modified                        Size                  
 serial0000             -   August 2, 2023, 15:54:39 (UTC-07:00) 426.7 KB  
 serialmanifest         -   August 2, 2023, 15:54:39 (UTC-07:00) 120.0 B
```

El contenido del archivo `serialmanifest` es similar al siguiente.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/serial000", "meta": { "content_length": 436991 }}
  ]
}
```

## Descargar la tabla EVENT mediante los parámetros PARTITION BY y MANIFEST
<a name="unload-examples-manifest-partition"></a>

Puede usar UNLOAD para descargar una tabla por partición y generar un archivo de manifiesto. Se crea una nueva carpeta en Amazon S3 con carpetas de partición secundarias y los archivos de datos en las carpetas secundarias con un patrón de nombres similar a `0000_par_00`. El archivo de manifiesto se encuentra en el mismo nivel de carpeta que las carpetas secundarias con el nombre `manifest`.

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/partition'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
partition by (eventname)
manifest;
```

La lista de archivos de Amazon S3 es similar a la siguiente.

```
 Name                   Type     Last modified                        Size                  
 partition           	Folder
```

En la carpeta `partition` están las carpetas secundarias con el nombre de la partición y el archivo de manifiesto. A continuación, se muestra la parte final de la lista de carpetas de la carpeta `partition`, similar a la siguiente.

```
 Name                   Type      Last modified                        Size                  
 ...
 eventname=Zucchero/    Folder 
 eventname=Zumanity/    Folder 
 eventname=ZZ Top/      Folder  
 manifest          	    -	    August 2, 2023, 15:54:39 (UTC-07:00) 467.6 KB
```

En la carpeta `eventname=Zucchero/` están los archivos de datos similares a los siguientes.

```
 Name               Last modified                        Size                  
 0000_part_00	-   August 2, 2023, 15:59:19 (UTC-07:00) 70.0 B
 0001_part_00	-   August 2, 2023, 15:59:16 (UTC-07:00) 106.0 B
 0002_part_00	-   August 2, 2023, 15:59:15 (UTC-07:00) 70.0 B
 0004_part_00	-   August 2, 2023, 15:59:17 (UTC-07:00) 141.0 B
 0006_part_00	-   August 2, 2023, 15:59:16 (UTC-07:00) 35.0 B
 0007_part_00	-   August 2, 2023, 15:59:19 (UTC-07:00) 108.0 B
```

La parte final del contenido del archivo `manifest` es similar a la siguiente.

```
{
  "entries": [
    ...
    {"url":"s3://amzn-s3-demo-bucket/partition/eventname=Zucchero/007_part_00", "meta": { "content_length": 108 }},
    {"url":"s3://amzn-s3-demo-bucket/partition/eventname=Zumanity/007_part_00", "meta": { "content_length": 72 }}
  ]
}
```

## Descargar la tabla EVENT con los parámetros MAXFILESIZE, ROWGROUPSIZE y MANIFEST
<a name="unload-examples-manifest-maxsize"></a>

Puede usar UNLOAD para descargar una tabla en paralelo y generar un archivo de manifiesto. Los archivos de datos de Amazon S3 se crean todos al mismo nivel y los nombres tienen como sufijo el patrón `0000_part_00`. Los archivos de datos Parquet generados están limitados a 256 MB y el tamaño del grupo de filas a 128 MB. El archivo de manifiesto se encuentra en el mismo nivel de carpeta que los archivos de datos y tiene como sufijo `manifest`.

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/eventsize'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
maxfilesize 256 MB
rowgroupsize 128 MB
parallel on
parquet
manifest;
```

La lista de archivos de Amazon S3 es similar a la siguiente.

```
 Name                            Type      Last modified                        Size 
 eventsize0000_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.5 KB
 eventsize0001_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.8 KB
 eventsize0002_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.4 KB
 eventsize0003_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.0 KB
 eventsize0004_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.3 KB
 eventsize0005_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.8 KB
 eventsize0006_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.0 KB
 eventsize0007_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.6 KB
 eventsizemanifest                 -       August 2, 2023, 17:35:21 (UTC-07:00) 958.0 B
```

El contenido del archivo `eventsizemanifest` es similar al siguiente.

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/eventsize0000_part_00.parquet", "meta": { "content_length": 25130 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0001_part_00.parquet", "meta": { "content_length": 25428 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0002_part_00.parquet", "meta": { "content_length": 25025 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0003_part_00.parquet", "meta": { "content_length": 24554 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0004_part_00.parquet", "meta": { "content_length": 25918 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0005_part_00.parquet", "meta": { "content_length": 25362 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0006_part_00.parquet", "meta": { "content_length": 25647 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0007_part_00.parquet", "meta": { "content_length": 26256 }}
  ]
}
```

# UPDATE
<a name="r_UPDATE"></a>

**Topics**
+ [Sintaxis](#r_UPDATE-synopsis)
+ [Parameters](#r_UPDATE-parameters)
+ [Notas de uso](#r_UPDATE_usage_notes)
+ [Ejemplos de instrucciones UPDATE](c_Examples_of_UPDATE_statements.md)

Actualiza valores en una o más columnas de la tabla cuando se cumple una condición. 

**nota**  
El tamaño máximo de una instrucción SQL es de 16 MB.

## Sintaxis
<a name="r_UPDATE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
            UPDATE table_name [ [ AS ] alias ] SET column = { expression | DEFAULT } [,...]

[ FROM fromlist ]
[ WHERE condition ]
```

## Parameters
<a name="r_UPDATE-parameters"></a>

Cláusula WITH  
Se trata de una cláusula opcional que especifica una o más *common-table-expressions*. Consulte [Cláusula WITH](r_WITH_clause.md). 

 *table\$1name*   
Una tabla temporal o persistente. Solo el propietario de la tabla o un usuario con el privilegio UPDATE en la tabla puede actualizar filas. Si utiliza la cláusula FROM o selecciona desde tablas en una expresión o condición, debe tener el privilegio SELECT en esas tablas. No puede asignar un alias a la tabla aquí; no obstante, puede especificar un alias en la cláusula FROM.   
Las tablas externas de Amazon Redshift Spectrum solo se pueden leer. No puede utilizar el comando UPDATE en una tabla externa.

alias  
Se trata del nombre alternativo temporal para una tabla de destino. Los alias son opcionales. La palabra clave AS es siempre opcional. 

SET *column* =   
Una o más columnas que desea modificar. Las columnas que no están en la lista conservan sus valores actuales. No incluya el nombre de la tabla en la especificación de una columna de destino. Por ejemplo, `UPDATE tab SET tab.col = 1` no es válido.

 *expresión*   
Una expresión que define el nuevo valor para la columna especificada. 

DEFAULT   
Actualiza la columna con el valor predeterminado que se asignó a la columna en la instrucción CREATE TABLE. 

FROM *tablelist (lista\$1de\$1tablas)*   
Puede actualizar una tabla al hacer referencia a información de otras tablas. Enumere estas otras tablas en la cláusula FROM o use una subconsulta como parte de la condición WHERE. Las tablas enumeradas en la cláusula FROM pueden tener alias. Si necesita incluir la tabla de destino de la instrucción UPDATE en la lista, utilice un alias. 

WHERE *condition*   
La cláusula opcional que limita las actualizaciones a filas que coinciden con una condición. Cuando la condición devuelve `true`, se actualizan las columnas SET especificadas. La condición puede ser un predicado simple en una columna o una condición basada en el resultado de una subconsulta.   
Puede otorgar un nombre a cualquier tabla de la subconsulta, incluida la tabla de destino para UPDATE. 

## Notas de uso
<a name="r_UPDATE_usage_notes"></a>

Después de actualizar una gran cantidad de filas en una tabla: 
+ Limpie la tabla para recuperar espacio de almacenamiento y reordene las filas. 
+ Analice la tabla para actualizar las estadísticas para el planificador de consultas. 

Las combinaciones externas izquierdas, derechas y completas no se admiten en la cláusula FROM de una instrucción UPDATE; devuelven el siguiente error: 

```
ERROR: Target table must be part of an equijoin predicate
```

 Si necesita especificar una combinación externa, utilice una subconsulta en la cláusula WHERE de la instrucción UPDATE. 

Si la instrucción UPDATE requiere una combinación automática con la tabla de destino, necesita especificar la condición de la combinación, así como los criterios de la cláusula WHERE que califican filas para la operación de actualización. En general, cuando la tabla de destino se combina consigo misma o con otra tabla, una práctica recomendada es utilizar una subconsulta que separe claramente las condiciones de combinación de los criterios que califican filas para actualizaciones. 

Las consultas UPDATE con varias coincidencias por fila arrojan un error cuando el parámetro de configuración `error_on_nondeterministic_update` se establece en *true*. Para obtener más información, consulte [error\$1on\$1nondeterministic\$1update](r_error_on_nondeterministic_update.md).

Puede actualizar una columna GENERATED BY DEFAULT AS IDENTITY. Las columnas definidas como GENERATED BY DEFAULT AS IDENTITY pueden actualizarse con los valores que se proporcionen. Para obtener más información, consulte [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

# Ejemplos de instrucciones UPDATE
<a name="c_Examples_of_UPDATE_statements"></a>

Para obtener más información acerca de las tablas utilizadas en los ejemplos siguientes, consulte [Base de datos de muestra](c_sampledb.md).

La tabla CATEGORY de la base de datos TICKIT contiene las siguientes filas: 

```
+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 5     | Sports   | MLS       | Major League Soccer                        |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
| 1     | Sports   | MLB       | Major League Baseball                      |
| 6     | Shows    | Musicals  | Musical theatre                            |
| 3     | Sports   | NFL       | National Football League                   |
| 8     | Shows    | Opera     | All opera and light opera                  |
| 2     | Sports   | NHL       | National Hockey League                     |
| 9     | Concerts | Pop       | All rock and pop music concerts            |
| 4     | Sports   | NBA       | National Basketball Association            |
| 7     | Shows    | Plays     | All non-musical theatre                    |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
+-------+----------+-----------+--------------------------------------------+
```

 **Actualización de una tabla en función de un rango de valores** 

Actualice la columna CATGROUP en función de un rango de valores en la columna CATID. 

```
UPDATE category
SET catgroup='Theatre'
WHERE catid BETWEEN 6 AND 8;

SELECT * FROM category
WHERE catid BETWEEN 6 AND 8;

+-------+----------+----------+---------------------------+
| catid | catgroup | catname  |          catdesc          |
+-------+----------+----------+---------------------------+
| 6     | Theatre  | Musicals | Musical theatre           |
| 7     | Theatre  | Plays    | All non-musical theatre   |
| 8     | Theatre  | Opera    | All opera and light opera |
+-------+----------+----------+---------------------------+
```

 **Actualización de una tabla en función de un valor actual** 

Actualice las columnas CATNAME y CATDESC en función del valor de CATGROUP actual: 

```
UPDATE category
SET catdesc=default, catname='Shows'
WHERE catgroup='Theatre';

SELECT * FROM category
WHERE catname='Shows';

+-------+----------+---------+---------+
| catid | catgroup | catname | catdesc |
+-------+----------+---------+---------+
| 6     | Theatre  | Shows   | NULL    |
| 7     | Theatre  | Shows   | NULL    |
| 8     | Theatre  | Shows   | NULL    |
+-------+----------+---------+---------+)
```

En este caso, la columna CATDESC se configuró como nula porque no se definió un valor predeterminado cuando se creó la tabla.

Ejecute los siguientes comandos para establecer los datos de la tabla CATEGORY de regreso a los valores originales:

```
TRUNCATE category;

COPY category
FROM 's3://redshift-downloads/tickit/category_pipe.txt' 
DELIMITER '|' 
IGNOREHEADER 1 
REGION 'us-east-1'
IAM_ROLE default;
```

 **Actualización de una tabla en función del resultado de una subconsulta de la cláusula WHERE** 

Actualice la tabla CATEGORY en función del resultado de una subconsulta en la cláusula WHERE: 

```
UPDATE category
SET catdesc='Broadway Musical'
WHERE category.catid IN
(SELECT category.catid FROM category
JOIN event ON category.catid = event.catid
JOIN venue ON venue.venueid = event.venueid
JOIN sales ON sales.eventid = event.eventid
WHERE venuecity='New York City' AND catname='Musicals');
```

Consulte la tabla actualizada: 

```
SELECT * FROM category ORDER BY catid;

+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 2     | Sports   | NHL       | National Hockey League                     |
| 3     | Sports   | NFL       | National Football League                   |
| 4     | Sports   | NBA       | National Basketball Association            |
| 5     | Sports   | MLS       | Major League Soccer                        |
| 6     | Shows    | Musicals  | Broadway Musical                           |
| 7     | Shows    | Plays     | All non-musical theatre                    |
| 8     | Shows    | Opera     | All opera and light opera                  |
| 9     | Concerts | Pop       | All rock and pop music concerts            |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
+-------+----------+-----------+--------------------------------------------+
```

 **Actualización de una tabla en función del resultado de una subconsulta de la cláusula WITH** 

Para actualizar la tabla CATEGORY basándose en el resultado de una subconsulta utilizando la cláusula WITH, utilice el siguiente ejemplo.

```
WITH u1 as (SELECT catid FROM event ORDER BY catid DESC LIMIT 1) 
UPDATE category SET catid='200' FROM u1 WHERE u1.catid=category.catid;

SELECT * FROM category ORDER BY catid DESC LIMIT 1;

+-------+----------+---------+---------------------------------+
| catid | catgroup | catname |             catdesc             |
+-------+----------+---------+---------------------------------+
| 200   | Concerts | Pop     | All rock and pop music concerts |
+-------+----------+---------+---------------------------------+
```

## Actualización de una tabla en función del resultado de una condición de combinación
<a name="c_Examples_of_UPDATE_statements-updating-a-table-based-on-the-result-of-a-join-condition"></a>

Actualice las 11 filas originales en la tabla CATEGORY en función de las filas CATID coincidentes en la tabla EVENT: 

```
UPDATE category SET catid=100
FROM event
WHERE event.catid=category.catid;

SELECT * FROM category ORDER BY catid;

+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 2     | Sports   | NHL       | National Hockey League                     |
| 3     | Sports   | NFL       | National Football League                   |
| 4     | Sports   | NBA       | National Basketball Association            |
| 5     | Sports   | MLS       | Major League Soccer                        |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
| 100   | Concerts | Pop       | All rock and pop music concerts            |
| 100   | Shows    | Plays     | All non-musical theatre                    |
| 100   | Shows    | Opera     | All opera and light opera                  |
| 100   | Shows    | Musicals  | Broadway Musical                           |
+-------+----------+-----------+--------------------------------------------+
```

 Tenga en cuenta que la tabla EVENT está enumerada en la cláusula FROM y la condición de combinación de la tabla de destino está definida en la cláusula WHERE. Solo cuatro filas califican para la actualización. Estas cuatro filas son las filas cuyos valores CATID eran originalmente 6, 7, 8 y 9; solo estas cuatro categorías están representadas en la tabla EVENT: 

```
SELECT DISTINCT catid FROM event;

+-------+
| catid |
+-------+
| 6     |
| 7     |
| 8     |
| 9     |
+-------+
```

Actualice las 11 filas originales en la tabla CATEGORY al extender el ejemplo anterior y agregar otra condición a la cláusula WHERE. Debido a la restricción en la columna CATGROUP, solo una fila califica para la actualización (aunque cuatro filas califican para la combinación). 

```
UPDATE category SET catid=100
FROM event
WHERE event.catid=category.catid
AND catgroup='Concerts';

SELECT * FROM category WHERE catid=100;

+-------+----------+---------+---------------------------------+
| catid | catgroup | catname |             catdesc             |
+-------+----------+---------+---------------------------------+
| 100   | Concerts | Pop     | All rock and pop music concerts |
+-------+----------+---------+---------------------------------+
```

A continuación se muestra una manera alternativa de escribir este ejemplo: 

```
UPDATE category SET catid=100
FROM event JOIN category cat ON event.catid=cat.catid
WHERE cat.catgroup='Concerts';
```

La ventaja de este enfoque es que los criterios de combinación están separados claramente de cualquier otro criterio que califica a las filas para la actualización. Observe el uso del alias CAT para la tabla CATEGORY en la cláusula FROM.

## Actualizaciones con combinaciones externas en la cláusula FROM
<a name="c_Examples_of_UPDATE_statements-updates-with-outer-joins-in-the-from-clause"></a>

El ejemplo anterior mostró una combinación interna especificada en la cláusula FROM de una instrucción UPDATE. El siguiente ejemplo devuelve un error, ya que la cláusula FROM no admite combinaciones externas en la tabla de destino: 

```
UPDATE category SET catid=100
FROM event LEFT JOIN category cat ON event.catid=cat.catid
WHERE cat.catgroup='Concerts';
ERROR:  Target table must be part of an equijoin predicate
```

Si la combinación externa se requiere para la instrucción UPDATE, puede trasladar la sintaxis de la combinación interna a una subconsulta: 

```
UPDATE category SET catid=100
FROM
(SELECT event.catid FROM event LEFT JOIN category cat ON event.catid=cat.catid) eventcat
WHERE category.catid=eventcat.catid
AND catgroup='Concerts';
```

## Actualizaciones con columnas de otra tabla en la cláusula SET
<a name="c_Examples_of_UPDATE_statements-set-with-column-from-another-table"></a>

Para actualizar la tabla listing de la base de datos de muestra TICKIT con los valores de la tabla sales, utilice el siguiente ejemplo.

```
SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5;

+--------+------------+
| listid | numtickets |
+--------+------------+
| 100423 | 4          |
| 108334 | 24         |
| 117150 | 4          |
| 135915 | 20         |
| 205927 | 6          |
+--------+------------+

UPDATE listing
SET numtickets = sales.sellerid
FROM sales
WHERE sales.sellerid = 1 AND listing.sellerid = sales.sellerid;

SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5;

+--------+------------+
| listid | numtickets |
+--------+------------+
| 100423 | 1          |
| 108334 | 1          |
| 117150 | 1          |
| 135915 | 1          |
| 205927 | 1          |
+--------+------------+
```

# USE
<a name="r_USE_command"></a>

Cambia la base de datos en la que se ejecutan las consultas. SHOW USE apunta a la base de datos que se utilizó más recientemente con el comando USE. RESET USE restablece la base de datos utilizada. Esto significa que si la base de datos no se especifica en SQL, los objetos se buscan en la base de datos actual.

## Sintaxis
<a name="r_USE-synopsis"></a>

```
USE database
```

## Ejemplos
<a name="r_USE_command-examples"></a>

Supongamos que hay tres bases de datos, `dev` y `pdb`, y `pdb2`. Supongamos que hay dos tablas `t` en los esquemas públicos de cada una de las bases de datos. En primer lugar, inserte los datos en tablas de diferentes bases de datos:

```
dev=# insert into dev.public.t values (1);
INSERT 0 1
dev=# insert into pdb.public.t values (2);
INSERT 0 1
```

Sin configurar una base de datos de forma explícita, el sistema utiliza la base de datos conectada. Compruebe el contexto actual de la base de datos:

```
dev=# show use;
Use Database

(1 row)
dev=> show search_path;
search_path
$user, public
(1 row)
```

Al consultar una tabla `t` sin especificar una base de datos, el sistema utiliza la tabla de la base de datos actual:

```
dev=# select * from t;
c
----
1
(1 row)
```

Utilice el comando `use` para cambiar de bases de datos sin cambiar la conexión:

```
dev=# use pdb;
USE
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# select * from t;
id
----
2
(1 row)
```

También puede especificar explícitamente el esquema:

```
dev=# select * from public.t;
id
----
2
(1 row)
```

Ahora puede crear tablas en diferentes esquemas dentro de la base de datos actual:

```
dev=# create table s1.t(id int);
CREATE TABLE
dev=# insert into pdb.s1.t values (3);
INSERT 0 1
```

La ruta de búsqueda determina a qué objetos del esquema se accede cuando no se especifica un esquema:

```
dev=# set search_path to public, s1;
SET
dev=# select * from t;
 id
----
  2
(1 row)
```

Cambie el orden de los esquemas para acceder a diferentes tablas:

```
dev=# set search_path to s1, public;
SET
dev=# show search_path;
 search_path
-------------
 s1, public
(1 row)
dev=# select * from t;
 id
----
  3
(1 row)
```

Cambie a otra base de datos manteniendo su conexión original:

```
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# use pdb2;
USE
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)
```

Al cambiar de base de datos, la ruta de búsqueda se restablece a la predeterminada:

```
dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

Cree una tabla e inserte datos en la base de datos actual:

```
dev=# create table pdb2.public.t(id int);
CREATE TABLE
dev=# insert into pdb2.public.t values (4);
INSERT 0 1
dev=# select * from t;
 id
----
  4
(1 row)
```

En las transacciones, puede escribir en la base de datos actual y leer desde cualquier base de datos mediante una notación de tres partes. Esto también incluye la base de datos conectada:

```
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)

dev=# BEGIN;
BEGIN
dev=# select * from t;
 id
----
  4
(1 row)

dev=# insert into t values (5);
INSERT 0 1
dev=# select * from t;
 id
----
  4
  5
(2 rows)

dev=# select * from pdb.public.t;
 id
----
  2
(1 row)

dev=# select * from dev.public.t;
 id
----
  1
(1 row)
```

Restablezca la base de datos conectada. Tenga en cuenta que esto no solo revierte a la base de datos `pdb` utilizada anteriormente, sino que se restablece a la base de datos conectada. La ruta de búsqueda también cambia a la predeterminada: 

```
dev=# RESET USE;
RESET
dev=# select * from t;
c
----
1
(1 row)
dev=# show use;
 Use Database
--------------

(1 row)

dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

Puede cambiar las bases de datos al inicio de una transacción, pero no después de ejecutar las consultas:

```
dev=# BEGIN;
BEGIN
dev=# use pdb;
USE
dev=# use pdb2;
USE
dev=# use pdb;
USE
dev=# select * from t;
 id
----
  2
(1 row)
dev=# use pdb2;
ERROR:  USEd Database cannot be set or reset inside a transaction after another command.
dev=# rollback;
ROLLBACK
(1 row)
```

### Ejemplo del catálogo de datos
<a name="use-redlake-example"></a>

En primer lugar, cree tablas en diferentes esquemas y catálogos para demostrar las consultas entre catálogos. Comience por crear tablas en la base de datos conectada.

```
dev=# CREATE TABLE dev.public.t (col INT);
dev=# INSERT INTO dev.public.t VALUES (1);
dev=# CREATE SCHEMA write_schema;
dev=# CREATE TABLE dev.write_schema.t (state char (2));
dev=# INSERT INTO dev.write_schema.t VALUES ('WA');
```

Ahora, cree tablas similares en un catálogo diferente. Esto demuestra cómo trabajar con bases de datos entre catálogos.

```
dev=# CREATE TABLE my_db@my_catalog.public.t (col INT);
dev=# INSERT INTO my_db@my_catalog.public.t VALUES (100);
dev=# CREATE SCHEMA my_db@my_catalog.write_schema;
dev=# CREATE TABLE my_db@my_catalog.write_schema.t (state char (2));
dev=# INSERT INTO my_db@my_catalog.write_schema.t VALUES ('CA');
```

Compruebe el contexto actual de la base de datos. Sin configurar una base de datos de forma explícita, el sistema utiliza la base de datos conectada.

```
dev=# SHOW USE;
 Use Database
--------------

(1 row)

dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)

dev=# SELECT * FROM t;
 col
-----
   1
(1 row)
```

Configure la base de datos USEd para consultar las tablas en un catálogo diferente.

```
dev=# USE my_db@my_catalog;

dev=# SHOW USE;
            Use Database
-------------------------------------
 my_db@my_catalog
(1 row)

dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

Al consultar la tabla t, los resultados provienen de la base de datos entre catálogos.

```
dev=# SELECT * FROM t;
 col
-----
 100
(1 row)

dev=# SELECT * FROM public.t;
 col
-----
 100
(1 row)

dev=# SELECT * FROM my_db@my_catalog.public.t;
 col
-----
 100
(1 row)
```

Cambie la ruta de búsqueda para acceder a las tablas de distintos esquemas dentro de la base de datos USEd.

```
dev=# SET search_path to write_schema;

dev=# SHOW search_path;
 search_path
--------------
 write_schema
(1 row)

dev=# SELECT * FROM t;
 state
-------
 CA
(1 row)

dev=# SELECT * FROM write_schema.t;
 state
-------
 CA
(1 row)

dev=# SELECT * FROM my_db@my_catalog.write_schema.t;
 state
-------
 CA
(1 row)
```

Aunque USE está configurado como una base de datos entre catálogos, aún es posible realizar consultas explícitas en la base de datos original.

```
dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

Restablezca la base de datos USEd para que vuelva a hacer referencia a los objetos de la base de datos conectada.

```
dev=# RESET USE;

dev=# SHOW USE;
 Use Database
--------------

(1 row)
```

Tenga en cuenta que search\$1path se restablece cuando se restablece USE.

```
dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

Tras el restablecimiento, las consultas ahora hacen referencia a la base de datos conectada original.

```
dev=# SELECT * FROM t;
 col
-----
   1
(1 row)

dev=# SELECT * FROM public.t;
 col
-----
   1
(1 row)

dev=# SELECT * FROM dev.public.t;
 col
-----
   1
(1 row)
```

Puede modificar la ruta de búsqueda en la base de datos original para acceder a diferentes esquemas.

```
dev=# SET search_path to write_schema;

dev=# SHOW search_path;
 search_path
--------------
 write_schema
(1 row)

dev=# SELECT * FROM t;
 state
-------
 WA
(1 row)

dev=# SELECT * FROM write_schema.t;
 state
-------
 WA
(1 row)

dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

# VACUUM
<a name="r_VACUUM_command"></a>

Reordena las filas y recupera espacio en una tabla especificada o en todas las tablas de la base de datos actual.

**nota**  
Solo los usuarios con los permisos de tabla necesarios pueden vaciar una tabla de forma eficaz. Si se ejecuta VACUUM sin los privilegios de tabla necesarios, la operación se completa correctamente pero no tiene ningún efecto. Para obtener una lista de los permisos de tabla válidos para ejecutar VACUUM de forma eficaz, consulte la siguiente sección de privilegios requeridos.

Amazon Redshift ordena los datos de forma automática y ejecuta VACUUM DELETE en segundo plano. Esto disminuye la necesidad de ejecutar el comando VACUUM. Para obtener más información, consulte [Limpieza de tablas](t_Reclaiming_storage_space202.md). 

De manera predeterminada, VACUUM omite la fase de ordenación para cualquier tabla que tenga más del 95 por ciento de las filas de la tabla ordenadas. La omisión de la fase de ordenación puede mejorar significativamente el rendimiento de VACUUM. Para cambiar el orden predeterminado o eliminar el umbral de una tabla, incluya el nombre de la tabla y el parámetro TO *threshold (umbral)* PERCENT cuando ejecute VACUUM. 

Los usuarios pueden obtener acceso a las tablas mientras se limpian. Puede realizar consultas y escribir operaciones mientras se limpia una tabla, pero cuando se ejecutan comandos de lenguaje de manipulación de datos (DML) y una limpieza de manera simultánea, ambas operaciones podrían demorar más de lo usual. Si se ejecutan las instrucciones UPDATE y DELETE durante una limpieza, el rendimiento del sistema podría reducirse. VACUUM DELETE bloquea temporalmente las operaciones UPDATE y DELETE. 

Amazon Redshift realiza automáticamente una operación de limpieza DELETE ONLY en segundo plano. La operación automática de limpieza se detiene cuando los usuarios ejecutan operaciones de lenguaje de definición de datos (DDL), tales como ALTER TABLE.

**nota**  
La sintaxis y el comportamiento del comando VACUUM de Amazon Redshift son considerablemente diferentes de la operación VACUUM de PostgreSQL. Por ejemplo, la operación VACUUM predeterminada en Amazon Redshift es VACUUM FULL, que recupera espacio en el disco y reordena todas las filas. En cambio, la operación VACUUM predeterminada en PostgreSQL solo recupera espacio y lo pone a disposición para volver a utilizarlo.

Para obtener más información, consulte [Limpieza de tablas](t_Reclaiming_storage_space202.md).

## Privilegios necesarios
<a name="r_VACUUM_command-privileges"></a>

Los siguientes privilegios son necesarios para VACUUM:
+ Superusuario
+ Usuarios con el privilegio VACUUM
+ Propietario de la tabla
+ Propietario de la base de datos con quien se comparte la tabla

## Sintaxis
<a name="r_VACUUM_command-synopsis"></a>

```
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ]
[ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
```

## Parameters
<a name="r_VACUUM_command-parameters"></a>

FULL   <a name="vacuum-full"></a>
Ordena la tabla especificada (o todas las tablas en la base de datos actual) y recupera espacio en disco ocupado por filas que las operaciones UPDATE y DELETE anteriores habían marcado para eliminación. El valor predeterminado es VACUUM FULL.  
Una limpieza completa no realiza una reindexación para tablas intercaladas. Para reindexar tablas intercaladas seguido por una limpieza completa, utilice la opción [VACUUM REINDEX](#vacuum-reindex).   
Por defecto, VACUUM FULL omite la fase de ordenación de cualquier tabla que ya tenga al menos 95 por ciento ordenado. Si VACUUM puede omitir la fase de ordenación, ejecuta un comando DELETE ONLY y recupera espacio en la fase de eliminación para que al menos el 95 por ciento de las filas restantes no se marque para su eliminación.    
Si no se cumple el umbral de ordenación (por ejemplo, si el 90 por ciento de las filas está ordenado) y VACUUM realiza una ordenación completa, también llevará a cabo una operación de eliminación completa y recuperará el espacio del 100 por cien de las filas eliminadas.   
Puede cambiar el umbral de limpieza predeterminado solo para una tabla. Para cambiar el umbral de limpieza predeterminado de una sola tabla, incluya el nombre de la tabla y el parámetro TO *threshold (umbral)* PERCENT. 

SORT ONLY   <a name="vacuum-sort-only"></a>
Ordena la tabla especificada (o todas las tablas de la base de datos actual) sin recuperar espacio liberado por filas eliminadas. Esta opción es útil cuando no es importante recuperar espacio en el disco, pero sí lo es la reordenación de nuevas filas. Una limpieza SORT ONLY reduce el tiempo transcurrido para las operaciones de limpieza cuando la región sin ordenar no contiene una gran cantidad de filas eliminadas o no abarca la región ordenada completa. Este tipo de limpieza puede ser beneficioso para las aplicaciones que no tienen limitaciones de espacio en el disco pero dependen de optimizaciones de consultas asociadas con mantener las filas de la tabla ordenadas.  
Por defecto, VACUUM SORT ONLY omite cualquier tabla que ya tenga al menos 95 por ciento ordenado. Para cambiar el umbral de orden predeterminado de una tabla, incluya el nombre de la tabla y el parámetro TO *threshold* PERCENT cuando ejecute VACUUM. 

DELETE ONLY   <a name="vacuum-delete-only"></a>
Amazon Redshift realiza de forma automática una operación de limpieza DELETE ONLY en segundo plano; por lo tanto, rara vez tendrá que ejecutar una limpieza DELETE ONLY.  
Una VACUUM DELETE recupera espacio en disco ocupado por filas que las operaciones UPDATE y DELETE anteriores habían marcado para eliminación y compacta la tabla para liberar el espacio consumido. Una operación de limpieza DELETE ONLY no ordena los datos de la tabla.   
Esta opción reduce el tiempo transcurrido en las operaciones de limpieza cuando la recuperación de espacio en el disco es importante, pero no la reordenación de nuevas filas. Esta opción también puede ser útil cuando el rendimiento de la consulta ya es óptimo y no es necesario reordenar las filas para optimizar el rendimiento de la consulta.  
Por defecto, VACUUM DELETE ONLY recupera espacio para que al menos el 95 por ciento de las filas restantes no se marque para su eliminación. Para cambiar el umbral de eliminación predeterminado de una tabla, incluya el nombre de la tabla y el parámetro TO *threshold* PERCENT cuando ejecute VACUUM.    
Algunas operaciones, como `ALTER TABLE APPEND`, pueden hacer que se fragmenten las tablas. Cuando se usa la cláusula `DELETE ONLY`, la operación vacuum reclama espacio de las tablas fragmentadas. El mismo valor de umbral del 95 por ciento se aplica a la operación de desfragmentación. 

REINDEX  <a name="vacuum-reindex"></a>
Analiza la distribución de los valores en columnas de claves de ordenación intercaladas y, luego, realiza una operación VACUUM completa. Si se utiliza REINDEX, se requiere un nombre de tabla.  
VACUUM REINDEX toma considerablemente más tiempo que VACUUM FULL ya que realiza una ejecución adicional para analizar las claves de ordenación intercaladas. La operación de ordenación y fusión lleva más tiempo para tablas intercaladas porque es posible que la ordenación intercalada necesite reorganizar más filas que una ordenación compuesta.  
Si una operación VACUUM REINDEX termina antes de completarse, la próxima VACUUM reanuda la operación de reindexación antes de realizar la operación de limpieza completa.  
VACUUM REINDEX no puede utilizarse con TO *threshold* PERCENT.  

RECLUSTER  <a name="vacuum-recluster"></a>
Ordena las partes de la tabla que no están ordenadas. Las partes de la tabla que ya están ordenadas gracias a la ordenación automática de tabla se dejan intactas. Este comando no fusiona los datos recién ordenados con la región ordenada. Tampoco recupera todo el espacio que está marcado para su eliminación. Cuando se completa este comando, es posible que la tabla no aparezca completamente ordenada, como lo indica el campo `unsorted` en SVV\$1TABLE\$1INFO.   
 Recomendamos que se utilice VACUUM RECLUSTER para las tablas grandes con ingesta frecuente y consultas que solo acceden a los datos más recientes.   
 VACUUM RECLUSTER no es compatible con TO threshold PERCENT. Si se utiliza RECLUSTER, se necesita el nombre de una tabla.  
VACUUM RECLUSTER no es compatible con las tablas con claves de ordenación intercaladas y las tablas con el estilo de distribución ALL.

 *table\$1name*   
El nombre de una tabla que se limpiará. Si no especifica un nombre de tabla, la operación de limpieza se aplica a todas las tablas de la base de datos actual. Puede especificar cualquier tabla permanente o temporal creada por un usuario. El comando no es significativo para otros objetos, como vistas y tablas del sistema.  
 Si incluye el parámetro TO *threshold* PERCENT, se requiere un nombre de tabla.

 TO *threshold* PERCENT   
Una cláusula que especifica el umbral por encima del cual VACUUM omite la fase de ordenación y el umbral de destino para recuperar espacio en la fase de eliminación. El *umbral de ordenación* es el porcentaje de las filas totales que ya están en orden en la tabla especificada antes de la limpieza.  El *umbral de eliminación* es el porcentaje mínimo de las filas totales que no están marcadas para eliminación después de la limpieza.   
Como VACUUM reordena las filas solo cuando el porcentaje de filas ordenadas en una tabla es inferior al límite de ordenación, en muchas ocasiones, Amazon Redshift puede reducir los tiempos de VACUUM considerablemente. Del mismo modo, cuando VACUUM no se limita a recuperar el espacio del 100 por cien de las filas marcadas para su eliminación, normalmente puede omitir la reescritura de varios bloques que contienen solo algunas filas eliminadas.  
Por ejemplo, si especifica 75 como *umbral*, VACUUM omitirá la fase de ordenación si el 75 por ciento o más de las filas de la tabla ya se encuentran en orden. En la fase de eliminación, VACUUMS establece un objetivo de espacio de recuperación de espacio en disco para que al menos el 75 por ciento de las filas de la tabla no se marquen para su eliminación después de la limpieza. El valor de *threshold* debe ser un número entero comprendido entre 0 y 100. El valor predeterminado es 95. Si especifica un valor de 100, VACUUM siempre ordena la tabla a menos que esté completamente ordenada y recupera espacio de todas las filas marcadas para la eliminación. Si especifica un valor de 0, VACUUM nunca ordena la tabla y nunca recupera espacio.  
Si incluye el parámetro TO *threshold* PERCENT, también debe especificar un nombre de tabla. VACUUM falla si se omite un nombre de tabla.   
No se puede utilizar el parámetro TO *threshold* PERCENT con REINDEX. 

BOOST  
Ejecuta el comando VACUUM con recursos adicionales como espacio en disco y memoria, cuando están disponibles, Con la opción BOOST, VACUUM opera en una ventana y bloquea las eliminaciones y actualizaciones simultáneas durante la duración de la operación VACUUM. La ejecución con la opción BOOST compite con los recursos del sistema, lo que puede afectar el rendimiento de las consultas. Ejecute VACUUM BOOST cuando la carga en el sistema sea ligera; por ejemplo durante las operaciones de mantenimiento.   
Cuando utilice la opción BOOST, tenga en cuenta lo siguiente:  
+ Si se especifica BOOST, el valor *table\$1name* es obligatorio. 
+ BOOST no es compatible con REINDEX. 
+ BOOST se ignora con DELETE ONLY. 

## Notas de uso
<a name="r_VACUUM_usage_notes"></a>

Se recomienda una limpieza completa para la mayoría de las aplicaciones de Amazon Redshift. Para obtener más información, consulte [Limpieza de tablas](t_Reclaiming_storage_space202.md).

Antes de ejecutar una operación de limpieza, tenga en cuenta el siguiente comportamiento: 
+ No se puede ejecutar VACUUM en un bloque de transacción (BEGIN … END). Para obtener más información acerca de las transacciones, consulte [Niveles de aislamiento en Amazon Redshift](c_serial_isolation.md). 
+ Parte del crecimiento de la tabla puede ocurrir cuando se limpian las tablas. Este comportamiento se espera cuando no hay filas eliminadas para recuperar o el nuevo orden de la tabla produce un menor nivel de compresión de datos.
+ Durante las operaciones de limpieza, se espera cierto grado de degradación en el rendimiento de las consultas. El rendimiento normal se reanuda tan pronto se completa la operación de limpieza.
+ Las operaciones de escritura simultáneas continúan durante las operaciones de limpieza, pero no se recomienda realizar operaciones de escritura durante la limpieza. Es más eficiente completar operaciones de escritura antes de ejecutar la limpieza. Además, cualquier dato que se escriba después de que se haya iniciado una operación de limpieza no se puede limpiar mediante esa operación. En este caso, es necesaria una segunda operación de limpieza.
+ Es posible que una operación de limpieza no se inicie si ya hay una operación de carga o inserción en curso. Las operaciones de limpieza requieren acceso exclusivo a tablas temporalmente para poder iniciarse. Este acceso exclusivo se requiere por poco tiempo, para que las operaciones de limpieza no bloqueen cargas e inserciones simultáneas para cualquier periodo de tiempo significativo.
+ Las operaciones de limpieza se omiten cuando no hay trabajo para realizar en una tabla en particular; no obstante, hay costos de mantenimiento asociados con descubrir que se puede omitir la operación. Si está seguro de que una tabla está limpia o no cumple con el umbral de limpieza, no ejecute una operación de limpieza.
+ Es posible que una operación de limpieza DELETE ONLY sobre una tabla pequeña no reduzca la cantidad de bloques utilizados para almacenar los datos, especialmente cuando la tabla tiene una gran cantidad de columnas o el clúster usa una gran cantidad de sectores por nodo. Estas operaciones de limpieza agregan un bloque por columna por sector a la cuenta para inserciones simultáneas en la tabla, y hay una posibilidad de que estos costos de mantenimiento superen la reducción de bloques del espacio en disco subyacente. Por ejemplo, si una tabla de 10 columnas de un clúster de 8 nodos ocupa 1000 bloques antes de una limpieza, la limpieza no reducirá la cantidad de bloques real a menos que se recuperen más de 80 bloques de espacio en disco por la eliminación de filas. (Cada bloque de datos utiliza 1 MB).

Las operaciones de limpieza automáticas se ponen en pausa si se cumple alguna de las condiciones siguientes: 
+ Un usuario ejecuta una operación de lenguaje de definición de datos (DDL), como ALTER TABLE, que requiere un bloqueo exclusivo en una tabla en la que se está realizando actualmente la limpieza automática. 
+ Un periodo de carga elevada del clúster.

### Compatibilidad con VACUUM simultáneo
<a name="r_VACUUM_usage_notes_concurrent"></a>

Amazon Redshift admite la ejecución simultánea de múltiples transacciones de vaciado en diferentes sesiones de un clúster o grupo de trabajo. Esto significa que puede emitir diferentes y múltiples instancias de todos los modos de vaciado a la vez, con cada transacción de vaciado en una tabla única. Dos operaciones de vaciado no pueden trabajar en una misma tabla al mismo tiempo.

**Directrices para ejecutar un vaciado simultáneo**
+ Cuando ejecute transacciones de vaciado simultáneas en diferentes sesiones, debe supervisar los recursos del sistema y evitar ejecutar demasiadas operaciones de vaciado al mismo tiempo.
+ El nivel de simultaneidad recomendado depende de la cantidad de espacio que se va a recuperar, tanto del número como de la anchura de las filas que se van a ordenar, del tamaño del almacén y del tamaño de la carga de trabajo que se ejecuta junto con las operaciones VACUUM.
+ Dependiendo del modo de la transacción de vaciado, comience con dos operaciones de vaciado simultáneas y agregue más dependiendo del tiempo de ejecución y carga del sistema. Al igual que otras consultas pesadas emitidas por los usuarios, las operaciones de vaciado pueden comenzar a ponerse en cola si ejecuta demasiadas simultáneamente cuando Amazon Redshift alcanza los límites de recursos del sistema. 
+ Ejecute varias operaciones de BOOST de vaciado con cuidado. La ejecución de vaciado con la opción BOOST compite con los recursos del sistema, lo que puede afectar el rendimiento de las consultas. Ejecute VACUUM BOOST cuando la carga en el sistema sea ligera; por ejemplo durante las operaciones de mantenimiento.
+ Si no especifica un nombre de tabla, la operación de limpieza se aplica a todas las tablas de la base de datos actual. Estas operaciones de vaciado siguen ejecutándose secuencialmente.

## Ejemplos
<a name="r_VACUUM_command-examples"></a>

Recuperar espacio y base de datos y reordenar las filas de todas las tablas en función del umbral de limpieza predeterminado de 95 por ciento.

```
vacuum;
```

Recuperar espacio y reordenar las filas de la tabla SALES en función del umbral predeterminado de 95 por ciento. 

```
vacuum sales;
```

Siempre recuperar espacio y reordenar las filas de la tabla SALES. 

```
vacuum sales to 100 percent;
```

Reordenar las filas de la tabla SALES solo si menos del 75 por ciento de las filas ya está ordenado. 

```
 vacuum sort only sales to 75 percent;
```

Recuperar espacio en la tabla SALES para que al menos el 75 por ciento de las filas restantes no se marquen para su eliminación después de la limpieza. 

```
vacuum delete only sales to 75 percent;
```

Reindexar y, luego, limpiar la tabla LISTING. 

```
vacuum reindex listing;
```

El siguiente comando devuelve un error. 

```
vacuum reindex listing to 75 percent;
```

Recluster y, a continuación, vacuum la tabla LISTING. 

```
vacuum recluster listing;
```

Recluster y, a continuación, vacuum la tabla LISTING con la opción BOOST. 

```
vacuum recluster listing boost;
```