

 O Amazon Redshift não permitirá mais a criação de UDFs do Python a partir do Patch 198. As UDFs do Python existentes continuarão a funcionar normalmente até 30 de junho de 2026. Para ter mais informações, consulte a [publicação de 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>

A linguagem SQL consiste em comandos usados para criar e manipular objetos de banco de dados, executar consultas, carregar tabelas e modificar os dados nas tabelas.

O Amazon Redshift é baseado no PostgreSQL. O Amazon Redshift e o PostgreSQL têm inúmeras diferenças importantes das quais você deve estar ciente ao projetar e desenvolver suas aplicações de data warehouse. Para mais informações sobre como o SQL do Amazon Redshift difere do PostgreSQL, consulte [Amazon Redshift e PostgreSQL](c_redshift-and-postgres-sql.md).

**nota**  
O tamanho máximo de uma única instrução SQL é 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)
+ [ALTER IDENTITY PROVIDER](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)
+ [CRIAR TABELA](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)
+ [https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.7/redshift-jdbc42-2.1.0.7.zip Na região da China (Pequim), use o seguinte link: https://s3---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/redshift-downloads-cn/drivers/jdbc/2.1.0.7/redshift-jdbc42-2.1.0.7.zip](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)
+ [DESCARTAR TABELA](r_DROP_TABLE.md)
+ [DROP](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 (tabela 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)
+ [SHOW SCHEMAS](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>

Interrompe a transação que está sendo executada e descarta todas as atualizações feitas por essa transação. ABORT não afeta transações já concluídas.

Este comando executa a mesma função que o comando ROLLBACK. Para mais informações, consulte [ROLLBACK](r_ROLLBACK.md).

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

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

## Parâmetros
<a name="r_ABORT-parameters"></a>

WORK  
Palavra-chave opcional.

TRANSACTION  
Palavra-chave opcional; WORK e TRANSACTION são sinônimos.

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

O exemplo a seguir cria uma tabela, depois inicia uma transação com a inserção de dados na tabela. O comando ABORT então reverte a inserção de dados para deixar a tabela vazia.

O comando a seguir cria uma tabela de exemplo denominada MOVIE\$1GROSS:

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

O próximo conjunto de comandos inicia uma transação que insere duas linhas de dados na tabela:

```
begin;

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

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

Depois, o comando seleciona os dados da tabela para mostrar que eles foram inseridos com êxito:

```
select * from movie_gross;
```

A saída do comando mostra que ambas as linhas foram inseridas com êxito:

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

Agora este comando reverte as alterações de dados para onde a transação foi iniciada:

```
abort;
```

Selecionar dados na tabela agora exibe uma tabela vazia:

```
select * from movie_gross;

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

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

Altera os atributos de um banco de dados.

## Privilégios obrigatórios
<a name="r_ALTER_DATABASE-privileges"></a>

Para usar ALTER DATABASE, um dos privilégios a seguir é necessário.
+ Superusuário
+ Usuários com o privilégio ALTER DATABASE.
+ Proprietário do banco de dados

## Sintaxe
<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 [, ...] } ] ]
 }
}
```

## Parâmetros
<a name="r_ALTER_DATABASE-parameters"></a>

 *database\$1name*   
Nome do banco de dados a ser alterado. Normalmente, você deve alterar um banco de dados ao qual não estiver conectado. De qualquer maneira, as alterações somente entram em vigor nas próximas sessões. É possível alterar o proprietário do banco de dados atual, mas não é possível renomeá-lo:  

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

RENAME TO   
Renomeia o banco de dados especificado. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md). Você não pode renomear os bancos de dados dev, padb\$1harvest, template0, template1 ou sys:internal, além do banco de dados atual. Somente o proprietário do banco de dados ou um [superuser](r_superusers.md#def_superusers) pode renomear o banco de dados. Proprietários que não forem superusuários também devem ter o privilégio CREATEDB.

 *new\$1name*   
Novo nome do banco de dados.

OWNER TO   
Altera o proprietário do banco de dados especificado. É possível alterar o proprietário do banco de dados atual ou de outro banco de dados. Somente um superusuário pode alterar o proprietário.

 *new\$1owner*   
Novo proprietário do banco de dados. O novo proprietário deve ser um usuário existente de bancos de dados com privilégios de gravação. Para obter mais informações sobre privilégios do usuário, consulte [GRANT](r_GRANT.md).

CONNECTION LIMIT \$1 *limite* \$1 UNLIMITED \$1   
Número máximo de conexões de banco de dados que os usuários podem abrir simultaneamente. Não há aplicação de limite para superusuários. Use a palavra-chave UNLIMITED para permitir o número máximo de conexões simultâneas. Um limite no número de conexões para cada usuário também pode ser aplicável. Para obter mais informações, consulte [CREATE USER](r_CREATE_USER.md). O valor padrão é UNLIMITED. Para visualizar as conexões atuais, consulte a exibição [STV\$1SESSIONS](r_STV_SESSIONS.md) do sistema.  
Se limites de usuário e de conexão de banco de dados forem aplicáveis, um slot de conexão não utilizado que esteja dentro de ambos os limites deve estar disponível quando um usuário tenta se conectar.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Uma cláusula que especifica se a pesquisa ou comparação de string diferencia maiúsculas e minúsculas ou não.   
É possível alterar a distinção entre maiúsculas e minúsculas do banco de dados atual se ele estiver vazio.  
Você deve ter a permissão ALTER para o banco de dados atual para alterar a distinção entre maiúsculas e minúsculas. Os superusuários ou proprietários de bancos de dados com a permissão CREATE DATABASE também podem alterar a distinção.  
CASE\$1SENSITIVE e CS são intercambiáveis e geram os mesmos resultados. Da mesma forma, CASE\$1INSENSITIVE e CI são intercambiáveis e geram os mesmos resultados.

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
Uma cláusula que especifica o nível de isolamento usado quando são executadas consultas em um banco de dados. Para acessar mais informações sobre níveis de isolamento, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md).  
+ Isolamento SNAPSHOT: fornece um nível de isolamento com proteção contra conflitos de atualização e exclusão. 
+ Isolamento SERIALIZABLE: fornece serialização total para transações simultâneas.
Considere os seguintes itens ao alterar o nível de isolamento de um banco de dados:  
+ Você deve ter o privilégio de superusuário ou CREATE DATABASE para o banco de dados atual a fim de alterar o nível de isolamento do banco de dados.
+ Você não pode alterar o nível de isolamento do banco de dados `dev`. 
+ Você não pode alterar o nível de isolamento em um bloco de transação.
+ O comando para alterar o nível de isolamento falhará se outros usuários estiverem conectados ao banco de dados.
+ O comando para alterar o nível de isolamento pode alterar as configurações de nível de isolamento da sessão atual.

INTEGRATION  
Altere um banco de dados de integração ETL zero.

REFRESH \$1\$1 ALL \$1 INERROR \$1 TABLES [IN SCHEMA *schema* [, ...]] \$1 TABLE *schema.table* [, ...]\$1  
Uma cláusula que especifica se o Amazon Redshift vai atualizar todas as tabelas ou as tabelas com erros na tabela ou no esquema especificado. A atualização vai acionar as tabelas na tabela ou no esquema especificado para serem totalmente replicadas pelo banco de dados de origem.  
Consulte mais informações em [Integrações ETL zero](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.html) no *Guia de gerenciamento do Amazon Redshift*. Para obter mais informações sobre estados de integração, consulte [SVV\$1INTEGRATION\$1TABLE\$1STATE](r_SVV_INTEGRATION_TABLE_STATE.md) e [SVV\$1INTEGRATION](r_SVV_INTEGRATION.md).

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
A cláusula QUERY\$1ALL\$1STATES define se as tabelas de integração ETL zero podem ser consultadas em todos os estados (`Synced`, `Failed`, `ResyncRequired` e `ResyncInitiated`). Por padrão, uma tabela de integração ETL zero só pode ser consultada no estado `Synced`.

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
A cláusula ACCEPTINVCHARS define se as tabelas de integração ETL zero devem continuar com a ingestão quando caracteres inválidos são detectados para o tipo de dados VARCHAR. Quando um caractere inválido é encontrado, ele é substituído por um caractere padrão `?`.

REFRESH\$1INTERVAL <intervalo>  
A cláusula REFRESH\$1INTERVAL define o intervalo de tempo aproximado, em segundos, para atualizar os dados da origem de ETL zero para o banco de dados de destino. O `interval` pode ser definido de 0 a 432.000 segundos (5 dias) para integrações ETL zero cujo tipo de origem é o Aurora MySQL, o Aurora PostgreSQL ou o RDS para MySQL. Para integrações ETL zero do Amazon DynamoDB, o `interval` pode ser definido de 900 a 432.000 segundos (15 minutos a 5 dias).  
Consulte mais informações sobre a criação de bancos de dados com integrações ETL zero em [Criar bancos de dados de destino no Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html) no *Guia de gerenciamento do Amazon Redshift*.

TRUNCATECOLUMNS [=] \$1 TRUE \$1 FALSE \$1  
A cláusula TRUNCATECOLUMNS define se as tabelas de Integração ETL zero devem continuar com a ingestão quando os valores dos atributos das colunas VARCHAR ou SUPER estão além do limite. Quando `TRUE`, os valores são truncados para caber na coluna e os valores dos atributos JSON em excesso são truncados para caber na coluna SUPER.

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1 [ FOR \$1 \$1ALL\$1 TABLES [IN SCHEMA schema [, ...]] \$1 TABLE schema.table [, ...]\$1 ]  
Uma cláusula que especifica se o Amazon Redshift definirá o modo histórico para todas as tabelas ou para tabelas no esquema especificado que participam da integração ETL zero. Essa opção é aplicável somente para bancos de dados criados para integração ETL zero.  
A cláusula HISTORY\$1MODE pode ser definida como `TRUE` ou `FALSE`. O padrão é `FALSE`. Ativar e desativar o modo histórico só é aplicável às tabelas que estão no estado `Synced`. Consulte informações sobre HISTORY\$1MODE em [History mode](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html) no *Guia de gerenciamento do Amazon Redshift*.

## Observações de uso
<a name="r_ALTER_DATABASE-usage-notes"></a>

Comandos ALTER DATABASE são aplicáveis a sessões subsequentes, e não às atuais. Você precisa se reconectar ao banco de dados alterado para visualizar as alterações implementadas.

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

O exemplo a seguir renomeia o banco de dados denominado TICKIT\$1SANDBOX para TICKIT\$1TEST: 

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

O exemplo a seguir altera o proprietário do banco de dados TICKIT (o banco de dados atual) para DWUSER: 

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

O seguinte exemplo altera a distinção entre maiúsculas de minúsculas do banco de dados sampledb:

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

O exemplo a seguir altera um banco de dados chamado **sampledb** com o nível de isolamento SNAPSHOT.

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

O exemplo a seguir atualiza as tabelas **schema1.sample\$1table1** e **schema2.sample\$1table2** no banco de dados **sample\$1integration\$1db** na integração ETL zero.

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

O exemplo a seguir atualiza todas as tabelas sincronizadas e com falha na integração ETL zero.

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

O exemplo a seguir define o intervalo de atualização para integrações ETL zero como 600 segundos.

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

O exemplo a seguir atualiza todas as tabelas presentes em `ErrorState` no esquema **sample\$1schema**.

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

O exemplo a seguir ativa o modo histórico para a tabela `myschema.table1`.

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

O exemplo a seguir ativa o modo histórico para todas as tabelas em `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>

Altera a definição de um datashare. Você pode adicionar ou remover objetos usando ALTER DATASHARE. Você só pode alterar uma unidade de compartilhamento de dados no banco de dados atual. Adicione ou remova objetos do banco de dados associado a uma unidade de compartilhamento de dados. O proprietário do datashare com as permissões necessárias nos objetos de datashare a serem adicionados ou removidos pode alterar o datashare.

## Privilégios obrigatórios
<a name="r_ALTER_DATASHARE-privileges"></a>

A seguir estão os privilégios obrigatórios para ALTER DATASHARE:
+ Superusuário.
+ Usuário com o privilégio ALTER DATASHARE.
+ Usuários que tenham privilégios ALTER ou ALL na unidade de compartilhamento de dados.
+ Para adicionar objetos específicos a uma unidade de compartilhamento de dados, os usuários devem ter o privilégio nos objetos. Neste caso, os usuários devem ser os proprietários de objetos ou ter privilégios SELECT, USAGE ou ALL nos objetos. 

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

A sintaxe a seguir ilustra como adicionar ou remover objetos da unidade de compartilhamento de dados.

```
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 [, ...] }
```

A sintaxe a seguir ilustra como configurar as propriedades da unidade de compartilhamento de dados.

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

## Parâmetros
<a name="r_ALTER_DATASHARE-parameters"></a>

*datashare\$1name*  
Nome do datashare a ser alterado. 

ADD \$1 REMOVE  
Uma cláusula que especifica se deve adicionar ou remover objetos do datashare.

TABLE *schema*.*table* [, ...]  
O nome da tabela ou da exibição no esquema especificado a ser adicionado ao datashare.

SCHEMA *schema* [, ...]   
O nome do esquema a ser adicionado ao datashare.

FUNCTION *schema*.*sql\$1udf* (argtype,...) [, ...]  
O nome da função SQL definida pelo usuário a ser adicionada à unidade de compartilhamento de dados.

ALL TABLES IN SCHEMA *schema* [, ...]   
Uma cláusula que especifica se deve adicionar todas as tabelas e exibições no esquema especificado ao datashare.

ALL FUNCTIONS IN SCHEMA *schema* [, ...] \$1  
Uma cláusula que especifica a adição de todas as funções no esquema especificado ao datashare.

[ SET PUBLICACCESSIBLE [=] TRUE \$1 FALSE ]  
Uma cláusula que especifica se um datashare pode ser compartilhado para clusters acessíveis publicamente.

[ SET INCLUDENEW [=] TRUE \$1 FALSE FOR SCHEMA *schema* ]  
Uma cláusula que especifica se deseja adicionar futuras tabelas, exibições ou funções definidas pelo usuário (UDFs) do SQL criadas no esquema especificado ao datashare. Tabelas atuais, exibições ou UDFs SQL no esquema especificado não são adicionadas ao datashare. Somente superusuários podem alterar essa propriedade para cada par datashare-esquema. Por padrão, a cláusula INCLUDENEW está definida como falsa. 

## Observações de uso do ALTER DATASHARE
<a name="r_ALTER_DATASHARE_usage"></a>
+ Os seguintes usuários podem alterar um datashare:
  + Um superusuário
  + O proprietário do datashare
  + Usuários com privilégios ALTER ou ALL na unidade de compartilhamento de dados
+ Para adicionar objetos específicos a uma unidade de compartilhamento de dados, esses usuários devem ter o privilégio correto nos objetos. Os usuários devem ser os proprietários de objetos ou ter privilégios SELECT, USAGE ou ALL nos objetos.
+ Você pode compartilhar esquemas, tabelas, exibições regulares, exibições de vinculação tardia, visões materializadas e funções definidas pelo usuário (UDFs) do SQL. Adicione um esquema à unidade de compartilhamento de dados antes de adicionar outros objetos ao esquema. 

  Quando você adiciona um esquema, o Amazon Redshift não adiciona todos os objetos abaixo dele. Você deve adicioná-las explicitamente. 
+ Recomendamos criar unidades de compartilhamento de dados AWS Data Exchange com a configuração publicamente acessível ativada.
+ Em geral, recomendamos não alterar uma unidade de compartilhamento de dados AWS Data Exchange para desativar a acessibilidade pública usando a instrução ALTER DATASHARE. Se você fizer isso, as Contas da AWS que têm acesso à unidade de compartilhamento de dados perderão o acesso se os clusters forem acessíveis ao público. Executar esse tipo de alteração pode violar os termos do produto de dados no AWS Data Exchange. Veja a seguir uma exceção a essa recomendação.

  O exemplo a seguir mostra um erro quando uma unidade de compartilhamento de dados do AWS Data Exchange é criada com a configuração desativada.

  ```
  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 a alteração de uma unidade de compartilhamento de dados do AWS Data Exchange para desativar a configuração publicamente acessível, definir a variável a seguir e executar a instrução ALTER DATASHARE novamente.

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

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

  Nesse caso, o Amazon Redshift gera um valor único aleatório para definir a variável de sessão para permitir ALTER DATASHARE SET PUBLICACCESSIBLE FALSE para uma unidade de compartilhamento de dados do AWS Data Exchange.

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

O exemplo a seguir adiciona o esquema `public` à unidade de compartilhamento de dados `salesshare`.

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

O exemplo a seguir adiciona a tabela `public.tickit_sales_redshift` à unidade de compartilhamento de dados `salesshare`.

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

O exemplo a seguir adiciona todas as tabelas à unidade de compartilhamento de dados `salesshare`.

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

O exemplo a seguir remove a tabela `public.tickit_sales_redshift` da unidade de compartilhamento de dados `salesshare`.

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

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

Define o conjunto padrão de permissões de acesso que será aplicado a objetos criados no futuro pelo usuário especificado. Por padrão, os usuários podem alterar somente suas próprias permissões de acesso padrão. Somente um superusuário pode especificar permissões padrão para outros usuários.

Privilégios padrão podem ser aplicados a funções, usuários ou grupos de usuários. É possível definir permissões padrão globalmente para todos os objetos criados no banco de dados atual ou para os objetos criados somente nos esquemas especificados. 

As permissões padrão se aplicam somente a novos objetos. Executar ALTER DEFAULT PRIVILEGES não altera as permissões em objetos existentes. Para conceder permissões em todos os objetos atuais e futuros criados por qualquer usuário em um banco de dados ou esquema, consulte [Scoped permissions](https://docs.aws.amazon.com/redshift/latest/dg/t_scoped-permissions.html). 

Para visualizar informações sobre os privilégios padrão para usuários de bancos de dados, consulte a [PG\$1DEFAULT\$1ACL](r_PG_DEFAULT_ACL.md) tabela de catálogos do sistema. 

Para obter mais informações sobre privilégios, consulte [GRANT](r_GRANT.md).

## Privilégios obrigatórios
<a name="r_ALTER_DEFAULT_PRIVILEGES-privileges"></a>

A seguir estão os privilégios obrigatórios para ALTER DEFAULT PRIVILEGES:
+ Superusuário
+ Usuários com o privilégio ALTER DEFAULT PRIVILEGES
+ Usuários que alterem seus próprios privilégios de acesso padrão
+ Usuários que definam privilégios para esquemas aos quais eles têm privilégios de acesso

## Sintaxe
<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 ]
```

## Parâmetros
<a name="r_ALTER_DEFAULT_PRIVILEGES-parameters"></a>

FOR USER *target\$1user*  <a name="default-for-user"></a>
Opcional. Nome do usuário para o qual os privilégios padrão são definidos. Somente os superusuários podem especificar privilégios padrão para outros usuários. O valor padrão é o usuário atual.

IN SCHEMA *schema\$1name*   <a name="default-in-schema"></a>
Opcional. Se uma cláusula IN SCHEMA for exibida, os privilégios padrão especificados são aplicados a novos objetos criados com o *schema\$1name* especificado. Nesse caso, o usuário ou grupo de usuários de destino do comando ALTER DEFAULT PRIVILEGES deve usar o comando CREATE para criar o privilégio para o esquema especificado. Os privilégios padrão específicos de um esquema são adicionados a privilégios padrão globais existentes. Por padrão, os privilégios padrão são aplicados globalmente ao banco de dados inteiro. 

GRANT   <a name="default-grant"></a>
O conjunto de privilégios a ser concedido a usuários ou grupos especificados para todas as novas tabelas, visualizações, funções ou procedimentos armazenados criados pelo usuário especificado. É possível definir os mesmos privilégios e opções com a cláusula GRANT que você pode definir com o comando [GRANT](r_GRANT.md). 

WITH GRANT OPTION   <a name="default-grant-option"></a>
Cláusula que indica que o usuário que recebe os privilégios por sua vez pode conceder os mesmos privilégios a outros. Você não pode conceder WITH GRANT OPTION a um grupo ou a PUBLIC. 

TO *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*   <a name="default-to"></a>
Nome do usuário, da função ou do grupo de usuários ao qual os privilégios padrão especificados são aplicados.

REVOKE   <a name="default-revoke"></a>
Conjunto de privilégios a serem revogados dos usuários ou grupos especificados para todas as novas tabelas, funções ou procedimentos armazenados criados pelo usuário especificado. É possível definir os mesmos privilégios e opções com a cláusula REVOKE que você pode definir com o comando [REVOKE](r_REVOKE.md). 

GRANT OPTION FOR  <a name="default-revoke-option"></a>
 Cláusula que revoga somente a opção de conceder um privilégio especificado a outros usuários e não revoga o próprio privilégio. Não é possível revogar GRANT OPTION de um grupo ou de PUBLIC. 

FROM *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*  <a name="default-from"></a>
O nome do usuário, da função ou do grupo de usuários do qual os privilégios especificados são revogados por padrão.

RESTRICT   <a name="default-restrict"></a>
A opção RESTRICT revoga somente os privilégios que o usuário concedeu diretamente. Esse é o padrão.

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

Digamos que você deseja permitir que qualquer usuário do grupo `report_readers` visualize todas as tabelas e visualizações criadas pelo usuário `report_admin`. Nesse caso, execute o comando a seguir como superusuário. 

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

No exemplo a seguir, o primeiro comando concede o privilégio SELECT a todas as novas tabelas que você criar. Sempre que criar uma visão, você deverá conceder explicitamente privilégios à visão ou executar novamente o comando `alter default privileges`.

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

O exemplo a seguir concede o privilégio INSERT ao grupo de usuários `sales_admin` para todas as novas tabelas e exibições que você criar no esquema `sales`. 

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

O exemplo a seguir inverte o comando ALTER DEFAULT PRIVILEGES do exemplo anterior. 

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

Por padrão, o grupo de usuários PUBLIC tem permissão de execução para todas as novas funções definidas por usuário. Para revogar permissões de execução `public` para suas novas funções e depois conceder a permissão de execução somente para o grupo de usuários `dev_test`, execute os comandos a seguir. 

```
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>

Altera um esquema externo existente no banco de dados atual. Somente proprietários de esquemas, superusuários ou usuários com privilégios ALTER no esquema podem alterá-lo. Somente esquemas externos criados no CATÁLOGO DE DADOS, KAFKA ou MSK podem ser alterados.

O proprietário deste esquema é o emissor do comando CREATE EXTERNAL SCHEMA. Para transferir a propriedade de um esquema externo, use ALTER SCHEMA para alterar o proprietário. Para conceder acesso ao esquema a outros usuários ou grupos de usuário, use o comando GRANT.

Você não pode usar os comandos GRANT ou REVOKE para permissões em uma tabela externa. Em vez disso, conceda ou revogue permissões no esquema externo. 

Para saber mais, consulte:
+ [ALTER SCHEMA](r_ALTER_SCHEMA.md)
+ [GRANT](r_GRANT.md)
+ [REVOKE](r_REVOKE.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [Habilitar a autenticação mTLS para um esquema externo existente](materialized-view-streaming-ingestion-mtls.md#materialized-view-streaming-ingestion-mtls-alter)

Para visualizar detalhes dos esquemas externos, consulte a visualização de sistema SVV\$1EXTERNAL\$1SCHEMAS. Para obter mais informações, consulte [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md).

## Sintaxe
<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' ]
```

Se você tiver um esquema externo usado para ingestão de streaming e quiser implementar o TLS mútuo para autenticação, poderá executar um comando como o apresentado a seguir, que especifica a autenticação mTLS e o ARN do certificado do ACM no ACM. 

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

Ou você pode especificar a autenticação mTLS, com referência ao ARN do segredo no Secrets Manager.

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

O seguinte exemplo mostra como modificar o URI para ALTER EXTERNAL SCHEMA:

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

O seguinte exemplo mostra como modificar o perfil do IAM para ALTER EXTERNAL SCHEMA:

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

## Parâmetros
<a name="r_ALTER_EXTERNAL_SCHEMA-parameters"></a>

 IAM\$1ROLE[ default \$1 'SESSION' \$1 'arn:aws:iam::<AWS account-id>:role/<role-name>' ]   
Use a palavra-chave `default` para que o Amazon Redshift use o perfil do IAM que está definido como padrão.  
Use `'SESSION'` se você se conectar ao cluster do Amazon Redshift usando uma identidade federada e acesse as tabelas do esquema externo criado usando esse comando.  
Para ter mais informações, consulte [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html).

AUTHENTICATION  
O tipo de autenticação definido para ingestão de streaming. A ingestão de streaming com tipos de autenticação funciona com o Apache, Kafka, Confluent Cloud e Amazon Managed Streaming for Apache Kafka. Para ter mais informações, consulte [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html).

AUTHENTICATION\$1ARN  
O ARN do certificado do AWS Certificate Manager usado pelo Amazon Redshift para autenticação mTLS com Apache Kafka, Confluent Cloud ou Amazon Managed Streaming for Apache Kafka (Amazon MSK). O ARN está disponível no console do ACM quando você escolhe o certificado emitido.

SECRET\$1ARN  
O nome do recurso da Amazon (ARN) de um segredo compatível criado por meio do AWS Secrets Manager. Para ter informações sobre como criar e recuperar um ARN de um segredo, consulte [Manage secrets with AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) no *Guia do usuário do AWS Secrets Manager* e [Recuperar o nome do recurso da Amazon (ARN) do segredo no Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html).

URI  
O URL de bootstrap do cluster do Apache Kafka, Confluent Cloud ou Amazon Managed Streaming for Apache Kafka (Amazon MSK). O endpoint deve ser acessível (roteável) pelo cluster do Amazon Redshift. Para ter mais informações, 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>

Use o comando ALTER EXTERNAL VIEW para atualizar a exibição externa. Dependendo dos parâmetros usados, outros mecanismos SQL, como Amazon Athena e Amazon EMR Spark, que também podem referenciar essa exibição, podem ser afetados. Para obter mais informações sobre visualizações do Catálogo de Dados, consulte [Visualizações do AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

## Sintaxe
<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 }
```

## Parâmetros
<a name="r_ALTER_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
O esquema anexado ao banco de dados do AWS Glue, seguido do nome da exibição.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
A notação do esquema a ser usado durante a alteração da exibição. Você pode especificar o uso do AWS Glue Data Catalog, um banco de dados do Glue criado por você, ou um esquema externo também criado por você. Consulte [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) e [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) para obter mais informações.

FORCE  
Se AWS Lake Formation deve atualizar a definição da exibição mesmo que os objetos referenciados na tabela estejam inconsistentes com outros mecanismos SQL. Se o Lake Formation atualizar a exibição, esta será considerada obsoleta para os outros mecanismos SQL até esses mecanismos também serem atualizados.

 *AS query\$1definition*   
A definição da consulta SQL executada pelo Amazon Redshift para alterar a exibição.

REMOVE DEFINITION  
Se é necessário descartar e recriar as exibições. As exibições devem ser descartadas e recriadas para marcá-las como `PROTECTED`.

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

O exemplo a seguir altera uma exibição do Data Catalog chamada 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>

Renomeia uma função ou altera o proprietário. Tanto o nome da função quanto os tipos de dados são obrigatórios. Somente o proprietário ou um superusuário pode renomear uma função. Somente um superusuário pode alterar o proprietário de uma função. 

## Sintaxe
<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 }
```

## Parâmetros
<a name="r_ALTER_FUNCTION-parameters"></a>

 *function\$1name*   
Nome da função a ser alterada. Especifique o nome da função no caminho de pesquisa atual ou use o formato `schema_name.function_name` para usar um esquema específico.

*py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
Opcional. Uma lista de nomes de argumentos de entrada e tipos de dados para a função definida pelo usuário do Python ou uma lista de tipos de dados de argumentos de entrada para a função SQL definida pelo usuário.

 *new\$1name*   
Um novo nome da função definida pelo usuário. 

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
Um novo proprietário da função definida pelo usuário. 

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

O exemplo a seguir altera o nome de uma função de `first_quarter_revenue` para `quarterly_revenue`.

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

O exemplo a seguir altera o proprietário da função `quarterly_revenue` para `etl_user`.

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

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

Altera um grupo de usuários. Use este comando para adicionar usuários a um grupo, excluir usuários de um grupo ou renomear o grupo. 

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

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

## Parâmetros
<a name="r_ALTER_GROUP-parameters"></a>

 *nome\$1grupo*   
Nome do grupo de usuários a ser modificado. 

ADD   
Adiciona um usuário a um grupo de usuários. 

DROP   
Remove um usuário de um grupo de usuários. 

 *Nome de usuário do*   
Nome do usuário a ser adicionado ou excluído do grupo. 

RENAME TO   
Renomeia o grupo de usuários. Nomes de grupos que começam com dois sublinhados são reservados para uso interno do Amazon Redshift. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md). 

 *new\$1name*   
Novo nome do grupo de usuários. 

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

O exemplo a seguir adiciona um usuário denominado DWUSER ao grupo ADMIN\$1GROUP.

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

O exemplo a seguir renomeia o grupo ADMIN\$1GROUP para ADMINISTRATORS: 

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

O exemplo a seguir adiciona dois usuários ao grupo ADMIN\$1GROUP. 

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

O exemplo a seguir descarta dois usuários do grupo ADMIN\$1GROUP. 

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

# ALTER IDENTITY PROVIDER
<a name="r_ALTER_IDENTITY_PROVIDER"></a>

Altera um provedor de identidades para atribuir novos parâmetros e valores. Quando você executa esse comando, todos os valores de parâmetro definidos anteriormente são excluídos antes de os novos valores serem atribuídos. Somente um superusuário pode alterar um provedor de identidades.

## Sintaxe
<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]
```

## Parâmetros
<a name="r_ALTER_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
O nome do provedor de identidades. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

 *parameter\$1string*   
Uma string com um objeto JSON formatado corretamente que contém os parâmetros e valores necessários para o provedor de identidades específico.

 *Namespace do*   
O namespace da organização.

 *iam\$1role*   
O perfil do IAM que fornece permissões para a conexão com o Centro de Identidade do IAM. Esse parâmetro é aplicável somente quando o tipo de provedor de identidades é AWSIDC.

 *auto\$1create\$1roles*   
Habilita ou desabilita o atributo de criação automática de perfil. Se o valor for TRUE, o Amazon Redshift habilitará o recurso de criação automática de perfil. Se o valor for FALSE, o Amazon Redshift desabilitará o recurso de criação automática de perfil. Se o valor desse parâmetro não for especificado, o Amazon Redshift o determinará usando a seguinte lógica:   
+  Se `AUTO_CREATE_ROLES` for habilitado, mas o valor não for especificado, o valor será definido como TRUE. 
+  Se `AUTO_CREATE_ROLES` não for habilitado e o provedor de identidades for AWSIDC, o valor será definido como FALSE. 
+  Se `AUTO_CREATE_ROLES` não for habilitado e o provedor de identidades for o Azure, o valor será definido como TRUE. 
Para incluir grupos, especifique `INCLUDE`. O padrão é vazio, o que significa incluir todos os grupos se `AUTO_CREATE_ROLES` estiver ativado.  
Para excluir grupos, especifique `EXCLUDE`. O padrão é vazio, o que significa não excluir nenhum grupo se `AUTO_CREATE_ROLES` estiver ativado.

 *filter\$1pattern*   
Uma expressão de caractere UTF-8 válida com o padrão para estabelecer correspondência com os nomes de grupo. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_ALTER_IDENTITY_PROVIDER.html)
Se *filter\$1pattern* não contiver metacaracteres, o padrão representará somente a própria string. Nesse caso, LIKE age da mesma forma que o operador de igualdade.   
*filter\$1pattern* aceita os seguintes caracteres:  
+  Caracteres alfabéticos maiúsculos e minúsculos (A-Z e a-z) 
+  Números (0-9) 
+  Os seguintes caracteres especiais: 

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

 *DISABLE ou ENABLE*   
Ativa e desativa o provedor de identidades. O padrão é ENABLE.

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

O exemplo a seguir altera um provedor de identidades chamado *oauth\$1standard*. Aplica-se especificamente quando o Microsoft Azure AD é o provedor 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"]
}'
```

O exemplo a seguir mostra como definir o namespace do provedor de identidades. Isso poderá ser aplicado ao Microsoft Azure AD, se ele seguir uma declaração como o exemplo anterior, ou a outro provedor de identidades. Também poderá ser aplicado a um caso em que você conecte um cluster provisionado existente do Amazon Redshift ou um grupo de trabalho do Amazon Redshift sem servidor ao Centro de Identidade do IAM, se tiver uma conexão configurada por meio de uma aplicação gerenciada.

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

O exemplo a seguir define o perfil do IAM e funciona no caso de uso para configurar a integração do Redshift com o Centro de Identidade do IAM.

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

Para obter mais informações sobre a configuração de uma conexão do Redshift ao Centro de Identidade do IAM, consulte [Conectar o Redshift ao IAM Identity Center para proporcionar aos usuários uma experiência de logon único](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

**Desabilitar um provedor de identidades**

A declaração de exemplo a seguir mostra como desabilitar um provedor de identidades. Quando desabilitado, os usuários federados do provedor de identidades não podem fazer login no cluster enquanto ele não for habilitado novamente.

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

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

Altera uma política de mascaramento de dados dinâmica existente. Para obter mais informações sobre mascaramento dinâmico de dados, consulte [Mascaramento dinâmico de dados](t_ddm.md).

Superusuários e usuários ou perfis que têm o perfil sys:secadmin podem alterar uma política de mascaramento.

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

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

## Parâmetros
<a name="r_ALTER_MASKING_POLICY-parameters"></a>

*policy\$1name*   
 O nome da política de mascaramento. Deve ser o nome de uma política de mascaramento que já existe no banco de dados. 

database\$1name  
O nome do banco de dados no qual a política é criada. O banco de dados pode ser o conectado ou um banco de dados que comporte as permissões federadas do Amazon Redshift.

*masking\$1expression*  
A expressão SQL usada para transformar as colunas de destino. Ela pode ser escrita usando funções de manipulação de dados, como funções de manipulação de strings, ou em conjunto com funções definidas pelo usuário escritas em SQL, em Python ou com o AWS Lambda.   
 A expressão deve corresponder às colunas de entrada e aos tipos de dados da expressão original. Por exemplo, se as colunas de entrada da política de mascaramento original fossem `sample_1 FLOAT` e `sample_2 VARCHAR(10)`, não seria possível alterar a política de mascaramento para receber uma terceira coluna ou fazer com que a política recebesse um FLOAT e um BOOLEAN. Se você usar uma constante como sua expressão de mascaramento, deverá convertê-la explicitamente em um tipo que corresponda ao tipo de entrada.  
 Você deve ter a permissão USAGE em todas as funções definidas pelo usuário que você usa na expressão de mascaramento. 

Para o uso da ALTER MASKING POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do 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>

Altera os atributos de uma visão materializada. 

## Sintaxe
<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]
};
```

## Parâmetros
<a name="r_ALTER_MATERIALIZED_VIEW-parameters"></a>

*mv\$1name*  
O nome da visão materializada a ser alterada.

AUTO REFRESH \$1 YES \$1 NO \$1  
Uma cláusula que ativa ou desativa a atualização automática de uma visão materializada. Para obter informações sobre atualização automática ou visões materializadas, consulte [Atualizar uma visualização materializada](materialized-view-refresh.md).

ALTER DISTSTYLE ALL  
Uma cláusula que altera o estilo de distribuição existente de uma tabela para `ALL`. Considere o seguinte:  
+ Um ALTER DISTSTYLE, ALTER SORTKEY e VACUUM não podem ser executados simultaneamente na mesma relação. 
  + Se VACUUM estiver sendo executado no momento, a execução ALTER DISTSTYLE ALL retornará um erro. 
  + Se ALTER DISTSTYLE ALL estiver em execução, um vacuum em segundo plano não será iniciado em uma relação. 
+ O comando ALTER DISTSTYLE ALL não é compatível para relações com chaves de classificação intercaladas e tabelas temporárias.
+ Se o estilo de distribuição tiver sido definido anteriormente como AUTO, a relação não será mais considerada para otimização automática de tabela. 
Para obter mais informações sobre DISTSTYLE ALL, acesse [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTSTYLE EVEN  
Uma cláusula que altera o estilo de distribuição existente de uma tabela para `EVEN`. Considere o seguinte:  
+ Um ALTER DISTSYTLE, ALTER SORTKEY e VACUUM não podem ser executados simultaneamente na mesma relação. 
  + Se VACUUM estiver sendo executado no momento, a execução ALTER DISTSTYLE EVEN retornará um erro. 
  + Se ALTER DISTSTYLE EVEN estiver em execução, um vacuum em segundo plano não será iniciado na relação. 
+ O comando ALTER DISTSTYLE EVEN não é compatível para relações com chaves de classificação intercaladas e tabelas temporárias.
+ Se o estilo de distribuição tiver sido definido anteriormente como AUTO, a relação não será mais considerada para otimização automática de tabela. 
Para obter mais informações sobre DISTSTYLE EVEN, acesse [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTKEY *column\$1name* ou ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
Uma cláusula que altera a coluna usada como chave de distribuição de uma relação. Considere o seguinte:  
+ VACUUM e ALTER DISTKEY não podem ser executados simultaneamente na mesma relação. 
  + Se VACUUM já estiver sendo executado, então, ALTER DISTKEY retornará um erro.
  + Se ALTER DISTKEY estiver em execução, o vacuum em segundo plano não será iniciado em uma relação.
  + Se ALTER DISTKEY estiver sendo executado, a limpeza em primeiro plano retornará um erro.
+ Você só pode executar um comando ALTER DISTKEY em uma relação por vez. 
+ O comando ALTER DISTKEY não é compatível para relações com chaves de classificação intercaladas. 
+ Se o estilo de distribuição tiver sido definido anteriormente como AUTO, a relação não será mais considerada para otimização automática de tabela. 
Ao especificar DISTSTYLE KEY, os dados são distribuídos pelos valores na coluna DISTKEY. Para obter mais informações sobre DISTSTYLE, consulte [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTSTYLE AUTO  
Uma cláusula que altera o estilo de distribuição existente de uma relação para AUTO.   
Quando você altera um estilo de distribuição para AUTO, o estilo de distribuição da relação é definido como o seguinte:   
+ Uma pequena relação com DISTSTYLE ALL é convertida em AUTO(ALL). 
+ Uma pequena relação com DISTSTYLE EVEN é convertida em AUTO(ALL). 
+ Uma pequena relação com DISTSTYLE KEY é convertida em AUTO(ALL). 
+ Uma grande relação com DISTSTYLE ALL é convertida em AUTO(EVEN). 
+ Uma grande relação com DISTSTYLE EVEN é convertida em AUTO(EVEN). 
+ Uma grande relação com DISTSTYLE KEY é convertida em AUTO(KEY) e a DISTKEY é preservada. Nesse caso, o Amazon Redshift não faz alterações na relação.
Se o Amazon Redshift determinar que um novo estilo de distribuição ou chave melhorará a performance das consultas, o Amazon Redshift poderá alterar o estilo de distribuição ou a chave da relação no futuro. Por exemplo, o Amazon Redshift pode converter uma relação com um DISTSTYLE de AUTO(KEY) em AUTO(EVEN) ou vice-versa. Para obter mais informações sobre o comportamento quando as chaves de distribuição são alteradas, incluindo redistribuição de dados e bloqueios, acesse [Recomendações do Amazon Redshift Advisor](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation).  
Para mais informações sobre DISTSTYLE AUTO, acesse [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).   
Para visualizar o estilo de distribuição de uma relação, consulte a visualização de catálogo SVV\$1TABLE\$1INFO do sistema. Para obter mais informações, acesse [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Para visualizar as recomendações do Amazon Redshift Advisor para relações, consulte a visualização de catálogo SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS do sistema. Para obter mais informações, acesse [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para exibir as ações executadas pelo Amazon Redshift, consulte a visualização do catálogo do sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obter mais informações, acesse [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
Uma cláusula que altera ou adiciona a chave de classificação usada para uma relação. ALTER SORTKEY não é compatível com tabelas temporárias.  
Quando você altera uma chave de classificação, a codificação de compactação de colunas na chave de classificação nova ou original pode ser alterada. Se nenhuma codificação for definida explicitamente para a relação, o Amazon Redshift atribuirá automaticamente codificações de compactação da seguinte maneira:  
+ Colunas que são definidas como chaves de classificação são designadas a compactação RAW.
+ Colunas que são definidas como tipos de dados BOOLEAN, REAL ou DOUBLE PRECISION recebem a compactação RAW.
+ As colunas definidas como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ recebem a compactação AZ64.
+ As colunas definidas como CHAR ou VARCHAR recebem a compactação LZO.
Considere o seguinte:  
+ Você pode definir no máximo 400 colunas para uma chave de classificação por relação. 
+ É possível alterar uma chave de classificação intercalada para uma chave de classificação composta ou nenhuma chave de classificação. Porém, não é possível alterar uma chave de classificação composta para uma chave de classificação intercalada. 
+ Se a chave de classificação tiver sido definida anteriormente como AUTO, a relação não será mais considerada para otimização automática de tabela. 
+ O Amazon Redshift recomenda o uso de codificação RAW (sem compactação) para colunas definidas como chaves de classificação. Quando você altera uma coluna para escolhê-la como uma chave de classificação, a compactação da coluna é alterada para compactação RAW (sem compactação). Isso pode aumentar a quantidade de armazenamento necessária para a relação. Quanto o tamanho da relação aumenta depende da definição específica da relação e do conteúdo da relação. Para obter mais informações sobre compactação, acesse [Codificações de compactação](c_Compression_encodings.md). 
Quando os dados são carregados em uma relação, eles são carregados na ordem da chave de classificação. Quando você altera a chave de classificação, o Amazon Redshift reorganiza os dados. Para obter mais informações sobre SORTKEY, consulte [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER SORTKEY AUTO  
Uma cláusula que altera ou adiciona a chave de classificação da relação de destino para AUTO. ALTER SORTKEY AUTO não é compatível com tabelas temporárias.   
Quando você altera uma chave de classificação para AUTO, o Amazon Redshift preserva a chave de classificação existente da relação.   
Se o Amazon Redshift determinar que uma nova chave de classificação melhorará a performance das consultas, o Amazon Redshift poderá alterar a chave de classificação da sua relação no futuro.   
Para obter mais informações sobre SORTKEY AUTO, consulte [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).   
Para visualizar a chave de classificação de uma relação, consulte a visualização de catálogo SVV\$1TABLE\$1INFO do sistema. Para obter mais informações, acesse [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Para visualizar as recomendações do Amazon Redshift Advisor para relações, consulte a visualização de catálogo SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS do sistema. Para obter mais informações, acesse [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para exibir as ações executadas pelo Amazon Redshift, consulte a visualização do catálogo do sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obter mais informações, acesse [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER SORTKEY NONE  
Uma cláusula que remove a chave de classificação da relação de destino.   
Se a chave de classificação tiver sido definida anteriormente como AUTO, a relação não será mais considerada para otimização automática de tabela. 

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
Uma cláusula que ativa ou desativa a segurança no nível da linha para uma relação.  
Quando a segurança no nível da linha é ativada para uma relação, você só pode ler as linhas às quais a política de segurança no nível da linha permite acesso. Quando não há política que conceda acesso à relação, você não consegue ver nenhuma linha da tabela. Somente superusuários e usuários ou perfis que tenham o perfil `sys:secadmin` podem definir a cláusula ROW LEVEL SECURITY. Para obter mais informações, consulte [Segurança por linha](t_rls.md).  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  Uma cláusula que permite a você escolher o tipo de conjunção da política de segurança no nível da linha para uma relação. Quando várias políticas de segurança no nível da linha são anexadas a uma relação, você pode combinar as políticas com a cláusula AND ou OR. Por padrão, o Amazon Redshift combina políticas RLS com a cláusula AND. Superusuários, usuários ou funções que tenham a função `sys:secadmin` podem usar essa cláusula para definir o tipo de conjunção da política de segurança no nível da linha para uma relação. Para obter mais informações, consulte [Combinar várias políticas por usuário](t_rls_combine_policies.md). 
+ PARA UNIDADES DE COMPARTILHAMENTO DE DADOS

   Uma cláusula que determina se uma relação protegida por RLS pode ser acessada por meio das unidades de compartilhamento de dados. Por padrão, uma relação protegida por RLS não pode ser acessada por meio de uma unidade de compartilhamento de dados. Um comando ALTER MATERIALIZED VIEW ROW LEVEL SECURITY executado com essa cláusula só afeta a propriedade de acessibilidade da unidade de compartilhamento de dados da relação. A propriedade ROW LEVEL SECURITY não foi alterada.

   Se você tornar uma relação protegida por RLS acessível por meio de unidades de compartilhamentos de dados, a relação não terá segurança no nível da linha no banco de dados compartilhado no lado do consumidor. A relação mantém a propriedade RLS do lado do produtor. 

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

O exemplo a seguir habilita a visão materializada `tickets_mv` a ser atualizada automaticamente.

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

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

Os exemplos neste tópico mostram como realizar alterações DISTSTYLE e SORTKEY utilizando ALTER MATERIALIZED VIEW.

Os seguintes exemplos de consulta mostram como alterar uma coluna DISTSTYLE KEY DISTKEY usando um exemplo de tabela base:

```
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;
```

Altere uma visão materializada para 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;
```

Os seguintes comandos mostram exemplos de ALTER MATERIALIZED VIEW SORTKEY usando uma tabela base de amostra:

```
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>

Altere uma política de segurança por linha em uma tabela.

Superusuários e usuários ou perfis que têm o perfil `sys:secadmin` podem alterar uma política.

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

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

## Parâmetros
<a name="r_ALTER_RLS_POLICY-parameters"></a>

 *policy\$1name*   
O nome da política.

database\$1name  
O nome do banco de dados no qual a política é criada. O banco de dados pode ser o conectado ou um banco de dados que comporte as permissões federadas do Amazon Redshift.

USING (* using\$1predicate\$1exp *)  
Especifica um filtro que é aplicado à cláusula WHERE da consulta. O Amazon Redshift aplica um predicado de política antes dos predicados do usuário no nível da consulta. Por exemplo, **current\$1user = ‘joe’ and price > 10** limita Joe a ver apenas registros com o preço superior a US\$1 10.  
A expressão tem acesso às variáveis declaradas na cláusula WITH da instrução CREATE RLS POLICY que foi usada para criar a política com o nome policy\$1name.

Para o uso da ALTER RLS POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

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

O exemplo a seguir altera uma 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>

Renomeia uma função ou altera o proprietário. Para conferir a lista de perfis definidos pelo sistema do Amazon Redshift, consulte [Funções definidas pelo sistema do Amazon Redshift](r_roles-default.md).

## Permissões obrigatórias
<a name="r_ALTER_ROLE-privileges"></a>

A seguir estão as permissões necessárias para ALTER ROLE:
+ Superusuário
+ Usuários com as permissões de ALTER ROLE

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

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

## Parâmetros
<a name="r_ALTER_ROLE-parameters"></a>

 *Perfil do*   
O nome da função a ser alterada.

RENAME TO  
Um novo nome para a função.

OWNER TO *user\$1name*  
Um novo proprietário para a função. 

EXTERNALID TO *external\$1id*  
Um novo ID externo para a função, que está associado a um provedor de identidades. Para obter mais informações, consulte [Federação do provedor de identidades (IdP) nativo para o Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

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

O exemplo a seguir altera o nome de uma função de `sample_role1` para `sample_role2`.

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

O exemplo a seguir altera o proprietário da função.

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

A sintaxe de ALTER ROLE é semelhante a ALTER PROCEDURE a seguir.

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

O seguinte exemplo altera o proprietário de um procedimento para `etl_user`.

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

O exemplo a seguir atualiza uma função `sample_role1` com um novo ID externo associado a um provedor de identidades.

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

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

Renomeia um procedimento ou altera o proprietário. São necessários o nome do procedimento e os tipos de dados, ou a assinatura. Somente o proprietário ou um usuário avançado pode renomear um procedimento. Somente um usuário avançado pode alterar o proprietário de um procedimento. 

## Sintaxe
<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 }
```

## Parâmetros
<a name="r_ALTER_PROCEDURE-parameters"></a>

 *sp\$1name*   
O nome do procedimento a ser alterado. Especifique apenas o nome do procedimento no caminho de pesquisa atual ou use o formato `schema_name.sp_procedure_name` para adotar um esquema específico.

*[argname] [ argmode] argtype*   
Uma lista de nomes de argumentos, modos de argumentos e tipos de dados. Somente os tipos de dados de entrada são obrigatórios, usados para identificar o procedimento armazenado. Como alternativa, você pode fornecer a assinatura completa usada para criar o procedimento, incluindo os parâmetros de entrada e saída com seus modos.

 *new\$1name*   
Um novo nome para o procedimento armazenado. 

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
Um novo proprietário para o procedimento armazenado. 

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

O exemplo a seguir altera o nome de um procedimento de `first_quarter_revenue` para `quarterly_revenue`.

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

Este exemplo é equivalente ao seguinte:

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

O seguinte exemplo altera o proprietário de um procedimento para `etl_user`.

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

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

Altera a definição de um esquema existente. Use este comando para renomear um esquema ou alterar o proprietário de um esquema. Por exemplo, renomeie um esquema existente para preservar uma cópia de backup do esquema quando planejar criar uma nova versão do esquema em questão. Para obter mais informações sobre esquemas, consulte [CREATE SCHEMA](r_CREATE_SCHEMA.md).

Para exibir as cotas de esquema configuradas, consulte [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md).

Para exibir os registros em que as cotas de esquema foram excedidas, consulte [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md).

## Privilégios obrigatórios
<a name="r_ALTER_SCHEMA-privileges"></a>

Veja a seguir os privilégios obrigatórios para ALTER SCHEMA:
+ Superusuário
+ Usuário com o privilégio ALTER SCHEMA
+ Proprietário do esquema

Ao alterar o nome de um esquema, observe que os objetos que usam o nome antigo, como procedimentos armazenados ou visões materializadas, devem ser atualizados para usar o novo nome.

## Sintaxe
<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 }
}
```

## Parâmetros
<a name="r_ALTER_SCHEMA-parameters"></a>

 *schema\$1name*   
Nome do esquema de banco de dados a ser alterado. 

RENAME TO   
Cláusula que renomeia o esquema. 

 *new\$1name*   
Novo nome do esquema. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md). 

OWNER TO   
Cláusula que altera o proprietário do esquema. 

 *new\$1owner*   
Novo proprietário do esquema. 

QUOTA   
A quantidade máxima de espaço em disco que o esquema especificado pode usar. Esse espaço é o tamanho coletivo de todas as tabelas no esquema especificado. O Amazon Redshift converte o valor selecionado para megabytes. Gigabytes é a unidade de medida padrão quando um valor não é especificado.   
Para obter mais informações sobre como configurar cotas de esquema, consulte [CREATE SCHEMA](r_CREATE_SCHEMA.md).

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

O exemplo a seguir renomeia o esquema SALES para US\$1SALES.

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

O exemplo a seguir fornece a propriedade do esquema US\$1SALES ao usuário DWUSER.

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

O exemplo a seguir altera a cota para 300 MB e remove a cota.

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

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

Altera uma opção de configuração no nível de sistema para o cluster do  Amazon Redshift ou o grupo de trabalho do Redshift sem servidor.

## Privilégios obrigatórios
<a name="r_ALTER_SYSTEM-privileges"></a>

Um dos seguintes tipos de usuário pode executar o comando ALTER SYSTEM:
+ Superusuário
+ Usuário Admin

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

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

## Parâmetros
<a name="r_ALTER_SYSTEM-parameters"></a>

 *system-level-configuration*   
Uma configuração no nível do sistema. Valor válido: `data_catalog_auto_mount` e `metadata_security`.

\$1true\$1 t \$1 on \$1 false \$1 f \$1 off\$1   
Um valor para ativar ou desativar a configuração no nível do sistema. Os valores `true`, `t` ou `on` indicam a ativação da configuração. Os valores `false`, `f` ou `off` indicam a desativação da configuração.

## Observações de uso
<a name="r_ALTER_SYSTEM-usage-notes"></a>

Para um cluster provisionado, mudará para `data_catalog_auto_mount` na próxima reinicialização do cluster. Para obter mais informações, consulte [Reinicialização de um cluster](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#reboot-cluster) no *Guia de gerenciamento do Amazon Redshift*.

Para um grupo de trabalho sem servidor, as alterações feitas em `data_catalog_auto_mount` não entram em vigor imediatamente.

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

O exemplo a seguir ativa a montagem automática do AWS Glue Data Catalog.

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

O exemplo a seguir ativa a segurança de metadados.

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

### Definir um namespace de identidade padrão
<a name="r_ALTER_SYSTEM-identity"></a>

Esse exemplo é específico ao trabalho com um provedor de identidades. É possível integrar o Redshift ao Centro de Identidade do IAM e a um provedor de identidades para centralizar o gerenciamento de identidades do Redshift e de outros serviços da AWS.

O exemplo a seguir mostra como definir o namespace de identidade padrão para o sistema. Fazer isso posteriormente simplifica a execução das declarações GRANT e CREATE, porque não é necessário incluir o namespace como prefixo para cada identidade.

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

Após a execução do comando, é possível executar declarações como as seguintes:

```
GRANT SELECT ON TABLE mytable TO alice;

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

O efeito de definir o namespace de identidade padrão é que cada identidade não o exige como prefixo. Neste exemplo, `alice` é substituído por `MYCO:alice`. Isso acontece com qualquer identidade incluída. Para ter mais informações sobre como usar um provedor de identidades com o Redshift, consulte [Conectar o Redshift ao IAM Identity Center para proporcionar aos usuários uma experiência de logon único](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

Para ter mais informações sobre definições relativas à configuração do Centro de Identidade do IAM, consulte [SET](r_SET.md) e [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md).

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

Esse comando altera a definição de uma tabela do Amazon Redshift ou de uma tabela externa do Amazon Redshift Spectrum. Esse comando atualiza os valores e propriedades definidos por [CRIAR TABELA](r_CREATE_TABLE_NEW.md) ou [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). É possível usar ALTER TABLE em uma visualização para segurança por linha (RLS).

Não é possível executar ALTER TABLE em uma tabela externa em um bloco de transação (BEGIN ... END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

ALTER TABLE bloqueia a tabela para operações de leitura e gravação até que a transação envolvendo a operação ALTER TABLE seja concluída, a menos que seja especificamente indicado na documentação que você pode consultar dados ou executar outras operações na tabela enquanto ela estiver sendo alterada.

## Privilégios obrigatórios
<a name="r_ALTER_TABLE-privileges"></a>

O usuário que altera uma tabela precisa do privilégio adequado para que o comando seja bem-sucedido. Dependendo do comando ALTER TABLE, é necessário um dos privilégios a seguir.
+ Superusuário
+ Usuários com o privilégio ALTER TABLE
+ Proprietário da tabela com o privilégio USAGE no esquema

## Sintaxe
<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 reduzir o tempo de execução do comando ALTER TABLE, você pode combinar algumas cláusulas do comando ALTER TABLE.

O Amazon Redshift oferece suporte às seguintes combinações de cláusulas de 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);
```

## Parâmetros
<a name="r_ALTER_TABLE-parameters"></a>

 *table\$1name*   
Nome da tabela a ser alterada. Especifique somente o nome da tabela ou use o formato *schema\$1name.table\$1name* para usar um esquema específico. As tabelas externas devem ser qualificadas por um nome de esquema externo. Você também poderá especificar um nome de exibição se estiver usando a instrução ALTER TABLE para renomear ou alterar o proprietário de uma exibição. O tamanho máximo de um nome de tabela é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes. É possível usar caracteres multibyte UFT-8 até um máximo de quatro bytes. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

ADD *restrição\$1tabela*   
Cláusula que adiciona a restrição especificada à tabela. Para descrições de valores de *table\$1constraint* válidos, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).  
Não é possível adicionar uma restrição de chave primária a uma coluna anulável. Se a coluna tiver sido criada originalmente com a restrição NOT NULL, é possível adicionar uma restrição de chave primária.

DROP CONSTRAINT *nome\$1restrição*   
Cláusula que remove a restrição denominada da tabela. Para remover uma restrição, especifique o nome da restrição, não o tipo. Para visualizar nomes de restrições de tabelas, execute a consulta a seguir.  

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

RESTRICT   
Cláusula que remove somente a restrição especificada. RESTRICT é uma opção para o comando DROP CONSTRAINT. RESTRICT não pode ser usada com CASCADE. 

CASCADE   
Cláusula que remove a restrição especificada e qualquer dependência dessa restrição. CASCADE é uma opção para o comando DROP CONSTRAINT. CASCADE não pode ser usada com RESTRICT.

OWNER TO *novo\$1proprietário*   
Cláusula que altera o proprietário da tabela (ou exibição) para o valor *new\$1owner*.

RENAME TO *novo\$1nome*   
Cláusula que renomeia uma tabela (ou exibição) para o valor especificado em *new\$1name*. O tamanho máximo do nome da tabela é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes.  
Não é possível renomear uma tabela permanente para um nome que comece com '\$1'. '\$1' no início do nome é indicação de uma tabela temporária.  
Você não pode renomear uma tabela externa.

ALTER COLUMN *column\$1name* TYPE *updated\$1varchar\$1data\$1type\$1size*   
Uma cláusula que altera o tamanho de uma coluna definida como um tipo de dados VARCHAR. Essa cláusula só oferece suporte à alteração do tamanho de um tipo de dado VARCHAR. Considere as seguintes limitações:  
+ Não é possível alterar uma coluna com as codificações de compactação BYTEDICT, RUNLENGTH, TEXT255 ou TEXT32K. 
+ Você não reduzir o tamanho para menos que o tamanho máximo dos dados existentes. 
+ Não é possível alterar colunas com valores padrão 
+ Não é possível alterar colunas com UNIQUE, PRIMARY KEY ou FOREIGN KEY. 
+ Não é possível alterar colunas em um bloco de transação (BEGIN ... END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

ALTER COLUMN *column\$1name* ENCODE *new\$1encode\$1type*   
Cláusula que altera a codificação de compactação de uma coluna. Se você especificar a codificação de compactação para uma coluna, a tabela não será mais definida como ENCODE AUTO. Para obter informações sobre a codificação de compactação, consulte [Compactação de colunas para reduzir o tamanho dos dados armazenados](t_Compressing_data_on_disk.md).   
Quando você altera a codificação de compactação para uma coluna, a tabela permanece disponível para consulta.  
Considere as seguintes limitações:  
+ Você não pode alterar uma coluna para a mesma codificação definida atualmente para a coluna. 
+ Não é possível alterar a codificação de uma coluna em uma tabela com uma chave de classificação intercalada. 

ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, .....;   
Uma cláusula que altera a codificação de compactação de várias colunas em um único comando. Para obter informações sobre a codificação de compactação, consulte [Compactação de colunas para reduzir o tamanho dos dados armazenados](t_Compressing_data_on_disk.md).  
Quando você altera a codificação de compactação para uma coluna, a tabela permanece disponível para consulta.  
 Considere as seguintes limitações:  
+ Você não pode alterar uma coluna para o mesmo tipo de codificação ou uma diferente várias vezes em um único comando.
+ Você não pode alterar uma coluna para a mesma codificação definida atualmente para a coluna. 
+ Não é possível alterar a codificação de uma coluna em uma tabela com uma chave de classificação intercalada. 

ALTER DISTSTYLE ALL  
Uma cláusula que altera o estilo de distribuição existente de uma tabela para `ALL`. Considere o seguinte:  
+ ALTER DISTSTYLE, ALTER SORTKEY e VACUUM não podem ser executados simultaneamente na mesma tabela. 
  + Se VACUUM estiver sendo executado no momento, a execução ALTER DISTSTYLE ALL retornará um erro. 
  + Se ALTER DISTSTYLE ALL estiver em execução, a limpeza em segundo plano não será iniciada em uma tabela. 
+ O comando ALTER DISTSTYLE ALL não é compatível com tabelas com chaves de classificação intercaladas e tabelas temporárias.
+ Se o estilo de distribuição foi definido anteriormente como AUTO, a tabela não é mais um candidato para otimização automática de tabela. 
Para mais informações sobre DISTSTYLE ALL, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).

ALTER DISTSTYLE EVEN  
Uma cláusula que altera o estilo de distribuição existente de uma tabela para `EVEN`. Considere o seguinte:  
+ Um ALTER DISTSYTLE, ALTER SORTKEY e VACUUM não podem ser executados simultaneamente na mesma tabela. 
  + Se VACUUM estiver sendo executado no momento, a execução ALTER DISTSTYLE EVEN retornará um erro. 
  + Se ALTER DISTSTYLE EVEN estiver em execução, o vacuum em segundo plano não será iniciado em uma tabela. 
+ O comando ALTER DISTSTYLE EVEN não é compatível com tabelas com chaves de classificação intercaladas nem com tabelas temporárias.
+ Se o estilo de distribuição foi definido anteriormente como AUTO, a tabela não é mais um candidato para otimização automática de tabela. 
Para obter mais informações sobre DISTSTYLE EVEN, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).

ALTER DISTKEY *column\$1name* ou ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
Uma cláusula que altera a coluna usada como a chave de distribuição da tabela. Considere o seguinte:  
+ VACUUM e ALTER DISTKEY não podem ser executados ao mesmo tempo na mesma tabela. 
  + Se VACUUM já estiver sendo executado, então, ALTER DISTKEY retornará um erro.
  + Se ALTER DISTKEY estiver em execução, a limpeza em segundo plano não será iniciada na tabela.
  + Se ALTER DISTKEY estiver sendo executado, a limpeza em primeiro plano retornará um erro.
+ Você só pode executar um comando ALTER DISTKEY por vez em uma tabela. 
+ O comando ALTER DISTKEY não é compatível com tabelas com chaves de classificação intercalada. 
+ Se o estilo de distribuição foi definido anteriormente como AUTO, a tabela não é mais um candidato para otimização automática de tabela. 
Ao especificar DISTSTYLE KEY, os dados são distribuídos pelos valores na coluna DISTKEY. Para mais informações sobre DISTSTYLE, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).

ALTER DISTSTYLE AUTO  
Uma cláusula que altera o estilo de distribuição existente de uma tabela para AUTO.   
Quando você altera um estilo de distribuição para AUTO, o estilo de distribuição da tabela é definido para o seguinte:   
+ Uma pequena tabela com DISTSTYLE ALL é convertida em AUTO(ALL). 
+ Uma pequena tabela com DISTSTYLE EVEN é convertida em AUTO(ALL). 
+ Uma pequena tabela com DISTSTYLE KEY é convertida em AUTO(ALL). 
+ Uma grande tabela com DISTSTYLE ALL é convertida em AUTO(EVEN). 
+ Uma grande tabela com DISTSTYLE EVEN é convertida em AUTO(EVEN). 
+ Uma tabela grande com DISTSTYLE KEY é convertida em AUTO(KEY) e a DISTKEY é mantida. Nesse caso, o Amazon Redshift não faz alterações na tabela.
Se o Amazon Redshift determinar que um novo estilo de distribuição ou chave melhorará a performance das consultas, o Amazon Redshift poderá alterar o estilo de distribuição ou a chave da sua tabela no futuro. Por exemplo, o Amazon Redshift pode converter uma tabela com um DISTSTYLE de AUTO(KEY) em AUTO(EVEN), ou vice-versa. Para obter mais informações sobre o comportamento quando as chaves de distribuição são alteradas, incluindo redistribuição de dados e bloqueios, consulte [Recomendações do Amazon Redshift Advisor](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation).  
Para mais informações sobre DISTSTYLE AUTO, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).   
Para exibir o estilo de distribuição de uma tabela, consulte a visualização do catálogo do sistema SVV\$1TABLE\$1INFO. Para obter mais informações, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Para exibir as recomendações do Amazon Redshift Advisor para tabelas, consulte a visualização do catálogo do sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Para obter mais informações, consulte [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para exibir as ações executadas pelo Amazon Redshift, consulte a visualização do catálogo do sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obter mais informações, consulte [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
Uma cláusula que altera ou adiciona a chave de classificação usada para uma tabela. ALTER SORTKEY não é compatível com tabelas temporárias.  
Quando você altera uma chave de classificação, a codificação de compactação de colunas na chave de classificação nova ou original pode ser alterada. Se nenhuma codificação for explicitamente definida para a tabela, o Amazon Redshift atribuirá automaticamente codificações de compactação da seguinte forma:  
+ Colunas que são definidas como chaves de classificação são designadas a compactação RAW.
+ Colunas que são definidas como tipos de dados BOOLEAN, REAL ou DOUBLE PRECISION recebem a compactação RAW.
+ As colunas definidas como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ recebem a compactação AZ64.
+ As colunas definidas como CHAR ou VARCHAR recebem a compactação LZO.
Considere o seguinte:  
+ Você pode definir um máximo de 400 colunas para uma chave de classificação por tabela. 
+ É possível alterar uma chave de classificação intercalada para uma chave de classificação composta ou nenhuma chave de classificação. Porém, não é possível alterar uma chave de classificação composta para uma chave de classificação intercalada. 
+ Se a chave de classificação tiver sido definida anteriormente como AUTO, a tabela não será mais candidata à otimização automática da tabela. 
+ O Amazon Redshift recomenda o uso de codificação RAW (sem compactação) para colunas definidas como chaves de classificação. Quando você altera uma coluna para escolhê-la como uma chave de classificação, a compactação da coluna é alterada para compactação RAW (sem compactação). Isso pode aumentar a quantidade de armazenamento necessária pela tabela. O quanto o tamanho da tabela aumenta depende da definição específica da tabela e do conteúdo da tabela. Para obter mais informações sobre compactação, consulte . [Codificações de compactação](c_Compression_encodings.md) 
Quando os dados são carregados em uma tabela, os dados são carregados na ordem da chave de classificação. Quando você altera a chave de classificação, o Amazon Redshift reorganiza os dados. Para obter mais informações sobre SORTKEY, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).

ALTER SORTKEY AUTO  
Uma cláusula que altera ou adiciona a chave de classificação da tabela de destino como AUTO. ALTER SORTKEY AUTO não é compatível com tabelas temporárias.   
Quando você altera uma chave de classificação para AUTO, o Amazon Redshift preserva a chave de classificação existente da tabela.   
Se o Amazon Redshift determinar que uma nova chave de classificação melhorará a performance das consultas, o Amazon Redshift poderá alterar a chave de classificação ou a chave da sua tabela futuramente.   
Para obter mais informações sobre SORTKEY AUTO, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).   
Para exibir a chave de classificação de uma tabela, consulte a visualização do catálogo do sistema SVV\$1TABLE\$1INFO. Para obter mais informações, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Para exibir as recomendações do Amazon Redshift Advisor para tabelas, consulte a visualização do catálogo do sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Para obter mais informações, consulte [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para exibir as ações executadas pelo Amazon Redshift, consulte a visualização do catálogo do sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obter mais informações, consulte [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER SORTKEY NONE  
Cláusula que remove a chave de classificação da tabela de destino.   
Se a chave de classificação tiver sido definida anteriormente como AUTO, a tabela não será mais candidata à otimização automática da tabela. 

ALTER ENCODE AUTO  
Uma cláusula que altera o tipo de codificação das colunas da tabela de destino para AUTO. Quando você altera a codificação para AUTO, o Amazon Redshift preserva o tipo de codificação existente das colunas na tabela. Em seguida, se o Amazon Redshift determinar que um novo tipo de codificação pode melhorar a performance da consulta, o Amazon Redshift poderá alterar o tipo de codificação das colunas da tabela.   
Se você alterar uma ou mais colunas para especificar uma codificação, o Amazon Redshift não ajustará mais automaticamente a codificação para todas as colunas da tabela. As colunas retêm as configurações de codificação atuais.  
As seguintes ações não afetam a configuração ENCODE AUTO para a tabela:   
+ Renomear a tabela.
+ Alterar a configuração DISTSTYLE ou SORTKEY para a tabela.
+ Adicionar ou eliminar uma coluna com uma configuração ENCODE.
+ Usar a opção COMPUPDATE do comando COPY. Para obter mais informações, consulte [Operações de carregamento de dados](copy-parameters-data-load.md).
Para exibir a codificação de uma tabela, consulte a visualização do catálogo do sistema SVV\$1TABLE\$1INFO. Para obter mais informações, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md).

RENAME COLUMN *column\$1name* TO *new\$1name*   
Cláusula que renomeia uma coluna para o valor especificado em *new\$1name*. O tamanho máximo do nome da coluna é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

ADD [ COLUMN ] *nome\$1coluna*   
Cláusula que adiciona uma coluna com o nome especificado à tabela. Só é possível adicionar uma coluna em cada instrução ALTER TABLE.  
Não é possível adicionar uma coluna que é a chave de distribuição (DISTKEY) ou uma chave de classificação (SORTKEY) da tabela.  
 Não é possível usar o comando ALTER TABLE ADD COLUMN para modificar os atributos da tabela e da coluna a seguir:   
+ UNIQUE
+ PRIMARY KEY
+ REFERENCES (chave externa)
+ IDENTITY ou GENERATED BY DEFAULT AS IDENTITY
O tamanho máximo do nome da coluna é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes. O número máximo de colunas que você pode definir em uma única tabela é 1.600.  
As seguintes restrições são aplicadas ao adicionar uma coluna a uma tabela externa:  
+ Você não pode adicionar uma coluna a uma tabela externa com a restrições de coluna DEFAULT, ENCODE, NOT NULL ou NULL. 
+ Você não pode adicionar colunas a uma tabela externa definida usando o formato de arquivo AVRO. 
+ Se pseudocolunas estiverem habilitadas, o número máximo de colunas que poderá ser definido em uma única tabela externa será 1.598. Se pseudocolunas não estiverem habilitadas, o número máximo de colunas que poderá ser definido em uma única tabela será 1.600. 
Para obter mais informações, consulte [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md).

 *column\$1type*   
O tipo de dados da coluna que está sendo adicionada. Para as colunas CHAR e VARCHAR, é possível usar a palavra-chave MAX em vez de declarar o tamanho máximo. MAX define o tamanho máximo de CHAR para 4.096 bytes ou de VARCHAR para 65.535 bytes. O tamanho máximo de um objeto GEOMETRY é 1.048.447 bytes.   
Para obter mais informações sobre os tipos de dados que o Amazon Redshift aceita, consulte [Tipos de dados](c_Supported_data_types.md).

DEFAULT *default\$1expr*   <a name="alter-table-default"></a>
Cláusula que atribui um valor de dados padrão à coluna. O tipo de dados *expr\$1padrão* deve ser compatível com o tipo de dados da coluna. O valor DEFAULT deve ser uma expressão sem variáveis. Não são permitidas subconsultas, referências cruzadas de outras colunas na tabela atual e funções definidas pelo usuário.  
*default\$1expr* é usado em qualquer operação INSERT que não especifique um valor para a coluna. Se não houver um valor padrão especificado, o valor padrão da coluna é nulo.  
Se uma operação COPY encontrar um campo nulo em uma coluna com um valor DEFAULT e uma restrição NOT NULL, o comando COPY vai inserir o valor da *default\$1expr*.   
DEFAULT não é compatível com tabelas externas.

ENCODE *encoding*   
Codificação de compactação de uma coluna. Por padrão, o Amazon Redshift gerencia automaticamente a codificação de compactação para todas as colunas de uma tabela se você não especificar a codificação de compactação para qualquer coluna da tabela ou se especificar a opção ENCODE AUTO para a tabela.  
Se você especificar a codificação de compactação para qualquer coluna na tabela ou se não especificar a opção ENCODE AUTO para a tabela, o Amazon Redshift atribuirá automaticamente a codificação de compactação às colunas para as quais você não especifica a codificação de compactação da seguinte maneira:  
+ Todas as colunas nas tabelas temporárias são atribuídas à compactação RAW como padrão.
+ Colunas que são definidas como chaves de classificação são designadas a compactação RAW.
+ Colunas que são definidas como tipos de dados BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY ou GEOGRAPHY recebem a compactação RAW.
+ As colunas definidas como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ recebem a compactação AZ64.
+ As colunas definidas como CHAR, VARCHAR ou VARBYTE recebem a compactação LZO.
Se você não quiser que uma coluna seja compactada, especifique explicitamente codificação RAW.
Os seguintes [compression encodings](c_Compression_encodings.md#compression-encoding-list) são compatíveis:  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (sem compactação)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD
ENCODE não é compatível com tabelas externas.

NOT NULL \$1 NULL   
NOT NULL especifica que a coluna não deve conter valores nulos. NULL, o padrão, especifica que a coluna aceita valores nulos.  
NOT NULL e NULL não são compatíveis com tabelas externas.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Uma cláusula que especifica se a pesquisa ou comparação de string na coluna distingue ou não maiúscula e minúsculas. O valor padrão é o mesmo da configuração atual de diferenciação de maiúsculas e minúsculas do banco de dados.  
Para localizar as informações de agrupamento de banco de dados, use o seguinte comando:  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE e CS são intercambiáveis e geram os mesmos resultados. Da mesma forma, CASE\$1INSENSITIVE e CI são intercambiáveis e geram os mesmos resultados.

DROP [ COLUMN ] *column\$1name*   
Nome da coluna a ser excluída da tabela.  
Você não pode descartar a última coluna de uma tabela. Uma tabela deve ter pelo menos uma coluna.  
Não é possível descartar uma coluna que seja a chave de distribuição (DISTKEY) ou uma chave de classificação (SORTKEY) da tabela. Comportamento padrão de DROP COLUMN será RESTRICT se a coluna tiver qualquer objeto dependente, como uma exibição, uma chave primária, uma chave externa ou uma restrição UNIQUE.  
As seguintes restrições são aplicadas ao remover uma coluna de uma tabela externa:  
+ Você não poderá descartar uma coluna de uma tabela externa se a coluna for usada como uma partição.
+ Você não pode descartar uma coluna de uma tabela externa definida usando o formato de arquivo AVRO. 
+ RESTRICT e CASCADE são ignorados para tabelas externas.
+ Não é possível descartar as colunas da tabela de políticas referenciada dentro da definição de política, a menos que você descarte ou desanexe a política. Isso também se aplica quando a opção CASCADE é especificada. Você pode descartar outras colunas na tabela de políticas.
Para obter mais informações, consulte [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md).

RESTRICT   
Quando usado com DROP COLUMN, RESTRICT significa que a coluna a ser descartada não será descartada, nestes casos:  
+ Se uma visualização definida fizer referência à coluna que está sendo descartada
+ Se uma chave externa fizer referência à coluna
+ Se a coluna fizer parte de uma chave multipart
RESTRICT não pode ser usada com CASCADE.  
RESTRICT e CASCADE são ignorados para tabelas externas.

CASCADE   
Quando usado com DROP COLUMN, remove a coluna especificada e qualquer objeto dependente dessa coluna. CASCADE não pode ser usada com RESTRICT.  
RESTRICT e CASCADE são ignorados para tabelas externas.

As opções a seguir se aplicam somente a tabelas externas.

SET LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*' \$1  
O caminho para a pasta ou bucket do Amazon S3 que contém arquivos de dados ou um arquivo manifesto que contém uma lista de caminhos de objetos do Amazon S3. Os buckets devem estar na mesma região da AWS que o cluster do Amazon Redshift. Para obter uma lista de regiões da AWS compatíveis, consulte [Limitações do Amazon Redshift Spectrum](c-spectrum-considerations.md). Para obter mais informações sobre o uso de um arquivo manifesto, consulte LOCATION na referência CREATE EXTERNAL TABLE [Parâmetros](r_CREATE_EXTERNAL_TABLE.md#r_CREATE_EXTERNAL_TABLE-parameters).

SET FILE FORMAT *format*  
Formato para arquivos de dados externos.  
Os formatos válidos são:  
+ AVRO 
+ PARQUET
+ RCFILE
+ SEQUENCEFILE
+ TEXTFILE 

SET TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*')   
Uma cláusula que estabelece a definição da tabela de propriedades da tabela para uma tabela externa.   
As propriedades de tabela fazem distinção entre maiúsculas e minúsculas.  
'numRows'='*row\$1count*'   
Uma propriedade que define o valor de numRows para a definição da tabela. Para atualizar de maneira explícita as estatísticas de uma tabela externa, defina a propriedade numRows de maneira a indicar o tamanho da tabela. O Amazon Redshift não analisa as tabelas externas para gerar as estatísticas das tabelas que o otimizador de consultas utiliza para gerar um plano de consulta. Se as estatísticas da tabela não estiverem configuradas para uma tabela externa, o Amazon Redshift gerará um plano de execução de consulta. Tal plano é baseado em uma suposição de que as tabelas externas são as maiores e as tabelas locais são as menores.  
'skip.header.line.count'='*line\$1count*'  
Uma propriedade que define o número de linhas a serem ignoradas no início de cada arquivo de origem.

PARTITION ( *partition\$1column*=*partition\$1value* [, ...] SET LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1  
Cláusula que define um novo local para uma ou mais colunas de partição. 

ADD [ IF NOT EXISTS ] PARTITION ( *partition\$1column*=*partition\$1value* [, ...] ) LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1 [, ... ]  
Uma cláusula que adiciona uma ou mais partições. É possível especificar várias cláusulas PARTITION usando um único comando ALTER TABLE… ADD.  
Se usar o catálogo do AWS Glue, você poderá adicionar até 100 partições usando um único comando ALTER TABLE.
A cláusula IF NOT EXISTS indica que, se a partição especificada já existir, o comando não deverá fazer alterações. Também indica que o comando deverá retornar uma mensagem de que a partição existe, em vez de finalizar com um erro. Esta cláusula é útil para realizar scripting para que o script não falhe se o comando ALTER TABLE tentar adicionar uma partição que já existe. 

DROP PARTITION (*partition\$1column*=*partition\$1value* [, ...] )   
Cláusula que remove a partição especificada. Remover uma partição altera somente os metadados da tabela externa. Os dados no Amazon S3 não são afetados.

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
Uma cláusula que ativa ou desativa a segurança no nível da linha para uma relação.  
Quando a segurança no nível da linha é ativada para uma relação, você só pode ler as linhas às quais a política de segurança no nível da linha permite acesso. Quando não há política que conceda acesso à relação, você não consegue ver nenhuma linha da tabela. Somente superusuários e usuários ou perfis que tenham o perfil `sys:secadmin` podem definir a cláusula ROW LEVEL SECURITY. Para obter mais informações, consulte [Segurança por linha](t_rls.md). Essa declaração é aceita no banco de dados conectado ou em um banco de dados com permissões federadas do Amazon Redshift. A cláusula FOR DATASHARES não é aceita em um banco de dados com permissões federadas do Amazon Redshift.  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  Uma cláusula que permite a você escolher o tipo de conjunção da política de segurança no nível da linha para uma relação. Quando várias políticas de segurança no nível da linha são anexadas a uma relação, você pode combinar as políticas com a cláusula AND ou OR. Por padrão, o Amazon Redshift combina políticas RLS com a cláusula AND. Superusuários, usuários ou funções que tenham a função `sys:secadmin` podem usar essa cláusula para definir o tipo de conjunção da política de segurança no nível da linha para uma relação. Para obter mais informações, consulte [Combinar várias políticas por usuário](t_rls_combine_policies.md). 
+ PARA UNIDADES DE COMPARTILHAMENTO DE DADOS

  Uma cláusula que determina se uma relação protegida por RLS pode ser acessada por meio das unidades de compartilhamento de dados. Por padrão, uma relação protegida por RLS não pode ser acessada por meio de uma unidade de compartilhamento de dados. Um comando ALTER TABLE ROW LEVEL SECURITY executado com essa cláusula só afeta a propriedade de acessibilidade da unidade de compartilhamento de dados da relação. A propriedade ROW LEVEL SECURITY não foi alterada. 

   Se você tornar uma relação protegida por RLS acessível por meio de unidades de compartilhamentos de dados, a relação não terá segurança no nível da linha no banco de dados compartilhado no lado do consumidor. A relação mantém a propriedade RLS do lado do produtor. 

MASKING \$1 ON \$1 OFF \$1 FOR DATASHARES  
Uma cláusula que determina se uma relação protegida por DDM pode ser acessada por meio de unidades de compartilhamento de dados. Por padrão, uma relação protegida por DDM não pode ser acessada por meio de uma unidade de compartilhamento de dados. Se você tornar uma relação protegida por DDM acessível por meio de unidades de compartilhamentos de dados, a relação não terá proteção por mascaramento no banco de dados compartilhado no lado do consumidor. A relação mantém a propriedade de mascaramento no lado do produtor. Somente superusuários e usuários ou perfis que tenham a função `sys:secadmin` podem definir a cláusula MASKING FOR DATASHARES. Para obter mais informações, consulte [Mascaramento dinâmico de dados](t_ddm.md). 

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

Para exemplos que mostram como usar o comando ALTER TABLE, confira os tópicos a seguir.
+ [Exemplos de ALTER TABLE](r_ALTER_TABLE_examples_basic.md)
+ [Exemplos de ALTER EXTERNAL TABLE](r_ALTER_TABLE_external-table.md)
+ [Exemplos de ALTER TABLE ADD e DROP COLUMN](r_ALTER_TABLE_COL_ex-add-drop.md)

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

Os exemplos a seguir demonstram o uso básico de comando ALTER TABLE. 

## Renomear uma tabela ou visão
<a name="r_ALTER_TABLE_examples_basic-rename-a-table"></a>

O comando a seguir renomeia a tabela de USERS para USERS\$1BKUP: 

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

 Você também pode usar esse tipo de comando para renomear uma exibição. 

## Alterar o proprietário de uma tabela ou visualização
<a name="r_ALTER_TABLE_examples_basic-change-the-owner-of-a-table-or-view"></a>

O comando a seguir altera o proprietário da tabela VENUE para o usuário DWUSER: 

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

Os comandos a seguir criam uma exibição, depois alteram seu proprietário: 

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

## Renomeação de uma coluna
<a name="r_ALTER_TABLE_examples_basic-rename-a-column"></a>

O comando a seguir renomeia a coluna VENUESEATS na tabela VENUE para VENUESIZE: 

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

## Remover uma restrição de tabela
<a name="r_ALTER_TABLE_examples_drop-constraint"></a>

Para remover uma restrição de tabela, como uma chave primária, chave externa ou restrição exclusiva, primeiro encontre o nome interno da restrição. Depois, especifique o nome da restrição no comando ALTER TABLE. O exemplo a seguir encontra as restrições da tabela CATEGORY, depois remove a chave primária com o nome `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;
```

## Alterar uma coluna VARCHAR
<a name="r_ALTER_TABLE_examples_alter-column"></a>

Para poupar armazenamento, você pode definir uma tabela inicialmente com colunas VARCHAR com o tamanho mínimo necessário para os requisitos dos dados atuais. Posteriormente, para acomodar strings mais longas, você poderá alterar a tabela para aumentar o tamanho da coluna. 

O exemplo a seguir aumenta o tamanho da coluna EVENTNAME para VARCHAR(300). 

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

## Alterar uma coluna VARBYTE
<a name="r_ALTER_TABLE_examples_alter-varbyte-column"></a>

Para poupar armazenamento, é possível definir uma tabela inicialmente com colunas VARBYTE com o tamanho mínimo necessário para os requisitos dos dados atuais. Posteriormente, para acomodar strings mais longas, você poderá alterar a tabela para aumentar o tamanho da coluna. 

O exemplo a seguir aumenta o tamanho da coluna EVENTNAME para VARBYTE(300). 

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

## Alterar a codificação de compactação para uma coluna
<a name="r_ALTER_TABLE_examples_alter-column-encoding"></a>

É possível alterar a codificação de compactação de uma coluna. Abaixo, é possível encontrar um conjunto de exemplos demonstrando essa abordagem. A seguir, a definição da tabela para esses exemplos.

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

A instrução a seguir altera a codificação de compactação para a coluna c0 de codificação LZO para codificação AZ64. 

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

A instrução a seguir altera a codificação de compactação para a coluna c1 de codificação Zstandard para codificação AZ64. 

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

A instrução a seguir altera a codificação de compactação para a coluna c2 de codificação LZO para codificação Byte-dictionary. 

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

A instrução a seguir altera a codificação de compactação para a coluna c3 de codificação Zstandard para codificação Runlength. 

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

## Alterar a coluna DISTSTYLE KEY DISTKEY
<a name="r_ALTER_TABLE_examples_alter-distkey"></a>

Os exemplos a seguir mostram como alterar o DISTSTYLE e DISTKEY de uma tabela.

Crie uma tabela com o estilo de distribuição EVEN. A visualização SVV\$1TABLE\$1INFO mostra que o DISTSTYLE é 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 a tabela DISTKEY para `inv_warehouse_sk`. A visualização SVV\$1TABLE\$1INFO mostra a coluna `inv_warehouse_sk` como a chave de distribuição 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 a tabela DISTKEY para `inv_item_sk`. A visualização SVV\$1TABLE\$1INFO mostra a coluna `inv_item_sk` como a chave de distribuição resultante. 

```
alter table inventory alter distkey inv_item_sk;

select "table", "diststyle" from svv_table_info;

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

## Alterar uma tabela para DISTSTYLE ALL
<a name="r_ALTER_TABLE_examples_alter-diststyle-all"></a>

Os exemplos a seguir mostram como alterar uma tabela para DISTSTYLE ALL.

Crie uma tabela com o estilo de distribuição EVEN. A visualização SVV\$1TABLE\$1INFO mostra que o DISTSTYLE é 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 a tabela DISTSTYLE para ALL. A visualização SVV\$1TABLE\$1INFO mostra a DISTSYTLE alterada. 

```
alter table inventory alter diststyle all;

select "table", "diststyle" from svv_table_info;

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

## Alterar uma tabela SORTKEY
<a name="r_ALTER_TABLE_examples_alter-sortkey"></a>

É possível alterar uma tabela para ter uma chave de classificação composta ou nenhuma chave de classificação.

Na definição de tabela a seguir, a tabela `t1` é definida com uma chave de classificação intercalada.

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

O comando a seguir altera a tabela de uma chave de classificação intercalada para uma chave de classificação composta.

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

O comando a seguir altera a tabela para remover a chave de classificação intercalada.

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

Na definição de tabela a seguir, a tabela `t1` é definida com coluna `c0` como chave de classificação intercalada.

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

O comando a seguir altera a tabela `t1` para uma chave de classificação composta.

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

## Alterar uma tabela para ENCODE AUTO
<a name="r_ALTER_TABLE_examples_alter-encode-auto"></a>

O exemplo a seguir mostra como alterar uma tabela para ENCODE AUTO. 

A seguir, a definição da tabela para esse exemplo. A coluna `c0` é definida com o tipo de codificação AZ64 e coluna `c1` é definida com o tipo de codificação LZO.

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

Para esta tabela, a instrução a seguir altera a codificação para AUTO.

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

O exemplo a seguir mostra como alterar uma tabela para remover a configuração ENCODE AUTO. 

A seguir, a definição da tabela para esse exemplo. As colunas da tabela são definidas sem codificação. Nesse caso, a codificação usa como padrão ENCODE AUTO.

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

Para esta tabela, a instrução a seguir altera a codificação da coluna c0 para LZO. A codificação da tabela não está mais definida como ENCODE AUTO.

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

## Alterar o controle de segurança por linha
<a name="r_ALTER_TABLE_examples_basic-rls"></a>

O comando a seguir desativa o RLS para a tabela: 

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

O comando a seguir ativa o RLS para a tabela: 

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

O seguinte comando ativa RLS para a tabela e a torna acessível por meio das unidades de compartilhamento de dados: 

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

O seguinte comando ativa RLS para a tabela e a torna inacessível por meio das unidades de compartilhamento de dados: 

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

O seguinte comando ativa RLS e define o tipo de conjunção RLS como OR para a tabela: 

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

O seguinte comando ativa RLS e define o tipo de conjunção RLS como AND para a tabela: 

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

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

Os exemplos a seguir usam um bucket do Amazon S3 localizado na Região da AWSLeste dos EUA (Norte da Virgínia) (`us-east-1`) e as tabelas de exemplo criadas em [Exemplos](r_CREATE_EXTERNAL_TABLE_examples.md) para CREATE TABLE. Para ter mais informações sobre como usar partições com tabelas externas, consulte [Dividir as tabelas externas do Redshift Spectrum](c-spectrum-external-tables.md#c-spectrum-external-tables-partitioning). 

O exemplo a seguir define a propriedade de tabela numRows da tabela externa SPECTRUM.SALES para 170.000 linhas.

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

O exemplo a seguir altera o local da tabela externa SPECTRUM.SALES.

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

O exemplo a seguir altera o formato da tabela externa SPECTRUM.SALES para Parquet.

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

O exemplo a seguir adiciona uma partição à tabela 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/';
```

O exemplo a seguir adiciona três partições à tabela 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/';
```

O exemplo a seguir altera SPECTRUM.SALES\$1PART para remover a partição com `saledate='2008-01-01''`.

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

O exemplo a seguir define um novo caminho do Amazon S3 para a partição com `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/';
```

O exemplo a seguir altera o nome de `sales_date` para `transaction_date`. 

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

O exemplo a seguir define o mapeamento de coluna para a posição de mapeamento para uma tabela externa que usa o formato de coluna de linha otimizada (ORC).

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

O exemplo a seguir define o mapeamento de coluna para o mapeamento de nome para uma tabela externa que usa o formato ORC.

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

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

Os exemplos a seguir demonstram como usar o comando ALTER TABLE para adicionar e depois remover colunas básicas de tabela, e também como remover uma coluna com um objeto dependente. 

## Usar os comandos ADD e depois DROP em uma coluna básica
<a name="r_ALTER_TABLE_COL_ex-add-then-drop-a-basic-column"></a>

O exemplo a seguir adiciona uma coluna FEEDBACK\$1SCORE independente à tabela USERS. Esta coluna simplesmente contém um inteiro, e o valor padrão dessa coluna é NULL (sem pontuação de comentário). 

Primeiro, consulte a tabela de catálogo PG\$1TABLE\$1DEF para exibir o esquema da tabela 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
```

Depois adicione a coluna feedback\$1score: 

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

Selecione a coluna FEEDBACK\$1SCORE em USERS para confirmar se ela foi adicionada: 

```
select feedback_score from users limit 5;

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

Remova a coluna para restabelecer o DDL original: 

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

## Descartar uma coluna com um objeto dependente
<a name="r_ALTER_TABLE_COL_ex-dropping-a-column-with-a-dependent-object"></a>

O exemplo a seguir descarta uma coluna que possui um objeto dependente. Como resultado, o objeto dependente também é removido. 

Para começar, adicione a coluna FEEDBACK\$1SCORE de novo à tabela USERS: 

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

Em seguida, crie uma exibição chamada USERS\$1VIEW na tabela USERS: 

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

Depois, tente remover a coluna FEEDBACK\$1SCORE da tabela USERS. A instrução DROP usa o comportamento padrão (RESTRICT): 

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

O Amazon Redshift exibe uma mensagem de erro indicando que a coluna não pode ser descartada porque outro objeto depende dela. 

Tente remover a coluna FEEDBACK\$1SCORE novamente, desta vez especificando em CASCADE para eliminar todos os objetos dependentes: 

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

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

Move dados de uma tabela de origem existente para acrescentar linhas a uma tabela de destino. Os dados da tabela de origem são movidos para as colunas correspondentes na tabela de destino. A ordem das colunas não importa. Depois que os dados forem acrescentados com sucesso na tabela de destino, a tabela de origem fica vazia. ALTER TABLE APPEND geralmente é muito mais rápido do que as operações [CREATE TABLE AS](r_CREATE_TABLE_AS.md) ou [INSERT](r_INSERT_30.md) semelhantes, pois os dados são movidos, não duplicados. 

**nota**  
ALTER TABLE APPEND move blocos de dados entre a tabela de origem e uma tabela de destino. Para melhorar a performance, ALTER TABLE APPEND não compacta o armazenamento como parte da operação de append. Como resultado, o uso do armazenamento aumenta temporariamente. Para recuperar o espaço, execute uma operação [VACUUM](r_VACUUM_command.md).

Colunas com o mesmo nome também devem ter atributos de coluna idênticos. Se a tabela de origem ou a tabela de destino tiver colunas que não existem na outra tabela, use os parâmetros IGNOREEXTRA ou FILLTARGET para especificar como as colunas extras devem ser gerenciadas. 

Não é possível acrescentar uma coluna de identidade. Se ambas as tabelas incluírem uma coluna de identidade, o comando falhará. Se somente uma tabela tiver uma coluna de identidade, inclua o parâmetro FILLTARGET ou IGNOREEXTRA. Para obter mais informações, consulte [Observações de uso de ALTER TABLE APPEND](#r_ALTER_TABLE_APPEND_usage).

É possível associar uma coluna GENERATED BY DEFAULT AS IDENTITY. Você pode atualizar as colunas definidas como GENERATED BY DEFAULT AS IDENTITY com os valores fornecidos. Para obter mais informações, consulte [Observações de uso de ALTER TABLE APPEND](#r_ALTER_TABLE_APPEND_usage). 

A tabela de destino deve ser uma tabela permanente. No entanto, a origem pode ser uma tabela permanente ou uma visão materializada configurada para ingestão de streaming. Os objetos devem usar o mesmo estilo de distribuição e a mesma chave de distribuição, caso definidos. Se os objetos estiverem classificados, ambos devem usar o mesmo estilo de classificação e definir as mesmas colunas como chaves de classificação.

Um comando ALTER TABLE APPEND é confirmado automaticamente logo depois da conclusão da operação. O comando não pode ser revertido. Não é possível executar ALTER TABLE APPEND em um bloco de transações (BEGIN ... END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

## Privilégios obrigatórios
<a name="r_ALTER_TABLE_APPEND-privileges"></a>

Dependendo do comando ALTER TABLE APPEND, é necessário um dos seguintes privilégios:
+ Superusuário
+ Usuários com o privilégio de sistema ALTER TABLE
+ Usuários com os privilégios DELETE e SELECT na tabela de origem e com o privilégio INSERT na tabela de destino

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

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

A anexação com base em uma visão materializada funciona somente no caso em que a visão materializada está configurada para [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md).

## Parâmetros
<a name="r_ALTER_TABLE_APPEND-parameters"></a>

 *nome\$1tabela\$1destino*   
Nome da tabela à qual as linhas são acrescentadas. Especifique somente o nome da tabela ou use o formato *schema\$1name.table\$1name* para adotar um esquema específico. A tabela de destino deve ser uma tabela permanente existente.

 FROM *nome\$1tabela\$1origem*   
Nome da tabela que fornece as linhas que serão acrescentadas. Especifique somente o nome da tabela ou use o formato *schema\$1name.table\$1name* para adotar um esquema específico. A tabela de origem deve ser uma tabela permanente existente.

 FROM *source\$1materialized\$1view\$1name*   
O nome da visão materializada que fornece as linhas que serão anexadas. A anexação com base em uma visão materializada funciona somente no caso em que a visão materializada está configurada para [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md). A visão materializada de origem já deve existir. 

IGNOREEXTRA   
Palavra-chave que especifica se a tabela de origem inclui colunas que não constam na tabela de destino. Os dados nas colunas extras devem ser descartados. Não é possível usar IGNOREEXTRA com FILLTARGET. 

FILLTARGET   
Palavra-chave que especifica se uma tabela de destino inclui colunas que não constam na tabela de origem. As colunas devem ser preenchidas com o valor [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) de coluna, caso haja um valor definido, ou com NULL. Não é possível usar IGNOREEXTRA com FILLTARGET. 

## Observações de uso de ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND_usage"></a>
+ ALTER TABLE APPEND move somente colunas idênticas da tabela de origem para a tabela de destino. A ordem das colunas não importa. 
+  Se a tabela de origem ou de destino tiver colunas extras, use FILLTARGET ou IGNOREEXTRA de acordo com as seguintes regras: 
  + Se a tabela de origem tiver colunas inexistentes na tabela de destino, inclua IGNOREEXTRA. O comando ignora as colunas extras na tabela de origem.
  + Se a tabela de destino tiver colunas inexistentes na tabela de origem, inclua FILLTARGET. O parâmetro preenche as colunas extras na tabela de destino com valores padrão de coluna ou com o valor IDENTITY, caso haja um valor definido, ou com NULL.
  + Se as tabelas de origem e de destino tiverem colunas extras, o comando falhará. Não é possível usar FILLTARGET e IGNOREEXTRA. 
+ Se uma coluna com o mesmo nome, porém atributos diferentes, for encontrada em ambas as tabelas, o comando falhará. Colunas de mesmo nome devem ter os atributos a seguir em comum: 
  + Tipo de dados
  + Tamanho da coluna
  + Codificação de compactação
  + Não nulo
  + Estilo de classificação
  + Colunas de chave de classificação
  + Estilo de distribuição
  + Colunas de chave de distribuição
+ Não é possível acrescentar uma coluna de identidade. Se as tabelas de origem e de destino tiverem colunas de identidade, o comando falhará. Se somente a tabela de origem tiver uma coluna de identidade, inclua o parâmetro IGNOREEXTRA para ignorar a coluna de identidade. Se somente a tabela de destino tiver uma coluna de identidade, inclua o parâmetro FILLTARGET para que a coluna de identidade seja preenchida de acordo com a cláusula IDENTITY definida para a tabela. Para obter mais informações, consulte [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default). 
+ É possível associar uma coluna de identidade padrão com a instrução ALTER TABLE APPEND. Para obter mais informações, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md). 
+ As operações ALTER TABLE APPEND mantêm bloqueios exclusivos quando executadas em visões materializadas de streaming do Amazon Redshift conectadas a qualquer um dos seguintes:
  +  Um Amazon Kinesis data stream 
  +  Um tópico Amazon Managed Streaming for Apache Kafka 
  +  Um stream externo compatível, como um tópico do Confluent Cloud Kafka 

  Para obter mais informações, consulte [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md).

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

Digamos que sua organização mantém uma tabela, SALES\$1MONTHLY, para capturar as transações de vendas atuais. Você deseja mover dados da tabela de transações para a tabela SALES todos os meses. 

É possível usar os comandos INSERT INTO e TRUNCATE a seguir para realizar a tarefa. 

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

No entanto, você pode realizar a mesma operação de maneira muito mais eficiente usando o comando ALTER TABLE APPEND. 

Em primeiro lugar, consulte a [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md) tabela de catálogo do sistema para verificar se ambas as tabelas têm as mesmas colunas com atributos de coluna 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
```

Em seguida, verifique o tamanho de cada tabela.

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

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

Agora execute o comando ALTER TABLE APPEND.

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

Verifique o tamanho de cada tabela novamente. A tabela SALES\$1MONTHLY agora contém 0 linha, e a tabela SALES tem 2.000 linhas a mais.

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

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

Se a tabela de origem tiver mais colunas que a tabela de destino, especifique o parâmetro IGNOREEXTRA. O exemplo a seguir usa o parâmetro IGNOREEXTRA para ignorar colunas extras na tabela SALES\$1LISTING ao acrescentar dados na tabela SALES.

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

Se a tabela de destino tiver mais colunas que a tabela de origem, especifique o parâmetro FILLTARGET. O exemplo a seguir usa o parâmetro FILLTARGET para preencher colunas que não existem na tabela SALES\$1MONTH na tabela SALES\$1REPORT.

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

O exemplo a seguir mostra como usar ALTER TABLE APPEND com uma visão materializada como origem.

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

Neste exemplo, os nomes da tabela e da visão materializada são fictícios. A anexação com base em uma visão materializada funciona somente no caso em que a visão materializada está configurada para [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md). Ela move todos os registros da visão materializada de origem para uma tabela de destino com o mesmo esquema da visão materializada e deixa a visão materializada intacta. Esse comportamento é o mesmo de quando a origem dos dados é uma tabela.

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

Altera a definição de um modelo existente. Use esse comando para renomear um modelo, alterar o proprietário de um modelo, adicionar ou remover parâmetros da definição do modelo ou definir valores de parâmetro.

## Privilégios obrigatórios
<a name="r_ALTER_TEMPLATE-privileges"></a>

Para alterar um modelo, é necessário ter uma das seguintes opções:
+ Privilégios de superusuário.
+ O privilégio ALTER TEMPLATE e o privilégio USAGE no esquema que contém o modelo.

## Sintaxe
<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 , ...]
};
```

## Parâmetros
<a name="r_ALTER_TEMPLATE-parameters"></a>

 *database\$1name*   
(Opcional) O nome do banco de dados no qual o modelo é criado. Se não especificado, será usado o banco de dados atual. 

 *schema\$1name*   
(Opcional) O nome do esquema no qual o modelo é criado. Se não for especificado, o modelo será pesquisado no caminho de pesquisa atual. 

 *template\$1name*   
O nome do modelo a ser alterado. 

RENAME TO   
Uma cláusula que renomeia o modelo. 

 *new\$1name*   
O novo nome do modelo. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md). 

OWNER TO   
Cláusula que altera o proprietário do modelo. 

 *new\$1owner*   
O novo proprietário do modelo. 

ADD *parameter* [AS] [*value*]  
Adiciona um novo parâmetro ao modelo.  
+ Para parâmetros somente de palavras-chave (como CSV ou GZIP), especifique apenas o nome do parâmetro.
+ Para parâmetros que exigem valores, especifique o nome do parâmetro seguido do valor. Opcionalmente, é possível incluir AS entre o parâmetro e o valor. 

DROP *parameter*  
Remove o parâmetro especificado do modelo. Não é possível eliminar vários parâmetros com um único comando DROP.

SET *parameter* TO *value1* [, *parameter2* TO *value2* , ...]  
Atualiza os valores de parâmetro de modelo existentes. Use somente para parâmetros que já tenham valores. Vários parâmetros podem ser atualizados em um único comando.

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

O exemplo a seguir muda o nome do modelo test\$1template para demo\$1template.

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

O exemplo a seguir atribui a propriedade do esquema demo\$1template ao usuário bob.

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

O exemplo a seguir adiciona o parâmetro `CSV` ao modelo demo\$1template.

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

O exemplo a seguir adiciona o parâmetro `TIMEFORMAT 'auto'` ao modelo demo\$1template.

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

O exemplo a seguir remove o parâmetro `ENCRYPTED` do modelo demo\$1template.

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

O seguinte exemplo define o `DELIMITER` parâmetro como `'|'` e o parâmetro `TIMEFORMAT` como `'epochsecs'`:

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

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

Muda um usuário do banco de dados.

## Privilégios obrigatórios
<a name="r_ALTER_USER-privileges"></a>

A seguir estão os privilégios obrigatórios para ALTER USER:
+ Superusuário
+ Usuários com o privilégio ALTER USER
+ Usuário atual que deseje alterar a própria senha

## Sintaxe
<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
```

## Parâmetros
<a name="r_ALTER_USER-parameters"></a>

 *Nome de usuário do*   
Nome do usuário. 

WITH   
Palavra-chave opcional. 

CREATEDB \$1 NOCREATEDB   
A opção CREATEDB permite que o usuário crie bancos de dados novos. NOCREATEDB é o valor padrão. 

CREATEUSER \$1 NOCREATEUSER   
A opção CREATEUSER cria um superusuário com todos os privilégios de banco de dados, incluindo CREATE USER. NOCREATEUSER é o valor padrão. Para obter mais informações, consulte [Superusuários](r_superusers.md).

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="alter-user-syslog-access"></a>
Uma cláusula que especifica o nível de acesso do usuário para as tabelas e as exibições de sistema do Amazon Redshift.   
Usuários regulares que têm a permissão SYSLOG ACCESS RESTRICTED podem ver somente as linhas geradas por esse usuário nas tabelas e visualizações do sistema visíveis ao usuário. O padrão é RESTRICTED.   
Usuários regulares que têm a permissão UNRESTRICTED podem ver todas as linhas nas tabelas e visualizações de sistema visíveis ao usuário, incluindo as linhas geradas por outro usuário. UNRESTRICTED não fornece acesso para os usuários regulares às tabelas visíveis para superusuários. Somente superusuários podem visualizar tabelas visíveis para superusuários.   
Fornecer acesso ilimitado para um usuário às tabelas de sistema é o mesmo que dar ao usuário visibilidade para os dados gerados por outros usuários. Por exemplo, STL\$1QUERY e STL\$1QUERYTEXT contêm texto completo de instruções INSERT, UPDATE e DELETE, e podem conter dados confidenciais gerados pelos usuários. 
Todas as linhas em SVV\$1TRANSACTIONS são visíveis a todos os usuários.   
Para obter mais informações, consulte [Visibilidade de dados em tabelas e visualizações de sistema](cm_chap_system-tables.md#c_visibility-of-data).

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
Define a senha do usuário.   
Por padrão, os usuários podem alterar suas próprias senhas, a menos que a senha esteja desabilitada. Para desabilitar a senha de um usuário, especifique DISABLE. Quando a senha de um usuário for desabilitada, ela será excluída do sistema e o usuário poderá fazer logon apenas usando as credenciais temporárias do usuário do AWS Identity and Access Management (IAM). Para obter mais informações, consulte [Uso da autenticação do IAM para gerar credenciais do usuário do banco de dados](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html). Apenas um superusuário pode habilitar ou desabilitar senhas. Não é possível desabilitar a senha de um superusuário. Para habilitar uma senha, execute ALTER USER e especifique uma senha.  
Para obter detalhes sobre como usar o parâmetro PASSWORD, consulte [CREATE USER](r_CREATE_USER.md). 

VALID UNTIL '*data\$1expiração*'   
Especifica que a senha tem uma data de expiração. Use o valor `'infinity'` para evitar ter uma data de expiração definida. O tipo de dados válido para o parâmetro é timestamp.   
Somente superusuários podem usar esse parâmetro.

RENAME TO   
Renomeia o usuário. 

 *new\$1name*   
Novo nome de usuário. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).  
Ao renomear um usuário, você também deve redefinir a senha do usuário. A senha redefinida não precisa ser diferente da senha anterior. O nome de usuário é usado como parte da criptografia da senha. Portanto, quando um usuário é renomeado, a senha é eliminada. O usuário só poderá fazer logon depois que a senha for redefinida. Por exemplo:   

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

CONNECTION LIMIT \$1 *limite* \$1 UNLIMITED \$1   
Número máximo de conexões de banco de dados que o usuário pode abrir simultaneamente. Não há aplicação de limite para superusuários. Use a palavra-chave UNLIMITED para permitir o número máximo de conexões simultâneas. Um limite no número de conexões para cada banco de dados pode ser aplicável. Para obter mais informações, consulte [CREATE DATABASE](r_CREATE_DATABASE.md). O valor padrão é UNLIMITED. Para visualizar as conexões atuais, consulte a exibição [STV\$1SESSIONS](r_STV_SESSIONS.md) do sistema.  
Se limites de usuário e de conexão de banco de dados forem aplicáveis, um slot de conexão não utilizado que esteja dentro de ambos os limites deve estar disponível quando um usuário tenta se conectar.

SESSION TIMEOUT *limit* \$1 RESET SESSION TIMEOUT  
O tempo máximo em segundos em que uma sessão permanece inativa ou ociosa. O intervalo é de 60 segundos (um minuto) a 1.728.000 segundos (20 dias). Se nenhum tempo limite de sessão estiver definido para o usuário, a configuração de cluster será aplicada. Para obter mais informações, consulte “[Cotas e limites no Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)” no *Guia de gerenciamento de clusters do Amazon Redshift*.  
Quando você define o tempo limite da sessão, ele é aplicado somente a novas sessões.  
Para exibir informações sobre sessões de usuário ativas, incluindo a hora de início, o nome de usuário e o tempo limite da sessão, consulte a visualização de sistema [STV\$1SESSIONS](r_STV_SESSIONS.md). Para exibir informações sobre o histórico de sessões de usuário, consulte a visualização [STL\$1SESSIONS](r_STL_SESSIONS.md). Para recuperar informações sobre usuários do banco de dados, incluindo valores de tempo limite de sessão, consulte a visualização [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md).

SET   
Define um parâmetro de configuração para um novo valor padrão em todas as sessões executadas pelo usuário especificado. 

RESET   
Redefine um parâmetro de configuração para o valor padrão original para o usuário especificado. 

 *Parâmetro*   
Nome do parâmetro a ser definido ou redefinido. 

 *valor*   
Novo valor para o parâmetro. 

DEFAULT   
Define o parâmetro de configuração para o valor padrão em todas as sessões executadas pelo usuário especificado. 

EXTERNALID *external\$1id*   
O identificador para o usuário, que está associado a um provedor de identidades. O usuário deve ter a senha desabilitada. Para obter mais informações, consulte [Federação do provedor de identidades (IdP) nativo para o Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

## Observações de uso
<a name="r_ALTER_USER_usage_notes"></a>
+ **Tentativa de alterar o rdsdb**: não é possível alterar o usuário chamado `rdsdb`.
+ **Criação de uma senha desconhecida**: ao usar a autenticação do AWS Identity and Access Management (IAM) para criar credenciais de usuário de banco de dados, convém criar um superusuário que possa fazer login usando apenas credenciais temporárias. Você não pode desabilitar a senha de um superusuário, mas pode criar uma senha desconhecida usando uma string de hash MD5 gerada aleatoriamente.

  ```
  alter user iam_superuser password 'md51234567890123456780123456789012';
  ```
+ **Definição de search\$1path**: quando você define o parâmetro [search\$1path](r_search_path.md) com o comando ALTER USER, a modificação entra em vigor no próximo login do usuário especificado. Se quiser alterar o valor do search\$1path para o usuário e a sessão atuais, use o comando SET. 
+ **Definição do fuso horário**: quando você usa SET TIMEZONE com o comando ALTER USER, a modificação entra em vigor no próximo login do usuário especificado.
+ **Trabalho com políticas de segurança no nível da linha e de mascaramento dinâmico de dados**: quando o cluster provisionado ou namespace sem servidor tem alguma política de segurança no nível da linha ou de mascaramento dinâmico de dados, os seguintes comandos são bloqueados para usuários comuns: 

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

  Somente superusuários e usuários com o privilégio ALTER USER podem definir essas opções de configuração. Para obter informações sobre a segurança por linha, consulte  [Segurança por linha](t_rls.md). Para obter informações sobre o mascaramento dinâmico de dados, consulte [Mascaramento dinâmico de dados](t_ddm.md). 

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

O exemplo a seguir permite que o usuário ADMIN tenha privilégios para criar bancos de dados: 

```
alter user admin createdb;
```

O exemplo a seguir define a senha do usuário ADMIN como `adminPass9`, além de definir a data e o horário de validade da senha: 

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

O exemplo a seguir renomeia o usuário de ADMIN para SYSADMIN: 

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

O exemplo a seguir atualiza o tempo limite de sessão ociosa para um usuário para 300 segundos.

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

Redefine o tempo limite da sessão ociosa do usuário. Quando você redefinir, a configuração de cluster se aplica. Você deve ser um superusuário do banco de dados para executar este comando. Para obter mais informações, consulte “[Cotas e limites no Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)” no *Guia de gerenciamento de clusters do Amazon Redshift*.

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

O exemplo a seguir atualiza o ID externo de um usuário chamado `bob`. Esse namespace é `myco_aad`. Se o namespace não estiver associado a um provedor de identidades inscrito, isso resultará em um erro.

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

O exemplo a seguir define o fuso horário para todas as sessões executadas por um usuário de banco de dados específico. Ele altera o fuso horário de sessões subsequentes, mas não da sessão atual.

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

O exemplo a seguir define o número máximo de conexões de banco de dados que o usuário `bob` pode abrir.

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

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

Atualiza as estatísticas da tabela para uso pelo planejador de consulta. 

## Privilégios obrigatórios
<a name="r_ANALYZE-privileges"></a>

A seguir estão os privilégios obrigatórios para ANALYZE:
+ Superusuário
+ Usuários com o privilégio ANALYZE
+ Proprietário da relação
+ Proprietário do banco de dados com o qual a tabela é compartilhada

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

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

## Parâmetros
<a name="r_ANALYZE-parameters"></a>

VERBOSE   
Cláusula que retorna mensagens de informações de andamento sobre a operação ANALYZE. Esta opção é útil quando uma tabela não é especificada.

 *table\$1name*   
É possível analisar tabelas específicas, incluindo tabelas temporárias. É possível qualificar a tabela com o nome do esquema. Como opção, é possível especificar nome\$1tabela para analisar uma tabela exclusiva. Não é possível especificar mais de um *nome\$1tabela* com uma única instrução ANALYZE *nome\$1tabela*. Se você não especificar um valor para o *table\$1name*, todas as tabelas no banco de dados conectado atualmente são analisadas, incluindo as tabelas persistentes no catálogo do sistema. O Amazon Redshift ignora a análise de uma tabela se a porcentagem de linhas alteradas desde a última ANALYZE for inferior ao limite de análise. Para obter mais informações, consulte [Limite de análise](#r_ANALYZE-threshold).  
Não é necessário analisar tabelas de sistema do Amazon Redshift (tabelas STL e STV).

 *column\$1name*   
Se especificar um *table\$1name*, você também pode especificar uma ou mais colunas na tabela (como uma lista separada por colunas entre parênteses). Se uma lista de colunas for especificada, somente as colunas listadas serão analisadas.

 PREDICATE COLUMNS \$1 ALL COLUMNS   
Cláusulas que indicam se ANALYZE deve incluir somente colunas de predicado. Especifique o parâmetro PREDICATE COLUMNS para analisar somente as colunas usadas como predicados em consultas anteriores ou que podem vir a ser usadas como predicados. Especifique ALL COLUMNS para analisar todas as colunas. ALL COLUMNS é o valor padrão.   
Uma coluna é incluída no conjunto de colunas de predicado se qualquer das seguintes afirmações for verdadeira:  
+ A coluna foi usada em uma consulta como parte de um filtro, condição de junção ou agrupamento por cláusula.
+ A coluna é uma chave de distribuição.
+ A coluna faz parte de uma chave de classificação.
Se nenhuma coluna for marcada como coluna de predicado, por exemplo porque a tabela ainda não foi consultada, todas as colunas serão analisadas mesmo se o parâmetro PREDICATE COLUMNS for especificado. Quando isso acontece, o Amazon Redshift pode responder com uma mensagem, como Nenhuma coluna de predicado encontrada para "*table-name*". Analisar todas as colunas. Para obter mais informações sobre colunas de predicado, consulte [Análise de tabelas](t_Analyzing_tables.md).

## Observações de uso
<a name="r_ANALYZE-usage-notes"></a>

O Amazon Redshift executa automaticamente ANALYZE em tabelas criadas com os seguintes comandos: 
+ CREATE TABLE AS
+ CREATE TEMP TABLE AS 
+ SELECT INTO

 Não é possível analisar uma tabela externa.

Não é necessário executar o comando ANALYZE nessas tabelas quando elas são criadas. Se você as modificar, você deve analisá-las da mesma forma que outras tabelas.

### Limite de análise
<a name="r_ANALYZE-threshold"></a>

Para reduzir o tempo de processamento e aprimorar a performance geral do sistema, o Amazon Redshift ignorará o comando ANALYZE para uma tabela se a porcentagem de linhas alteradas desde a última vez em que o comando ANALYZE foi executado for inferior ao limite de análise especificado pelo parâmetro [analyze\$1threshold\$1percent](r_analyze_threshold_percent.md). Por padrão, `analyze_threshold_percent` é 10. Para alterar a `analyze_threshold_percent` para a sessão atual, execute o comando [SET](r_SET.md). O exemplo a seguir altera a `analyze_threshold_percent` para 20%.

```
set analyze_threshold_percent to 20;
```

Para analisar tabelas quando apenas uma quantidade pequena de linhas tiver sido alterada, defina `analyze_threshold_percent` como um número arbitrariamente pequeno. Por exemplo, se você definir `analyze_threshold_percent` como 0,01, a tabela com 100.000.000 linhas não será ignorada se pelo menos 10.000 linhas tiverem sido alteradas. 

```
set analyze_threshold_percent to 0.01;
```

Se o comando ANALYZE ignorar uma tabela porque ela não atende ao limite, o Amazon Redshift retornará a mensagem a seguir.

```
ANALYZE SKIP
```

Para analisar todas as tabelas, mesmo se nenhuma linha tiver sido alterada, defina `analyze_threshold_percent` como 0.

Para visualizar os resultados das operações ANALYZE, consulte a tabela do sistema [STL\$1ANALYZE](r_STL_ANALYZE.md). 

Para obter mais informações sobre a análise de tabelas, consulte [Análise de tabelas](t_Analyzing_tables.md).

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

Analisa todas as tabelas no banco de dados TICKIT e retorna informações de andamento.

```
analyze verbose;
```

Analise somente a tabela LISTING.

```
analyze listing;
```

Analise as colunas VENUEID e VENUENAME na tabela VENUE. 

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

Analise somente colunas de predicado na tabela VENUE.

```
analyze venue predicate columns;
```

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

Executa análise de compactação e produz um relatório com a codificação sugerida de compactação para as tabelas analisadas. Para cada coluna, o relatório inclui uma estimativa da possível redução no espaço em disco para a codificação RAW.

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

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

## Parâmetros
<a name="r_ANALYZE_COMPRESSION-parameters"></a>

 *table\$1name*   
É possível analisar a compactação para tabelas específicas, incluindo tabelas temporárias. É possível qualificar a tabela com o nome do esquema. Como opção, é possível especificar *nome\$1tabela* para analisar uma tabela exclusiva. Se você não especificar um *table\$1name*, todas as tabelas conectadas no banco de dados no momento serão analisadas. Não é possível especificar mais de um *table\$1name* com uma única instrução ANALYZE COMPRESSION.

 *column\$1name*   
Se especificar um *table\$1name*, você também pode especificar uma ou mais colunas na tabela (como uma lista separada por colunas entre parênteses).

COMPROWS  
Número de linhas a serem usadas como o tamanho de exemplo para análise de compactação. A análise é executada em linhas de cada fatia de dados. Por exemplo, se você especificar COMPROWS 1000000 (1.000.000) e o sistema tiver 4 fatias no total, não mais do que 250.000 linhas por fatia serão lidas e analisadas. Se COMPROWS não for especificado, o padrão do tamanho de exemplo será 100.000 por fatia. Os valores de COMPROWS menores que o padrão de 100.000 linhas por fatia são atualizados automaticamente para o valor padrão. Porém, a análise de compactação não produzirá recomendações se o valor de dados na tabela for insuficiente para produzir um exemplo significativo. Se o número de COMPROWS for maior que o número de linhas na tabela, o comando ANALYZE COMPRESSION continuará e executará a análise de compactação para todas as linhas disponíveis. O uso de COMPROWS gerará um erro se uma tabela não for especificada.

 *numrows*   
Número de linhas a serem usadas como o tamanho de exemplo para análise de compactação. O intervalo aceito para *numrows* é um número entre 1000 e 1000000000 (1.000.000.000).

## Observações de uso
<a name="r_ANALYZE_COMPRESSION_usage_notes"></a>

ANALYZE COMPRESSION adquire um bloqueio exclusivo de tabela que impede leituras e gravações simultâneas na tabela. Execute o comando ANALYZE COMPRESSION somente quando a tabela estiver ociosa.

Execute ANALYZE COMPRESSION para obter recomendações de esquemas de codificação de coluna com base em uma amostra do conteúdo da tabela. ANALYZE COMPRESSION é uma ferramenta de consulta e não modifica as codificações de coluna da tabela. A codificação sugerida pode ser aplicada recriando a tabela ou criando uma tabela com o mesmo esquema. Recriar uma tabela descompactada com esquemas de codificação apropriados pode reduzir significativamente o espaço ocupado no disco. Essa abordagem economiza espaço em disco e melhora a performance da consulta para workloads limitados a E/S.

ANALYZE COMPRESSION ignora a fase de análise real e retorna diretamente o tipo de codificação original em qualquer coluna designada como SORTKEY. Ele faz isso porque verificações restritas por intervalo podem ter uma má performance quando as colunas SORTKEY são muito mais compactadas que outras colunas.

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

O exemplo a seguir mostra a codificação e a redução percentual estimada somente para as colunas na tabela LISTING:

```
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
```

O exemplo a seguir analisa as colunas QTYSOLD, COMMISSION e SALETIME na tabela 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>

Anexa uma política de mascaramento dinâmico de dados existente a uma coluna. Para obter mais informações sobre mascaramento dinâmico de dados, consulte [Mascaramento dinâmico de dados](t_ddm.md).

Superusuários e usuários ou perfis que têm a função sys:secadmin podem anexar uma política de mascaramento.

## Sintaxe
<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 ];
```

## Parâmetros
<a name="r_ATTACH_MASKING_POLICY-parameters"></a>

*policy\$1name*   
O nome da política de mascaramento a ser anexada.

database\$1name  
O nome do banco de dados no qual a política e a relação são criadas. A política e a relação precisam estar no mesmo banco de dados. O banco de dados pode ser o conectado ou um banco de dados que comporte as permissões federadas do Amazon Redshift.

schema\$1name  
O nome do esquema ao qual pertence a relação.

 *relation\$1name*   
O nome da relação à qual a política de mascaramento deve ser anexada.

*output\$1column\$1names*   
Os nomes das colunas às quais a política de mascaramento se aplicará.

*output\$1paths*   
O caminho completo do objeto SUPER ao qual a política de mascaramento será aplicada, inclusive o nome da coluna. Por exemplo, para uma relação com uma coluna do tipo SUPER chamada `person`, *output\$1path* pode ser `person.name.first_name`. 

*input\$1column\$1names*   
Os nomes das colunas que a política de mascaramento vai receber como entrada. Esse parâmetro é opcional. Se não for especificado, a política de mascaramento usará *output\$1column\$1names* como entradas.

*input\$1paths*   
O caminho completo do objeto SUPER que a política de mascaramento vai utilizar como entrada. Esse parâmetro é opcional. Se não for especificado, a política de mascaramento usará *output\$1path* como entradas.

*user\$1name*   
O nome do usuário ao qual a política de mascaramento será anexada. Você não pode anexar duas políticas à mesma combinação de usuário e coluna ou função e coluna. Você pode anexar uma política a um usuário e outra política ao perfil do usuário. Nesse caso, a política com maior prioridade se aplicará.  
Só é possível definir uma opção entre user\$1name, role\$1name e PUBLIC em um comando ATTACH MASKING POLICY. 

*role\$1name*   
O nome do perfil ao qual a política de mascaramento será anexada. Não é possível anexar duas políticas ao mesmo par de coluna/perfil. Você pode anexar uma política a um usuário e outra política ao perfil do usuário. Nesse caso, a política com maior prioridade se aplicará.  
Só é possível definir uma opção entre user\$1name, role\$1name e PUBLIC em um comando ATTACH MASKING POLICY. 

*PUBLIC*   
Anexa a política de mascaramento a todos os usuários que acessam a tabela. Você deve dar a outras políticas de mascaramento associadas a pares específicos de coluna/usuário ou coluna/perfil uma prioridade maior do que a política PUBLIC para que elas sejam aplicadas.  
Só é possível definir uma opção entre user\$1name, role\$1name e PUBLIC em um comando ATTACH MASKING POLICY. 

*priority*   
A prioridade da política de mascaramento. Quando várias políticas de mascaramento se aplicam à consulta de um determinado usuário, a política de maior prioridade se aplica.  
Você não pode anexar duas políticas diferentes à mesma coluna com prioridade igual, mesmo se as duas políticas estiverem anexadas a usuários ou funções diferentes. Você pode anexar a mesma política várias vezes ao mesmo conjunto de parâmetros de tabela, coluna de saída, coluna de entrada e prioridade, desde que o usuário ou a função à qual a política esteja anexada seja sempre diferente.   
Você não pode aplicar uma política a uma coluna com a mesma prioridade de outra política anexada a essa coluna, mesmo que ela seja para perfis diferentes. Esse campo é opcional. Se você não especificar uma prioridade, a política de mascaramento será anexada com prioridade 0 por padrão.

Para o uso da ATTACH MASKING POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do 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>

Anexar política de segurança no nível da linha de uma tabela a um ou mais usuários ou funções.

Superusuários e usuários ou funções que têm a função `sys:secadmin` podem anexar uma política.

## Sintaxe
<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 } [, ...]
```

## Parâmetros
<a name="r_ATTACH_RLS_POLICY-parameters"></a>

 *policy\$1name*   
O nome da política.

database\$1name  
O nome do banco de dados no qual a política e a relação são criadas. A política e a relação precisam estar no mesmo banco de dados. O banco de dados pode ser o conectado ou um banco de dados que comporte as permissões federadas do Amazon Redshift.

schema\$1name  
O nome do esquema ao qual pertence a relação.

table\$1name  
A relação à qual a política de segurança no nível da linha está anexada.

TO \$1 *user\$1name* \$1 ROLE *role\$1name* \$1 PUBLIC\$1 [, ...]  
Especifica se a política está anexada a um ou mais usuários ou funções especificados. 

Para o uso da ATTACH RLS POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Observações de uso
<a name="r_ATTACH_RLS_POLICY-usage"></a>

Ao trabalhar com a instrução ATTACH RLS POLICY, observe o seguinte:
+ A tabela que está sendo anexada deve ter todas as colunas listadas na cláusula WITH da instrução de criação da política.
+ A segurança por linha (RLS) do Amazon Redshift permite a anexação de políticas de RLS aos seguintes objetos:
  +  Tabelas 
  +  Visualizações
  +  Visualizações de vinculação tardia 
  +  Visões materializadas
+ O Amazon Redshift RLS não dá suporte à anexação de políticas RLS para os seguintes objetos:
  +  Tabelas de catálogo 
  +  Relações entre bancos de dados 
  +  Tabelas externas 
  +  Tabelas temporárias 
  +  Tabelas de pesquisa de políticas
  + Tabelas base de visão materializada
+ Políticas de RLS anexadas a superusuários ou a usuários com a permissão `sys:secadmin` são ignoradas.

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

O exemplo a seguir anexa uma política de RLS às combinações especificadas de tabela e perfil. A política de RLS se aplica a qualquer usuário com o perfil de `analyst` ou `dbadmin` quando ele acessa a tabela tickit\$1category\$1redshift.

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

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

Inicia uma transação. Sinônimo de START TRANSACTION.

Quer consista em um ou mais comandos, uma transação é uma unidade de trabalho única e lógica. Geralmente, todos os comandos de uma transação são executados em um snapshot do banco de dados, cuja a hora de início é determinada pelo valor definido para o parâmetro de configuração do sistema `transaction_snapshot_begin`.

Por padrão, as operações individuais do Amazon Redshift (consultas, instruções de DDL, cargas) são confirmadas automaticamente no banco de dados. Se quiser suspender a confirmação de uma operação até que o trabalho subsequente seja concluído, você precisará abrir uma transação com a instrução BEGIN, executar os comandos e depois fechar a transação com a instrução [COMMIT](r_COMMIT.md) ou [END](r_END.md). Se necessário, use uma instrução [ROLLBACK](r_ROLLBACK.md) para abortar uma transação em andamento. Uma exceção a esse comportamento é o comando [TRUNCATE](r_TRUNCATE.md) que confirma a transação na qual é executado e não pode ser revertido.

## Sintaxe
<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.
```

## Parâmetros
<a name="r_BEGIN-parameters"></a>

WORK   
Palavra-chave opcional.

TRANSACTION   
Palavra-chave opcional; WORK e TRANSACTION são sinônimos.

ISOLATION LEVEL SERIALIZABLE   
O isolamento serializável é compatível por padrão. Portanto, o comportamento da transação é o mesmo, esteja ou não essa sintaxe incluída na instrução. Para obter mais informações, consulte [Gerenciamento de operações de gravação simultâneas](c_Concurrent_writes.md). Nenhum outro nível de isolamento é compatível.  
O padrão SQL define quatro níveis de isolamento de transação para impedir *dirty reads* (leitura contaminada em que uma transação lê dados gravados por outra transação simultânea não confirmada), *nonrepeatable reads* (leitura não repetível em que uma transação relê dados lidos anteriormente e descobre que os dados foram alterados por outra transação confirmada após a leitura inicial) e *phantom reads* (leitura fantasma em que uma transação executa uma consulta novamente, retorna um conjunto de linhas que satisfaz uma condição de pesquisa e descobre que o conjunto de linhas mudou por causa de outra transação confirmada recentemente):  
+ Leitura não confirmada: É possível que ocorram leituras contaminadas, não repetíveis e fantasmas.
+ Leitura confirmada: É possível que ocorram leituras não repetíveis e fantasmas.
+ Leitura repetível: É possível que ocorram leituras fantasma.
+ Serializável: Impede que ocorram leituras contaminadas, não repetíveis e fantasma.
Embora seja possível usar qualquer dos quatro níveis de isolamento de transação, o Amazon Redshift processa todos os níveis de isolamento como serializáveis.

READ WRITE   
Oferece permissões de leitura e gravação à transação.

READ ONLY   
Oferece permissões somente de leitura à transação.

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

Os exemplos a seguir iniciam um bloco de transação serializável: 

```
begin;
```

Os exemplos a seguir iniciam o bloco de transação com um nível de isolamento serializável e permissões de leitura e gravação: 

```
begin read write;
```

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

Executa um procedimento armazenado. O comando CALL deve incluir o nome do procedimento e os valores do argumento de entrada. É obrigatório chamar um procedimento armazenado usando a instrução CALL.

**nota**  
CALL não pode fazer parte de qualquer consulta regular.

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

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

## Parâmetros
<a name="r_CALL_procedure-parameters"></a>

 *sp\$1name*   
O nome do procedimento a ser executado. 

 *argument*   
O valor do argumento de entrada. Esse parâmetro também pode ser um nome de função, por exemplo, `pg_last_query_id()`. Não é possível usar consultas como argumentos para CALL. 

## Observações de uso
<a name="r_CALL_procedure-usage-notes"></a>

Os procedimentos armazenados do Amazon Redshift oferecem suporte a chamadas aninhadas e recursivas, conforme descrito a seguir. Além disso, verifique se o seu suporte ao driver está atualizado, também descrito a seguir.

**Topics**
+ [Chamadas aninhadas](#r_CALL_procedure-nested-calls)
+ [Suporte a drivers](#r_CALL_procedure-driver-support)

### Chamadas aninhadas
<a name="r_CALL_procedure-nested-calls"></a>

Os procedimentos armazenados do Amazon Redshift oferecem suporte a chamadas aninhadas e recursivas. O número máximo de níveis de aninhamento permitido é 16. Chamadas aninhadas podem encapsular lógica de negócios em procedimentos menores, que podem ser compartilhados por vários chamadores. 

Se você chamar um procedimento aninhado que tem parâmetros de saída, o procedimento interno deverá definir argumentos INOUT. Nesse caso, o procedimento interno será enviado em uma variável não constante. Argumentos OUT não são permitidos. Esse comportamento ocorre pois uma variável é necessária para conter a saída da chamada interna.

A relação entre os procedimentos interno e externo é registrada em log na coluna `from_sp_call` de [SVL\$1STORED\$1PROC\$1CALL](r_SVL_STORED_PROC_CALL.md). 

O exemplo a seguir mostra as variáveis enviadas a uma chamada de procedimento aninhado por meio 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)
```

### Suporte a drivers
<a name="r_CALL_procedure-driver-support"></a>

Recomendamos atualizar seus drivers de Java Database Connectivity (JDBC) e Open Database Connectivity (ODBC) para a versão mais recente com suporte para procedimentos armazenados do Amazon Redshift. 

Você poderá usar o driver existente se a sua ferramenta de cliente usar operações da API de driver que transmitem a instrução CALL para o servidor. Parâmetros de saída, se houver, são retornados como um conjunto de resultados de uma linha. 

As versões mais recentes dos drivers JDBC e ODBC do Amazon Redshift têm suporte a metadados para descoberta de procedimentos armazenados. Elas também têm suporte a `CallableStatement` para aplicativos Java personalizados. Para obter mais informações, consulte “[Conectar-se a um cluster Amazon Redshift usando ferramentas de cliente SQL](https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-to-cluster.html)” no *Guia de gerenciamento de clusters do Amazon Redshift.* 

Os exemplos a seguir mostram como usar diferentes operações da API do driver de JDBC para chamadas de procedimentos armazenados.

```
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);
}
```

## Exemplos
<a name="r_CALL_procedure-examples"></a>

O exemplo a seguir chama o nome de procedimento `test_spl`.

```
call test_sp1(3,'book');
INFO:  Table "tmp_tbl" does not exist and will be skipped
INFO:  min_val = 3, f2 = book
```

O exemplo a seguir chama o nome de procedimento `test_spl2`.

```
call test_sp2(2,'2019');

         f2          | column2
---------------------+---------
 2019+2019+2019+2019 | 2
(1 row)
```

# CANCEL
<a name="r_CANCEL"></a>

Cancela uma consulta de banco de dados que está sendo executada no momento.

O comando CANCEL requer o ID do processo ou o ID da sessão da consulta que está sendo executada e exibe uma mensagem de confirmação para confirmar que a consulta foi cancelada.

## Privilégios obrigatórios
<a name="r_CANCEL-privileges"></a>

A seguir estão os privilégios obrigatórios para CANCEL:
+ Superusuário que cancele sua própria consulta
+ Superusuário que cancele a consulta de um usuário
+ Usuários com o privilégio CANCEL que cancelem a consulta de um usuário
+ Usuário que cancele sua própria consulta

## Sintaxe
<a name="r_CANCEL-synopsis"></a>

```
CANCEL process_id [ 'message' ]
```

## Parâmetros
<a name="r_CANCEL-parameters"></a>

 *process\$1id*   
Para cancelar uma consulta em execução em um cluster do Amazon Redshift, use o `pid` (ID do processo) de [STV\$1RECENTS](r_STV_RECENTS.md) que corresponde à consulta a ser cancelada.  
Para cancelar uma consulta em execução em um grupo de trabalho do Amazon Redshift sem servidor, use o `session_id` de [SYS\$1QUERY\$1HISTORY](SYS_QUERY_HISTORY.md) que corresponde à consulta a ser cancelada.

'*mensagem*'   
Mensagem de confirmação opcional exibida quando o cancelamento da consulta é concluído. Se você não especificar uma mensagem, o Amazon Redshift exibirá a mensagem padrão como verificação. Você deve colocar a mensagem entre aspas simples.

## Observações de uso
<a name="r_CANCEL-usage-notes"></a>

Não é possível cancelar uma consulta especificando um *ID de consulta*; é necessário especificar o *ID de processo* (PID) ou o *ID da sessão* da consulta. Somente é possível cancelar consultas atualmente em execução pelo seu usuário. Superusuários podem cancelar todas as consultas.

Se as consultas em várias sessões mantiverem bloqueios na mesma tabela, você poderá usar a função [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md) para encerrar uma das sessões. Isso força todas as transações em execução na sessão encerrada a liberar todos os bloqueios e reverter a transação. Consulte a tabela de sistema [STV\$1LOCKS](r_STV_LOCKS.md) para exibir os bloqueios atuais. 

Depois de alguns eventos internos, o Amazon Redshift pode reiniciar uma sessão ativa e atribuir um novo PID. Se o PID foi alterado, a seguinte mensagem de erro pode aparecer.

```
Session <PID> does not exist. The session PID might have changed. Check the stl_restarted_sessions system table for details.
```

Para encontrar o PID, consulte a tabela de sistema [STL\$1RESTARTED\$1SESSIONS](r_STL_RESTARTED_SESSIONS.md) e o filtro na coluna `oldpid`.

```
select oldpid, newpid from stl_restarted_sessions where oldpid = 1234;
```

## Exemplos
<a name="r_CANCEL-examples"></a>

Para cancelar uma consulta em execução em um cluster do Amazon Redshift, recupere primeiro o ID de processo para a consulta a ser cancelada. Para determinar os IDs de processo para todas as consultas atualmente em execução, digite o seguinte 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);
```

Verifique o texto da consulta para determinar qual ID de processo (PID) corresponde à consulta que você deseja cancelar.

Digite o seguinte comando a ser usado com o PID 802 para cancelar a consulta: 

```
cancel 802;
```

A sessão em que a consulta estava sendo executada exibirá a seguinte mensagem: 

```
ERROR:  Query (168) cancelled on user's request
```

onde `168` é o ID de consulta (não o ID de processo usado para cancelar a consulta).

Como alternativa, você pode especificar uma mensagem de confirmação personalizada a ser exibida no lugar da mensagem padrão. Para especificar uma mensagem personalizada, inclua sua mensagem entre aspas simples no final do comando CANCEL: 

```
cancel 802 'Long-running query';
```

A sessão em que a consulta estava sendo executada exibirá a seguinte mensagem: 

```
ERROR:  Long-running query
```

# CLOSE
<a name="close"></a>

(Opcional) Fecha todos os recursos livres associados com um cursor aberto. [COMMIT](r_COMMIT.md), [END](r_END.md) e [ROLLBACK](r_ROLLBACK.md) fecham automaticamente o cursor, para que não seja necessário usar o comando CLOSE para fechá-lo explicitamente. 

Para obter mais informações, consulte [DECLARE](declare.md)[FETCH](fetch.md). 

## Sintaxe
<a name="close-synopsis"></a>

```
CLOSE cursor
```

## Parâmetros
<a name="close-parameters"></a>

*cursor*   
Nome do cursor a ser fechado. 

## Exemplo de CLOSE
<a name="close-example"></a>

Os comandos a seguir fecham o cursor e realizam uma confirmação, que finaliza a transação:

```
close movie_cursor;
commit;
```

# COMMENT
<a name="r_COMMENT"></a>

Cria ou altera um comentário sobre um objeto do banco de dados.

## Sintaxe
<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
```

## Parâmetros
<a name="r_COMMENT-parameters"></a>

 *nome\$1objeto*   
Nome do objeto do banco de dados que está sendo comentado. Você pode adicionar um comentário aos seguintes objetos:  
+ TABLE
+ COLUMN (também utiliza um *nome\$1coluna*).
+ CONSTRAINT (também utiliza um *nome\$1restrição* e um *nome\$1tabela*).
+ DATABASE
+ VIEW
+ SCHEMA

IS '*text*' \$1 NULL  
O texto do comentário que você deseja adicionar ou substituir pelo objeto especificado. A string *text* é o tipo de dados TEXT. Coloque o comentário entre aspas simples. Defina o valor como NULL para remover o texto do comentário.

 *column\$1name*   
Nome da coluna que está sendo comentada. Parâmetro de COLUMN. Acompanha uma tabela específica em `object_name`.

 *nome\$1restrição*   
Nome da restrição que está sendo comentada. Parâmetro de CONSTRAINT.

 *table\$1name*   
Nome de uma tabela que contém a restrição. Parâmetro de CONSTRAINT.

## Observações de uso
<a name="r_COMMENT-usage-notes"></a>

É necessário ser um superusuário ou o proprietário de um objeto de banco de dados para adicionar ou atualizar um comentário.

Comentários sobre bancos de dados podem ser aplicados somente ao banco de dados atual. Uma mensagem de advertência é exibida se você tentar fazer comentários sobre um banco de dados diferente. A mesma mensagem é exibida para comentários sobre bancos de dados que não existem.

Comentários em tabelas externas, colunas externas e colunas de visões de vinculação tardia não são compatíveis.

## Exemplos
<a name="r_COMMENT-example"></a>

O exemplo a seguir adiciona um comentário à tabela SALES. 

```
COMMENT ON TABLE sales IS 'This table stores tickets sales data';
```

O exemplo a seguir exibe o comentário na tabela SALES. 

```
select obj_description('public.sales'::regclass);

obj_description
-------------------------------------
This table stores tickets sales data
```

O exemplo a seguir remove um comentário da tabela SALES. 

```
COMMENT ON TABLE sales IS NULL;
```

O exemplo a seguir adiciona um comentário à coluna EVENTID da tabela SALES. 

```
COMMENT ON COLUMN sales.eventid IS 'Foreign-key reference to the EVENT table.';
```

O exemplo a seguir exibe um comentário na coluna EVENTID (coluna número 5) da tabela SALES. 

```
select col_description( 'public.sales'::regclass, 5::integer );

col_description
-----------------------------------------
Foreign-key reference to the EVENT table.
```

O exemplo a seguir adiciona um comentário descritivo à tabela EVENT. 

```
comment on table event is 'Contains listings of individual events.';
```

Para visualizar os comentários, faça uma consulta no catálogo do sistema PG\$1DESCRIPTION. O exemplo a seguir retorna a descrição da tabela 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 a transação atual no banco de dados. Este comando realiza as atualizações de bancos de dados a partir da transação permanente.

## Sintaxe
<a name="r_COMMIT-synopsis"></a>

```
COMMIT [ WORK | TRANSACTION ]
```

## Parâmetros
<a name="r_COMMIT-parameters"></a>

WORK  
Palavra-chave opcional. Essa palavra-chave não é permitida em um procedimento armazenado. 

TRANSACTION  
Palavra-chave opcional. WORK e TRANSACTION são sinônimos. Nenhuma delas é permitida em um procedimento armazenado. 

Para obter informações sobre como usar COMMIT em um procedimento armazenado, consulte [Gerenciamento de transações](stored-procedure-transaction-management.md). 

## Exemplos
<a name="r_COMMIT-examples"></a>

Cada um dos exemplos a seguir confirma a transação atual no banco de dados:

```
commit;
```

```
commit work;
```

```
commit transaction;
```

# COPY
<a name="r_COPY"></a>


|  | 
| --- |
| A criptografia do lado do cliente para os comandos COPY e UNLOAD não estará mais disponível para novos clientes a partir de 30 de abril de 2025. Se você usou a criptografia do lado do cliente com os comandos COPY e UNLOAD nos 12 meses anteriores a 30 de abril de 2025, poderá continuar usando a criptografia do lado do cliente com os comandos COPY ou UNLOAD até 30 de abril de 2026. Após 30 de abril de 2026, você não poderá usar a criptografia do lado do cliente para COPY e UNLOAD. Recomendamos que você passe a usar a criptografia do lado do servidor para COPY e UNLOAD o mais rápido possível. Se você já usa a criptografia do lado do servidor para COPY e UNLOAD, não há nenhuma alteração a fazer e você pode continuar a usá-la sem alterar suas consultas. Para ter mais informações sobre criptografia para COPY e UNLOAD, consulte o parâmetro ENCRYPTED abaixo.  | 

Carrega dados em uma tabela de arquivos de dados ou de uma tabela do Amazon DynamoDB. Os arquivos podem estar localizados em um bucket do Amazon Simple Storage Service (Amazon S3), em um cluster do Amazon EMR ou em um host remoto acessado com o uso de uma conexão SSH (Secure Shell).

**nota**  
As tabelas externas do Amazon Redshift Spectrum são de somente leitura. Não é possível usar o comando COPY em uma tabela externa.

O comando COPY acrescenta os dados de entrada na forma de linhas adicionais na tabela.

O tamanho máximo de uma única linha de entrada de qualquer origem é 4 MB.

**Topics**
+ [Permissões obrigatórias](#r_COPY-permissions)
+ [Sintaxe de COPY](#r_COPY-syntax)
+ [Parâmetros necessários](#r_COPY-syntax-required-parameters)
+ [Parâmetros opcionais](#r_COPY-syntax-overview-optional-parameters)
+ [Observações sobre uso e recursos adicionais para o comando COPY](#r_COPY-using-the-copy-command)
+ [Exemplos de comando COPY](#r_COPY-using-the-copy-command-examples)
+ [COPY JOB](r_COPY-JOB.md)
+ [COPIAR com MODELO](r_COPY-WITH-TEMPLATE.md)
+ [Referência de parâmetro de COPY](r_COPY-parameters.md)
+ [Observações de uso](r_COPY_usage_notes.md)
+ [Exemplos de COPY](r_COPY_command_examples.md)

## Permissões obrigatórias
<a name="r_COPY-permissions"></a>

Para usar o comando COPY, você deve ter o privilégio [INSERT](r_GRANT.md#grant-insert) para a tabela do Amazon Redshift.

## Sintaxe de COPY
<a name="r_COPY-syntax"></a>

```
COPY table-name 
[ column-list ]
FROM data_source
authorization
[ [ FORMAT ] [ AS ] data_format ] 
[ parameter [ argument ] [, ... ] ]
```

Você pode realizar uma operação COPY com apenas três parâmetros: um nome de tabela, uma fonte de dados e uma autorização para acessar os dados. 

O Amazon Redshift estende a funcionalidade do comando COPY para permitir o carregamento de dados em diversos formatos de dados de várias fontes de dados, o controle de acesso para carregar dados, o gerenciamento de transformações de dados e o gerenciamento da operação de carregamento. 

As seções a seguir apresentam os parâmetros do comando COPY obrigatório. agrupando os parâmetros opcionais por função. Elas também descrevem cada parâmetro e explicam como diversas opções funcionam juntas. Você pode ir diretamente à descrição de um parâmetro usando a lista de parâmetros alfabética. 

## Parâmetros necessários
<a name="r_COPY-syntax-required-parameters"></a>

O comando COPY exige três elementos: 
+ [Table Name](#r_COPY-syntax-overview-table-name)
+ [Data Source](#r_COPY-syntax-overview-data-source)
+ [Authorization](#r_COPY-syntax-overview-credentials)

O comando COPY mais simples usa o formato a seguir. 

```
COPY table-name 
FROM data-source
authorization;
```

O exemplo a seguir criar uma tabela chamada CATDEMO e carrega a tabela com dados de exemplo de um arquivo de dados no Amazon S3 chamado `category_pipe.txt`. 

```
create table catdemo(catid smallint, catgroup varchar(10), catname varchar(10), catdesc varchar(50));
```

No exemplo a seguir, a origem dos dados do comando COPY é um arquivo de dados chamado `category_pipe.txt` na pasta `tickit` de um bucket do Amazon S3 chamado `redshift-downloads`. O comando COPY tem autorização para acessar o bucket do Amazon S3 por meio de uma função do AWS Identity and Access Management (IAM). Se o cluster tiver uma função do IAM existente com permissão para acessar o Amazon S3 anexado, você poderá substituir o nome do recurso da Amazon (ARN) no comando COPY a seguir e executá-lo.

```
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 ter instruções completas sobre como usar comandos COPY para carregar dados de exemplo, inclusive instruções para carregar dados de outras regiões da AWS, consulte [Carregar dados do Amazon S3](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html) para o Amazon Redshift no Guia de conceitos básicos do Amazon Redshift.

*table-name*  <a name="r_COPY-syntax-overview-table-name"></a>
O nome da tabela de destino do comando COPY. A tabela já deve existir no banco de dados. A tabela pode ser temporária ou persistente. O comando COPY acrescenta os novos dados de entrada a todas as linhas existentes na tabela.

FROM *data-source*  <a name="r_COPY-syntax-overview-data-source"></a>
O local dos dados de origem a serem carregados na tabela de destino. É possível especificar um arquivo de manifesto com algumas fontes de dados.   
O repositório de dados mais usado é um bucket do Amazon S3. Você também pode carregar os arquivos de dados localizados em um cluster do Amazon EMR, uma instância do Amazon EC2 ou um host remoto que o cluster pode acessar usando uma conexão SSH, ou ainda pode carregar diretamente de uma tabela do DynamoDB.   
+ [COPY do Amazon S3](copy-parameters-data-source-s3.md)
+ [COPY do Amazon EMR](copy-parameters-data-source-emr.md) 
+ [COPY de host remoto (SSH)](copy-parameters-data-source-ssh.md)
+ [COPY do Amazon DynamoDB](copy-parameters-data-source-dynamodb.md)

Autorização  <a name="r_COPY-syntax-overview-credentials"></a>
Uma cláusula que indica o método que o seu cluster usa na autenticação e autorização para acessar outros recursos da AWS. O comando COPY precisa de autorização para acessar dados em outro recurso da AWS, inclusive em Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. Você pode fornecer essa autorização referenciando uma função do IAM anexada ao cluster ou fornecendo o ID de chave de acesso e a chave de acesso secreta para um usuário do IAM.   
+ [Parâmetros de autorização](copy-parameters-authorization.md) 
+ [Controle de acesso com base em função](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 
+ [Controle de acesso com base em chave](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based) 

## Parâmetros opcionais
<a name="r_COPY-syntax-overview-optional-parameters"></a>

Opcionalmente, você pode especificar como o COPY mapeia os dados de campo para colunas na tabela de destino, definir atributos de dados de origem para permitir que o comando COPY leia e analise corretamente os dados de origem e gerenciar quais operações o comando COPY executa durante o processo de carregamento. 
+ [Opções de mapeamento da coluna](copy-parameters-column-mapping.md)
+ [Parâmetros de formato de dados](#r_COPY-syntax-overview-data-format)
+ [Parâmetros da conversão de dados](#r_COPY-syntax-overview-data-conversion)
+ [Operações de carregamento de dados](#r_COPY-syntax-overview-data-load)

### Mapeamento de colunas
<a name="r_COPY-syntax-overview-column-mapping"></a>

Por padrão, COPY insere valores de campo nas colunas da tabela de destino na mesma ordem dos campos ocorridos nos arquivos de dados. Se a ordem de coluna padrão não funcionar, você poderá especificar uma lista de colunas ou usar expressões JSONPath para mapear campos de dados de origem para as colunas 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 dados
<a name="r_COPY-syntax-overview-data-format"></a>

Você pode carregar dados de arquivos de texto em formato de largura fixa, delimitado por caractere, CSV (Comma-Separated Values) ou JSON, ou de arquivos Avro.

Por padrão, o comando COPY espera que os dados de origem estejam em arquivos de texto UTF-8 delimitados por caractere. O delimitador padrão é um caractere de barra ( \$1 ). Se os dados de origem estiverem em outro formato, use os parâmetros a seguir para especificar o formato de dados.
+ [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 da conversão de dados
<a name="r_COPY-syntax-overview-data-conversion"></a>

À medida que carrega a tabela, COPY tenta converter implicitamente as strings nos dados de origem no tipo de dados da coluna de destino. Se precisar especificar uma conversão diferente do comportamento padrão, ou se a conversão padrão resultar em erros, você poderá gerenciar conversões de dados especificando os parâmetros a seguir.
+ [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) 

### Operações de carregamento de dados
<a name="r_COPY-syntax-overview-data-load"></a>

Gerencie o comportamento padrão da operação de carregamento para solucionar problemas ou reduzir o tempo de carregamento especificando os parâmetros a seguir. 
+ [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) 

## Observações sobre uso e recursos adicionais para o comando COPY
<a name="r_COPY-using-the-copy-command"></a>

Para obter mais informações sobre como usar o comando COPY, consulte os seguintes tópicos: 
+ [Observações de uso](r_COPY_usage_notes.md)
+ [Tutorial: Carregar dados do Amazon S3](tutorial-loading-data.md)
+ [Práticas recomendadas do Amazon Redshift para carregamento de dados](c_loading-data-best-practices.md)
+ [Carregar tabelas com o comando COPY](t_Loading_tables_with_the_COPY_command.md)
  + [Carregar dados do Amazon S3](t_Loading-data-from-S3.md)
  + [Carregar dados do Amazon EMR](loading-data-from-emr.md)
  + [Carregamento de dados de hosts remotos](loading-data-from-remote-hosts.md) 
  + [Carregar dados de uma tabela do Amazon DynamoDB](t_Loading-data-from-dynamodb.md)
+ [Solução de problemas de carregamento de dados](t_Troubleshooting_load_errors.md)

## Exemplos de comando COPY
<a name="r_COPY-using-the-copy-command-examples"></a>

Para obter mais exemplos que mostram como COPIAR de várias fontes, em formatos diferentes e com diferentes opções de CÓPIA, consulte [Exemplos de COPY](r_COPY_command_examples.md).

# COPY JOB
<a name="r_COPY-JOB"></a>

Para obter mais informações sobre esse comando, consulte [Criar uma integração de eventos do S3 para copiar automaticamente arquivos de buckets do Amazon S3](loading-data-copy-job.md).

Gerencia comandos COPY que carregam dados em uma tabela. O comando COPY JOB é uma extensão do comando COPY e automatiza o carregamento de dados dos buckets do Amazon S3. Quando você cria um trabalho COPY, o Amazon Redshift detecta quando são criados arquivos do Amazon S3 em um caminho especificado e os carrega automaticamente sem sua intervenção. Os mesmos parâmetros usados no comando COPY original são usados ao carregar os dados. O Amazon Redshift monitora os arquivos carregados (com base no nome do arquivo) para verificar se eles são carregados apenas uma vez.

**nota**  
Para obter informações sobre o comando COPY, incluindo uso, parâmetros e permissões, consulte[COPY](r_COPY.md).

## Permissão obrigatória
<a name="r_COPY-JOB-privileges"></a>

Para usar o comando COPY JOB, você deve ter uma das seguintes permissões, além de todas as permissões necessárias para usar COPY:
+ Superusuário
+  Todas as seguintes: 
  +  A permissão relevante CREATE, ALTER ou DROP com escopo para COPY JOBS no banco de dados para o qual você deseja COPIAR. 
  +  Permissão USAGE referente ao esquema para o qual você deseja COPIAR ou permissão USAGE com escopo para esquemas no banco de dados para o qual você deseja COPIAR. 
  +  Permissão INSERT para a tabela para a qual você deseja COPIAR ou a permissão INSERT com escopo para tabelas no esquema ou banco de dados para o qual você deseja COPIAR. 

O perfil do IAM especificado com o comando COPY deve ter permissão para acessar os dados a serem carregados. Para obter mais informações, consulte [Permissões do IAM para COPY, UNLOAD e CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions).

## Sintaxe
<a name="r_COPY-JOB-syntax"></a>

Crie um trabalho de cópia. Os parâmetros do comando COPY são salvos com o trabalho de cópia.

Não é possível executar COPY JOB CREATE dentro do escopo de um bloco de transação.

```
COPY copy-command JOB CREATE job-name
[AUTO ON | OFF]
```

Altere a configuração de um trabalho de cópia.

```
COPY JOB ALTER job-name
[AUTO ON | OFF]
```

Execute um trabalho de cópia. Os parâmetros do comando COPY armazenados são usados.

```
COPY JOB RUN job-name
```

Liste todos os trabalhos de cópia.

```
COPY JOB LIST
```

Mostre os detalhes de um trabalho de cópia.

```
COPY JOB SHOW job-name
```

Exclua um trabalho de cópia.

Não é possível executar COPY JOB DROP dentro do escopo de um bloco de transação.

```
COPY JOB DROP job-name
```

## Parâmetros
<a name="r_COPY-JOB-parameters"></a>

*copy-command*  
Um comando COPY que carrega dados do Amazon S3 para o Amazon Redshift. A cláusula contém parâmetros de COPY que definem o bucket do Amazon S3, a tabela de destino, o perfil do IAM e outros parâmetros usados ao carregar dados. Todos os parâmetros do comando COPY para um carregamento de dados do Amazon S3 são compatíveis, exceto:  
+ COPY JOB não ingere arquivos preexistentes na pasta apontada pelo comando COPY. Somente arquivos criados após o carimbo de data e hora da criação de COPY JOB são ingeridos.
+ Não é possível especificar um comando COPY com as opções MAXERROR ou IGNOREALLERRORS.
+ Você não pode especificar um arquivo de manifesto. COPY JOB exige um local designado no Amazon S3 para monitorar a criação de arquivos.
+ Você não pode especificar um comando COPY com tipos de autorização como chaves de acesso e secretas. Somente comandos COPY que usam o parâmetro `IAM_ROLE` para autorização são compatíveis. Para obter mais informações, consulte [Parâmetros de autorização](copy-parameters-authorization.md).
+ O COPY JOB não oferece suporte ao perfil do IAM padrão associado com o cluster. Você deve especificar o `IAM_ROLE` no comando COPY. 
Para obter mais informações, consulte [COPY do Amazon S3](copy-parameters-data-source-s3.md).

*job-name*  
O nome do trabalho usado para fazer referência ao trabalho COPY. O *job-name* não pode conter um hífen (‐).

 [AUTO ON \$1 OFF]   
Cláusula que indica se os dados do Amazon S3 são carregados automaticamente nas tabelas do Amazon Redshift.  
+ Quando `ON`, o Amazon Redshift monitora o caminho de origem do Amazon S3 para arquivos recém-criados e, se encontrado, um comando COPY é executado com os parâmetros de COPY na definição do trabalho. Esse é o padrão.
+ Quando `OFF`, o Amazon Redshift não executa COPY JOB automaticamente.

## Observações de uso
<a name="r_COPY-JOB-usage-notes"></a>

As opções do comando COPY não são validadas até o tempo de execução. Por exemplo, um `IAM_ROLE` inválido ou uma fonte de dados do Amazon S3 resulta em erros de tempo de execução quando COPY JOB é iniciado.

Se o cluster estiver pausado, COPY JOBS não serão executados.

Para consultar arquivos de comando COPY carregados e erros de carregamento, consulte [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md), [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md) e [STL\$1LOADERROR\$1DETAIL](r_STL_LOADERROR_DETAIL.md). Para obter mais informações, consulte [Como verificar se os dados foram carregados corretamente](verifying-that-data-loaded-correctly.md).

Não é possível usar COPY JOBS em bancos de dados com ETL zero, pois eles operam no modo somente leitura.

## Exemplos
<a name="r_COPY-JOB-examples"></a>

O exemplo a seguir mostra a criação de um COPY JOB para carregar dados de um bucket do 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;
```

# COPIAR com MODELO
<a name="r_COPY-WITH-TEMPLATE"></a>

É possível usar modelos do Redshift com comandos COPY para simplificar a sintaxe dos comandos e garantir a consistência nas operações de carregamento de dados. Em vez de especificar os mesmos parâmetros de formatação repetidamente, defina-os uma vez em um modelo e faça referência ao modelo em seus comandos COPY. Quando você usa um modelo, o comando COPY associa os parâmetros do modelo a quaisquer parâmetros especificados diretamente no comando. Se o mesmo parâmetro aparecer no modelo e no comando, o parâmetro do comando terá precedência. Para obter mais informações, consulte [CREATE TEMPLATE](r_CREATE_TEMPLATE.md). 

Os modelos para o comando COPY podem ser criados com:
+ [Parâmetros de formato de dados](copy-parameters-data-format.md)
+ [Parâmetros de compactação de arquivo](copy-parameters-file-compression.md)
+ [Parâmetros da conversão de dados](copy-parameters-data-conversion.md)
+ [Operações de carregamento de dados](copy-parameters-data-load.md)

Para ver uma lista completa de parâmetros compatíveis, consulte o comando [COPY](r_COPY.md).

## Permissão obrigatória
<a name="r_COPY-WITH-TEMPLATE-privileges"></a>

Para usar um modelo em um comando COPY, você deve ter:
+ Todas as permissões necessárias para executar o comando COPY (consulte [Permissões obrigatórias](r_COPY.md#r_COPY-permissions)).
+ Uma das seguintes permissões de modelo:
  + Privilégios de superusuário.
  + Privilégio USAGE no modelo e privilégio USAGE no esquema que contém o modelo.

## Sintaxe
<a name="r_COPY-WITH-TEMPLATE-syntax"></a>

```
COPY target_table FROM 's3://...'
authorization
[ option, ...]
USING TEMPLATE [database_name.][schema_name.]template_name;
```

## Parâmetros
<a name="r_COPY-WITH-TEMPLATE-parameters"></a>

 *database\$1name*   
(Opcional) O nome do banco de dados no qual o modelo existe. Se não especificado, será usado o banco de dados atual.

 *schema\$1name*   
(Opcional) O nome do esquema no qual o modelo existe. Se não for especificado, o modelo será pesquisado no caminho de pesquisa atual.

 *template\$1name*   
O nome do modelo a ser usado em COPY. 

## Observações de uso
<a name="r_COPY-WITH_TEMPLATE-usage-notes"></a>
+ Os parâmetros específicos do comando (origem, destino e autorização) ainda devem ser especificados no comando COPY.
+ Os modelos não podem conter especificações de arquivo de manifesto para comandos COPY.

## Exemplos
<a name="r_COPY-WITH-TEMPLATE-examples"></a>

Os seguintes exemplos mostram como criar um modelo e usá-lo em 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;
```

Quando existe um parâmetro no modelo e no comando, o parâmetro do comando tem precedência. Neste exemplo, se o modelo `public.test_template` contiver `DELIMITER '|'`, mas o comando COPY especificar `DELIMITER ','`, o delimitador de vírgula (`,`) do comando será usado em vez do delimitador de barra vertical (`|`) do modelo. 

```
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;
```

# Referência de parâmetro de COPY
<a name="r_COPY-parameters"></a>

COPY tem vários parâmetros que podem ser usados em muitas situações. No entanto, nem todos os parâmetros são compatíveis com cada situação. Por exemplo, para carregar arquivos ORC ou PARQUET, há um número limitado de parâmetros compatíveis. Para obter mais informações, consulte [COPY de formatos de dados colunar](copy-usage_notes-copy-from-columnar.md).

**Topics**
+ [Fontes de dados](copy-parameters-data-source.md)
+ [Parâmetros de autorização](copy-parameters-authorization.md)
+ [Opções de mapeamento da coluna](copy-parameters-column-mapping.md)
+ [Parâmetros de formato de dados](copy-parameters-data-format.md)
+ [Parâmetros de compactação de arquivo](copy-parameters-file-compression.md)
+ [Parâmetros da conversão de dados](copy-parameters-data-conversion.md)
+ [Operações de carregamento de dados](copy-parameters-data-load.md)
+ [Lista de parâmetros alfabética](r_COPY-alphabetical-parm-list.md)

# Fontes de dados
<a name="copy-parameters-data-source"></a>

Você pode carregar dados de arquivos de texto em um bucket do Amazon S3, em um cluster do Amazon EMR ou em um host remoto que o cluster pode acessar usando uma conexão SSH. Você também pode carregar dados diretamente de uma tabela do DynamoDB. 

O tamanho máximo de uma única linha de entrada de qualquer origem é 4 MB. 

Para exportar dados de uma tabela para um conjunto de arquivos em um Amazon S3, use o comando [UNLOAD](r_UNLOAD.md). 

**Topics**
+ [COPY do Amazon S3](copy-parameters-data-source-s3.md)
+ [COPY do Amazon EMR](copy-parameters-data-source-emr.md)
+ [COPY de host remoto (SSH)](copy-parameters-data-source-ssh.md)
+ [COPY do Amazon DynamoDB](copy-parameters-data-source-dynamodb.md)

# COPY do Amazon S3
<a name="copy-parameters-data-source-s3"></a>

Para carregar dados de arquivos localizados em um ou mais buckets do S3, use a cláusula FROM para indicar como o COPY localiza os arquivos no Amazon S3. Você pode fornecer o caminho do objeto para os arquivos de dados como parte da cláusula FROM ou a localização de um arquivo manifesto que contenha uma lista de caminhos de objeto do Amazon S3. COPY de Amazon S3 usa uma conexão HTTPS. Certifique-se de que os intervalos de IP do S3 sejam adicionados à sua lista de permissões. Para saber mais sobre os intervalos de IP do S3 necessários, consulte [ Isolamento de rede](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation).

**Importante**  
Se os buckets do Amazon S3 que mantêm os arquivos de dados não residirem na mesma região da AWS que o cluster, use o parâmetro [REGION](#copy-region) para especificar a região na qual os dados estão localizados. 

**Topics**
+ [Sintaxe](#copy-parameters-data-source-s3-syntax)
+ [Exemplos](#copy-parameters-data-source-s3-examples)
+ [Parâmetros opcionais](#copy-parameters-data-source-s3-optional-parms)
+ [Parâmetros incompatíveis](#copy-parameters-data-source-s3-unsupported-parms)

## Sintaxe
<a name="copy-parameters-data-source-s3-syntax"></a>

```
FROM { 's3://objectpath' | 's3://manifest_file' }
authorization
| MANIFEST
| ENCRYPTED
| REGION [AS] 'aws-region'
| optional-parameters
```

## Exemplos
<a name="copy-parameters-data-source-s3-examples"></a>

O exemplo a seguir usa um caminho de objeto para carregar dados do Amazon S3. 

```
copy customer
from 's3://amzn-s3-demo-bucket/customer' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

O exemplo a seguir usa um arquivo manifesto para carregar dados do Amazon S3. 

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

### Parâmetros
<a name="copy-parameters-data-source-s3-parameters"></a>

FROM  <a name="copy-parameters-from"></a>
A origem dos dados a serem carregados. Para obter mais informações sobre a codificação do arquivo do Amazon S3, consulte [Parâmetros da conversão de dados](copy-parameters-data-conversion.md).

's3://*copy\$1from\$1s3\$1objectpath*'   <a name="copy-s3-objectpath"></a>
Especifica o caminho para os objetos do Amazon S3 que contêm os dados por exemplo, `'s3://amzn-s3-demo-bucket/custdata.txt'`. O parâmetro *s3://copy\$1from\$1s3\$1objectpath* pode referenciar um único arquivo ou um conjunto de objetos ou pastas que tenham o mesmo prefixo de chaves. Por exemplo, o nome `custdata.txt` é um prefixo de chaves que referencia um número de arquivos físicos: `custdata.txt`,`custdata.txt.1`, `custdata.txt.2`, `custdata.txt.bak` e assim por diante. O prefixo de chaves também pode referenciar um número de pastas. Por exemplo, `'s3://amzn-s3-demo-bucket/custfolder'` se refere às pastas `custfolder`, `custfolder_1`, `custfolder_2` e assim por diante. Se um prefixo de chaves referencia várias pastas, todos os arquivos nas pastas são carregados. Se um prefixo de chaves corresponder a um arquivo, bem como a uma pasta, como `custfolder.log`, COPY também tentará carregar o arquivo. Se um prefixo de chaves puder resultar na tentativa de COPY de carregar arquivos indesejados, use um arquivo manifesto. Para obter mais informações, consulte [copy_from_s3_manifest_file](#copy-manifest-file), a seguir.   
Se o bucket do S3 que mantém os arquivos de dados não residir na mesma região da AWS que o cluster, use o parâmetro [REGION](#copy-region) para especificar a região na qual os dados estão localizados.
Para obter mais informações, consulte [Carregar dados do Amazon S3](t_Loading-data-from-S3.md).

's3://*copy\$1from\$1s3\$1manifest\$1file*'   <a name="copy-manifest-file"></a>
Especifica a chave de objeto do Amazon S3 para um arquivo manifesto que lista os arquivos de dados a serem carregados. O argumento *'s3://*copy\$1from\$1s3\$1manifest\$1file'** deve referenciar explicitamente um único arquivo, por exemplo, `'s3://amzn-s3-demo-bucket/manifest.txt'`. Ele não pode fazer referência a um prefixo de chaves.  
O manifesto é um arquivo de texto em formato JSON que lista o URL de cada arquivo que deve ser carregado do Amazon S3. O URL inclui o nome do bucket e o caminho de objeto completo do arquivo. Os arquivos especificados no manifesto podem estar em buckets diferentes, mas todos os buckets devem estar na mesma região da AWS que o cluster do Amazon Redshift. Se for listado duas vezes, o arquivo será carregado duas vezes. O exemplo a seguir mostra o JSON de um manifesto que carrega três arquivos.   

```
{
  "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}
  ]
}
```
As aspas duplas são obrigatórias e devem ser simples (0x22), e não inclinadas ou "inteligentes". Cada entrada no manifesto também pode incluir um sinalizador `mandatory`. Se `mandatory` estiver definido como `true`, COPY será encerrado se não encontrar o arquivo dessa entrada; do contrário, COPY continuará. O valor padrão para `mandatory` é `false`.   
Ao carregar arquivos de dados em ORC ou em formato Parquet, um campo `meta` é necessário, conforme exibido no seguinte exemplo.  

```
{  
   "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
         }
      }
   ]
}
```
O arquivo manifesto não deverá ser criptografado ou compactado, mesmo se as opções ENCRYPTED, GZIP, LZOP, BZIP2 ou ZSTD forem especificadas. COPY retornará um erro se o arquivo de manifesto especificado não for encontrado ou se ele não estiver formado corretamente.   
Se um arquivo manifesto for usado, o parâmetro MANIFEST deverá ser especificado com o comando COPY. Se o parâmetro MANIFEST não for especificado, COPY vai pressupor que o arquivo especificado com FROM seja um arquivo de dados.   
Para obter mais informações, consulte [Carregar dados do Amazon S3](t_Loading-data-from-S3.md).

*authorization*  
O comando COPY precisa de autorização para acessar dados em outro recurso da AWS, inclusive em Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. É possível conceder essa autorização referenciando um perfil do AWS Identity and Access Management (IAM) anexado ao cluster (controle de acesso baseado em perfil) ou fornecendo as credenciais de acesso de um usuário (controle de acesso baseado em chave). Para mais segurança e a flexibilidade, recomendamos usar o controle de acesso baseado em função do IAM. Para obter mais informações, consulte [Parâmetros de autorização](copy-parameters-authorization.md).

MANIFEST  <a name="copy-manifest"></a>
Especifica que um manifesto é usado para identificar os arquivos de dados a serem carregados do Amazon S3. Se o parâmetro MANIFEST for usado, COPY carregará dados dos arquivos listados no manifesto referenciado por *'s3://copy\$1from\$1s3\$1manifest\$1file'*. Se o arquivo de manifesto não for encontrado ou não estiver formado corretamente, ocorrerá uma falha no COPY. Para obter mais informações, consulte [Uso de um manifesto para especificar arquivos de dados](loading-data-files-using-manifest.md).

ENCRYPTED  <a name="copy-encrypted"></a>
Uma cláusula que especifica que os arquivos de entrada no Amazon S3 são criptografados com criptografia do lado do cliente com chaves gerenciadas pelo cliente. Para obter mais informações, consulte [Carregar arquivos de dados criptografados do Amazon S3](c_loading-encrypted-files.md). Não especifique ENCRYPTED se arquivos de entrada forem criptografados usando-se criptografia no lado do servidor do Amazon S3 (SSE-KMS ou SSE-S3). COPY lê arquivos criptografados no lado do servidor automaticamente.  
Se você especificar o parâmetro ENCRYPTED, também deverá especificar o parâmetro [MASTER_SYMMETRIC_KEY](#copy-master-symmetric-key) ou incluir o valor **master\$1symmetric\$1key** na string [Usar o parâmetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials).  
Se os arquivos criptografados estiverem em formato compactado, adicione o parâmetro GZIP, LZOP, BZIP2 ou ZSTD.  
Arquivos manifesto e JSONPaths não devem ser criptografados, mesmo se a opção ENCRYPTED for especificada.

MASTER\$1SYMMETRIC\$1KEY '*root\$1key*'  <a name="copy-master-symmetric-key"></a>
A chave simétrica raiz que foi usada para criptografar arquivos de dados no Amazon S3. Se MASTER\$1SYMMETRIC\$1KEY for especificado, o parâmetro [ENCRYPTED](#copy-encrypted) também deverá ser especificado. MASTER\$1SYMMETRIC\$1KEY não pode ser usado com o parâmetro CREDENTIALS. Para obter mais informações, consulte [Carregar arquivos de dados criptografados do Amazon S3](c_loading-encrypted-files.md).  
Se os arquivos criptografados estiverem em formato compactado, adicione o parâmetro GZIP, LZOP, BZIP2 ou ZSTD.

REGION [AS] '*aws-region*'  <a name="copy-region"></a>
Especifica a região da AWS onde os dados de origem estão localizados. REGION é necessário para COPY em um bucket do Amazon S3 ou uma tabela do DynamoDB quando o recurso da AWS que contém os dados não está na mesma região que o cluster do Amazon Redshift.   
O valor de *aws\$1region* deve combinar com uma região listada na tabela [regiões e endpoints do Amazon Redshift](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region).  
Se o parâmetro REGION for especificado, todos os recursos, inclusive um arquivo manifesto ou vários buckets do Amazon S3, devem estar localizados na região especificada.   
A transferência de dados entre regiões incorre em cobranças adicionais em relação ao bucket do Amazon S3 ou à tabela do DynamoDB que contém dados. Para ter mais informações sobre preço, consulte as **transferências de dados de saída do Amazon S3 para outra região da AWS** na página [Preços do Amazon S3](https://aws.amazon.com/s3/pricing/) e as **transferências de dados de saída** na página [Preço do Amazon DynamoDB](https://aws.amazon.com/dynamodb/pricing/). 
Por padrão, COPY pressupõe que os dados estejam localizados na mesma região do cluster do Amazon Redshift. 

## Parâmetros opcionais
<a name="copy-parameters-data-source-s3-optional-parms"></a>

Você também pode especificar os seguintes parâmetros com COPY do Amazon S3: 
+ [Opções de mapeamento da coluna](copy-parameters-column-mapping.md)
+ [Parâmetros de formato de dados](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parâmetros da conversão de dados](copy-parameters-data-conversion.md)
+ [Operações de carregamento de dados](copy-parameters-data-load.md)

## Parâmetros incompatíveis
<a name="copy-parameters-data-source-s3-unsupported-parms"></a>

Você não pode usar os seguintes parâmetros com COPY do Amazon S3: 
+ SSH
+ READRATIO

# COPY do Amazon EMR
<a name="copy-parameters-data-source-emr"></a>

Você pode usar o comando COPY para carregar dados em paralelo de um cluster do Amazon EMR configurado para gravar arquivos de texto no Hadoop Distributed File System (HDFS) do cluster na forma de arquivos de largura fixa, delimitados por caractere, CSV, formatados em JSON ou Avro.

**Topics**
+ [Sintaxe](#copy-parameters-data-source-emr-syntax)
+ [Exemplo](#copy-parameters-data-source-emr-example)
+ [Parâmetros](#copy-parameters-data-source-emr-parameters)
+ [Parâmetros compatíveis](#copy-parameters-data-source-emr-optional-parms)
+ [Parâmetros incompatíveis](#copy-parameters-data-source-emr-unsupported-parms)

## Sintaxe
<a name="copy-parameters-data-source-emr-syntax"></a>

```
FROM 'emr://emr_cluster_id/hdfs_filepath'  
authorization
[ optional_parameters ]
```

## Exemplo
<a name="copy-parameters-data-source-emr-example"></a>

O exemplo a seguir carrega dados como um cluster do Amazon EMR. 

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Parâmetros
<a name="copy-parameters-data-source-emr-parameters"></a>

FROM  
A origem dos dados a serem carregados. 

 'emr://*emr\$1cluster\$1id*/*hdfs\$1file\$1path*'  <a name="copy-emr"></a>
O identificador exclusivo do cluster do Amazon EMR e o caminho de arquivo HDFS que referencia os arquivos de dados para o comando COPY. Os nomes de arquivos de dados HDFS não devem conter o asterisco de caracteres curinga (\$1) e o ponto de interrogação (?).   
O cluster do Amazon EMR deve continuar em execução enquanto a operação COPY é concluída. Se alguns dos arquivos de dados HDFS forem alterados ou excluídos antes da operação COPY ser concluída, você poderá ter resultados inesperados, ou a operação COPY poderá falhar. 
Você pode usar os caracteres curinga asterisco (\$1) e ponto de interrogação (?) como parte do argumento *hdfs\$1file\$1path* para especificar o carregamento de vários arquivos. Por exemplo, `'emr://j-SAMPLE2B500FC/myoutput/part*'` identifica os arquivos `part-0000`, `part-0001` e assim por diante. Se não contiver caracteres curinga, o caminho do arquivo será tratado como uma string literal. Se você especificar somente um nome de pasta, COPY tentará carregar todos os arquivos na pasta.   
Se você usar caracteres curinga ou somente o nome da pasta, verifique se nenhum arquivo indesejado será cobrado. Por exemplo, alguns processos podem gravar um arquivo de log na pasta de saída.
Para obter mais informações, consulte [Carregar dados do Amazon EMR](loading-data-from-emr.md).

*authorization*  
O comando COPY precisa de autorização para acessar dados em outro recurso da AWS, inclusive em Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. É possível conceder essa autorização referenciando um perfil do AWS Identity and Access Management (IAM) anexado ao cluster (controle de acesso baseado em perfil) ou fornecendo as credenciais de acesso de um usuário (controle de acesso baseado em chave). Para mais segurança e a flexibilidade, recomendamos usar o controle de acesso baseado em função do IAM. Para obter mais informações, consulte [Parâmetros de autorização](copy-parameters-authorization.md).

## Parâmetros compatíveis
<a name="copy-parameters-data-source-emr-optional-parms"></a>

Você também pode especificar os seguintes parâmetros com COPY do Amazon EMR: 
+ [Opções de mapeamento da coluna](copy-parameters-column-mapping.md)
+ [Parâmetros de formato de dados](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parâmetros da conversão de dados](copy-parameters-data-conversion.md)
+ [Operações de carregamento de dados](copy-parameters-data-load.md)

## Parâmetros incompatíveis
<a name="copy-parameters-data-source-emr-unsupported-parms"></a>

Você não pode usar os seguintes parâmetros com COPY do Amazon EMR: 
+ ENCRYPTED
+ MANIFEST
+ REGION
+ READRATIO
+ SSH

# COPY de host remoto (SSH)
<a name="copy-parameters-data-source-ssh"></a>

Você pode usar o comando COPY para carregar dados em paralelo de um ou mais hosts remotos, como instâncias do Amazon Elastic Compute Cloud (Amazon EC2) ou outros computadores. COPY se conecta aos hosts remotos usando o Secure Shell (SSH) e executa comandos nos hosts remotos para gerar a saída de texto. O host remoto pode ser uma instância do EC2 Linux ou outro computador Unix ou Linux configurado para aceitar conexões SSH. O Amazon Redshift pode conectar-se a vários hosts e abrir várias conexões SSH para cada host. O Amazon Redshift envia um comando exclusivo por meio de cada conexão para gerar saída de texto para a saída padrão do host, que o Amazon Redshift lê enquanto faz com um arquivo de texto.

Use a cláusula FROM para especificar a chave do objeto do Amazon S3 para o arquivo manifesto que fornece as informações que o COPY usa para abrir conexões SSH e executar os comandos remotos. 

**Topics**
+ [Sintaxe](#copy-parameters-data-source-ssh-syntax)
+ [Exemplos](#copy-parameters-data-source-ssh-examples)
+ [Parâmetros](#copy-parameters-data-source-ssh-parameters)
+ [Parâmetros opcionais](#copy-parameters-data-source-ssh-optional-parms)
+ [Parâmetros incompatíveis](#copy-parameters-data-source-ssh-unsupported-parms)

**Importante**  
 Se o bucket do S3 que mantém o arquivo manifesto não residir na mesma região da AWS que o cluster, use o parâmetro REGION para especificar a região na qual o bucket está localizado. 

## Sintaxe
<a name="copy-parameters-data-source-ssh-syntax"></a>

```
FROM 's3://'ssh_manifest_file' }
authorization
SSH
| optional-parameters
```

## Exemplos
<a name="copy-parameters-data-source-ssh-examples"></a>

O exemplo a seguir usa um arquivo manifesto para carregar dados de um host remoto usando o SSH. 

```
copy sales
from 's3://amzn-s3-demo-bucket/ssh_manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
ssh;
```

## Parâmetros
<a name="copy-parameters-data-source-ssh-parameters"></a>

FROM  
A origem dos dados a serem carregados. 

's3://*copy\$1from\$1ssh\$1manifest\$1file*'  <a name="copy-ssh-manifest"></a>
O comando COPY pode conectar-se a vários hosts usando SSH e criar várias conexões SSH para cada host. O COPY executa um comando em cada conexão do host e carrega a saída dos comandos para a tabela em paralelo. O argumento *s3://copy\$1from\$1ssh\$1manifest\$1file* especifica a chave do objeto do Amazon S3 para o arquivo manifesto que fornece as informações que o COPY usa para abrir conexões SSH e executar os comandos remotos.  
O argumento *s3://copy\$1from\$1ssh\$1manifest\$1file* deve referenciar explicitamente um único arquivo; ele não pode ser um prefixo das chaves. Por exemplo:  

```
's3://amzn-s3-demo-bucket/ssh_manifest.txt'
```
O arquivo manifesto é um arquivo de texto no formato JSON que o Amazon Redshift usa para se conectar ao host. O arquivo manifesto especifica os endpoints do host SSH e os comandos que serão executados no host para retornar dados ao Amazon Redshift. Você também pode incluir a chave pública do host, o nome de usuário de login e um sinalizador obrigatório para cada entrada. O exemplo a seguir mostra um arquivo manifesto que cria duas conexões 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>"} 
     ] 
}
```
O arquivo manifesto contém um construto `"entries"` para cada conexão SSH. Você pode ter várias conexões para um único host ou várias conexões para vários hosts. As aspas duplas são necessárias, conforme mostrado, para os nomes de campo e valores. As aspas devem ser simples (0x22), e não inclinadas ou “inteligentes”. O único valor que não precisa de aspas duplas é o valor booliano `true` ou `false` para o campo `"mandatory"`.   
A lista a seguir descreve os campos no arquivo manifesto.     
endpoint  <a name="copy-ssh-manifest-endpoint"></a>
O endereço de URL ou o endereço IP do host. Por exemplo, `"ec2-111-222-333.compute-1.amazonaws.com"`, ou `"198.51.100.0"`.   
command  <a name="copy-ssh-manifest-command"></a>
O comando a ser executado pelo host para gerar a saída de texto ou a saída binária em formato gzip, lzop, bzip2 ou zstd. O comando pode ser qualquer um que o usuário *"host\$1user\$1name"* tenha permissão para executar. O comando pode ser tão simples quanto imprimir um arquivo, ou pode consultar um banco de dados ou iniciar um script. A saída (arquivo de texto, arquivo binário gzip, arquivo binário lzop ou arquivo binário bzip2) deve estar em uma forma que o comando COPY do Amazon Redshift possa ingerir. Para obter mais informações, consulte [Preparação de dados de entrada](t_preparing-input-data.md).  
publickey  <a name="copy-ssh-manifest-publickey"></a>
(Opcional) A chave pública do host. Se fornecida, o Amazon Redshift usará a chave pública para identificar o host. Se a chave pública não for fornecida, o Amazon Redshift não tentará a identificação do host. Por exemplo, se a chave pública do host remoto for `ssh-rsa AbcCbaxxx…Example root@amazon.com`, digite o seguinte texto no campo de chave pública: `"AbcCbaxxx…Example"`  
mandatory  <a name="copy-ssh-manifest-mandatory"></a>
(Opcional) Uma cláusula que indica se o comando COPY deverá falhar se a tentativa de conexão falhar. O padrão é `false`. Se o Amazon Redshift não estabelecer pelo menos uma conexão, o comando COPY falhará.  
username  <a name="copy-ssh-manifest-username"></a>
(Opcional) O nome de usuário que será usado para fazer logon no sistema do host e executar o comando remoto. O nome de login do usuário deve ser o mesmo do login que foi usado para adicionar a chave pública do cluster do Amazon Redshift ao arquivo de chaves autorizadas do host. O nome de usuário padrão é `redshift`.
Para obter mais informações sobre como criar um arquivo manifesto, consulte [Processo de carregamento de dados](loading-data-from-remote-hosts.md#load-from-host-process).  
Para executar COPY de um host remoto, o parâmetro SSH deve estar especificado com o comando COPY. Se o parâmetro SSH não for especificado, COPY vai pressupor que o arquivo especificado com FROM seja um arquivo de dados e ocorrerá uma falha.   
Se você usar a compactação automática, o comando COPY realizará duas operações de leitura de dados, o que significa que executará o comando remoto duas vezes. A primeira operação de leitura deve fornecer um exemplo de dados para análise da compactação, e a segunda efetivamente carrega os dados. Se executar o comando remoto duas vezes puder causar um problema, você deverá desabilitar a compactação automática. Para desabilitar a compactação automática, execute o comando COPY com o parâmetro COMPUPDATE definido como OFF. Para obter mais informações, consulte [Carregamento de tabelas com compactação automática](c_Loading_tables_auto_compress.md).  
Para obter procedimentos detalhados sobre como usar COPY em SSH, consulte [Carregamento de dados de hosts remotos](loading-data-from-remote-hosts.md).

*authorization*  
O comando COPY precisa de autorização para acessar dados em outro recurso da AWS, inclusive em Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. É possível conceder essa autorização referenciando um perfil do AWS Identity and Access Management (IAM) anexado ao cluster (controle de acesso baseado em perfil) ou fornecendo as credenciais de acesso de um usuário (controle de acesso baseado em chave). Para mais segurança e a flexibilidade, recomendamos usar o controle de acesso baseado em função do IAM. Para obter mais informações, consulte [Parâmetros de autorização](copy-parameters-authorization.md).

SSH  <a name="copy-ssh"></a>
Uma cláusula que especifica que os dados devem ser carregados de um host remoto usando o protocolo SSH. Se especificar SSH, você também deverá fornecer um arquivo manifesto usando o argumento [s3://copy_from_ssh_manifest_file](#copy-ssh-manifest).   
Se você estiver usando o SSH para copiar de um host usando um endereço IP privado em uma VPC remota, a VPC deverá ter o roteamento VPC aprimorado habilitado. Para obter mais informações sobre o Enhanced VPC Routing, consulte [Enhanced VPC Routing do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html).

## Parâmetros opcionais
<a name="copy-parameters-data-source-ssh-optional-parms"></a>

Você também pode especificar os seguintes parâmetros com COPY do SSH: 
+ [Opções de mapeamento da coluna](copy-parameters-column-mapping.md)
+ [Parâmetros de formato de dados](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parâmetros da conversão de dados](copy-parameters-data-conversion.md)
+ [Operações de carregamento de dados](copy-parameters-data-load.md)

## Parâmetros incompatíveis
<a name="copy-parameters-data-source-ssh-unsupported-parms"></a>

Você não pode usar os seguintes parâmetros com COPY do SSH: 
+ ENCRYPTED
+ MANIFEST
+ READRATIO

# COPY do Amazon DynamoDB
<a name="copy-parameters-data-source-dynamodb"></a>

Para carregar dados de uma tabela do DynamoDB existente, use a cláusula FROM para especificar o nome da tabela do DynamoDB.

**Topics**
+ [Sintaxe](#copy-parameters-data-source-dynamodb-syntax)
+ [Exemplos](#copy-parameters-data-source-dynamodb-examples)
+ [Parâmetros opcionais](#copy-parameters-data-source-dynamodb-optional-parms)
+ [Parâmetros incompatíveis](#copy-parameters-data-source-dynamodb-unsupported-parms)

**Importante**  
Se a tabela do DynamoDB não residir na mesma região que o cluster do Amazon Redshift, use o parâmetro REGION para especificar a região na qual os dados estão localizados. 

## Sintaxe
<a name="copy-parameters-data-source-dynamodb-syntax"></a>

```
FROM 'dynamodb://table-name' 
authorization
READRATIO ratio
| REGION [AS] 'aws_region'  
| optional-parameters
```

## Exemplos
<a name="copy-parameters-data-source-dynamodb-examples"></a>

O exemplo a seguir carrega dados de uma tabela do DynamoDB. 

```
copy favoritemovies from 'dynamodb://ProductCatalog'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
readratio 50;
```

### Parâmetros
<a name="copy-parameters-data-source-dynamodb-parameters"></a>

FROM  
A origem dos dados a serem carregados. 

'dynamodb://*table-name*'  <a name="copy-dynamodb"></a>
O nome da tabela do DynamoDB que contém os dados; por exemplo, `'dynamodb://ProductCatalog'`. Para obter detalhes sobre como os atributos do DynamoDB são mapeados para colunas do Amazon Redshift, consulte [Carregar dados de uma tabela do Amazon DynamoDB](t_Loading-data-from-dynamodb.md).  
O nome de uma tabela do DynamoDB é exclusivo de uma conta da AWS, identificada por credenciais de acesso da AWS.

*authorization*  
O comando COPY precisa de autorização para acessar dados em outro recurso da AWS, inclusive em Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. É possível conceder essa autorização referenciando um perfil do AWS Identity and Access Management (IAM) anexado ao cluster (controle de acesso baseado em perfil) ou fornecendo as credenciais de acesso de um usuário (controle de acesso baseado em chave). Para mais segurança e a flexibilidade, recomendamos usar o controle de acesso baseado em função do IAM. Para obter mais informações, consulte [Parâmetros de autorização](copy-parameters-authorization.md).

READRATIO [AS] *ratio*  <a name="copy-readratio"></a>
A porcentagem do throughput provisionado da tabela do DynamoDB a ser usada no carregamento de dados. READRATIO é obrigatório para COPY do DynamoDB. Ele não pode ser usado com COPY do Amazon S3. É altamente recomendável definir a proporção como um valor menor que o throughput provisionado não usado médio. Os valores válidos são números inteiros de 1 a 200.  
A definição de READRATIO como 100 ou mais permite que o Amazon Redshift consuma todo o throughput provisionado da tabela do DynamoDB, o que afeta gravemente a performance de operações de leitura simultâneas na mesma tabela durante a sessão de COPY. O tráfego de gravação não é afetado. Os valores maiores que 100 têm permissão para solucionar problemas em cenários raros quando o Amazon Redshift deixar de atender ao throughput provisionado da tabela. Se você carregar dados do DynamoDB no Amazon Redshift continuamente, considere organizar as tabelas do DynamoDB como uma série temporal para separar o tráfego ao vivo da operação COPY.

## Parâmetros opcionais
<a name="copy-parameters-data-source-dynamodb-optional-parms"></a>

Você também pode especificar os seguintes parâmetros com COPY do Amazon DynamoDB: 
+ [Opções de mapeamento da coluna](copy-parameters-column-mapping.md)
+ Os seguintes parâmetros de conversão de dados são compatíveis:
  + [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) 
+ [Operações de carregamento de dados](copy-parameters-data-load.md)

## Parâmetros incompatíveis
<a name="copy-parameters-data-source-dynamodb-unsupported-parms"></a>

Você não pode usar os seguintes parâmetros com COPY do DynamoDB: 
+ Todos os parâmetros de formato de dados
+ ESCAPE
+ FILLRECORD
+ IGNOREBLANKLINES
+ IGNOREHEADER
+ NULL
+ REMOVEQUOTES
+ ACCEPTINVCHARS
+ MANIFEST
+ ENCRYPTED

# Parâmetros de autorização
<a name="copy-parameters-authorization"></a>

O comando COPY precisa de autorização para acessar dados em outro recurso da AWS, inclusive em Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. É possível fornecer essa autorização por meio de referência à [função do AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) que é associada ao cluster (*controle de acesso com base da função*). Você pode criptografar seus dados de carregamento no Amazon S3. 

Os seguintes tópicos dão mais detalhes e exemplos de opções de autenticação:
+ [Permissões do IAM para COPY, UNLOAD e CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)
+ [Controle de acesso com base em função](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)
+ [Controle de acesso com base em chave](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based)

Use um dos seguintes para dar autorização para o comando COPY: 
+ Parâmetro [Usar o parâmetro IAM\$1ROLE](#copy-iam-role)
+ [Usar os parâmetros ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY](#copy-access-key-id)Parâmetros do 
+ [Usar o parâmetro CREDENTIALS](#copy-credentials)Cláusula 

## Usar o parâmetro IAM\$1ROLE
<a name="copy-iam-role"></a>

### IAM\$1ROLE
<a name="copy-iam-role-iam"></a>

Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando COPY for executado. 

Use o nome do recurso da Amazon (ARN) de uma função do IAM que seu cluster usa para autenticação e autorização. Se especificar IAM\$1ROLE, você não poderá usar ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN ou CREDENTIALS.

A seguir, a sintaxe do parâmetro IAM\$1ROLE. 

```
IAM_ROLE { default | 'arn:aws:iam::<Conta da AWS-id>:role/<role-name>' }
```

Para obter mais informações, consulte [Controle de acesso com base em função](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

## Usar os parâmetros ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id"></a>

### ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id-access"></a>

Esse método de autorização não é recomendado. 

**nota**  
Em vez de fornecer credenciais de acesso como texto sem formatação, é altamente recomendável usar a autenticação baseada em função especificando-se o parâmetro IAM\$1ROLE. Para obter mais informações, consulte [Controle de acesso com base em função](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

### SESSION\$1TOKEN
<a name="copy-token"></a>

O token de sessão a ser usado com credenciais de acesso temporárias. Quando SESSION\$1TOKEN for especificado, você também deverá usar ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY para fornecer credenciais de chave de acesso temporárias. Se especificar SESSION\$1TOKEN, você não poderá usar IAM\$1ROLE ou CREDENTIALS. Para obter mais informações, consulte [Credenciais de segurança temporárias](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials) no Guia do usuário do IAM.

**nota**  
Em vez de criar credenciais de segurança temporárias, é altamente recomendável usar a autenticação baseada na função. Quando você autoriza o uso de uma função do IAM, o Amazon Redshift cria automaticamente credenciais de usuário temporárias para cada sessão. Para obter mais informações, consulte [Controle de acesso com base em função](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

A seguir, a sintaxe do parâmetro SESSION\$1TOKEN com os parâmetros ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY. 

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

Se especificar SESSION\$1TOKEN, você não poderá usar CREDENTIALS ou IAM\$1ROLE. 

## Usar o parâmetro CREDENTIALS
<a name="copy-credentials"></a>

### CREDENTIALS
<a name="copy-credentials-cred"></a>

Uma cláusula que indica o método que o cluster usará quando acessar outros recursos da AWS que contêm arquivos de dados ou arquivos manifesto. Você não pode usar o parâmetro CREDENTIALS com IAM\$1ROLE or ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY.

A seguir é mostrada a sintaxe referente ao parâmetro CREDENTIALS.

```
[WITH] CREDENTIALS [AS] 'credentials-args'
```

**nota**  
Para aumentar a flexibilidade, recomendamos o uso do parâmetro [IAM\$1ROLE](#copy-iam-role-iam), em vez do parâmetro CREDENTIALS.

Como opção, se o parâmetro [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) for usado, a string *credentials-args* também fornecerá a chave de criptografia.

A string *credentials-args* diferencia maiúsculas de minúsculas e não deve conter espaços.

As palavras-chave WITH e AS são opcionais e são ignoradas.

É possível especificar [role-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based.phrase) ou [key-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based.phrase). Em ambos os casos, o usuário ou perfil do IAM deve ter as permissões obrigatórias para acessar os recursos da AWS especificados. Para obter mais informações, consulte [Permissões do IAM para COPY, UNLOAD e CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions). 

**nota**  
Para resguardar as credenciais da AWS e proteger os dados sigilosos, é altamente recomendável usar o controle de acesso baseado na função. 

Para especificar o controle de acesso baseado na função, forneça a string *credentials-args* no formato a seguir.

```
'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
```

Para usar credenciais de token temporário, você deve fornecer o ID da chave de acesso temporária, a chave de acesso secreta temporária e o token temporário. A string *credentials-args* está no formato a seguir. 

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>'
```

Um comando COPY usando controle de acesso por perfil com credenciais temporárias seria semelhante ao seguinte exemplo de instrução: 

```
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 obter mais informações, consulte [Credenciais de segurança temporárias](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials).

Se o parâmetro [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) for usado, a cadeia de caracteres *credentials-args* estará no formato a seguir, em que *<root-key>* é o valor da chave raiz que foi usada para criptografar os arquivos.

```
CREDENTIALS
'<credentials-args>;master_symmetric_key=<root-key>'
```

Um comando COPY usando controle de acesso por perfil com uma chave de criptografia seria semelhante ao seguinte exemplo de instrução:

```
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>'
```

# Opções de mapeamento da coluna
<a name="copy-parameters-column-mapping"></a>

Por padrão, COPY insere valores nas colunas da tabela de destino na mesma ordem dos campos ocorridos nos arquivos de dados. Se a ordem de coluna padrão não funcionar, você poderá especificar uma lista de colunas ou usar expressões JSONPath para mapear campos de dados de origem para as colunas de destino. 
+ [Column List](#copy-column-list)
+ [JSONPaths File](#copy-column-mapping-jsonpaths)

## Lista de colunas
<a name="copy-column-list"></a>

Você pode especificar uma lista separada por vírgulas de nomes de coluna para carregar campos de dados de origem em colunas de destino específicas. As colunas podem estar em qualquer ordem na instrução COPY, mas durante o carregamento de arquivos simples, como em um bucket do Amazon S3, a ordem deve corresponder à ordem dos dados de origem. 

Durante o carregamento de uma tabela do Amazon DynamoDB, a ordem não importa. O comando COPY compara nomes de atributo nos itens recuperados da tabela do DynamoDB com nomes de coluna na tabela do Amazon Redshift. Para obter mais informações, consulte . [Carregar dados de uma tabela do Amazon DynamoDB](t_Loading-data-from-dynamodb.md)

 A seguir, o formato para uma lista de colunas.

```
COPY tablename (column1 [,column2, ...]) 
```

Se uma coluna na tabela de destino for omitida da lista de colunas, COPY carregará a expressão [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) da coluna.

Se a coluna de destino não tiver um padrão, COPY tentará carregar NULL.

Se COPY tentar atribuir NULL a uma coluna definida como NOT NULL, o comando COPY falhará. 

Se uma coluna [IDENTITY](r_CREATE_TABLE_NEW.md#identity-clause) estiver incluída na lista de colunas, [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids) também deverá ser especificado; se uma coluna IDENTITY for omitida, EXPLICIT\$1IDS não poderá ser especificado. Se nenhuma lista de colunas for especificada, o comando se comportará como se uma lista de colunas completa, na ordem, tivesse sido especificada, com colunas IDENTITY omitidas se EXPLICIT\$1IDS também não tiver sido especificado.

Se uma coluna estiver definida com GENERATED BY DEFAULT AS IDENTITY, será possível copiá-la. Os valores são gerados ou atualizados com os valores fornecidos. A opção EXPLICIT\$1IDS não é necessária. COPY não atualiza a marca d'água alta de identidade. Para obter mais informações, consulte [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

## Arquivo JSONPaths
<a name="copy-column-mapping-jsonpaths"></a>

Ao carregar de arquivos de dados em formato JSON ou Avro, COPY mapeará automaticamente os elemento de dados nos dados JSON ou Avro para as colunas na tabela de destino. Ele faz isso comparando nomes de campo no esquema do Avro com nomes de coluna na tabela de destino ou na lista de colunas.

Em alguns casos, os nomes de coluna e os nomes de campo não correspondem, ou você precisa mapear para níveis mais profundos na hierarquia de dados. Para mapear explicitamente elemento de dados JSON ou Avro para colunas, você pode usar um arquivo JSONPaths. 

Para obter mais informações, consulte [Arquivo JSONPaths](copy-parameters-data-format.md#copy-json-jsonpaths). 

# Parâmetros de formato de dados
<a name="copy-parameters-data-format"></a>

Por padrão, o comando COPY espera que os dados de origem sejam texto UTF-8 delimitados por caractere. O delimitador padrão é um caractere de barra ( \$1 ). Se os dados de origem estiverem em outro formato, use os parâmetros a seguir para especificar o formato de dados: 
+ [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) 

Além dos formatos de dados padrão, COPY é compatível com os seguintes formatos de dados colunares para COPY do Amazon S3: 
+ [ORC](#copy-orc) 
+ [PARQUET](#copy-parquet) 

COPY de formato colunar é compatível com determinada restrição. Para obter mais informações, consulte [COPY de formatos de dados colunar](copy-usage_notes-copy-from-columnar.md). <a name="copy-data-format-parameters"></a>Parâmetros de formato de dados

FORMAT [AS]  <a name="copy-format"></a>
(Opcional) Identifica palavras-chave do formato de dados. Os argumentos FORMAT estão descritos a seguir.

CSV [ QUOTE [AS] *'quote\$1character'* ]  <a name="copy-csv"></a>
Permite o uso do formato CSV nos dados de entrada. Para delimitadores de escape automático, caracteres em nova linha e retornos de carro, deixe o campo no caractere especificado no parâmetro QUOTE. As aspas padrão são aspas duplas ("). Quando as aspas são usadas dentro de um campo, faça o escape do caractere com aspas adicionais. Por exemplo, se as aspas forem duplas, para inserir a string `A "quoted" word` o arquivo de entrada deve incluir a string `"A ""quoted"" word"`. Quando o parâmetro CSV for usado, o delimitador padrão será uma vírgula ( , ). Você pode especificar um delimitador diferente usando o parâmetro DELIMITER.   
Quando um campo está entre aspas, o espaço em branco entre os delimitadores e as aspas é ignorado. Se o delimitador for um caractere de espaço em branco, como uma tabulação, o delimitador não será tratado como um espaço em branco.  
CSV não pode ser usado com FIXEDWIDTH, REMOVEQUOTES ou ESCAPE.     
QUOTE [AS] *'quote\$1character'*  <a name="copy-csv-quote"></a>
Opcional. Especifica o caractere a ser usado como as aspas durante o uso do parâmetro CSV. O padrão são aspas duplas ( " ). Se usar o parâmetro QUOTE para definir aspas diferentes das aspas duplas, você não precisará escapar aspas duplas dentro do campo. O parâmetro QUOTE só pode ser usado com o parâmetro CSV. A palavra-chave AS é opcional.

DELIMITER [AS] ['*delimiter\$1char*']   <a name="copy-delimiter"></a>
Especifica os caracteres que são usados para separar campos no arquivo de entrada, como barra (`|`), vírgula (`,`) ou tabulação (`\t`), ou vários caracteres, como `|~|`. Caracteres não imprimíveis são aceitos. Os caracteres também podem ser representados em octal como suas unidades de código UTF-8. Para octal, use o formato “\$1ddd”, em que “d” é um dígito octal (0 a 7). O delimitador padrão é um caractere de barra (`|`), a menos que o parâmetro CSV seja usado, caso em que o delimitador padrão é uma vírgula (`,`). A palavra-chave AS é opcional. DELIMITER não pode ser usado com FIXEDWIDTH.

FIXEDWIDTH '*fixedwidth\$1spec*'   <a name="copy-fixedwidth"></a>
Carrega os dados de um arquivo em que a largura de cada coluna tem um tamanho fixo, em vez de colunas separadas por um delimitador. A *fixedwidth\$1spec* é uma string que especifica um rótulo de coluna definido pelo usuário e uma largura de coluna. O rótulo da coluna pode ser uma string de texto ou um inteiro, dependendo do que o usuário escolher. O rótulo da coluna não tem relação com o nome da coluna. A ordem dos pares de rótulo/largura deve corresponder exatamente à ordem das colunas da tabela. FIXEDWIDTH não pode ser usado com CSV ou DELIMITER. No Amazon Redshift, como o tamanho das colunas CHAR e VARCHAR é expressado em bytes, verifique se a largura de coluna especificada por você acomoda o tamanho binário de caracteres multibyte ao preparar o arquivo a ser carregado. Para obter mais informações, consulte [Tipos de caracteres](r_Character_types.md).   
O formato de *fixedwidth\$1spec* é mostrado a seguir:   

```
'colLabel1:colWidth1,colLabel:colWidth2, ...'
```

SHAPEFILE [ SIMPLIFY [AUTO] [*'tolerance'*] ]  <a name="copy-shapefile"></a>
Permite o uso do formato SHAPEFILE nos dados de entrada. Por padrão, a primeira coluna do shapefile é uma coluna `GEOMETRY` ou `IDENTITY`. Todas as colunas subsequentes seguem a ordem especificada no shapefile.  
É possível usar SHAPEFILE com FIXEDWIDTH, REMOVEQUOTES ou ESCAPE.   
Para usar objetos `GEOGRAPHY` com `COPY FROM SHAPEFILE`, primeiro ingira em um coluna `GEOMETRY` e transmita os objetos para objetos `GEOGRAPHY`. .    
SIMPLIFY [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(Opcional) Simplifica todas as geometrias durante o processo de ingestão usando o algoritmo Ramer-Douglas-Peucker e a tolerância dada.   
SIMPLIFY AUTO [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(Opcional) Simplifica apenas geometrias maiores que o tamanho máximo da geometria. Essa simplificação usa o algoritmo Ramer-Douglas-Peucker e a tolerância calculada automaticamente se isso não exceder a tolerância especificada. Este algoritmo calcula o tamanho para armazenar objetos dentro da tolerância especificada. O valor *tolerance* é opcional.
Para obter exemplos de carregamento de shapefiles, consulte [Carregar um shapefile no Amazon Redshift](r_COPY_command_examples.md#copy-example-spatial-copy-shapefile).

AVRO [AS] '*avro\$1option*'  <a name="copy-avro"></a>
Especifica se os dados de origem estão em formato Avro.   
O formato Avro é compatível com COPY nestes serviços e protocolos:  
+ Amazon S3 
+ Amazon EMR 
+ Hosts remotos (SSH) 
Avro não é compatível com COPY no DynamoDB.   
Avro é um protocolo de serialização de dados. Um arquivo de origem do Avro inclui um esquema que define a estrutura dos dados. O tipo de esquema do Avro deve ser `record`. COPY aceita a criação de arquivos do Avro usando o codec não compactado padrão, bem como os codecs de compactação `deflate` e `snappy`. Para obter mais informações sobre o Avro, vá até [Apache Avro](https://avro.apache.org/).   
Os valores válidos para *avro\$1option* são os seguintes:  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
O padrão é `'auto'`.  
COPY mapeará automaticamente os elemento de dados nos dados JSON ou Avro para as colunas na tabela de destino. Ele faz isso comparando nomes de campo no esquema do Avro com nomes de coluna na tabela de destino. A correspondência diferencia maiúsculas de minúsculas para `'auto'` e não diferencia maiúsculas de minúsculas para `'auto ignorecase'`.   
Como os nomes de coluna em tabelas do Amazon Redshift estão sempre em minúsculas, quando você usa a opção `'auto'`, os nomes de campo do JSON correspondentes também devem estar em minúsculas. Se os nomes dos campos não estiverem todos em minúsculas, você poderá usar a opção `'auto ignorecase'`. Com o arguento padrão `'auto'`, COPY reconhece apenas o primeiro nível de campos, ou *campos externos*, na estrutura.   
Para mapear explicitamente nomes de coluna para nomes de campo do Avro, você pode usar um [Arquivo JSONPaths](#copy-json-jsonpaths).   
Por padrão, COPY tenta comparar todas as colunas na tabela de destino com os nomes de campo do Avro. Para carregar um subconjunto das colunas, você também pode especificar uma lista de colunas. Se uma coluna na tabela de destino for omitida da lista de colunas, COPY carregará a expressão [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) da coluna. Se a coluna de destino não tiver um padrão, COPY tentará carregar NULL. Se uma coluna estiver incluída na lista de colunas e COPY não encontrar um campo correspondente nos dados do Avro, COPY tentará carregar NULL na coluna.   
Se COPY tentar atribuir NULL a uma coluna definida como NOT NULL, o comando COPY falhará.   
<a name="copy-avro-schema"></a>**Esquema do Avro**  
Um arquivo de dados de origem do Avro inclui um esquema que define a estrutura dos dados. COPY lê o esquema que faz parte do arquivo de dados de origem do Avro a fim de mapear elementos de dados para colunas da tabela de destino. O exemplo a seguir mostra um esquema do Avro.   

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"}]
}
```
O esquema do Avro é definido usando-se o formato JSON. O objeto JSON de nível mais alto contém três pares de nome/valor com os nomes, ou *chaves*, `"name"`, `"type"` e `"fields"`.   
Os pares de chaves `"fields"` com uma matriz de objetos que definem o nome e o tipo de dados de cada campo na estrutura de dados. Por padrão, COPY compara automaticamente os nomes de campo com os nomes de coluna. Como nomes de coluna estão sempre em minúsculas, nomes de campo também devem estar em minúsculas, a não ser a opção `‘auto ignorecase’` seja especificada. Todos os nomes de campo que não corresponderem a um nome de coluna serão ignorados. A ordem das colunas não importa. No exemplo anterior, COPY é mapeado para os nomes de coluna `id`, `guid`, `name` e `address`.   
Com o argumento `'auto'` padrão, COPY compara apenas os objetos no primeiro nível com as colunas. A fim de mapear para níveis mais profundos no esquema, ou se nomes de campo e de coluna não corresponderem, use um arquivo JSONPaths para definir o mapeamento. Para obter mais informações, consulte [Arquivo JSONPaths](#copy-json-jsonpaths).   
Se o valor associado a uma chave for um tipo de dados do Avro complexo como byte, matriz, registro, mapa ou link, COPY carregará o valor como uma string, em que a string é a representação JSON dos dados. Aqui, a string é a representação JSON dos dados. COPY carrega tipos de dados enum do Avro como strings, em que o conteúdo é o nome do tipo. Para ver um exemplo, consulte [COPY no formato JSON](copy-usage_notes-copy-from-json.md).  
O tamanho máximo do cabeçalho de arquivo do Avro, o que inclui o esquema e os metadados do arquivo, é 1 MB.     
O tamanho máximo de um único bloco de dados do Avro é 4 MB. Isso é diferente do tamanho máximo da linha. Se o tamanho máximo de um único bloco de dados do Avro for excedido, mesmo se o tamanho de linha resultante for menor que o limite do tamanho de linha de 4 MB, o comando COPY falhará.   
Ao calcular o tamanho da linha, o Amazon Redshift contabiliza internamente os caracteres de barra vertical (\$1) duas vezes. Se os dados de entrada contiverem um número muito grande de caracteres de barra, será possível para o tamanho da linha exceder 4 MB, mesmo se o bloco de dados for menor que 4 MB.

JSON [AS] '*json\$1option*'  <a name="copy-json"></a>
Os dados de origem estão em formato JSON.   
O formato JSON é compatível com COPY nestes serviços e protocolos:  
+ Amazon S3
+ COPY do Amazon EMR
+ COPY de SSH
JSON não é compatível com COPY no DynamoDB.   
Os valores válidos para *json\$1option* são os seguintes:  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
+ `'noshred'` 
O padrão é `'auto'`. O Amazon Redshift não fragmenta os atributos de estruturas JSON em várias colunas ao carregar um documento JSON.  
Por padrão, COPY tenta comparar todas as colunas na tabela de destino com as chaves de nome de campo do JSON. Para carregar um subconjunto das colunas, você também pode especificar uma lista de colunas. Se as chaves de nome de campo JSON não estiverem todas em minúsculas, você poderá usar a opção `'auto ignorecase'` ou um [Arquivo JSONPaths](#copy-json-jsonpaths) a fim de mapear explicitamente nomes de coluna para chaves de nome de campo JSON.  
Se uma coluna na tabela de destino for omitida da lista de colunas, COPY carregará a expressão [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) da coluna. Se a coluna de destino não tiver um padrão, COPY tentará carregar NULL. Se uma coluna estiver incluída na lista de colunas e COPY não encontrar um campo correspondente nos dados JSON, COPY tentará carregar NULL na coluna.   
Se COPY tentar atribuir NULL a uma coluna definida como NOT NULL, o comando COPY falhará.   
COPY mapeará automaticamente os elemento de dados nos dados JSON ou Avro para as colunas na tabela de destino. Ele faz isso combinando *chaves de objeto*, ou nomes, nos pares de nome-valor de origem com os nomes de colunas na tabela de destino.   
Consulte os seguintes detalhes sobre cada valor de *json\$1option*:    
'auto'  <a name="copy-json-auto"></a>
Com essa opção, a correspondência diferencia maiúsculas de minúsculas. Como os nomes de coluna em tabelas do Amazon Redshift estão sempre em minúsculas, quando você usa a opção `'auto'`, os nomes de campo do JSON correspondentes também devem estar em minúsculas.  
'auto ignorecase'  <a name="copy-json-auto-ignorecase"></a>
Com essa opção, a correspondência não diferencia maiúsculas de minúsculas. Como os nomes de coluna nas tabelas do Amazon Redshift estão sempre em minúsculas, quando você usa a opção `'auto ignorecase'`, os nomes de campo JSON correspondentes podem ser minúsculas, maiúsculas ou mistas.   
's3://*jsonpaths\$1file*'  <a name="copy-json-pathfile"></a>
COPY usa o arquivo chamado JSONPaths a fim de mapear os elementos de dados nos dados de origem do JSON para as colunas na tabela de destino. O *`s3://jsonpaths_file`* deve ser uma chave de objeto do Amazon S3 que referencia explicitamente um único arquivo. Um exemplo é `'s3://amzn-s3-demo-bucket/jsonpaths.txt`'. O argumento não pode ser um prefixo das chaves. Para obter mais informações sobre como usar um arquivo JSONPaths, consulte [Arquivo JSONPaths](#copy-json-jsonpaths).  
Em alguns casos, o arquivo especificado pelo `jsonpaths_file` tem o mesmo prefixo que o caminho especificado por `copy_from_s3_objectpath` para os arquivos de dados. Em caso afirmativo, COPY lê o arquivo JSONPaths como um arquivo de dados e retorna erros. Por exemplo, digamos que seus arquivos de dados usem o caminho do objeto `s3://amzn-s3-demo-bucket/my_data.json` e seu arquivo JSONPaths é `s3://amzn-s3-demo-bucket/my_data.jsonpaths`. Nesse caso, COPY tenta carregar `my_data.jsonpaths` como um arquivo de dados.  
‘noshred'  <a name="copy-json-noshred"></a>
Com esta opção, o Amazon Redshift não fragmenta os atributos de estruturas JSON em várias colunas ao carregar um documento JSON.

## Arquivo de dados JSON
<a name="copy-json-data-file"></a>

O arquivo de dados JSON contém um conjunto de objetos ou matrizes. COPY carrega cada objeto ou matriz JSON em uma linha na tabela de destino. Cada objeto ou matriz correspondente a uma linha deve ser uma estrutura no nível raiz, autônoma; ou seja, não deve ser um membro de outra estrutura JSON.

Um *objeto* JSON começa e termina com chaves (\$1 \$1) e contém uma coleção de pares de nome-valor desordenada. Cada nome e valor em par são separados por um dois-pontos, e os pares são separados por vírgulas. Por padrão, a *chave de objeto*, ou o nome, nos pares de nome-valor deve corresponder ao nome da coluna correspondente na tabela. Os nomes de coluna nas tabelas do Amazon Redshift estão sempre em minúsculas, as chaves de nome de campo correspondentes do JSON também deverão estar em minúsculas. Se os nomes de coluna e as chaves do JSON não forem correspondentes, use [Arquivo JSONPaths](#copy-json-jsonpaths) a fim de mapear explicitamente as colunas para as chaves. 

A ordem em um objeto JSON não importa. Todos os nomes que não corresponderem a um nome de coluna serão ignorados. A seguir, a estrutura de um objeto JSON simples.

```
{
  "column1": "value1",
  "column2": value2,
  "notacolumn" : "ignore this value"
}
```

Uma *matriz* JSON começa e termina com colchetes ( [ ] ), e contém uma coleção ordenada de valores separados por vírgulas. Se os arquivos de dados usarem matrizes, você deverá especificar um arquivo JSONPaths para corresponder os valores às colunas. A seguir, a estrutura de uma matriz JSON simples. 

```
["value1", value2]
```

O JSON bastante deve ser bem formado. Por exemplo, os objetos ou as matrizes não podem ser separados por vírgulas ou por quaisquer outros caracteres, exceto o espaço em branco. As strings devem estar entre aspas duplas. As aspas devem ser simples (0x22), e não inclinadas ou "inteligentes".

O tamanho máximo de um objeto ou matriz JSON, inclusive colchetes ou chaves, é 4 MB. Isso é diferente do tamanho máximo da linha. Se o tamanho máximo de um único objeto ou matriz JSON for excedido, mesmo se o tamanho de linha resultante for menor que o limite do tamanho de linha de 4 MB, o comando COPY falhará. 

Ao calcular o tamanho da linha, o Amazon Redshift contabiliza internamente os caracteres de barra vertical (\$1) duas vezes. Se os dados de entrada contiverem um número muito grande de caracteres de barra, será possível para o tamanho da linha exceder 4 MB, mesmo se o tamanho do objeto for menor que 4 MB.

COPY carrega `\n` como um caractere de nova linha e `\t` como um caractere de tabulação. Para carregar uma barra invertida, use uma barra invertida de escape ( `\\` ).

COPY pesquisa a origem JSON especificada em busca de um objeto JSON válido ou uma matriz bem formada. Se COPY encontrar algum caractere que não seja um espaço em branco antes de localizar uma estrutura JSON útil, ou entre objetos JSON ou matrizes válidos, COPY retornará um erro para cada instância. Esses erros são válidos para a contagem MAXERROR. Quando a contagem de erros for igual ou exceder MAXERROR, COPY falhará. 

Para cada erro, o Amazon Redshift registra uma linha na tabela do sistema STL\$1LOAD\$1ERRORS. A coluna LINE\$1NUMBER registra a última linha do objeto JSON que causou o erro. 

Se IGNOREHEADER for especificado, COPY ignorará o número especificado de linhas nos dados JSON. Os caracteres de nova linha nos dados JSON são sempre contados para cálculos de IGNOREHEADER. 

COPY carrega strings vazias como campos vazios por padrão. Se EMPTYASNULL for especificado, COPY carregará strings vazias de campos CHAR e VARCHAR como NULL. As strings vazias de outros tipos de dados, como INT, são sempre carregadas com NULL. 

As seguintes opções não são compatíveis com JSON: 
+ CSV
+ DELIMITER 
+ ESCAPE
+ FILLRECORD 
+ FIXEDWIDTH
+ IGNOREBLANKLINES
+ NULL AS
+ READRATIO
+ REMOVEQUOTES 

Para obter mais informações, consulte [COPY no formato JSON](copy-usage_notes-copy-from-json.md). Para obter mais informações sobre estruturas de dados JSON, vá até [www.json.org](https://www.json.org/). 

## Arquivo JSONPaths
<a name="copy-json-jsonpaths"></a>

Se você estiver carregando dados formatados em JSON ou de origem Avro, por padrão, COPY mapeará os elementos de dados no primeiro nível nos dados de origem para as colunas na tabela de destino. Ele faz isso combinando chaves de objeto, ou nomes, nos pares de nome-valor com os nomes de colunas na tabela de destino. 

Se os nomes de coluna e as chaves de objeto não forem correspondentes, ou a fim de mapear para níveis mais profundos na hierarquia de dados, você poderá usar um arquivo JSONPaths a fim de mapear explicitamente elemento de dados JSON ou Avro para colunas. O arquivo JSONPaths mapeia elementos de dados JSON para colunas comparando a ordem das colunas na tabela de destino ou na lista de colunas.

O arquivo JSONPaths deve conter somente um único objeto JSON (e não uma matriz). O objeto JSON é um par de nome-valor. A *chave de objeto*, que é o nome no par de nome-valor, deve ser `"jsonpaths"`. O *valor* no par de nome-valor é uma matriz de *expressões JSONPath*. Cada expressão JSONPath referencia um único elemento na hierarquia de dados JSON ou no esquema Avro, da mesma maneira como uma expressão XPath se refere a elementos em um documento XML. Para obter mais informações, consulte [Expressões JSONPath](#copy-json-jsonpath-expressions).

Para usar um arquivo JSONPaths, adicione a palavra-chave JSON ou AVRO ao comando COPY. Especifique o nome do bucket do S3 e o caminho de objeto do arquivo JSONPaths usando o formato a seguir.

```
COPY tablename 
FROM 'data_source' 
CREDENTIALS 'credentials-args' 
FORMAT AS { AVRO | JSON } 's3://jsonpaths_file';
```

O valor `s3://jsonpaths_file` deve ser uma chave de objeto do Amazon S3 que referencia explicitamente um único arquivo, como `'s3://amzn-s3-demo-bucket/jsonpaths.txt'`. Não pode ser um prefixo das chaves. 

Em alguns casos, se você estiver carregando do Amazon S3, o arquivo especificado por `jsonpaths_file` tem o mesmo prefixo que o caminho especificado por `copy_from_s3_objectpath` para os arquivos de dados. Em caso afirmativo, COPY lê o arquivo JSONPaths como um arquivo de dados e retorna erros. Por exemplo, digamos que seus arquivos de dados usem o caminho do objeto `s3://amzn-s3-demo-bucket/my_data.json` e seu arquivo JSONPaths é `s3://amzn-s3-demo-bucket/my_data.jsonpaths`. Nesse caso, COPY tenta carregar `my_data.jsonpaths` como um arquivo de dados.

 Se o nome de uma chave for qualquer string diferente de `"jsonpaths"`, o comando COPY não retornará um erro, mas ignorará *jsonpaths\$1file* e usará o argumento `'auto'` em seu lugar. 

Se algum dos seguintes ocorrer, o comando COPY falhará:
+ O JSON está malformado.
+ Existe mais de um objeto JSON.
+ Todos os caracteres, exceto o espaço branco, estão fora do objeto.
+ Um elemento de matriz é uma string vazia ou não é uma string.

MAXERROR não se aplica ao arquivo JSONPaths. 

O arquivo JSONPaths não deve ser criptografado, mesmo se a opção [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) for especificada.

Para obter mais informações, consulte [COPY no formato JSON](copy-usage_notes-copy-from-json.md). 

## Expressões JSONPath
<a name="copy-json-jsonpath-expressions"></a>

O arquivo JSONPaths usa expressões JSONPath a fim de mapear campos de dados para colunas de destino. Cada expressão JSONPath corresponde a uma coluna na tabela de destino do Amazon Redshift. A ordem dos elementos de matriz JSONPath deverá corresponder à ordem das colunas na tabela de destino ou na lista de colunas, se uma lista de colunas for usada. 

As aspas duplas são necessárias, conforme mostrado, para os nomes de campo e valores. As aspas devem ser simples (0x22), e não inclinadas ou “inteligentes”.

Se um elemento de objeto referenciado por uma expressão JSONPath não for encontrado nos dados JSON, COPY tentará carregar um valor NULL. Se o objeto referenciado for malformado, COPY retornará um erro de carregamento. 

Se um elemento de matriz referenciado por uma expressão JSONPath não for encontrado nos dados JSON nem Avro, COPY falhará com o seguinte erro: `Invalid JSONPath format: Not an array or index out of range.` Remova todos os elementos de matriz de JSONPaths que não existirem nos dados de origem e verifique se as matrizes nos dados de origem estão bem formadas.  

As expressões JSONPath podem usar a notação de colchetes ou de pontos, mas não pode misturar notações. O exemplo a seguir mostra expressões JSONPath usando notação de colchetes. 

```
{
    "jsonpaths": [
        "$['venuename']",
        "$['venuecity']",
        "$['venuestate']",
        "$['venueseats']"
    ]
}
```

O exemplo a seguir mostra expressões JSONPath usando notação de pontos. 

```
{
    "jsonpaths": [
        "$.venuename",
        "$.venuecity",
        "$.venuestate",
        "$.venueseats"
    ]
}
```

No contexto da sintaxe COPY do Amazon Redshift, uma expressão JSONPath deve especificar o caminho explícito para um único elemento de nome em uma estrutura de dados hierárquicos JSON ou Avro. O Amazon Redshift não dá suporte a elementos JSONPath, como caracteres curinga ou expressões de filtro, que podem ser resolvidos para um caminho ambíguo ou vários elementos de nome.

Para obter mais informações, consulte [COPY no formato JSON](copy-usage_notes-copy-from-json.md). 

## Usar JSONPaths com dados Avro
<a name="using-jsonpath-with-avro"></a>

O exemplo a seguir mostra um esquema do Avro com vários níveis.

```
{
    "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"}
    ]
}
```

O exemplo a seguir mostra um arquivo JSONPaths que usa expressões do AvroPath para referenciar o esquema anterior. 

```
{
    "jsonpaths": [
        "$.id",
        "$.guid",
        "$.address",
        "$.friends[0].id"
    ]
}
```

O exemplo JSONPaths inclui os seguintes elementos:

jsonpaths  
O nome do objeto JSON que contém as expressões AvroPath.

[ … ]  
A matriz JSON está entre colchetes contendo os elementos do caminho.

\$1  
O cifrão se refere ao elemento raiz no esquema do Avro, que é a matriz `"fields"`.

"\$1.id",  
O destino da expressão AvroPath. Nesta instância, o destino é o elemento na matriz `"fields"` com o nome `"id"`. As expressões são separadas por vírgulas.

"\$1.friends[0].id"  
Os colchetes indicam um índice de matriz. Como as expressões JSONPath usam indexação baseada em zero, essa expressão referencia o primeiro elemento na matriz `"friends"` com o nome `"id"`.

A sintaxe do esquema do Avro exige o uso de *campos internos* para definir a estrutura de tipos de dados de registro e matriz. Os campos internos são ignorados pelas expressões AvroPath. Por exemplo, o campo `"friends"` define uma matriz chamada `"inner_friends"`, que, por sua vez, define um registro chamado `"friends_record"`. A expressão AvroPath para referenciar o campo `"id"` pode ignorar os campos extras para referenciar diretamente o campo de destino. As expressões AvroPath a seguir referenciam os dois campos que pertencem à matriz `"friends"`.

```
"$.friends[0].id"
"$.friends[0].name"
```

## Parâmetros de formato de dados colunar
<a name="copy-parameters-columnar-data"></a>

Além dos formatos de dados padrão, COPY é compatível com os seguintes formatos de dados colunares para COPY do Amazon S3. COPY de formato colunar é compatível com determinadas restrições. Para obter mais informações, consulte [COPY de formatos de dados colunar](copy-usage_notes-copy-from-columnar.md). 

ORC  <a name="copy-orc"></a>
Carrega os dados de um arquivo que usa o formato de arquivo Colunar de linha otimizado (ORC). 

PARQUET  <a name="copy-parquet"></a>
Carrega os dados de um arquivo que usa o formato de arquivo Parquet. 

# Parâmetros de compactação de arquivo
<a name="copy-parameters-file-compression"></a>

Você pode carregar a partir de arquivos de dados compactados especificando os seguintes parâmetros. Parâmetros de compactação de arquivo

BZIP2   <a name="copy-bzip2"></a>
Um valor que especifica que o arquivo ou os arquivos de entrada estão em formato bzip2 compactado (arquivos .bz2). A operação COPY lê cada arquivo compactado e descompacta os dados à medida que eles são carregados.

GZIP   <a name="copy-gzip"></a>
Um valor que especifica que o arquivo ou os arquivos de entrada estão em formato gzip compactado (arquivos .gz). A operação COPY lê cada arquivo compactado e descompacta os dados à medida que eles são carregados.

LZOP   <a name="copy-lzop"></a>
Um valor que especifica que o arquivo ou os arquivos de entrada estão em formato lzop compactado (arquivos .lzo). A operação COPY lê cada arquivo compactado e descompacta os dados à medida que eles são carregados.  
COPY não dá suporte a arquivos que foram compactados com a opção lzop *--filter*.

ZSTD   <a name="copy-zstd"></a>
Um valor que especifica que o arquivo ou os arquivos de entrada estão em formato compactado Zstandard (arquivos .zst). A operação COPY lê cada arquivo compactado e descompacta os dados à medida que eles são carregados.  
ZSTD é compatível apenas com COPY do Amazon S3.

# Parâmetros da conversão de dados
<a name="copy-parameters-data-conversion"></a>

À medida que carrega a tabela, COPY tenta converter implicitamente as strings nos dados de origem no tipo de dados da coluna de destino. Se precisar especificar uma conversão diferente do comportamento padrão, ou se a conversão padrão resultar em erros, você poderá gerenciar conversões de dados especificando os parâmetros a seguir. Para obter mais informações sobre a sintaxe desses parâmetros, consulte [Sintaxe 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 da conversão de dados

ACCEPTANYDATE   <a name="copy-acceptanydate"></a>
Permite que qualquer formato de data, inclusive formatos inválidos, como `00/00/00 00:00:00`, seja carregado sem gerar um erro. Esse parâmetro se aplica somente a colunas TIMESTAMP e DATA. Use sempre ACCEPTANYDATE com o parâmetro DATEFORMAT. Se o formato de data dos dados não for correspondente à especificação DATEFORMAT, o Amazon Redshift inserirá um valor NULL nesse campo.

ACCEPTINVCHARS [AS] ['*replacement\$1char*']   <a name="copy-acceptinvchars"></a>
Permite o carregamento de dados em colunas VARCHAR mesmo se os dados contiverem caracteres UTF-8 inválidos. Quando ACCEPTINVCHARS é especificado, COPY substitui todos os caracteres UTF-8 inválidos por uma string de mesmo tamanho que consiste no caractere especificado por *replacement\$1char*. Por exemplo, se o caractere substituto for '`^`', um caractere inválido de três bytes será substituído por '`^^^`'.  
 O caractere substituto pode ser qualquer caractere ASCII, exceto NULL. O padrão é um ponto de interrogação (?). Para obter informações sobre caracteres UTF-8 inválidos, consulte [Erros no carregamento de caracteres multibyte](multi-byte-character-load-errors.md).  
COPY retorna o número de linhas que apresentavam caracteres UTF-8 inválidos e adiciona uma entrada à tabela do sistema [STL\$1REPLACEMENTS](r_STL_REPLACEMENTS.md) para cada linha afetada, até 100 linhas, no máximo, para cada fatia de nó. Os caracteres UTF-8 inválidos adicionais também são substituídos, mas esses eventos substitutos não são registrados.  
Se ACCEPTINVCHARS não for especificado, COPY retornará um erro sempre que encontrar um caractere UTF-8 inválido.   
ACCEPTINVCHARS só é válido para colunas VARCHAR.

BLANKSASNULL   <a name="copy-blanksasnull"></a>
Carrega campos em branco, que consistem somente em caracteres de espaço em branco, como NULL. Essa opção se aplica somente a colunas CHAR e VARCHAR. Os campos em branco de outros tipos de dados, como INT, são sempre carregados com NULL. Por exemplo, uma string que contém três caracteres de espaço em sucessão (e qualquer outro caractere) é carregada como um NULL. O comportamento padrão, sem essa opção, é carregar os caracteres de espaço como estão. 

DATEFORMAT [AS] \$1'*dateformat\$1string*' \$1 'auto' \$1  <a name="copy-dateformat"></a>
Se nenhum DATEFORMAT for especificado, o formato padrão será `'YYYY-MM-DD'`. Por exemplo, um formato válido alternativo é `'MM-DD-YYYY'`.   
Se o comando COPY não reconhecer o formato dos valores de data ou hora, ou se os valores de data ou hora usarem formatos diferentes, use o argumento `'auto'` com o parâmetro DATEFORMAT ou TIMEFORMAT. O argumento `'auto'` reconhece diversos formatos não compatíveis ao usar uma string DATEFORMAT e TIMEFORMAT. A palavra-chave `'auto'`' diferencia maiúsculas de minúsculas. Para obter mais informações, consulte [Usar o reconhecimento automático com DATEFORMAT e TIMEFORMAT](automatic-recognition.md).   
O formato de data pode incluir informações sobre horário (hora, minutos, segundos), mas essas informações são ignoradas. A palavra-chave AS é opcional. Para obter mais informações, consulte [Strings DATEFORMAT e TIMEFORMATExemplo](r_DATEFORMAT_and_TIMEFORMAT_strings.md).

EMPTYASNULL   <a name="copy-emptyasnull"></a>
Indica que o Amazon Redshift deve carregar campos CHAR e VARCHAR vazios como NULL. Os campos vazios de outros tipos de dados, como INT, são sempre carregados com NULL. Os campos vazios ocorrem quando os dados contêm dois delimitadores em sucessão sem caracteres entre os delimitadores. EMPTYASNULL e NULL AS '' (string vazia) produzem o mesmo comportamento.

ENCODING [AS] *file\$1encoding*  <a name="copy-encoding"></a>
Especifica o tipo de codificação dos dados de carregamento. O comando COPY converte os dados da codificação especificada em UTF-8 durante o carregamento.   
Os valores válidos para *file\$1encoding* são os seguintes:  
+ `UTF8`
+ `UTF16`
+ `UTF16LE`
+ `UTF16BE`
+ `ISO88591`
O padrão é `UTF8`.  
Os nomes de arquivo de origem devem usar codificação UTF-8.  
Os seguintes arquivos devem usar codificação UTF-8, mesmo se uma codificação diferente for especificada para os dados de carregamento:  
+ Arquivos de manifesto
+ Arquivos JSONPaths
As string de argumento que acompanham os seguintes parâmetros devem usar UTF-8:  
+ FIXEDWIDTH '*fixedwidth\$1spec*'
+ ACCEPTINVCHARS '*replacement\$1char*'
+ DATEFORMAT '*dateformat\$1string*'
+ TIMEFORMAT '*timeformat\$1string*'
+ NULL AS '*null\$1string*'
Os arquivos de dados de largura fixa devem usar codificação UTF-8. As larguras de campo se baseiam no número de caracteres, e não no número de bytes.   
Todos os dados de carregamento devem usar a codificação especificada. Se encontrar uma codificação diferente, COPY ignorará o arquivo e retornará um erro.   
Se você especificar `UTF16`, os dados deverão ter uma Byte Order Mark (BOM – Marca da ordem de bytes). Se souber se os dados UTF-16 são LE (Little-Endian) ou BE (Big-Endian), você poderá usar `UTF16LE` ou `UTF16BE`, independentemente da presença de uma BOM.   
Para usar a codificação ISO-8859-1, especifique `ISO88591`. Para obter mais informações, consulte [ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1) na *Wikipédia*.

ESCAPE   <a name="copy-escape"></a>
Quando esse parâmetro é especificado, o caractere de barra invertida (`\`) em dados de entrada é tratado como um caractere de escape. O caractere logo depois do caractere de barra invertida será carregado na tabela como parte do valor de coluna atual, mesmo se for um caractere que normalmente atende a uma finalidade especial. Por exemplo, você poderá usar esse parâmetro para escapar o caractere delimitador, aspas, um caractere de nova linha integrado ou o próprio caractere de escape quando qualquer um desses caracteres for uma parte legítima de um valor de coluna.  
Se especificar o parâmetro ESCAPE em combinação com o parâmetro REMOVEQUOTES, você poderá escapar e manter aspas (`'` ou `"`) que possam ser removidas de outra maneira. A string nula padrão, `\N`, funciona como está, mas também pode ser escapada nos dados de entrada como `\\N`. Desde que você não especifique uma string nula alternativa com o parâmetro NULL AS, `\N` e `\\N` produzem os mesmos resultados.  
O caractere de controle `0x00` (NUL) não pode ser escapado e deve ser removido dos dados de entrada ou convertido. Esse caractere é tratado como um marcador End Of Record (EOR – Fim do registro), truncando o restante do registro.
Você não pode usar o parâmetro ESCAPE para cargas FIXEDWIDTH, e você não pode especificar o caractere de escape propriamente dito; o caractere de escape é sempre o caractere de barra invertida. Além disso, você deve garantir que os dados de entrada contenham o caractere de escape nos lugares apropriados.  
Aqui estão alguns exemplos de dados de entrada e os dados carregados resultantes quando o parâmetro ESCAPE é especificado. O resultado da linha 4 pressupõe que o parâmetro REMOVEQUOTES também esteja especificado. Os dados de entrada consistem em dois campos delimitados por barra:   

```
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'
```
Os dados carregados na coluna 2 têm esta aparência:   

```
The quick brown fox
jumped over the lazy dog.
A\B\C
A|B|C
A Midsummer Night's Dream
```
A aplicação do caractere de escape aos dados de entrada de uma carga é responsabilidade do usuário. Uma exceção a esse requisito é quando você recarrega dados que foram descarregados anteriormente com o parâmetro ESCAPE. Nesse caso, os dados já conterão os caracteres de escape necessários.
O parâmetro ESCAPE não interpreta octal, hex, Unicode nem outras notações da sequência de escape. Por exemplo, se os dados de origem contiverem o valor de alimentação de linha octal (`\012`) e você tentar carregar esses dados com o parâmetro ESCAPE, o Amazon Redshift carregará o valor `012` na tabela e não interpretará esse valor como uma alimentação de linha com escape.  
Para escapar caracteres de nova linha em dados originados de plataformas do Microsoft Windows, você pode precisar usar dois caracteres de escape: um para o retorno de carro e um para a alimentação de linha. Você também pode remover os retorno de carro antes de carregar o arquivo (por exemplo, usando o utilitário dos2unix).

EXPLICIT\$1IDS   <a name="copy-explicit-ids"></a>
Use EXPLICIT\$1IDS com tabelas que tenham colunas IDENTITY se você quiser substituir os valores gerados automaticamente por valores explícitos dos arquivos de dados de origem das tabelas. Se o comando incluir uma lista de colunas, essa lista deverá incluir as colunas IDENTITY para usar esse parâmetro. O formato de dados de valores EXPLICIT\$1IDS deve corresponder ao formato IDENTITY especificado pela definição de CREATE TABLE.  
Depois de executar o comando COPY em relação a uma tabela com a opção EXPLICIT\$1IDS, o Amazon Redshift não conferirá a exclusividade de colunas IDENTITY na tabela.  
Se uma coluna estiver definida com GENERATED BY DEFAULT AS IDENTITY, será possível copiá-la. Os valores são gerados ou atualizados com os valores fornecidos. A opção EXPLICIT\$1IDS não é necessária. COPY não atualiza a marca d'água alta de identidade.  
 Para obter um exemplo de um comando COPY usando EXPLICIT\$1IDS, consulte [Carregar VENUE com valores explícitos para uma coluna 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 arquivos de dados sejam carregados quando colunas contíguas não forem encontradas ao final de alguns dos registros. As colunas ausentes são carregadas como NULLs. Para formatos de texto e CSV, se a coluna ausente for uma coluna VARCHAR, as strings de comprimento zero serão carregadas em vez de NULLs. Para carregar NULLs em colunas VARCHAR a partir de texto e CSV, especifique a palavra-chave EMPTYASNULL. A substituição de NULL funcionará somente se a definição de coluna permitir NULLs.  
Por exemplo, se a definição de tabela contiver quatro colunas CHAR anuláveis e um registro contiver os valores `apple, orange, banana, mango`, o comando COPY poderá carregar e preencher um registro que contenha somente os valores `apple, orange`. Os valores CHAR não encontrados seriam carregados como valores NULL.

IGNOREBLANKLINES   <a name="copy-ignoreblanklines"></a>
Ignora linhas em branco que contêm somente uma alimentação de linha em um arquivo de dados e não tenta carregá-las.

IGNOREHEADER [ AS ] *number\$1rows*   <a name="copy-ignoreheader"></a>
Trata as *number\$1rows* especificadas como um cabeçalho de arquivo e não as carrega. Use IGNOREHEADER para ignorar cabeçalhos de arquivo em todos os arquivos em uma carga paralela.

NULL AS '*null\$1string*'   <a name="copy-null-as"></a>
Carrega campos que correspondam a *null\$1string* como NULL, em que *null\$1string* pode ser qualquer string. Se os dados incluírem um terminador nulo, também conhecido como NUL (UTF-8 0000) ou zero binário (0x000), COPY o tratará como qualquer outro caractere. Por exemplo, um registro contendo '1' \$1\$1 NUL \$1\$1 '2' é copiado como string de comprimento de 3 bytes. Se um campo contiver somente NUL, você poderá usar NULL AS para substituir o terminador nulo por NULL, especificando `'\0'` ou `'\000'`. Por exemplo, `NULL AS '\0'` ou `NULL AS '\000'`. Se um campo contiver uma string que termina com NUL e NULL AS for especificado, a string será inserida com NUL ao final. Não use '\$1n' (nova linha) para o valor *null\$1string*. O Amazon Redshift reserva o uso de '\$1n' como um delimitador de linha. O *null\$1string* padrão é `'\N`'.  
Se você tentar carregar nulos em uma coluna definida como NOT NULL, o comando COPY falhará.

REMOVEQUOTES   <a name="copy-removequotes"></a>
Remove as aspas de strings nos dados recebidos. Todos os caracteres entre aspas, inclusive delimitadores, são mantidos. Se uma string tiver aspas simples ou duplas de abertura, mas nenhuma de fechamento correspondente, o comando COPY deixará de carregar essa linha e retornará um erro. A tabela a seguir mostra alguns exemplos simples de strings que contêm aspas e os valores carregados resultantes.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/copy-parameters-data-conversion.html)

ROUNDEC   <a name="copy-roundec"></a>
Arredonda para cima valores numéricos quando a escala do valor de entrada é maior que a escala da coluna. Por padrão, COPY trunca valores quando necessário para caber na escala da coluna. Por exemplo, se um valor de `20.259` for carregado em uma coluna DECIMAL(8,2), COPY truncará o valor em `20.25`, por padrão. Se ROUNDEC for especificado, COPY arredondará o valor para `20.26`. Como o comando INSERT sempre arredonda valores quando necessário de acordo com a escala da coluna, um comando COPY com o parâmetro ROUNDEC se comporta da mesma maneira que um comando INSERT.

TIMEFORMAT [AS] \$1'*timeformat\$1string*' \$1 'auto' \$1 'epochsecs' \$1 'epochmillisecs' \$1  <a name="copy-timeformat"></a>
Especifica o formato de hora. Se nenhum TIMEFORMAT for especificado, o formato padrão será `YYYY-MM-DD HH:MI:SS` para colunas TIMESTAMP ou `YYYY-MM-DD HH:MI:SSOF` para colunas TIMESTAMPTZ, em que `OF` é a diferença em relação ao Universal Coordinated Time (UTC – Tempo universal coordenado). Você não pode incluir um especificador de fuso horário no *timeformat\$1string*. Para carregar dados TIMESTAMPTZ em um formato diferente do formato padrão, especifique 'auto'; para obter mais informações, consulte [Usar o reconhecimento automático com DATEFORMAT e TIMEFORMAT](automatic-recognition.md). Para obter mais informações sobre *timeformat\$1string*, consulte [Strings DATEFORMAT e TIMEFORMATExemplo](r_DATEFORMAT_and_TIMEFORMAT_strings.md).  
O argumento `'auto'` reconhece diversos formatos não compatíveis ao usar uma string DATEFORMAT e TIMEFORMAT. Se o comando COPY não reconhecer o formato dos valores de data ou hora, ou se os valores de data e hora usarem formatos diferentes, use o argumento `'auto'` com o parâmetro DATEFORMAT ou TIMEFORMAT. Para obter mais informações, consulte [Usar o reconhecimento automático com DATEFORMAT e TIMEFORMAT](automatic-recognition.md).   
Se os dados de origem forem representados como hora epoch, ou seja o número de segundos ou milissegundos desde 1º de janeiro de 1970, 00:00:00 UTC, especifique `'epochsecs'` ou `'epochmillisecs'`.   
As palavras-chave `'auto'`, `'epochsecs'` e `'epochmillisecs'` diferenciam maiúsculas de minúsculas.  
A palavra-chave AS é opcional.

TRIMBLANKS   <a name="copy-trimblanks"></a>
Remove os caracteres de espaço em branco à direita de uma string VARCHAR. Esse parâmetro se aplica somente a colunas com um tipo de dados VARCHAR.

TRUNCATECOLUMNS   <a name="copy-truncatecolumns"></a>
Trunca dados em colunas no número apropriado de caracteres, de maneira que ele caiba na especificação da coluna. Aplica-se somente a colunas com um tipo de dados VARCHAR ou CHAR e linhas com 4 MB ou menos.

# Operações de carregamento de dados
<a name="copy-parameters-data-load"></a>

Gerencie o comportamento padrão da operação de carregamento para solucionar problemas ou reduzir o tempo de carregamento especificando os parâmetros a seguir. 
+ [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>Parâmetros

COMPROWS *numrows*   <a name="copy-comprows"></a>
Especifica o número de linhas a serem usadas como o tamanho de exemplo para análise de compactação. A análise é executada em linhas de cada fatia de dados. Por exemplo, se você especificar `COMPROWS 1000000` (1.000.000) e o sistema contiver quatro fatias no total, não mais do que 250.000 linhas para cada fatia serão lidas e analisadas.  
Se COMPROWS não for especificado, o padrão do tamanho de exemplo será 100.000 para cada fatia. Os valores de COMPROWS menores que o padrão de 100.000 linhas para cada fatia são atualizados automaticamente para o valor padrão. Porém, a compactação automática não acontecerá se o valor de dados carregados for insuficiente para produzir um exemplo significativo.  
Se o número de COMPROWS for maior que o número de linhas no arquivo de entrada, o comando COPY continuará e executará a análise de compactação em todas as linhas disponíveis. O intervalo aceito para esse argumento é um número entre 1000 e 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 se as codificações de compactação são aplicadas automaticamente durante um comando COPY.   
Quando COMPUPDATE é PRESET, o comando COPY escolhe a codificação de compactação para cada coluna se a tabela de destino estiver vazia; mesmo se as colunas já tiverem codificações diferentes de RAW. As codificações de coluna atualmente especificadas podem ser substituídas. A codificação para cada coluna é baseada no tipo de dados da coluna. Não é criada nenhuma amostra de dados. O Amazon Redshift atribui automaticamente a codificação de compactação da seguinte maneira:  
+ Colunas que são definidas como chaves de classificação são designadas a compactação RAW.
+ Colunas que são definidas como tipos de dados BOOLEAN, REAL ou DOUBLE PRECISION recebem a compactação RAW.
+ As colunas definidas como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP ou TIMESTAMPTZ recebem a compactação AZ64.
+ As colunas definidas como CHAR ou VARCHAR recebem a compactação LZO.
Quando COMPUPDATE for omitido, o comando COPY escolherá a codificação de compactação para cada coluna apenas se a tabela de destino estiver vazia e você não tiver especificado uma codificação (diferente de RAW) para nenhuma das colunas. A codificação de cada coluna é determinada pelo Amazon Redshift. Não é criada nenhuma amostra de dados.   
Quando COMPUPDATE estiver definido como ON (ou TRUE) ou especificado sem uma opção, o comando COPY aplicará a compactação automática se a tabela estiver vazia, mesmo que as colunas da tabela já tenham codificações diferentes de RAW. As codificações de coluna atualmente especificadas podem ser substituídas. A codificação de cada coluna se baseia em uma análise de dados de amostra. Para obter mais informações, consulte [Carregamento de tabelas com compactação automática](c_Loading_tables_auto_compress.md).  
Quando COMPUPDATE é definido como OFF (ou FALSE), a compactação automática é desativada. As codificações de coluna não são alteradas.  
Para obter informações sobre a tabela do sistema para analisar a compactação, consulte [STL\$1ANALYZE\$1COMPRESSION](r_STL_ANALYZE_COMPRESSION.md). 

IGNOREALLERRORS   <a name="copy-ignoreallerrors"></a>
Você pode especificar essa opção para ignorar todos os erros que ocorrem durante a operação de carregamento.   
Você não pode especificar a opção IGNOREALLERRORS se especificar a opção MAXERROR. Você não pode especificar a opção IGNOREALLERRORS para formatos colunares, incluindo ORC e Parquet.

MAXERROR [AS] *error\$1count*   <a name="copy-maxerror"></a>
Se retornar o número de erros *error\$1count* ou mais, a carga falhará. Se retornar menos erros, a carga continuará e retornará uma mensagem INFO informando que não foi possível carregar o número de linhas. Use esse parâmetro para permitir que as cargas continuem quando determinadas linhas deixarem de ser carregadas na tabela por causa de erros de formatação ou outras inconsistências nos dados.   
Defina esse valor como `0` ou `1`, se você quiser que a carga falhe assim que o primeiro erro ocorrer. A palavra-chave AS é opcional. O valor padrão MAXERROR é `0`, e o limite é `100000`.  
 O número real de erros relatados pode ser maior que o MAXERROR especificado por causa da natureza paralela do Amazon Redshift. Se o nó no cluster do Amazon Redshift detectar que MAXERROR foi excedido, cada nó relatará todos os nós encontrados.

NOLOAD   <a name="copy-noload"></a>
Verifica a validade do arquivo de dados sem efetivamente carregar os dados. Use o parâmetro NOLOAD para garantir que o arquivo de dados seja carregado sem erros antes de executar o carregamento de dados real Executar COPY com o parâmetro NOLOAD é muito mais rápido do que carregar os dados porque somente analisa os arquivos.

STATUPDATE [ \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-statupdate"></a>
Regula a computação automática e a atualização de estatísticas do otimizador ao final de um comando COPY bem-sucedido. Por padrão, se o parâmetro STATUPDATE não for usado, as estatísticas serão atualizadas automaticamente se a tabela estiver inicialmente vazia.  
Sempre que o processamento de dados em uma tabela não vazia alterar significativamente o tamanho da tabela, recomendamos atualizar as estatísticas executando um comando [ANALYZE](r_ANALYZE.md) ou usando o argumento STATUPDATE ON.  
Com STATUPDATE ON (ou TRUE), as estatísticas são atualizadas automaticamente, independente da tabela estar inicialmente vazia. Se STATUPDATE for usado, o usuário atual não deverá ser o proprietário da tabela ou um superusuário. Se STATUPDATE não for especificado, somente a permissão INSERT será necessária.  
Com STATUPDATE OFF (ou FALSE), as estatísticas jamais são atualizadas.  
Para obter informações adicionais, consulte [Análise de tabelas](t_Analyzing_tables.md).

# Lista de parâmetros alfabética
<a name="r_COPY-alphabetical-parm-list"></a>

A lista a seguir fornece links para cada descrição de parâmetro do comando COPY, classificados em ordem alfabética.
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate)
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)
+ [ACCESS\$1KEY\$1ID e 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)

# Observações de uso
<a name="r_COPY_usage_notes"></a>

**Topics**
+ [Permissões para acessar outros recursos da AWS](copy-usage_notes-access-permissions.md)
+ [Usar COPY com aliases de ponto de acesso do Amazon S3](copy-usage_notes-s3-access-point-alias.md)
+ [Carregar dados multibyte do Amazon S3](copy-usage_notes-multi-byte.md)
+ [Carregar uma coluna do tipo de dados GEOMETRY ou GEOGRAPHY](copy-usage_notes-spatial-data.md)
+ [Carregando o tipo de dados HLLSKETCH](copy-usage_notes-hll.md)
+ [Carregar uma coluna do tipo de dados VARBYTE](copy-usage-varbyte.md)
+ [Erros durante a leitura de vários arquivos](copy-usage_notes-multiple-files.md)
+ [COPY no formato JSON](copy-usage_notes-copy-from-json.md)
+ [COPY de formatos de dados colunar](copy-usage_notes-copy-from-columnar.md)
+ [Strings DATEFORMAT e TIMEFORMAT](r_DATEFORMAT_and_TIMEFORMAT_strings.md)
+ [Usar o reconhecimento automático com DATEFORMAT e TIMEFORMAT](automatic-recognition.md)

# Permissões para acessar outros recursos da AWS
<a name="copy-usage_notes-access-permissions"></a>

 Para mover dados entre o cluster e outro recurso da AWS, como Amazon S3, Amazon DynamoDB, Amazon EMR, ou Amazon EC2, o cluster deve ter permissão para acessar o recurso e realizar as ações necessárias. Por exemplo, para carregar dados do Amazon S3, COPY deve ter acesso LIST para o bucket e acesso GET para os objetos do bucket. Para obter informações sobre permissões mínimas, consulte [Permissões do IAM para COPY, UNLOAD e CREATE LIBRARY](#copy-usage_notes-iam-permissions).

Para obter autorização a fim de acessar o recurso, o cluster deve ser autenticado. Você pode escolher qualquer um dos seguintes métodos de autenticação: 
+ [Controle de acesso com base em função](#copy-usage_notes-access-role-based) – Para controle de acesso baseado na função, você especifica uma função do AWS Identity and Access Management (IAM) usada pelo cluster na autenticação e na autorização. Para resguardar as credenciais da AWS e os dados sigilosos, é altamente recomendável usar a autenticação baseada na função.
+ [Controle de acesso com base em chave](#copy-usage_notes-access-key-based) – Para controle de acesso baseado em chave, você fornece as credenciais de acesso da AWS (ID da chave de acesso e chave de acesso secreta) para um usuário como texto sem formatação.

## Controle de acesso com base em função
<a name="copy-usage_notes-access-role-based"></a>

Com <a name="copy-usage_notes-access-role-based.phrase"></a>controle de acesso baseado na função, o cluster pressupõe temporariamente uma função do IAM em seu nome. Então, com base nas autorizações concedidas para a função, seu cluster pode acessar os recursos da AWS necessários.

Criar um *perfil* do IAM é semelhante a conceder permissões a um usuário no sentido de ser uma identidade da AWS com políticas de permissão que determinam o que a identidade pode e não pode fazer na AWS. No entanto, em vez de ser exclusivamente associada a um usuário, uma função pode ser assumida por qualquer entidade que precise dela. Além disso, uma função não tem credenciais (uma senha ou chaves de acesso) associadas. Em vez disso, se uma função estiver associada a um cluster, as chaves de acesso serão criadas dinamicamente e fornecidas para o cluster.

Recomendamos o uso do controle de acesso baseado em função, pois ele fornece um controle refinado e mais seguro do acesso aos recursos da AWS e dados sigilosos do usuário, além de proteger suas credenciais da AWS.

A autenticação com base na função oferece os seguintes benefícios:
+ Você pode usar as ferramentas do IAM padrão da AWS para definir uma função do IAM e associar a função a vários clusters. Quando você modifica a política de acesso de uma função, as alterações são aplicadas automaticamente a todos os clusters que usam a função.
+ Você pode definir políticas do IAM refinadas que concedem permissões para clusters específicos e usuários de banco de dados acessarem recursos e ações específicos da AWS.
+ O cluster obtém credenciais de sessão temporária em tempo de execução e atualiza as credenciais conforme necessário até a operação ser concluída. Se você usar credenciais temporárias baseadas na chave, a operação falhará se as credenciais temporárias expirarem antes de serem concluídas.
+ O ID de chave de acesso e o ID de chave de acesso secreta não são armazenados nem transmitidos no código SQL.

Para usar o controle de acesso com base em função, você primeiro deve criar uma função do IAM usando o tipo de função de serviço do Amazon Redshift e, em seguida, anexar a função ao seu cluster. A função deve ter, pelo menos, as permissões listadas em [Permissões do IAM para COPY, UNLOAD e CREATE LIBRARY](#copy-usage_notes-iam-permissions). Para conhecer as etapas de criação de um perfil do IAM e anexá-lo ao cluster, consulte “[Autorizar o Amazon Redshift a acessar outros serviços da AWS em seu nome](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)” no *Guia de gerenciamento de clusters do Amazon Redshift*.

Você pode adicionar uma função a um cluster ou visualizar as funções associadas a um cluster usando o Console de Gerenciamento do Amazon Redshift, a CLI ou a API. Para obter mais informações, consulte “[Autorizar operações COPY, UNLOAD, CREATE EXTERNAL FUNCTION e CREATE EXTERNAL SCHEMA usando funções do IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html)” no *Guia de gerenciamento de clusters do Amazon Redshift*.

Quando você cria uma função do IAM, o IAM retorna um nome de recurso da Amazon (ARN) para a função. Para especificar uma função do IAM, forneça ao ARN da função o parâmetro [Usar o parâmetro IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role) ou o parâmetro [Usar o parâmetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials). 

Por exemplo, suponhamos que a função a seguir esteja anexada ao cluster.

```
"IamRoleArn": "arn:aws:iam::0123456789012:role/MyRedshiftRole"
```

O exemplo de comando COPY a seguir usa o parâmetro IAM\$1ROLE com o ARN no exemplo anterior para autenticação e acesso ao Amazon S3.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata'  
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

O exemplo de comando COPY a seguir usa o parâmetro CREDENTIALS para especificar a função do IAM.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata' 
credentials 
'aws_iam_role=arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Além disso, um superusuário pode conceder o privilégio ASSUMEROLE aos usuários e grupos do banco de dados para fornecer acesso a uma função para operações COPY. Para mais informações, consulte [GRANT](r_GRANT.md).

## Controle de acesso com base em chave
<a name="copy-usage_notes-access-key-based"></a>

Com <a name="copy-usage_notes-access-key-based.phrase"></a>controle de acesso baseado em chave, você fornece o ID da chave de acesso e a chave de acesso secreta de um usuário do IAM autorizado a acessar os recursos da AWS que contêm os dados. É possível usar os parâmetros [Usar os parâmetros ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id) juntos ou o parâmetro [Usar o parâmetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials).

**nota**  
É altamente recomendável usar uma função do IAM para autenticação em vez de fornecer um ID da chave de acesso de texto simples e uma chave de acesso secreta. Se você escolher o controle de acesso com base em chave, nunca use as credenciais de sua conta da AWS (raiz). Sempre crie um usuário do IAM e forneça o ID da chave de acesso e a chave de acesso secreta desse usuário. Para obter as etapas para criar um usuário do IAM, consulte [Criação de um usuário do IAM em sua conta da AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html).

Para se autenticar usando ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY, substitua *<access-key-id>* e *<secret-access-key>* por um ID de chave de acesso do usuário autorizado e uma chave de acesso secreta completa conforme mostrado a seguir. 

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>';
```

Para se autenticar usando o parâmetro CREDENTIALS, substitua *<access-key-id>* e *<secret-access-key>* por um ID de chave de acesso do usuário autorizado e uma chave de acesso secreta completa conforme mostrado a seguir.

```
CREDENTIALS
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>';
```

O usuário do IAM deve ter, pelo menos, as permissões listadas em [Permissões do IAM para COPY, UNLOAD e CREATE LIBRARY](#copy-usage_notes-iam-permissions).

### Credenciais de segurança temporárias
<a name="r_copy-temporary-security-credentials"></a>

 Se estiver usando o controle de acesso baseado na chave, você poderá limitar ainda o acesso que usuários têm aos dados usando credenciais de segurança temporárias. A autenticação baseada na função usa automaticamente credenciais temporárias. 

**nota**  
É altamente recomendável usar [role-based access control](#copy-usage_notes-access-role-based.phrase), em vez de criar credenciais temporárias e fornecer o ID de chave de acesso e a chave de acesso secreta como texto sem formatação. O controle de acesso baseado em perfil usa automaticamente credenciais temporárias. 

As credenciais de segurança temporárias fornecem segurança avançada, pois possuem vidas úteis curtas e não podem ser reutilizadas depois que expiram. A ID da chave de acesso e a chave de acesso secreta geradas com o token não podem ser usadas sem o token, e um usuário que tiver essas credenciais de segurança temporárias poderá acessar os recursos somente até as credenciais expirarem.

Para conceder a usuários acesso temporário aos recursos, você chama operações da API do AWS Security Token Service (AWS STS). As operações da API do AWS STS retornam credenciais de segurança temporárias que consistem em um token de segurança, um ID de chave de acesso e uma chave de acesso secreta. Você emite as credenciais de segurança temporárias para os usuários que precisam de acesso temporário aos recursos. Esses usuários podem ser usuários do IAM existentes ou podem não ser usuários da AWS. Para obter mais informações sobre como criar credenciais de segurança temporárias, consulte [Usar credenciais de segurança temporárias](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html) no Manual do usuário do IAM.

É possível usar os parâmetros [Usar os parâmetros ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id) com o parâmetro [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token) ou o parâmetro [Usar o parâmetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials). Você também deve fornecer o ID de chave de acesso e a chave de acesso secreta que acompanhavam o token.

Para se autenticar usando ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY e SESSION\$1TOKEN, substitua *<temporary-access-key-id>*, *<temporary-secret-access-key>* e *<temporary-token>* conforme mostrado a seguir. 

```
ACCESS_KEY_ID '<temporary-access-key-id>'
SECRET_ACCESS_KEY '<temporary-secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

Para se autenticar usando CREDENTIALS, inclua `session_token=<temporary-token>` na string de credenciais conforme mostrado a seguir. 

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>';
```

O exemplo a seguir mostra um comando COPY com credenciais de segurança temporárias.

```
copy table-name
from 's3://objectpath'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>';
```

O exemplo a seguir carrega a tabela LISTING com credenciais temporárias e criptografia de arquivos.

```
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;
```

O exemplo a seguir carrega a tabela LISTING usando o parâmetro CREDENTIALS com credenciais temporárias e criptografia de arquivos.

```
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**  
As credenciais de segurança temporárias devem ser válidas durante toda a duração da operação de COPY ou UNLOAD. Se as credenciais de segurança temporárias expirarem durante a operação, o comando falhará e a transação será revertida. Por exemplo, se as credenciais de segurança temporárias expirarem depois de 15 minutos e a operação COPY exigir uma hora, a operação COPY falhará antes de ser concluída. Se você usar acesso baseado na função, as credenciais de segurança temporárias serão atualizadas automaticamente até a operação ser concluída.

## Permissões do IAM para COPY, UNLOAD e CREATE LIBRARY
<a name="copy-usage_notes-iam-permissions"></a>

O usuário ou perfil do IAM referenciado pelo parâmetro CREDENTIALS deve ter, pelo menos, as seguintes permissões:
+ Para COPY no Amazon S3, a permissão para LIST o bucket do Amazon S3 e GET os objetos do Amazon S3 do carregados, além do arquivo manifesto, se algum for usado.
+ Para COPY do Amazon S3, Amazon EMR e hosts remotos (SSH) com dados formatados em JSON, permissão para LIST e GET o arquivo JSONPaths no Amazon S3, se algum for usado. 
+ Para COPY no DynamoDB, permissão para SCAN e DESCRIBE a tabela do DynamoDB que está sendo carregada. 
+ Para COPY a partir de um cluster do Amazon EMR, permissão para a ação `ListInstances` no cluster do Amazon EMR. 
+ Para UNLOAD no Amazon S3, as permissões para GET, LIST e PUT para o bucket do Amazon S3 no qual os arquivos de dados estão sendo descarregados.
+ Para CREATE LIBARY do Amazon S3, permissão para LIST o bucket do Amazon S3 e GET os objetos do Amazon S3 a serem importados

**nota**  
Se você receber a mensagem de erro `S3ServiceException: Access Denied` ao executar um comando COPY, UNLOAD ou CREATE LIBRARY, significa que o cluster não tem permissões de acesso apropriadas para o Amazon S3.

É possível gerenciar permissões do IAM anexando uma política do IAM a um perfil do IAM anexado ao cluster, ao usuário ou ao grupo ao qual o usuário pertence. Por exemplo, a política gerenciada `AmazonS3ReadOnlyAccess` concede permissões LIST e GET a recursos do Amazon S3. Para obter mais informações sobre o gerenciamento de políticas, consulte [Gerenciando políticas do IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html) no *Manual do usuário do IAM*. 

# Usar COPY com aliases de ponto de acesso do Amazon S3
<a name="copy-usage_notes-s3-access-point-alias"></a>

COPY oferece suporte a aliases de ponto de acesso do Amazon S3. Para obter mais informações, consulte [Usar um alias em estilo de bucket para seu ponto de acesso](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html) no *Guia do usuário do Amazon Simple Storage Service*.

# Carregar dados multibyte do Amazon S3
<a name="copy-usage_notes-multi-byte"></a>

Se seus dados incluem caracteres multibyte não ASCII (tal como caracteres chineses ou cirílicos), você deve carregar os dados em colunas VARCHAR. O tipo de dados VARCHAR é compatível com caracteres UTF-8 de quatro bytes, mas o tipo de dados CHAR aceita apenas caracteres ASCII de único byte. Você não pode carregar caracteres de cinco ou mais bytes de comprimento em tabelas do Amazon Redshift. Para obter mais informações, consulte [Caracteres multibyte](c_Supported_data_types.md#c_Supported_data_types-multi-byte-characters). 

# Carregar uma coluna do tipo de dados GEOMETRY ou GEOGRAPHY
<a name="copy-usage_notes-spatial-data"></a>

Você pode usar COPY e, colunas `GEOMETRY` ou `GEOGRAPHY` de dados em um arquivo de texto delimitado por caracteres, como um arquivo CSV. Os dados devem estar na forma do formato binário reconhecido (WKB ou EWKB) ou no formato de texto reconhecido (WKT ou EWKT) e caber no tamanho máximo de uma única linha de entrada para o comando COPY. Para obter mais informações, consulte [COPY](r_COPY.md). 

Para obter informações sobre como carregar a partir de um arquivo de forma, consulte [Carregar um shapefile no Amazon Redshift](spatial-copy-shapefile.md).

Para obter mais informações sobre tipos de dados `GEOMETRY` ou `GEOGRAPHY`, consulte [Consultar dados espaciais no Amazon Redshift](geospatial-overview.md).

# Carregando o tipo de dados HLLSKETCH
<a name="copy-usage_notes-hll"></a>

Você pode copiar esboços HLL apenas em formato esparso ou denso compatível com o Amazon Redshift. Para usar o comando COPY em esboços HyperLogLog, use o formato Base64 para esboços de HyperLogLog densos e o formato JSON para esboços de HyperLogLog esparsos. Para obter mais informações, consulte [Funções HyperLogLog](hyperloglog-functions.md). 

O exemplo a seguir importa dados de um arquivo CSV para uma tabela usando CREATE TABLE e COPY. Primeiro, o exemplo cria a tabela `t1` usando CREATE TABLE.

```
CREATE TABLE t1 (sketch hllsketch, a bigint);
```

Em seguida, ele usa COPY para importar dados de um arquivo CSV para a tabela `t1`. 

```
COPY t1 FROM s3://amzn-s3-demo-bucket/unload/' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' CSV;
```

# Carregar uma coluna do tipo de dados VARBYTE
<a name="copy-usage-varbyte"></a>

É possível carregar dados de arquivos no formato CSV, Parquet e ORC. Para CSV, os dados são carregados de um arquivo em representação hexadecimal dos dados VARBYTE. Não é possível carregar dados VARBYTE com a opção `FIXEDWIDTH`. Não há suporte para as opções `ADDQUOTES` ou `REMOVEQUOTES` de COPY. Uma coluna VARBYTE não pode ser usada como coluna de partição. 

# Erros durante a leitura de vários arquivos
<a name="copy-usage_notes-multiple-files"></a>

O comando COPY é atômico e transacional. Em outras palavras, mesmo quando o comando COPY lê dados de vários arquivos, todo o processo é tratado como uma única transação. Se encontrar um erro ao ler um arquivo, COPY será repetido automaticamente até o processo expirar (consulte [statement\$1timeout](r_statement_timeout.md)) ou se o download dos dados não puder ser feito no Amazon S3 por um período prolongado (entre 15 e 30 minutos), garantindo que cada arquivo seja carregado somente uma vez. Se o comando COPY falhar, toda a transação será cancelada, e todas as alterações serão revertidas. Para obter mais informações sobre como processar erros de carga, consulte [Solução de problemas de carregamento de dados](t_Troubleshooting_load_errors.md). 

Depois que for iniciado com êxito, não ocorrerá uma falha em um comando COPY se a sessão for concluída, por exemplo, quando o cliente se desconectar. Porém, se o comando COPY estiver dentro de um bloco de transação BEGIN … END não concluído porque a sessão foi encerrada, toda a transação, inclusive COPY, será restaurada. Para obter mais informações sobre transações, consulte [BEGIN](r_BEGIN.md).

# COPY no formato JSON
<a name="copy-usage_notes-copy-from-json"></a>

A estrutura de dados JSON é composta de um conjunto de objetos ou matrizes. Um *objeto* JSON começa e termina com chaves e contém uma coleção de pares de nome-valor desordenada. Cada nome e valor são separados por um dois-pontos, e os pares são separados por vírgulas. O nome é uma string entre aspas duplas. As aspas devem ser simples (0x22), e não inclinadas ou "inteligentes". 

Uma *matriz* JSON começa e termina com colchetes e contém uma coleção ordenada de valores separados por vírgulas. Um valor pode ser uma string entre aspas, um número, um verdadeiro ou falso Booliano, um nulo, um objeto JSON ou uma matriz. 

Os objetos JSON e as matrizes podem ser aninhados, o que possibilita uma estrutura de dados hierárquica. O exemplo a seguir mostra uma estrutura de dados JSON com dois objetos válidos. 

```
{
    "id": 1006410,
    "title": "Amazon Redshift Database Developer Guide"
}
{
    "id": 100540,
    "name": "Amazon Simple Storage Service User Guide"
}
```

A seguir, os mesmos dados como duas matrizes JSON.

```
[
    1006410,
    "Amazon Redshift Database Developer Guide"
]
[
    100540,
    "Amazon Simple Storage Service User Guide"
]
```

## Opções COPY para JSON
<a name="copy-usage-json-options"></a>

Você pode especificar as seguintes opções ao usar COPY com dados de formato JSON: 
+ `'auto' ` — COPY carrega automaticamente campos do arquivo JSON. 
+ `'auto ignorecase'` — COPY carrega automaticamente campos do arquivo JSON enquanto ignora as maiúsculas e minúsculas de nomes de campo.
+ `s3://jsonpaths_file` — COPY usa um arquivo JSONPaths para analisar nos dados de origem do JSON. Um *arquivo JSONPaths* é um arquivo de texto que contém um objeto JSON com o nome `"jsonpaths"` em par com uma matriz de expressões JSONPath. Se o nome for qualquer string além de `"jsonpaths"`, COPY usará o argumento `'auto'`, em vez de usar o arquivo JSONPaths. 

Para obter exemplos que mostrem como carregar dados usando `'auto'`, `'auto ignorecase'` ou um arquivo JSONPaths e usando objetos JSON ou matrizes, consulte [Copiar de exemplos JSON](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json). 

## Opção JSONPath
<a name="copy-usage-json-options"></a>

Na sintaxe do Amazon Redshift COPY, uma expressão JSONPath especifica o caminho explícito para um único elemento de nome em uma estrutura de dados hierárquica JSON, usando notação de colchetes ou notação de ponto. O Amazon Redshift não dá suporte a elementos JSONPath, como caracteres curinga ou expressões de filtro, que podem ser resolvidos para um caminho ambíguo ou vários elementos de nome. Dessa forma, o Amazon Redshift não pode analisar estruturas de dados complexas de vários níveis.

Este é um exemplo de um arquivo JSONPaths com expressões JSONPath usando a notação de colchetes. O cifrão (\$1) representa a estrutura no nível da raiz. 

```
{
    "jsonpaths": [
       "$['id']",
       "$['store']['book']['title']",
	"$['location'][0]" 
    ]
}
```

 No exemplo anterior, `$['location'][0]` referencia o primeiro elemento em uma matriz. JSON usa uma indexação de matriz baseada em zero. Os índices de matriz devem ser inteiros positivos (maiores ou iguais a zero).

O exemplo a seguir mostra o caminho JSONPath anterior usando notação de pontos. 

```
{
    "jsonpaths": [
       "$.id",
       "$.store.book.title",
	"$.location[0]"
    ]
}
```

Você não pode misturar notações de colchetes e pontos na matriz `jsonpaths`. Os colchetes podem ser usados nas notações de colchetes e de pontos para referenciar um elemento de matriz. 

Ao usar uma notação de pontos, as expressões JSONPath não deverão conter os seguintes caracteres: 
+ Aspas retas únicas ( ' ) 
+ Ponto final ou ponto ( . ) 
+ Colchetes ( [ ] ), a menos que sejam usados para referenciar um elemento de matriz 

Se o valor no par de nome-valor referenciado por uma expressão JSONPath for um objeto ou uma matriz, todo o objeto ou matriz será carregado como uma string, incluindo as chaves ou os colchetes. Por exemplo, suponhamos que os dados JSON contenham o objeto a seguir. 

```
{
    "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"
        }
    ]
}
```

Em seguida, a expressão JSONPath `$['tags']` retorna o valor a seguir. 

```
"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]" 
```

Em seguida, a expressão JSONPath `$['friends'][1]` retorna o valor a seguir. 

```
"{"id": 1,"name": "Renaldo"}" 
```

Cada expressão JSONPath na matriz `jsonpaths` corresponde a uma coluna na tabela de destino do Amazon Redshift. A ordem dos elementos de matriz `jsonpaths` deverá corresponder à ordem das colunas na tabela de destino ou na lista de colunas, se uma lista de colunas for usada. 

Para obter exemplos que mostrem como carregar dados usando o argumento `'auto'` ou um arquivo JSONPaths, e usando objetos JSON ou matrizes, consulte [Copiar de exemplos JSON](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json). 

Para obter informações sobre como copiar vários arquivos JSON, consulte [Uso de um manifesto para especificar arquivos de dados](loading-data-files-using-manifest.md).

## Caracteres de escape em JSON
<a name="copy-usage-json-escape-characters"></a>

COPY carrega `\n` como um caractere de nova linha e `\t` como um caractere de tabulação. Para carregar uma barra invertida, use uma barra invertida de escape ( `\\` ).

Por exemplo, suponhamos que você tenha o JSON a seguir em um arquivo chamado `escape.json` no 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."
}
```

Execute os comandos a seguir para criar a tabela ESCAPES e carregar o 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 a tabela ESCAPES para exibir os resultados.

```
select * from escapes;

       backslash        |      newline      |               tab
------------------------+-------------------+----------------------------------
 This is a backslash: \ | This sentence     | This sentence    contains a tab.
                        :  is on two lines.
(1 row)
```

## Perda de precisão numérica
<a name="copy-usage-json-rounding"></a>

É possível perder precisão ao carregar números de arquivos de dados no formato JSON para uma coluna definida como um tipo de dados numérico. Alguns valores de ponto flutuante não são representados exatamente nos sistemas de computação. Como resultado, os dados copiados de um arquivo JSON podem não ser arredondados conforme esperado. Para evitar a perda de precisão, recomendamos que você use uma das seguintes alternativas:
+ Representa o número como uma string, colocando o valor em caracteres de aspas duplas.
+ Use [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) para arredondar o número em vez de truncar.
+ Em vez de usar arquivos JSON ou Avro, use arquivos de texto CSV, delimitados por caracteres, ou de largura fixa.

# COPY de formatos de dados colunar
<a name="copy-usage_notes-copy-from-columnar"></a>

COPY pode carregar dados do Amazon S3 nos seguintes formatos colunares:
+ ORC
+ Parquet

Para obter exemplos do uso de COPY a partir de formatos de dados colunares, consulte [Exemplos de COPY](r_COPY_command_examples.md).

O comando COPY aceita dados formatados colunares com as seguintes considerações:
+ O bucket da Amazon S3 deve estar na mesma região da AWS que o banco de dados do Amazon Redshift. 
+ Para acessar seus dados do Amazon S3 por meio de um endpoint da VPC, configure o acesso usando políticas e perfis do IAM conforme descrito em “[Usar o Amazon Redshift Spectrum com roteamento aprimorado da VPC](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html)” no *Guia de gerenciamento de clusters do Amazon Redshift*. 
+ COPY não aplicará automaticamente as codificações de compactação. 
+ Apenas os parâmetros COPY a seguir são aceitos: 
  + [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars) ao copiar de um arquivo ORC ou 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)
+ Se COPY encontrar um erro ao carregar, o comando falhará. ACCEPTANYDATE e MAXERROR não são compatíveis com tipos de dados colunares.
+ Mensagens de erro são enviadas para o cliente SQL. Alguns erros são registrados em log em STL\$1LOAD\$1ERRORS e STL\$1ERROR.
+ COPY insere valores nas colunas da tabela de destino na mesma ordem das colunas ocorridas nos arquivos de dados colunares. O número de colunas na tabela de destino e o número de colunas no arquivo de dados devem combinar.
+ Se o arquivo especificado para a operação COPY incluir uma das seguintes extensões, os dados serão descompactados sem a necessidade de adicionar nenhum parâmetro: 
  + `.gz`
  + `.snappy`
  + `.bz2`
+ COPY dos formatos de arquivo Parquet e ORC usa o Redshift Spectrum e o acesso de bucket. Para usar COPY para esses formatos, verifique se não há políticas do IAM bloqueando o uso de URLs pré-assinados do Amazon S3. Os URLs pré-assinados gerados pelo Amazon Redshift são válidos por uma hora para que o Amazon Redshift tenha tempo suficiente para carregar todos os arquivos do bucket do Amazon S3. Um URL pré-assinado exclusivo é gerado para cada arquivo verificado pelo comando COPY com base em formatos de dados colunares. Para políticas de bucket que incluem uma ação `s3:signatureAge`, o valor deve ser definido como pelo menos 3.600.000 milissegundos. Para obter mais informações, consulte [Usar o Amazon Redshift Spectrum com o roteamento de VPC aprimorado](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html).
+ O parâmetro REGION não é compatível com COPY de formatos de dados colunares. Mesmo que o bucket do Amazon S3 e o banco de dados estejam na mesma Região da AWS, você poderá encontrar um erro, como REGION argument is not supported for PARQUET based COPY.
+ COPY de formatos colunares agora aceita a escalabilidade de simultaneidade. Para habilitar a escalabilidade de simultaneidade, consulte [Configurar filas de escalabilidade de simultaneidade](https://docs.aws.amazon.com/redshift/latest/dg/concurrency-scaling.html#concurrency-scaling-queues).

# Strings DATEFORMAT e TIMEFORMAT
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings"></a>

O comando COPY usa as opções DATEFORMAT e TIMEFORMAT para analisar valores de data e hora nos dados de origem. DATEFORMAT e TIMEFORMAT são strings formatadas que devem corresponder ao formato dos valores de data e hora dos dados de origem. Por exemplo, um comando COPY que carrega dados de origem com o valor da data `Jan-01-1999` deve incluir a seguinte string DATEFORMAT:

```
COPY ...
            DATEFORMAT AS 'MON-DD-YYYY'
```

Para obter mais informações sobre como gerenciar conversões de dados COPY, consulte [Parâmetros de conversão de dados](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-conversion.html). 

As strings DATEFORMAT e TIMEFORMAT podem conter separadores de data e hora (como “`-`”, “`/`” ou “`:`”), bem como os formatos datepart e timepart na tabela a seguir.

**nota**  
Se não for possível corresponder os formatos dos valores de data e hora com os dateparts e timeparts a seguir, ou se você tiver valores de data e hora com formatos diferentes entre si, use o argumento `'auto'` com o parâmetro DATEFORMAT ou TIMEFORMAT. O argumento `'auto'` reconhece diversos formatos incompatíveis ao usar uma string DATEFORMAT e TIMEFORMAT. Para obter mais informações, consulte [Usar o reconhecimento automático com DATEFORMAT e TIMEFORMAT](automatic-recognition.md).

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

O formato de data padrão é YYYY-MM-DD. O formato de carimbo de data/hora padrão sem fuso horário (TIMESTAMP) é YYYY-MM-DD HH:MI:SS. O formato de carimbo de data/hora padrão com formato de fuso horário (TIMESTAMPTZ) é YYYY-MM-DD HH:MI:SSOF, em que OF é o deslocamento de UTC (por exemplo, -8:00). Você não pode incluir um especificador de fuso horário (TZ, tz ou OF) no timeformat\$1string. O campo de segundos (SS) também dá suporte a segundos fracionários até um nível de microssegundo. Para carregar dados TIMESTAMPTZ em um formato diferente do formato padrão, especifique 'auto'.

A seguir estão alguns exemplos de datas e horas que você pode encontrar em seus dados de origem e as strings DATEFORMAT ou TIMEFORMAT correspondentes a eles.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

## Exemplo
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings-examples"></a>

Para ver um exemplo do uso de TIMEFORMAT, consulte [Carregar um time stamp ou date stamp](r_COPY_command_examples.md#r_COPY_command_examples-load-a-time-datestamp).

# Usar o reconhecimento automático com DATEFORMAT e TIMEFORMAT
<a name="automatic-recognition"></a>

Se você especificar `'auto'` como o argumento para o parâmetro DATEFORMAT ou TIMEFORMAT, o Amazon Redshift reconhecerá automaticamente e converterá o formato de data ou o formato de hora nos dados de origem. Por exemplo:

```
copy favoritemovies from 'dynamodb://ProductCatalog' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
dateformat 'auto';
```

Quando usado com o argumento `'auto'` para DATEFORMAT e TIMEFORMAT, COPY reconhece e converte os formatos de data e hora listados na tabela em [Strings DATEFORMAT e TIMEFORMATExemplo](r_DATEFORMAT_and_TIMEFORMAT_strings.md). Além disso, o argumento `'auto'` reconhece os seguintes formatos não compatíveis ao usar uma string DATEFORMAT e TIMEFORMAT.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/automatic-recognition.html)

O reconhecimento automático não dá suporte a epochsecs e epochmillisecs.

Para testar se um valor de data ou de data e hora será convertido automaticamente, use uma função CAST para tentar converter a string em um valor de data ou de data e hora. Por exemplo, os comandos a seguir testam o valor de data e hora `'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
```

Se os dados de origem de uma coluna DATA incluírem informações de hora, o componente de hora será truncado. Se os dados de origem de uma coluna TIMESTAMP omitirem informações de hora, 00:00:00 será usado para o componente de hora.

# Exemplos de COPY
<a name="r_COPY_command_examples"></a>

**nota**  
Estes exemplos contêm quebras de linha para garantir legibilidade. Não inclua quebras de linha nem espaços na string *credentials-args*.

**Topics**
+ [Carregar FAVORITEMOVIES de uma tabela do DynamoDB](#r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table)
+ [Carregar LISTING de um bucket do Amazon S3](#r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket)
+ [Carregar LISTING de um cluster do Amazon EMR](#copy-command-examples-emr)
+ [Example: COPY from Amazon S3 using a manifest](#copy-command-examples-manifest)
+ [Carregar LISTING de um arquivo delimitado por barras (delimitador padrão)](#r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter)
+ [Carregar LISTING usando dados de colunas no formato Parquet](#r_COPY_command_examples-load-listing-from-parquet)
+ [Carregar LISTING usando dados de colunas no formato ORC](#r_COPY_command_examples-load-listing-from-orc)
+ [Carregar EVENT com opções](#r_COPY_command_examples-load-event-with-options)
+ [Carregar VENUE de um arquivo de dados de largura fixa](#r_COPY_command_examples-load-venue-from-a-fixed-width-data-file)
+ [Carregar CATEGORY de um arquivo CSV](#load-from-csv)
+ [Carregar VENUE com valores explícitos para uma coluna IDENTITY](#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)
+ [Carregar TIME de um arquivo GZIP delimitado por barras](#r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file)
+ [Carregar um time stamp ou date stamp](#r_COPY_command_examples-load-a-time-datestamp)
+ [Carregar dados de um arquivo com valores padrão](#r_COPY_command_examples-load-data-from-a-file-with-default-values)
+ [Dados de COPY com a opção ESCAPE](#r_COPY_command_examples-copy-data-with-the-escape-option)
+ [Copiar de exemplos JSON](#r_COPY_command_examples-copy-from-json)
+ [Copiar de exemplos Avro](#r_COPY_command_examples-copy-from-avro)
+ [Preparar arquivos para COPY com a opção ESCAPE](#r_COPY_preparing_data)
+ [Carregar um shapefile no Amazon Redshift](#copy-example-spatial-copy-shapefile)
+ [Comando COPY com a opção NOLOAD](#r_COPY_command_examples-load-noload-option)
+ [Comando COPY com um delimitador multibyte e a opção ENCODING](#r_COPY_command_examples-load-encoding-multibyte-delimiter-option)

## Carregar FAVORITEMOVIES de uma tabela do DynamoDB
<a name="r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table"></a>

Os SDKs da AWS incluem um exemplo simples de como criar uma tabela do DynamoDB chamada *Movies*. (Para esse exemplo, consulte [Conceitos básicos do DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.html).) O exemplo a seguir carrega a tabela MOVIES do Amazon Redshift com dados da tabela do DynamoDB. A tabela do Amazon Redshift já deve existir no banco de dados.

```
copy favoritemovies from 'dynamodb://Movies'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
readratio 50;
```

## Carregar LISTING de um bucket do Amazon S3
<a name="r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket"></a>

O exemplo a seguir carrega LISTING de um bucket do Amazon S3. O comando COPY carrega todos os arquivos na pasta `/data/listing/`.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listing/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Carregar LISTING de um cluster do Amazon EMR
<a name="copy-command-examples-emr"></a>

O exemplo a seguir carrega a tabela SALES com dados delimitados por tabulação de arquivos compactados por lzop em um cluster do Amazon EMR. COPY carrega cada arquivo na pasta `myoutput/` que começa com `part-`.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '\t' lzop;
```

O exemplo a seguir carrega a tabela SALES com dados formatados JSON em um cluster do Amazon EMR. COPY carrega cada arquivo na pasta `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 um manifesto para especificar arquivos de dados
<a name="copy-command-examples-manifest"></a>

Você pode usar um manifesto para garantir que o comando COPY carregue todos os arquivos necessários, e somente os arquivos necessários, do Amazon S3. Você também pode usar um manifesto ao precisar carregar vários arquivos de buckets diferentes ou arquivos que não tenham o mesmo prefixo. 

Por exemplo, suponha que você precise carregar os seguintes três arquivos: `custdata1.txt`, `custdata2.txt` e `custdata3.txt`. Você pode usar o seguinte comando para carregar todos os arquivos em `amzn-s3-demo-bucket` que comecem com `custdata` especificando um prefixo: 

```
copy category
from 's3://amzn-s3-demo-bucket/custdata' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Se somente dois dos arquivos existirem por causa de um erro, COPY carrega somente esses dois arquivos e será concluído com êxito, resultando em uma carga de dados incompleta. Se o bucket também contiver um arquivo indesejado que acabe usando o mesmo prefixo, como um arquivo chamado `custdata.backup` por exemplo, COPY carregará esse arquivo também, resultando no carregamento de dados indesejados.

Para garantir que todos os arquivos necessários sejam carregados e para evitar que arquivos indesejados sejam carregados, você pode usar um arquivo manifesto. O manifesto é um arquivo de texto formatado em JSON que lista os arquivos a serem processados pelo comando COPY. Por exemplo, o manifesto a seguir carrega os três arquivos no exemplo 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
      }
   ]
}
```

O sinalizador `mandatory` opcional indica se COPY deverá ser encerrado se o arquivo não existir. O padrão é `false`. Independentemente de qualquer configuração obrigatória, o COPY encerra se nenhum arquivo for encontrado. Neste exemplo, COPY retornará um erro se algum dos arquivos não for encontrado. Arquivos indesejados que possam ter sido escolhidos se você tiver especificado somente um prefixo de chaves, como `custdata.backup`, são ignorados, pois não estão no manifesto. 

Ao carregar arquivos de dados em ORC ou em formato Parquet, um campo `meta` é necessário, conforme exibido no seguinte exemplo.

```
{  
   "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
         }
      }
   ]
}
```

O exemplo a seguir usa um manifesto nomeado `cust.manifest`. 

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc
manifest;
```

Você pode usar um manifesto para carregar vários arquivos de buckets diferentes ou arquivos que não compartilham o mesmo prefixo. O exemplo a seguir mostra o JSON para carregar dados com arquivos cujos nomes começam com uma data e hora.

```
{
  "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}
  ]
}
```

O manifesto pode listar arquivos em buckets diferentes, desde que os buckets estejam na mesma região da AWS do cluster. 

```
{
  "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}
  ]
}
```

## Carregar LISTING de um arquivo delimitado por barras (delimitador padrão)
<a name="r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter"></a>

O exemplo a seguir é um caso muito simples em que nenhuma opção é especificada e o arquivo de entrada contém o delimitador padrão, um caractere de barra ('\$1'). 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Carregar LISTING usando dados de colunas no formato Parquet
<a name="r_COPY_command_examples-load-listing-from-parquet"></a>

O exemplo a seguir carrega dados de uma pasta no Amazon S3, chamada Parquet. 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/parquet/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as parquet;
```

## Carregar LISTING usando dados de colunas no formato ORC
<a name="r_COPY_command_examples-load-listing-from-orc"></a>

O exemplo a seguir carrega dados de uma pasta no Amazon S3, chamada `orc`. 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/orc/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc;
```

## Carregar EVENT com opções
<a name="r_COPY_command_examples-load-event-with-options"></a>

O exemplo a seguir carrega dados delimitados por barra na tabela EVENT e aplica as seguintes regras: 
+ Se forem usados para todas as strings de caracteres, os pares de aspas serão removidos.
+ As strings vazias e as que contêm espaços em branco serão carregadas como valores NULL.
+ A carga falha se mais de 5 erros forem retornados.
+ Os valores de data e hora devem respeitar o formato especificado; por exemplo, uma data e hora válida é `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';
```

## Carregar VENUE de um arquivo de dados de largura fixa
<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';
```

O exemplo anterior pressupõe um arquivo de dados formatado da mesma maneira que os dados de exemplo mostrados. No exemplo a seguir, os espaços funcionam como espaços reservados, de maneira que todas as colunas tenham a mesma largura conforme observado na especificação: 

```
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
```

## Carregar CATEGORY de um arquivo CSV
<a name="load-from-csv"></a>

Suponhamos que você queira carregar CATEGORY com os valores mostrados na tabela a seguir.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_COPY_command_examples.html)

O exemplo a seguir mostra o conteúdo de um arquivo de texto com os valores de campo separados por vírgulas.

```
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
```

Se você carregar o arquivo usando o parâmetro DELIMITER para especificar uma entrada delimitada por vírgulas, o comando COPY falha porque alguns campos de entrada contêm vírgulas. Você pode evitar esse problema usando o parâmetro CSV e colocando os campos que contenham vírgulas entre aspas. Se as aspas forem exibidas dentro de uma string com aspas, você precisará escapá-las dobrando as aspas. Como as aspas padrão são duplas, você precisa escapar todas as aspas duplas com aspas adicionais. O novo arquivo de entrada é algo assim. 

```
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"
```

Supondo que o nome de arquivo seja `category_csv.txt`, você pode carregar o arquivo usando o seguinte comando COPY:

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv;
```

Como alternativa, para evitar a necessidade de escapar as aspas duplas na entrada, você pode especificar aspas diferentes usando o parâmetro QUOTE AS. Por exemplo, a versão a seguir de `category_csv.txt` usa '`%`' como aspas.

```
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%
```

O seguinte comando COPY usa QUOTE AS para carregar `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 '%';
```

## Carregar VENUE com valores explícitos para uma coluna IDENTITY
<a name="r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column"></a>

O exemplo a seguir pressupõe que, quando a tabela VENUE foi criada, pelo menos uma coluna (como a coluna `venueid`) foi especificada para ser uma coluna IDENTITY. Esse comando substitui o comportamento de IDENTITY padrão de valores gerados automaticamente para uma coluna IDENTITY e, em vez disso, carrega os valores explícitos do arquivo venue.txt. O Amazon Redshift não verifica se valores de IDENTITY duplicados são carregados na tabela ao usar a opção EXLICIT\$1IDS. 

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
explicit_ids;
```

## Carregar TIME de um arquivo GZIP delimitado por barras
<a name="r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file"></a>

O seguinte exemplo carrega a tabela TIME de um arquivo GZIP delimitado por barras:

```
copy time
from 's3://amzn-s3-demo-bucket/data/timerows.gz' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
gzip
delimiter '|';
```

## Carregar um time stamp ou date stamp
<a name="r_COPY_command_examples-load-a-time-datestamp"></a>

O exemplo a seguir carrega dados com uma data e hora formatada.

**nota**  
O TIMEFORMAT de `HH:MI:SS` também pode dar suporte a segundos fracionários além do `SS` para um nível detalhado de microssegundos. O arquivo `time.txt` usado nesse exemplo contém uma linha `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';
```

O resultado dessa cópia é o seguinte: 

```
select * from timestamp1;
c1
----------------------------
2009-01-12 14:15:57.119568
(1 row)
```

## Carregar dados de um arquivo com valores padrão
<a name="r_COPY_command_examples-load-data-from-a-file-with-default-values"></a>

O exemplo a seguir usa uma variação da tabela VENUE no banco de dados TICKIT. Leve em consideração uma tabela VENUE\$1NEW definida com o seguinte comando: 

```
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');
```

Leve em consideração um arquivo de dados venue\$1noseats.txt que não contenha valores para a coluna VENUESEATS, conforme mostrado no seguinte exemplo: 

```
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|
```

A seguinte instrução COPY carregará com êxito a tabela do arquivo e aplicará o valor DEFAULT ('1000') à coluna 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 '|';
```

Agora veja a tabela carregada: 

```
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 o seguinte exemplo, além de pressupor que nenhum dado de VENUESEATS esteja incluído no arquivo, também pressuponha que não haja dados VENUENAME incluídos: 

```
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|
```

 Usando a mesma definição de tabela, a seguinte instrução COPY falha porque nenhum valor DEFAULT foi especificado para VENUENAME, e VENUENAME é uma coluna 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 '|';
```

Agora leve em consideração uma variação da tabela VENUE que usa uma coluna 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');
```

Assim como acontece com o exemplo anterior, pressuponha que a coluna VENUESEATS não tenha valores correspondentes no arquivo de origem. A instrução COPY a seguir carrega a tabela com êxito, inclusive os valores de dados IDENTITY predefinidos em vez de gerar automaticamente esses 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;
```

Ocorre uma falha nessa instrução porque não inclui a coluna IDENTITY (VENUEID não é encontrado na lista de colunas), além de incluir um 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;
```

Ocorre uma falha nessa instrução porque não inclui um 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 '|';
```

## Dados de COPY com a opção ESCAPE
<a name="r_COPY_command_examples-copy-data-with-the-escape-option"></a>

O exemplo a seguir mostra como carregar caracteres correspondentes ao caractere delimitador (nesse caso, o caractere de barra). No arquivo de entrada, verifique se todos os caracteres de barra (\$1) que você deseja carregar sejam escapados com o caractere de barra invertida (\$1). Em seguida, carregue o arquivo com o 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)
```

Sem o parâmetro ESCAPE, esse comando COPY falha com um erro `Extra column(s) found`.

**Importante**  
Se carregar os dados usando um COPY com o parâmetro ESCAPE, você também deverá especificar o parâmetro ESCAPE com o comando UNLOAD para gerar o arquivo de saída recíproco. Da mesma maneira, se usar UNLOAD com o parâmetro ESCAPE, você precisa usar ESCAPE quando usar o comando COPY nos mesmos dados.

## Copiar de exemplos JSON
<a name="r_COPY_command_examples-copy-from-json"></a>

Nos exemplos a seguir, você carrega a tabela CATEGORY com os dados a seguir. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ [Carregar de dados JSON usando a opção "auto"](#copy-from-json-examples-using-auto)
+ [Carregar de dados JSON usando a opção "auto ignorecase"](#copy-from-json-examples-using-auto-ignorecase)
+ [Carregar de dados JSON usando um arquivo JSONPaths](#copy-from-json-examples-using-jsonpaths)
+ [Carregar de matrizes JSON usando um arquivo JSONPaths](#copy-from-json-examples-using-jsonpaths-arrays)

### Carregar de dados JSON usando a opção "auto"
<a name="copy-from-json-examples-using-auto"></a>

Para carregar de dados JSON usando o argumento `'auto'`, os dados JSON devem consistir em um conjunto de objetos. Os nomes de chave devem corresponder aos nomes de coluna, mas, nesse caso, a ordem não importa. A seguir, o conteúdo de um arquivo chamado `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 carregar do arquivo de dados JSON no exemplo anterior, execute o comando COPY a seguir.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto';
```

### Carregar de dados JSON usando a opção "auto ignorecase"
<a name="copy-from-json-examples-using-auto-ignorecase"></a>

Para carregar de dados JSON usando o argumento `'auto ignorecase'`, os dados JSON devem consistir em um conjunto de objetos. As maiúsculas e minúsculas dos nomes de chave não precisam corresponder aos nomes de coluna e a ordem não importa. A seguir, o conteúdo de um arquivo chamado `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 carregar do arquivo de dados JSON no exemplo anterior, execute o comando COPY a seguir.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto ignorecase.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto ignorecase';
```

### Carregar de dados JSON usando um arquivo JSONPaths
<a name="copy-from-json-examples-using-jsonpaths"></a>

Se os objetos de dados JSON não corresponderem diretamente aos nomes de coluna, você poderá usar um arquivo JSONPaths a fim de mapear os elementos JSON para colunas. Além disso, a ordem não importa nos dados de origem JSON, mas a ordem das expressões do arquivo JSONPaths deve corresponder à ordem da coluna. Suponha que você tenha o seguinte arquivo de dados, chamado `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"
}
```

O arquivo JSONPaths a seguir, chamado `category_jsonpath.json`, mapeia os dados de origem para as colunas de tabela.

```
{
    "jsonpaths": [
        "$['one']",
        "$['two']",
        "$['three']",
        "$['four']"
    ]
}
```

Para carregar do arquivo de dados JSON no exemplo anterior, execute o comando COPY a seguir.

```
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';
```

### Carregar de matrizes JSON usando um arquivo JSONPaths
<a name="copy-from-json-examples-using-jsonpaths-arrays"></a>

Para carregar de dados JSON que consistem em um conjunto de matrizes, você deve usar um arquivo JSONPaths a fim de mapear os elementos de matriz para as colunas. Suponha que você tenha o seguinte arquivo de dados, chamado `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"]
```

O arquivo JSONPaths a seguir, chamado `category_array_jsonpath.json`, mapeia os dados de origem para as colunas de tabela.

```
{
    "jsonpaths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]"
    ]
}
```

Para carregar do arquivo de dados JSON no exemplo anterior, execute o comando COPY a seguir.

```
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';
```

## Copiar de exemplos Avro
<a name="r_COPY_command_examples-copy-from-avro"></a>

Nos exemplos a seguir, você carrega a tabela CATEGORY com os dados a seguir. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ [Carregar de dados Avro usando a opção "auto"](#copy-from-avro-examples-using-auto)
+ [Carregar de dados Avro usando a opção "auto ignorecase"](#copy-from-avro-examples-using-auto-ignorecase)
+ [Carregar de dados Avro usando um arquivo JSONPaths](#copy-from-avro-examples-using-avropaths)

### Carregar de dados Avro usando a opção "auto"
<a name="copy-from-avro-examples-using-auto"></a>

Para carregar de dados Avro usando o argumento `'auto'`, os nomes de campo no esquema Avro devem corresponder aos nomes de coluna. Durante o uso do argumento `'auto'`, a ordem não importa. A seguir, o esquema de um arquivo chamado `category_auto.avro`.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "catid", "type": "int"},
        {"name": "catdesc", "type": "string"},
        {"name": "catname", "type": "string"},
        {"name": "catgroup", "type": "string"},
}
```

Como estão em formato binário, os dados em um arquivo Avro não são legíveis. A seguir, uma representação JSON dos dados no arquivo `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 carregar do arquivo de dados Avro no exemplo anterior, execute o comando COPY a seguir.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto';
```

### Carregar de dados Avro usando a opção "auto ignorecase"
<a name="copy-from-avro-examples-using-auto-ignorecase"></a>

Para carregar de dados Avro usando o argumento `'auto ignorecase'`, a maiúscula e minúscula nos nomes de campo no esquema Avro devem corresponder aos nomes de coluna. Durante o uso do argumento `'auto ignorecase'`, a ordem não importa. A seguir, o esquema de um arquivo chamado `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"},
}
```

Como estão em formato binário, os dados em um arquivo Avro não são legíveis. A seguir, uma representação JSON dos dados no arquivo `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 carregar do arquivo de dados Avro no exemplo anterior, execute o comando COPY a seguir.

```
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';
```

### Carregar de dados Avro usando um arquivo JSONPaths
<a name="copy-from-avro-examples-using-avropaths"></a>

Se os nomes de campo no esquema Avro não corresponderem diretamente aos nomes de coluna, você poderá usar um arquivo JSONPaths a fim de mapear os elementos de esquema para colunas. A ordem das expressões do arquivo JSONPaths deve corresponder à ordem das colunas. 

Suponha que você tenha um arquivo de dados chamado `category_paths.avro` contendo os mesmos dados do exemplo anterior, mas com o esquema a seguir.

```
{
    "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"} 
     ]
}
```

O arquivo JSONPaths a seguir, chamado `category_path.avropath`, mapeia os dados de origem para as colunas de tabela.

```
{
    "jsonpaths": [
        "$['id']",
        "$['group']",
        "$['name']",
        "$['desc']"
    ]
}
```

Para carregar do arquivo de dados Avro no exemplo anterior, execute o comando COPY a seguir.

```
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 ';
```

## Preparar arquivos para COPY com a opção ESCAPE
<a name="r_COPY_preparing_data"></a>

O exemplo a seguir descreve como convém preparar dados para "escapar" caracteres de nova linha antes de importar os dados para uma tabela do Amazon Redshift usando o comando COPY com o parâmetro ESCAPE. Sem preparar os dados para delimitar os caracteres de nova linha, o Amazon Redshift retorna erros de carga quando você executar o comando COPY, porque o caractere de nova linha normalmente é usado como um separador de registros. 

Por exemplo, leve em consideração um arquivo ou uma coluna em uma tabela externa que você deseja copiar para uma tabela do Amazon Redshift. Se o arquivo ou a coluna apresentar conteúdo formatado em XML ou dados semelhantes, você precisa verificar se todos os caracteres de nova linha (\$1n) que fazem parte do conteúdo são escapados com o caractere de barra invertida (\$1). 

Um arquivo ou tabela contendo caracteres de nova linha incorporados fornece um padrão relativamente fácil de combinar. Cada caractere de nova linha interno quase sempre vem depois de um caractere `>` com alguns caracteres de espaço em branco em potencial (`' '` ou tabulação) entre eles, como você pode ver no exemplo a seguir de um arquivo de texto chamado `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
```

Com o exemplo a seguir, você pode executar um utilitário de processamento de texto para pré-processar o arquivo de origem e inserir os caracteres de escape quando necessário. (O caractere `|` deve ser usado como delimitador para separar dados de coluna quando copiados para uma tabela do Amazon Redshift.) 

```
$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g' nlTest1.txt > nlTest2.txt
```

Da mesma maneira, você pode usar Perl para realizar uma operação semelhante: 

```
cat nlTest1.txt | perl -p -e 's/>\s*\n/>\\\n/g' > nlTest2.txt
```

Para acomodar ao carregamento dos dados do arquivo `nlTest2.txt` para o Amazon Redshift, criamos uma tabela de duas colunas no Amazon Redshift. A primeira coluna c1 é uma coluna de caracteres que mantém o conteúdo formatado do arquivo `nlTest2.txt`. A segunda coluna c2 mantém valores inteiros carregados do mesmo arquivo. 

Depois de executar o comando `sed`, você poderá carregar corretamente dados do arquivo `nlTest2.txt` para uma tabela do Amazon Redshift usando o parâmetro ESCAPE. 

**nota**  
Quando você inclui o parâmetro ESCAPE com o comando COPY, ele escapa vários caracteres especiais, dentre os quais estão caractere de barra invertida (inclusive nova linha). 

```
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)
```

Você pode preparar arquivos de dados exportados de bancos de dados externos de maneira semelhante. Por exemplo, com um banco de dados Oracle, você pode usar a função REPLACE em cada coluna afetada em uma tabela que deseja copiar para o Amazon Redshift. 

```
SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml
```

Além disso, muitas ferramentas Export e Extract, Transform, Load (ETL – Exportação e extração, transformação, carga) de banco de dados que processam sempre muitos dados oferecem opções para especificar caracteres de escape e delimitadores. 

## Carregar um shapefile no Amazon Redshift
<a name="copy-example-spatial-copy-shapefile"></a>

Os exemplos a seguir demonstram como carregar um shapefile da Esri usando COPY. Para obter mais informações o carregamento de shapefiles, consulte [Carregar um shapefile no Amazon Redshift](spatial-copy-shapefile.md). 

### Carregar um shapefile
<a name="copy-example-spatial-copy-shapefile-loading-copy"></a>

As etapas a seguir mostram como ingerir dados do OpenStreetMap do Amazon S3 usando o comando COPY. Este exemplo pressupõe que o arquivo shapefile da Noruega do [site de download de Geofabrik](https://download.geofabrik.de/europe.html) foi carregado para um bucket privado do Amazon S3 em sua região da AWS. Os arquivos `.shp`, `.shx` e`.dbf` devem compartilhar o mesmo prefixo do Amazon S3 e nome de arquivo.

#### Ingestão de dados sem simplificação
<a name="spatial-copy-shapefile-loading-copy-fits"></a>

Os comandos a seguir criam tabelas e ingerem dados que podem caber no tamanho máximo da geometria sem qualquer simplificação. Abra o `gis_osm_natural_free_1.shp` em seu software GIS preferido e inspecione as colunas nesta camada. Por padrão, as colunas IDENTITY ou GEOMETRY são as primeiras. Quando uma coluna GEOMETRY é a primeira, você pode criar a tabela como mostrado a seguir.

```
CREATE TABLE norway_natural (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Ou, quando uma coluna IDENTITY é a primeira, você pode criar a tabela como mostrado a seguir.

```
CREATE TABLE norway_natural_with_id (
   fid INT IDENTITY(1,1),
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Agora você pode ingerir os dados usando 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
```

Ou você pode ingerir os dados como mostrado a seguir. 

```
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.
```

#### Ingestão de dados com simplificação
<a name="spatial-copy-shapefile-loading-copy-no-fit"></a>

Os comandos a seguir criam uma tabela e tentam ingerir dados que não podem caber no tamanho máximo da geometria sem qualquer simplificação. Inspecione o shapefile `gis_osm_water_a_free_1.shp` e crie a tabela apropriada como mostrado a seguir.

```
CREATE TABLE norway_water (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Quando o comando COPY é executado, isso resulta em um erro.

```
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.
```

Consultar `STL_LOAD_ERRORS` mostra que a geometria é muito 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 isso, o parâmetro `SIMPLIFY AUTO` é adicionado ao comando COPY para simplificar geometrias.

```
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 exibir as linhas e geometrias que foram simplificadas, 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
```

Utilizar SIMPLIFY AUTO *max\$1tolerance* com a tolerância menor do que as calculadas automaticamente provavelmente resulta em um erro de ingestão. Nesse caso, use MAXERROR para ignorar erros.

```
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` novamente para identificar o registro que COPY não conseguiu carregar.

```
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
```

Neste exemplo, o primeiro registro não conseguiu caber, então o `simplified` está mostrando “false”. O segundo registro foi carregado dentro da tolerância dada. No entanto, o tamanho final é maior do que usar a tolerância calculada automaticamente sem especificar a tolerância máxima. 

### Carregar a partir de um shapefile compactado
<a name="copy-example-spatial-copy-shapefile-compressed"></a>

O Amazon Redshift COPY oferece suporte à ingestão de dados de um shapefile compactado. Todos os componentes shapefile devem ter o mesmo prefixo do Amazon S3 e o mesmo sufixo de compactação. Como exemplo, suponha que você deseja carregar os dados do exemplo anterior. Neste caso, os arquivos `gis_osm_water_a_free_1.shp.gz`, `gis_osm_water_a_free_1.dbf.gz`, e `gis_osm_water_a_free_1.shx.gz` devem compartilhar o mesmo diretório do Amazon S3. O comando COPY requer a opção GZIP e a cláusula FROM deve especificar o arquivo compactado correto, conforme mostrado a seguir.

```
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.
```

### Carregar dados em uma tabela com uma ordem de coluna diferente
<a name="copy-example-spatial-copy-shapefile-column-order"></a>

Se você tiver uma tabela que não tenha `GEOMETRY` como a primeira coluna, você pode usar o mapeamento de coluna para mapear colunas para a tabela de destino. Por exemplo, crie uma tabela com `osm_id` especificado como uma primeira coluna.

```
CREATE TABLE norway_natural_order (
   osm_id BIGINT,
   wkb_geometry GEOMETRY,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Em seguida, faça a ingestão de um shapefile usando o mapeamento de coluna.

```
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.
```

### Carregar dados em uma tabela com uma coluna geography
<a name="copy-example-spatial-copy-shapefile-geography"></a>

Caso você tenha uma tabela com uma coluna `GEOGRAPHY`, ingira primeiro para uma coluna `GEOMETRY` e converta os objetos para objetos `GEOGRAPHY`. Por exemplo, depois de copiar seu arquivo de formato para uma coluna `GEOMETRY`, altere a tabela para adicionar uma coluna do tipo de dados `GEOGRAPHY`.

```
ALTER TABLE norway_natural ADD COLUMN wkb_geography GEOGRAPHY;
```

Então converta geometrias em geografias.

```
UPDATE norway_natural SET wkb_geography = wkb_geometry::geography;
```

Se preferir, você pode descartar a coluna `GEOMETRY`.

```
ALTER TABLE norway_natural DROP COLUMN wkb_geometry;
```

## Comando COPY com a opção NOLOAD
<a name="r_COPY_command_examples-load-noload-option"></a>

Para validar os arquivos de dados antes de realmente carregar os dados, use a opção NOLOAD com o comando COPY. O Amazon Redshift analisa o arquivo de entrada e exibe todos os erros que ocorrem. O exemplo a seguir usa a opção NOLOAD e nenhuma linha é realmente carregada na tabela.

```
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 com um delimitador multibyte e a opção ENCODING
<a name="r_COPY_command_examples-load-encoding-multibyte-delimiter-option"></a>

O exemplo a seguir carrega LATIN1 de um arquivo do Amazon S3 que contém dados multibyte. O comando COPY especifica o delimitador `\302\246\303\254` em formato octal para separar os campos no arquivo de entrada que é codificado como ISO-8859-1. Para indicar o mesmo delimitador em UTF-8, especifique `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>

Cria um novo banco de dados.

Para criar um banco de dados, é necessário ser um superusuário ou ter o privilégio CREATEDB. Para criar um banco de dados associado a uma integração ETL zero, é necessário ser um superusuário ou ter os privilégios CREATEDB e CREATEUSER.

Não é possível executar CREATE DATABASE em um bloco de transação (BEGIN ... END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

## Sintaxe
<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 }
]
```

## Parâmetros
<a name="r_CREATE_DATABASE-parameters"></a>

 *database\$1name*   
Nome do novo banco de dados. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

FROM INTEGRATION '<integration\$1id>' [ DATABASE '<source\$1database>' ]   
Especifica se o banco de dados deve ser criado usando um identificador de integração ETL zero. É possível recuperar o `integration_id` da visualização do sistema SVV\$1INTEGRATION. Em integrações ETL zero do Aurora PostgreSQL, você também precisa especificar o nome `source_database`, que também pode ser recuperado em SVV\$1INTEGRATION.  
Para ver um exemplo, consulte [Criar bancos de dados para receber resultados de integrações ETL zero](#r_CREATE_DATABASE-integration). Consulte mais informações sobre a criação de bancos de dados com integrações ETL zero em [Criar bancos de dados de destino no Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html) no *Guia de gerenciamento do Amazon Redshift*.

SET  
Palavra-chave opcional.

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
A cláusula ACCEPTINVCHARS define se as tabelas de integração ETL zero devem continuar com a ingestão quando caracteres inválidos são detectados para o tipo de dados VARCHAR. Quando um caractere inválido é encontrado, ele é substituído por um caractere padrão `?`.

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
A cláusula QUERY\$1ALL\$1STATES define se as tabelas de integração ETL zero podem ser consultadas em todos os estados (`Synced`, `Failed`, `ResyncRequired` e `ResyncInitiated`). Por padrão, uma tabela de integração ETL zero só pode ser consultada no estado `Synced`.

REFRESH\$1INTERVAL <interval>  
A cláusula REFRESH\$1INTERVAL define o intervalo de tempo aproximado, em segundos, para atualizar os dados da origem de ETL zero para o banco de dados de destino. O valor pode ser definido de 0 a 432.000 segundos (5 dias) para integrações ETL zero cujo tipo de fonte é o Aurora MySQL, o Aurora PostgreSQL ou o RDS para MySQL. Para integrações ETL zero do Amazon DynamoDB, o valor pode ser definido de 900 a 432.000 segundos (15 minutos a 5 dias). O `interval` padrão é zero (0) segundo para integrações ETL zero cujo tipo de origem é o Aurora MySQL, o Aurora PostgreSQL ou o RDS para MySQL. Para integrações ETL zero do Amazon DynamoDB, o `interval` padrão é 900 segundos (15 minutos).

TRUNCATECOLUMNS [=] \$1 TRUE \$1 FALSE \$1  
A cláusula TRUNCATECOLUMNS define se as tabelas de Integração ETL zero devem continuar com a ingestão quando os valores dos atributos das colunas VARCHAR ou SUPER estão além do limite. Quando `TRUE`, os valores são truncados para caber na coluna e os valores dos atributos JSON em excesso são truncados para caber na coluna SUPER.

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1  
Uma cláusula que especifica se o Amazon Redshift vai definir o modo histórico para todas as novas tabelas no banco de dados especificado. Essa opção é aplicável somente para bancos de dados criados para integração ETL zero.  
A cláusula HISTORY\$1MODE pode ser definida como `TRUE` ou `FALSE`. O padrão é `FALSE`. Consulte informações sobre HISTORY\$1MODE em [History mode](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html) no *Guia de gerenciamento do Amazon Redshift*.

WITH  
Palavra-chave opcional.

OWNER [=] db\$1owner  
Especifica o nome de usuário do proprietário do banco de dados.

CONNECTION LIMIT \$1 *limite* \$1 UNLIMITED \$1   
Número máximo de conexões de banco de dados que os usuários podem abrir simultaneamente. Não há aplicação de limite para superusuários. Use a palavra-chave UNLIMITED para permitir o número máximo de conexões simultâneas. Um limite no número de conexões para cada usuário também pode ser aplicável. Para obter mais informações, consulte [CREATE USER](r_CREATE_USER.md). O valor padrão é UNLIMITED. Para visualizar as conexões atuais, consulte a exibição [STV\$1SESSIONS](r_STV_SESSIONS.md) do sistema.  
Se limites de usuário e de conexão de banco de dados forem aplicáveis, um slot de conexão não utilizado que esteja dentro de ambos os limites deve estar disponível quando um usuário tenta se conectar.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Uma cláusula que especifica se a pesquisa ou comparação de string distingue ou não maiúsculas e minúsculas. O padrão é distingue maiúsculas e minúsculas.  
Não é possível usar COLLATE ao criar um banco de dados com base em uma unidade de compartilhamento de dados.  
CASE\$1SENSITIVE e CS são intercambiáveis e geram os mesmos resultados. Da mesma forma, CASE\$1INSENSITIVE e CI são intercambiáveis e geram os mesmos resultados.

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
Uma cláusula que especifica o nível de isolamento usado quando são executadas consultas em um banco de dados. Para acessar mais informações sobre níveis de isolamento, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md).  
+ Isolamento SNAPSHOT: fornece um nível de isolamento com proteção contra conflitos de atualização e exclusão. Esse é o padrão para um banco de dados criado em um cluster provisionado ou um namespace sem servidor. 
+ Isolamento SERIALIZABLE: fornece serialização total para transações simultâneas. 

FROM ARN '<ARN>'  
O ARN do banco de dados do AWS Glue a ser usado para criar o banco de dados.

\$1 WITH DATA CATALOG SCHEMA '<esquema>' \$1 WITH NO DATA CATALOG SCHEMA \$1  
Esse parâmetro só será aplicável se o comando CREATE DATABASE também usar o parâmetro FROM ARN.
Especifica se o banco de dados deve ser criado usando um esquema para ajudar a acessar objetos no AWS Glue Data Catalog.

IAM\$1ROLE \$1 default \$1 'SESSION' \$1 'arn:aws:iam::*<Conta da AWS-id>*:role/*<role-name>*' \$1  
Esse parâmetro só será aplicável se o comando CREATE DATABASE também usar o parâmetro FROM ARN.
Se você especificar um perfil do IAM associado ao cluster ao executar o comando CREATE DATABASE, o Amazon Redshift usará as credenciais do perfil ao executar consultas no banco de dados.  
Especificar a palavra-chave `default` significa usar o perfil do IAM que está definido como padrão e associado ao cluster.  
Use `'SESSION'` se você se conectar ao cluster do Amazon Redshift usando uma identidade federada e acesse as tabelas do esquema externo criado usando esse comando. Para obter um exemplo do uso de uma identidade federada, consulte [Usar uma identidade federada para gerenciar o acesso do Amazon Redshift aos recursos locais e a tabelas externas do Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html), que explica como configurar uma identidade federada.   
Use o nome do recurso da Amazon (ARN) de uma função do IAM que seu cluster usa para autenticação e autorização. No mínimo, a função do IAM deve ter permissão para executar uma operação LIST no bucket do Amazon S3 a ser acessado e uma operação GET nos objetos do Amazon S3 que constam no bucket. Para saber mais sobre como usar IAM\$1ROLE ao criar um banco de dados usando o AWS Glue Data Catalog para compartilhamentos de dados, consulte [Trabalhar com unidades de compartilhamento de dados gerenciadas pelo Lake Formation como consumidor](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html).  
O exemplo a seguir mostra a sintaxe da string do parâmetro IAM\$1ROLE para um único ARN.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
Você pode encadear funções para que seu cluster possa assumir outra função do IAM, possivelmente pertencente a outra conta. Você pode encadear até 10 funções. Para obter mais informações, consulte [Encadeamento de funções do IAM no Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 Anexe a essa função do IAM uma política de permissões do IAM semelhante à política descrita a seguir.    
****  

```
{
    "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 obter as etapas para criar uma função do IAM a ser usada com consulta federada, consulte [Criar um segredo e uma função do IAM para usar consultas federadas](federated-create-secret-iam-role.md).   
Não inclua espaços na lista de funções encadeadas.
O seguinte mostra a sintaxe do encadeamento de três funções.  

```
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>'
```

## Sintaxe para usar CREATE DATABASE com um datashare
<a name="r_CREATE_DATABASE-datashare-synopsis"></a>

A sintaxe a seguir descreve o comando CREATE DATABASE usado para criar bancos de dados a partir de uma unidade de compartilhamento de dados para compartilhar dados na mesma conta da AWS.

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

A sintaxe a seguir descreve o comando CREATE DATABASE usado para criar bancos de dados a partir de uma unidade de compartilhamento de dados para compartilhar dados entre contas da AWS.

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

### Parâmetros para usar CREATE DATABASE com um datashare
<a name="r_CREATE_DATABASE-parameters-datashare"></a>

FROM DATASHARE   
Uma palavra-chave que indica onde o datashare está localizado.

 *datashare\$1name*   
O nome do datashare no qual o banco de dados do consumidor é criado.

WITH PERMISSIONS  
Especifica que o banco de dados criado a partir da unidade de compartilhamento de dados requer permissões no nível de objeto para ter acesso a objetos do banco de dados individuais. Sem essa cláusula, os usuários ou as funções que receberem a permissão USAGE no banco de dados terão acesso automático a todos os objetos no banco de dados.

 NAMESPACE *namespace\$1guid*   
Valor que especifica o namespace de produtor ao qual a unidade de compartilhamento de dados pertence.

ACCOUNT *account\$1id*  
Valor que especifica a conta de produtor à qual a unidade de compartilhamento de dados pertence.

## Notas de uso de CREATE DATABASE para compartilhamento de dados
<a name="r_CREATE_DATABASE-usage"></a>

Como superusuário de banco de dados, ao usar CREATE DATABASE para criar bancos de dados a partir de unidades de compartilhamento de dados da conta da AWS, especifique a opção NAMESPACE. A opção ACCOUNT é opcional. Ao usar CREATE DATABASE para criar bancos de dados de unidades de compartilhamento de dados entre contas da AWS, especifique os parâmetros ACCOUNT e NAMESPACE do produtor.

Você pode criar apenas um banco de dados de consumidor para uma unidade de compartilhamento de dados em um cluster de consumidores. Não é possível criar vários bancos de dados de consumidores referentes à mesma unidade de compartilhamento de dados.

## CREATE DATABASE por meio do AWS Glue Data Catalog
<a name="r_CREATE_DATABASE_data-catalog"></a>

Para criar um banco de dados usando um ARN do banco de dados do AWS Glue, especifique o ARN no comando CREATE DATABASE.

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

Opcionalmente, você também pode fornecer um valor no parâmetro IAM\$1ROLE. Para obter mais informações sobre o parâmetro e os valores aceitos, consulte [Parâmetros](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html#r_CREATE_DATABASE-parameters).

Veja a seguir exemplos que demonstram como criar um banco de dados com base em um ARN usando um perfil do 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;
```

Também é possível criar um banco de dados usando um DATA CATALOG SCHEMA.

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

## Criar bancos de dados para receber resultados de integrações ETL zero
<a name="r_CREATE_DATABASE-integration"></a>

Para criar um banco de dados usando uma identidade de integração ETL zero, especifique `integration_id` no comando CREATE DATABASE.

```
CREATE DATABASE destination_db_name FROM INTEGRATION 'integration_id';
```

Por exemplo, primeiro, recupere os IDs de integração de SVV\$1INTEGRATION:

```
SELECT integration_id FROM SVV_INTEGRATION;
```

Depois, use um dos IDs de integração recuperados para criar o banco de dados que recebe integrações ETL zero.

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

Quando o banco de dados de origem de integrações ETL zero for necessário, especifique, por exemplo:

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

Você também pode definir um intervalo de atualização para o banco de dados. Por exemplo, para definir o intervalo de atualização como 7.200 segundos para dados de uma fonte de integração ETL zero:

```
CREATE DATABASE myacct_mysql FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET REFRESH_INTERVAL 7200;
```

Consulte a visualização de catálogo SVV\$1INTEGRATION para ter informações sobre uma integração ETL zero, como integration\$1id, target\$1database, source, refresh\$1interval, e muito mais.

```
SELECT * FROM svv_integration;
```

O exemplo a seguir cria um banco de dados com base em uma integração com o modo histórico ativado.

```
CREATE DATABASE sample_integration_db FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET HISTORY_MODE = true;
```

## Limites de CREATE DATABASE
<a name="r_CREATE_DATABASE-create-database-limits"></a>

O Amazon Redshift aplica esses limites aos bancos de dados:
+ Máximo de 60 bancos de dados definidos pelo usuário por cluster.
+ Máximo de 127 bytes para um nome de banco de dados.
+ Um nome de banco de dados não pode ser uma palavra reservada. 

## Agrupamento de banco de dados
<a name="r_CREATE_DATABASE-collation"></a>

O agrupamento é um conjunto de regras que define como o mecanismo de banco de dados compara e classifica os dados de tipo de caractere em SQL. O agrupamento sem distinção de maiúsculas de minúsculas é o agrupamento mais comumente usado. O Amazon Redshift usa agrupamento sem distinção de maiúsculas e minúsculas para facilitar a migração de outros sistemas de data warehouse. Com o suporte nativo de agrupamento sem distinção de maiúsculas e minúsculas, o Amazon Redshift continua a usar métodos importantes de ajuste ou otimização, como chaves de distribuição, chaves de classificação ou varredura restrita de intervalo. 

A cláusula COLLATE especifica o agrupamento padrão para todas as colunas CHAR e VARCHAR no banco de dados. Se CASE\$1INSENSITIVE for especificado, todas as colunas CHAR ou VARCHAR usarão agrupamento sem distinção de maiúsculas e minúsculas. Para obter mais informações sobre agrupamento, consulte [Sequências de colação](c_collation_sequences.md).

Os dados inseridos ou ingeridos em colunas que não diferenciam maiúsculas e minúsculas manterão suas letras originais. Mas todas as operações de string baseadas em comparação, incluindo classificação e agrupamento, são insensíveis a maiúsculas e minúsculas. Operações de correspondência de padrões, como predicados LIKE, semelhantes a, e funções de expressão regular também são insensíveis a maiúsculas e minúsculas.

As seguintes operações SQL suportam semântica de agrupamento aplicável:
+ Operadores de comparação: =, <>, <, <=, >, >=.
+ Operador: LIKE
+ Cláusula ORDER BY
+ Cláusulas GROUP BY
+ Funções agregadas que usam comparação de strings, como MIN, MAX e LISTAGG
+ Funções da janela, como cláusulas PARTITION BY e cláusulas ORDER BY
+ Funções escalares greatest() e least(), STRPOS(), REGEXP\$1COUNT(), REGEXP\$1REPLACE(), REGEXP\$1INSTR(), REGEXP\$1SUBSTR()
+ Cláusula distinta
+ UNION, INTERSECT e EXCEPT
+ IN LIST

Para consultas externas, incluindo consultas federadas do Amazon Redshift Spectrum e do Aurora PostgreSQL, o agrupamento da coluna VARCHAR ou CHAR é o mesmo que o agrupamento em nível de banco de dados atual.

O seguinte exemplo consulta uma tabela do Amazon Redshift Spectrum:

```
SELECT ci_varchar FROM spectrum.test_collation
WHERE ci_varchar = 'AMAZON';

ci_varchar
----------
amazon
Amazon
AMAZON
AmaZon
(4 rows)
```

Para obter informações sobre como criar tabelas usando o agrupamento de banco de dados, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).

Para obter mais informações sobre funções COLLATE, consulte [Função COLLATE](r_COLLATE.md).

### Limitações do agrupamento de banco de dados
<a name="r_CREATE_DATABASE-collation-limitations"></a>

Veja as seguintes limitações ao trabalhar com agrupamento de banco de dados no Amazon Redshift:
+ Todas as tabelas ou exibições do sistema, incluindo tabelas de catálogo PG e tabelas de sistema do Amazon Redshift, diferenciam maiúsculas de minúsculas.
+ Quando o banco de dados do consumidor e o banco de dados do produtor têm agrupamentos de nível de banco de dados diferentes, o Amazon Redshift não oferece suporte a consultas entre bancos de dados e entre clusters.
+ O Amazon Redshift não oferece suporte a agrupamento sem distinção de maiúsculas e minúsculas na consulta somente nó líder.

  O seguinte exemplo mostra uma consulta sem distinção entre maiúsculas e minúsculas e o erro que o Amazon Redshift envia:

  ```
  SELECT collate(usename, 'case_insensitive') FROM pg_user;
  ERROR:  Case insensitive collation is not supported in leader node only query.
  ```
+ O Amazon Redshift não oferece suporte à interação entre colunas que diferenciam maiúsculas e minúsculas, como operações de comparação, função, junção ou conjunto.

  Os exemplos a seguir mostram erros quando colunas com e sem diferenciação de maiúsculas e minúsculas interagem:

  ```
  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 fazer essas consultas funcionarem, use a função COLLATE para converter o agrupamento de uma coluna para corresponder à outra. Para obter mais informações, consulte [Função COLLATE](r_COLLATE.md).

## Exemplos
<a name="r_CREATE_DATABASE-examples"></a>

**Criação de um banco de dados**  
O exemplo a seguir criar um banco de dados denominado TICKIT e de propriedade do usuário DWUSER.

```
create database tickit
with owner dwuser;
```

Consulte a tabela de catálogo PG\$1DATABASE\$1INFO para exibir detalhes sobre bancos de dados. 

```
select datname, datdba, datconnlimit
from pg_database_info
where datdba > 1;

 datname     | datdba | datconnlimit
-------------+--------+-------------
 admin       |    100 | UNLIMITED
 reports     |    100 | 100
 tickit      |    100 | 100
```

O exemplo a seguir cria um banco de dados chamado **sampledb** com o nível de isolamento SNAPSHOT.

```
CREATE DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
```

O exemplo a seguir cria o banco de dados sales\$1db a partir da unidade de compartilhamento de dados saleshare.

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

### Exemplos de agrupamento de banco de dados
<a name="r_CREATE_DATABASE-collation-examples"></a>

**Criação de um banco de dados que não diferencia maiúsculas de minúsculas**  
O exemplo a seguir cria o banco de dados `sampledb`, a tabela `T1` e insere dados na tabela `T1`.

```
create database sampledb collate case_insensitive;
```

Conecte-se ao novo banco de dados que você acabou de criar usando o cliente SQL. Ao usar o Editor de Consultas do Amazon Redshift v2, escolha o `sampledb` no **Editor**. Ao usar o RSQL, use um comando semelhante ao seguinte.

```
\connect sampledb;
```

```
CREATE TABLE T1 (
  col1 Varchar(20) distkey sortkey
);
```

```
INSERT INTO T1 VALUES ('bob'), ('john'), ('Mary'), ('JOHN'), ('Bob');
```

Em seguida, a consulta encontra resultados com `John`.

```
SELECT * FROM T1 WHERE col1 = 'John';

 col1
 ------
 john
 JOHN
(2 row)
```

**Ordenar por distinção de maiúsculas de minúsculas**  
O exemplo a seguir mostra a ordenação sem distinção de maiúsculas e minúsculas com a tabela T1. A ordenação de *Bob* e *bob* ou *John* e *john* não é determinística porque os nomes são iguais em colunas que não diferenciam maiúsculas de minúsculas.

```
SELECT * FROM T1 ORDER BY 1;

 col1
 ------
 bob
 Bob
 JOHN
 john
 Mary
(5 rows)
```

Da mesma forma, o exemplo a seguir mostra a ordem sem distinção entre maiúsculas e minúsculas com a cláusula GROUP BY. *Bob* e *bob* são iguais e pertencem ao mesmo grupo. Não é determinístico qual aparece no resultado.

```
SELECT col1, count(*) FROM T1 GROUP BY 1;

 col1 | count
 -----+------
 Mary |  1
 bob  |  2
 JOHN |  2
(3 rows)
```

**Consultar com uma função da janela em colunas que não diferenciam maiúsculas e minúsculas**  
O exemplo a seguir consulta uma função da janela em uma coluna que não diferencia maiúsculas e 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)
```

**Consultar com a palavra-chave DISTINCT**  
O exemplo a seguir cria a tabela `T1` com a palavra-chave DISTINCT.

```
SELECT DISTINCT col1 FROM T1;

 col1
 ------
 bob
 Mary
 john
(3 rows)
```

**Consultar com a cláusula UNION**  
O exemplo a seguir mostra os resultados da UNION das tabelas `T1` e `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>

Cria um novo datashare no banco de dados atual. O proprietário desta tabela é o emissor do comando CREATE DATASHARE.

O Amazon Redshift associa cada datashare a um único banco de dados do Amazon Redshift. Você só pode adicionar objetos do banco de dados associado a um datashare. Você pode criar vários conjuntos de dados no mesmo banco de dados do Amazon Redshift.

Para obter mais informações sobre unidades de compartilhamento de dados, consulte [Compartilhamento de dados no Amazon Redshift](datashare-overview.md).

Para visualizar informações sobre os conjuntos de dados, use [SHOW DATASHARES](r_SHOW_DATASHARES.md).

## Privilégios obrigatórios
<a name="r_CREATE_DATASHARE-privileges"></a>

A seguir estão os privilégios obrigatórios para CREATE DATASHARE:
+ Superusuário
+ Usuários com o privilégio CREATE DATASHARE
+ Proprietário do banco de dados

## Sintaxe
<a name="r_CREATE_DATASHARE-synopsis"></a>

```
CREATE DATASHARE datashare_name
[[SET] PUBLICACCESSIBLE [=] TRUE | FALSE ];
```

## Parâmetros
<a name="r_CREATE_DATASHARE-parameters"></a>

*datashare\$1name*  
O nome do datashare. O nome do datashare deve ser exclusivo no namespace do cluster.

[[SET] PUBLICACCESSIBLE]  
Cláusula que especifica se o armazenamento de dados pode ser compartilhado para clusters que são acessíveis ao público.  
O valor padrão para `SET PUBLICACCESSIBLE` é `FALSE`.

## Observações de uso
<a name="r_CREATE_DATASHARE_usage"></a>

Por padrão, o proprietário do datashare possui somente o compartilhamento, mas não objetos dentro do compartilhamento.

Somente superusuários e o proprietário do banco de dados podem usar CREATE DATASHARE e delegar privilégios ALTER a outros usuários ou grupos. 

## Exemplos
<a name="r_CREATE_DATASHARE_examples"></a>

O exemplo a seguir cria a unidade de compartilhamento de dados `salesshare`.

```
CREATE DATASHARE salesshare;
```

O exemplo a seguir cria a unidade de compartilhamento de dados `demoshare` que o AWS Data Exchange gerencia.

```
CREATE DATASHARE demoshare SET PUBLICACCESSIBLE TRUE, MANAGEDBY ADX;
```

# CREATE EXTERNAL FUNCTION
<a name="r_CREATE_EXTERNAL_FUNCTION"></a>

Cria uma função definida pelo usuário (UDF) escalar baseada em AWS Lambda para o Amazon Redshift. Para obter mais informações sobre as funções definidas pelo usuário do Lambda, consulte [UDFs escalares do Lambda](udf-creating-a-lambda-sql-udf.md).

## Privilégios obrigatórios
<a name="r_CREATE_EXTERNAL_FUNCTION-privileges"></a>

A seguir estão os privilégios necessários para CREATE EXTERNAL FUNCTION:
+ Superusuário
+ Usuários com o privilégio CREATE [ OR REPLACE ] EXTERNAL FUNCTION

## Sintaxe
<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::<Conta da AWS-id>:role/<role-name>’
RETRY_TIMEOUT milliseconds
MAX_BATCH_ROWS count
MAX_BATCH_SIZE size [ KB | MB ];
```

## Parâmetros
<a name="r_CREATE_EXTERNAL_FUNCTION-parameters"></a>

OR REPLACE  
Uma cláusula que especifica que se uma função com o mesmo nome e tipo de dados do argumento de entrada ou *assinatura* já existir, a função existente será substituída. Você só pode substituir uma função por uma nova função que defina um conjunto idêntico de tipos de dados. É preciso ser um superusuário para substituir uma função.  
Se uma função for definida com o mesmo nome que uma função existente mas com uma assinatura diferente, uma nova função será criada. Em outras palavras, o nome da função fica sobrecarregado. Para obter mais informações, consulte [Sobrecarga de nomes de função](udf-naming-udfs.md#udf-naming-overloading-function-names).

*external\$1fn\$1name*  
O nome da função externa. Se você especificar um nome de esquema (como myschema.myfunction), a função será criada usando o esquema especificado. Caso contrário, a função será criada no esquema atual. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).   
Recomendamos que você prefixe os nomes de todos os UDF com `f_`. O Amazon Redshift reserva o prefixo `f_` para nomes UDF. Usando o prefixo `f_`, você ajuda a garantir que o nome de seu UDF não entrará em conflito com qualquer nome de função SQL integrada do Amazon Redshift agora ou no futuro. Para obter mais informações, consulte [Evitar conflitos na nomeação da UDF](udf-naming-udfs.md).

*data\$1type*  
O tipo de dados dos argumentos de entrada. Para obter mais informações, consulte [UDFs escalares do Python](udf-creating-a-scalar-udf.md) e [UDFs escalares do Lambda](udf-creating-a-lambda-sql-udf.md).

RETURNS *tipo\$1dados*  
Tipo de dados do valor retornado pela função. O tipo de dados RETURNS pode ser qualquer tipo de dados padrão do Amazon Redshift. Para obter mais informações, consulte [UDFs escalares do Python](udf-creating-a-scalar-udf.md) e [UDFs escalares do Lambda](udf-creating-a-lambda-sql-udf.md).

VOLATILE \$1 STABLE  
Informa o otimizador de consulta sobre a volatilidade da função.   
Você terá a melhor otimização se rotular sua função com a categoria mais restrita de volatilidade válida para ela. Por ordem de nível de restrição, começando a partir da menos restrita, as categorias são:  
+ VOLATILE
+ STABLE
VOLATILE  
Dados os mesmos argumentos, a função pode retornar resultados diferentes em chamadas sucessivas, mesmo para as linhas em uma única instrução. O otimizador de consultas não pode fazer suposições sobre o comportamento de uma função volátil. Uma consulta que usa uma função volátil deve reavaliar a função para cada entrada.  
STABLE  
Em vista dos mesmos argumentos, a função com certeza retorna os mesmos resultados em chamadas sucessivas processadas em uma única instrução. A função pode retornar resultados diferentes quando chamada em instruções diferentes. Essa categoria possibilita que o otimizador reduza o número de vezes que a função é chamada em uma única instrução.  
Se a rigidez escolhida não for válida para a função, existe o risco de o otimizador ignorar  algumas chamadas com base nessa rigidez. Isso pode resultar em um conjunto de resultados incorreto.  
No momento, a cláusula IMMUTABLE não é compatível com UDFs do Lambda.

LAMBDA *'lambda\$1fn\$1name'*   
 O nome da função chamada pelo Amazon Redshift.  
Para obter etapas para criar uma função AWS Lambda, consulte [Criar uma função do Lambda com o console](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html) no *AWS LambdaGuia do desenvolvedor*.  
Para obter informações sobre permissões necessárias para a função do Lambda, consulte [Permissões do AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html) no *AWS LambdaGuia do desenvolvedor*.

IAM\$1ROLE \$1 default \$1 ‘arn:aws:iam::*<Conta da AWS-id>*:role/*<role-name>*’   
Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando CREATE EXTERNAL FUNCTION for executado.  
Use o nome do recurso da Amazon (ARN) de uma função do IAM que seu cluster usa para autenticação e autorização. O comando CREATE EXTERNAL FUNCTION está autorizado a invocar funções do Lambda por meio desta função do IAM. Se o cluster tiver uma função do IAM existente com permissões para invocar funções do Lambda anexadas, você poderá substituir o ARN da função. Para obter mais informações, consulte [Configurar o parâmetro de autorização para UDFs do Lambda](udf-creating-a-lambda-sql-udf.md#udf-lambda-authorization).  
A seguir, a sintaxe do parâmetro IAM\$1ROLE.  

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

RETRY\$1TIMEOUT *milliseconds*   
A quantidade de tempo total em milissegundos que o Amazon Redshift usa para os atrasos em recuos de novas tentativas.   
Em vez de tentar novamente imediatamente para quaisquer consultas com falha, o Amazon Redshift realiza backoffs e espera por um certo período de tempo entre novas tentativas. Em seguida, o Amazon Redshift tenta novamente a solicitação para executar novamente a consulta com falha até que a soma de todos os atrasos seja igual ou exceda o valor RETRY\$1TIMEOUT especificado. O valor padrão é 20.000 milissegundos.  
Quando uma função do Lambda é chamada, o Amazon Redshift tenta novamente consultas que recebem erros como `TooManyRequestsException`, `EC2ThrottledException`, e`ServiceException`.   
Você pode definir o parâmetro RETRY\$1TIMEOUT como 0 milissegundos para evitar quaisquer tentativas para um Lambda UDF.

*Contagem* de MAX\$1BATCH\$1ROWS  
 O número máximo de linhas que o Amazon Redshift envia em uma única solicitação em lote para uma invocação do Lambda.   
 O valor mínimo desse parâmetro é 1. O valor máximo é INT\$1MAX, ou 2.147.483.647.   
 Esse parâmetro é opcional. O valor padrão é INT\$1MAX, ou 2.147.483.647. 

*Tamanho* de MAX\$1BATCH\$1SIZE [ KB \$1 MB ]   
 O tamanho máximo da carga de dados que o Amazon Redshift envia em uma única solicitação em lote para uma invocação do Lambda.   
 O valor mínimo desse parâmetro é 1 KB. O valor máximo é 5 MB.   
 O valor padrão desse parâmetro é 5 MB.   
 KB e MB são opcionais. Se você não definir a unidade de medida, o Amazon Redshift usará KB como padrão. 

## Observações de uso
<a name="r_CREATE_FUNCTION-usage-notes"></a>

Considere o seguinte ao criar UDFs do Lambda: 
+ A ordem das chamadas da função do Lambda nos argumentos de entrada não é fixa nem garantida. Isso pode variar entre as instâncias de execução de consultas, dependendo da configuração do cluster.
+ Não é garantido que as funções sejam aplicadas a cada argumento de entrada somente uma vez. A interação entre o Amazon Redshift e o AWS Lambda pode levar a chamadas repetitivas com as mesmas entradas.

## Exemplos
<a name="r_CREATE_FUNCTION-examples"></a>

A seguir estão exemplos de uso de funções definidas pelo usuário (UDFs) do Lambda escalar.

### Exemplo de UDF Lambda escalar usando uma função Node.js Lambda
<a name="r_CREATE_FUNCTION-lambda-example-node"></a>

O exemplo a seguir cria uma função externa chamada `exfunc_sum` que leva dois inteiros como argumentos de entrada. Esta função retorna a soma como uma saída inteira. O nome da função do Lambda a ser chamada é `lambda_sum`. A linguagem usada para essa função do Lambda é Node.js 12.x. Especifique a função do IAM. O exemplo usa `'arn:aws:iam::123456789012:user/johndoe'` como a função do IAM.

```
CREATE EXTERNAL FUNCTION exfunc_sum(INT,INT)
RETURNS INT
VOLATILE
LAMBDA 'lambda_sum'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

A função do Lambda recebe a carga útil de solicitação e itera sobre cada linha. Todos os valores em uma única linha são adicionados para calcular a soma dessa linha, que é salva na matriz de resposta. O número de linhas na matriz de resultados é semelhante ao número de linhas recebidas na carga útil da solicitação. 

A carga útil da resposta JSON deve ter os dados do resultado no campo “resultados” para que ele seja reconhecido pela função externa. O campo argumentos na solicitação enviada para a função Lambda contém a carga útil de dados. Pode haver várias linhas na carga útil de dados no caso de uma solicitação em lote. A seguinte função do Lambda itera sobre todas as linhas na carga útil de dados de solicitação. Ele também itera individualmente sobre todos os valores dentro de uma única linha.

```
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);
};
```

O exemplo a seguir chama a função externa com valores literais.

```
select exfunc_sum(1,2);
exfunc_sum
------------
 3
(1 row)
```

O exemplo a seguir cria uma tabela chamada t\$1sum com duas colunas, c1 e c2, do tipo de dados inteiro e insere duas linhas de dados. Em seguida, a função externa é chamada passando os nomes de coluna desta tabela. As duas linhas da tabela são enviadas em uma solicitação de lote na carga útil de solicitação como uma única invocação do 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)
```

### Exemplo de UDF Lambda escalar usando o atributo RETRY\$1TIMEOUT
<a name="r_CREATE_FUNCTION-lambda-example-retry"></a>

Na seção a seguir, você pode encontrar um exemplo de como usar o atributo RETRY\$1TIMEOUT em UDFs do Lambda. 

AWS LambdaFunções têm limites de simultaneidade que você pode definir para cada função. Para ter mais informações sobre limites de simultaneidade, consulte [Gerenciar a simultaneidade para uma função do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) no *Guia do desenvolvedor do AWS Lambda* e a publicação [Gerenciar a simultaneidade da função do AWS Lambda](https://aws.amazon.com/blogs/compute/managing-aws-lambda-function-concurrency) no Blog de Computação da AWS. 

Quando o número de solicitações que estão sendo atendidas por um UDF Lambda excede os limites de simultaneidade, as novas solicitações recebem o erro `TooManyRequestsException`. O UDF Lambda tenta novamente neste erro até que a soma de todos os atrasos entre as solicitações enviadas para a função do Lambda seja igual ou exceda o valor RETRY\$1TIMEOUT definido. O valor padrão de RETRY\$1TIMEOUT é 20.000 milissegundos.

O exemplo a seguir cria uma função do Lambda chamada `exfunc_sleep_3`. Esta função recebe a carga útil de solicitação, itera sobre cada linha e converte a entrada para maiúsculas. Em seguida, dorme por 3 segundos e retorna o resultado. A linguagem usada para esta função do Lambda é Python 3.8. 

O número de linhas na matriz de resultados é semelhante ao número de linhas recebidas na carga útil da solicitação. A carga útil da resposta JSON deve ter os dados do resultado no campo `results` para que ele seja reconhecido pela função externa. O campo `arguments` na solicitação enviada para a função do Lambda contém a carga útil de dados. Pode haver várias linhas na carga útil de dados no caso de uma solicitação em lote.

O limite de simultaneidade para essa função é definido especificamente como 1 em simultaneidade reservada para demonstrar o uso do atributo RETRY\$1TIMEOUT. Quando o atributo é definido como 1, a função do Lambda só pode servir uma solicitação por 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 seguir, dois exemplos adicionais ilustram o atributo RETRY\$1TIMEOUT. Cada um deles invoca um único UDF Lambda. Ao invocar o UDF Lambda, cada exemplo executa a mesma consulta SQL para invocar o UDF Lambda de duas sessões simultâneas de banco de dados ao mesmo tempo. Quando a primeira consulta que invoca o UDF Lambda está sendo atendida pelo UDF, a segunda consulta recebe o erro `TooManyRequestsException`. Esse resultado ocorre porque você define especificamente a simultaneidade reservada no UDF como 1. Para obter informações sobre como definir a simultaneidade reservada para funções do Lambda, consulte [Configurar a simultaneidade reservada](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#configuration-concurrency-reservedconfiguration-concurrency-reserved).

O primeiro exemplo a seguir define o atributo RETRY\$1TIMEOUT para o UDF Lambda como 0 milissegundos. Se a solicitação do Lambda receber exceções da função do Lambda, o Amazon Redshift não fará novas tentativas. Esse resultado ocorre porque o atributo RETRY\$1TIMEOUT está definido como 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;
```

Com o RETRY\$1TIMEOUT definido como 0, você pode executar as duas consultas a seguir de sessões de banco de dados separadas para ver resultados diferentes.

A primeira consulta SQL que usa o UDF Lambda é executada com êxito.

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

A segunda consulta, que é executada a partir de uma sessão de banco de dados separada ao mesmo tempo, recebe o erro `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]
-----------------------------------------------
```

O segundo exemplo a seguir define o atributo RETRY\$1TIMEOUT para o UDF Lambda como 3.000 milissegundos. Mesmo se a segunda consulta for executada simultaneamente, o UDF Lambda tenta novamente até que o total de atrasos seja de 3.000 milissegundos. Assim, ambas as consultas são executadas com êxito.

```
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;
```

Com o RETRY\$1TIMEOUT definido como 3.000 milissegundos, você pode executar as duas consultas a seguir de sessões de banco de dados separadas para ver os mesmos resultados.

A primeira consulta SQL que usa o UDF Lambda é executada com êxito.

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

A segunda consulta é executada simultaneamente e o UDF Lambda tenta novamente até que o atraso total seja de 3.000 milissegundos.

```
select exfunc_upper('Varchar');
 exfunc_upper
--------------
 VARCHAR
(1 row)
```

### Exemplo de UDF Lambda escalar usando uma função Python Lambda
<a name="r_CREATE_FUNCTION-lambda-example-python"></a>

O exemplo a seguir cria uma função externa chamada `exfunc_multiplication` que multiplica números e retorna um inteiro. Este exemplo incorpora o campo success e `error_msg` na resposta do Lambda. O campo success é definido como false quando há um estouro de inteiro no resultado da multiplicação, e a propriedade `error_msg` está definida como `Integer multiplication overflow`. A função `exfunc_multiplication` leva três inteiros como argumentos de entrada e retorna a soma como uma saída inteira. 

O nome da função do Lambda chamada é `lambda_multiplication`. A linguagem usada para esta função do Lambda é Python 3.8. Especifique a função do 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';
```

A função do Lambda recebe a carga útil de solicitação e itera sobre cada linha. Todos os valores em uma única linha são multiplicados para calcular o resultado dessa linha, que é salvo na lista de respostas. Este exemplo usa um valor de sucesso booleano definido como true por padrão. Se o resultado da multiplicação de uma linha tiver um estouro de inteiro, o valor de sucesso será definido como false. Em seguida, o loop de iteração quebra. 

Ao criar a carga útil de resposta, se o valor de sucesso for false, a seguinte função do Lambda adiciona o campo `error_msg` na carga útil. Também define a mensagem de erro como `Integer multiplication overflow`. Se o valor de sucesso for true, os dados do resultado serão adicionados no campo de resultados. O número de linhas na matriz de resultados, se houver, é semelhante ao número de linhas recebidas na carga útil da solicitação. 

O campo argumentos na solicitação enviada para a função Lambda contém a carga útil de dados. Pode haver várias linhas na carga útil de dados no caso de uma solicitação em lote. A seguinte função do Lambda itera sobre todas as linhas na carga útil de dados de solicitação e itera individualmente sobre todos os valores dentro de uma única linha. 

```
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
```

O exemplo a seguir chama a função externa com valores literais.

```
SELECT exfunc_multiplication(8, 9, 2);
  exfunc_multiplication
---------------------------
          144
(1 row)
```

O exemplo a seguir cria uma tabela chamada t\$1multi com três colunas, c1, c2 e c3, do tipo de dados inteiro. A função externa é chamada passando os nomes das colunas desta tabela. Os dados são inseridos de forma a causar estouro de inteiro para mostrar como o erro é propagado.

```
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**
+ [Pré-requisitos referentes a CREATE EXTERNAL MODEL](#r_create_external_model_prereqs)
+ [Privilégios obrigatórios](#r_simple_create_model-privileges)
+ [Controle de custos](#r_create_model_cost)
+ [Sintaxe de CREATE EXTERNAL MODEL](#r_create_external_model_syntax)
+ [Parâmetros e configurações de CREATE EXTERNAL MODEL](#r_create_external_model_parameters_settings)
+ [Parâmetros da função de inferência CREATE EXTERNAL MODEL](#r_create_external_model_if_parameters)

## Pré-requisitos referentes a CREATE EXTERNAL MODEL
<a name="r_create_external_model_prereqs"></a>

Antes de usar a instrução CREATE EXTERNAL MODEL, conclua os pré-requisitos em [Configuração de cluster para usar o Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup). A seguir está um resumo de alto nível dos pré-requisitos.
+ Crie um cluster do Amazon Redshift com o Console de Gerenciamento da AWS ou a Interface de linha de comando da AWS (AWS CLI).
+ Anexe a política de Identity and Access Management (IAM) da AWS ao criar o cluster.
+ Para permitir que o Amazon Redshift e o Amazon Bedrock assumam o perfil para interagir com outros serviços, adicione a política de confiança apropriada ao perfil do IAM.
+ Habilite o acesso aos LLMs específicos que você deseja usar no console do Amazon Bedrock.
+ (Opcional) Se você encontrar exceções de controle de utilização provenientes do Amazon Bedrock, como `Too many requests, please wait before trying again`, mesmo com pequenas quantidades de dados, verifique as cotas em **Cotas de serviço** na conta do Amazon Bedrock. Verifique se a cota aplicada no nível da conta é pelo menos igual ao valor da cota padrão da AWS para as solicitações **InvokeModel** do modelo que você está usando.

Para obter detalhes sobre a função do IAM, a política de confiança e outros pré-requisitos, consulte [Configuração de cluster para usar o Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup).

## Privilégios obrigatórios
<a name="r_simple_create_model-privileges"></a>

Estes são os privilégios obrigatórios para CREATE EXTERNAL MODEL:
+ Superusuário
+ Usuários com o privilégio CREATE MODEL
+ Funções com privilégio GRANT CREATE MODEL

## Controle de custos
<a name="r_create_model_cost"></a>

 O Amazon Redshift ML usa os recursos de cluster existentes para criar modelos de previsão. Portanato, você não precisa pagar a mais. No entanto, a AWS aplica cobranças ao uso do Amazon Bedrock com base no modelo selecionado. Para obter mais informações, consulte [Custos de uso do Amazon Redshift ML](https://docs.aws.amazon.com/redshift/latest/dg/cost.html). 

## Sintaxe de CREATE EXTERNAL MODEL
<a name="r_create_external_model_syntax"></a>

A seguir é apresentada a sintaxe completa da instrução 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}]
);
```

O comando `CREATE EXTERNAL MODEL` cria uma função de inferência usada para gerar conteúdo. 

Esta é a sintaxe de uma função de inferência que `CREATE EXTERNAL MODEL` cria usando `RAW` como `REQUEST_TYPE`: 

```
SELECT inference_function_name(request_super) 
[FROM table];
```

Esta é a sintaxe de uma função de inferência que `CREATE EXTERNAL MODEL` cria usando `UNIFIED` como `REQUEST_TYPE`: 

```
SELECT inference_function_name(input_text, [, inference_config [, additional_model_request_fields]])
[FROM table];
```

Para ter informações sobre como usar a função de inferência, consulte [Usar um modelo externo para a integração do Amazon Redshift ML com o Amazon Bedrock](machine-learning-br.md#machine-learning-br-use).

## Parâmetros e configurações de CREATE EXTERNAL MODEL
<a name="r_create_external_model_parameters_settings"></a>

Esta seção descreve os parâmetros e as configurações do comando `CREATE EXTERNAL MODEL`.

**Topics**
+ [Parâmetros de CREATE EXTERNAL MODEL](#r_create_external_model_parameters)
+ [Configurações 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  
O nome do modelo externo. O nome do modelo em um esquema deve ser exclusivo.

FUNCTION *function\$1name (data\$1type [,...] )*  
O nome da função de inferência que cria `CREATE EXTERNAL MODEL`. Use a função de inferência para enviar solicitações ao Amazon Bedrock e recuperar texto gerado por ML.

IAM\$1ROLE * \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1*  
O perfil do IAM que o Amazon Redshift usa para acessar o Amazon Bedrock. Para obter informações sobre a função do IAM, consulte [Criar ou atualizar um perfil do IAM para a integração do Amazon Redshift ML com o Amazon Bedrock](machine-learning-br.md#machine-learning-br-iam).

MODEL\$1TYPE BEDROCK  
Especifica o tipo de modelo. O único valor válido é `BEDROCK`.

SETTINGS ( MODEL\$1ID model\$1id [,...] )  
Especifica as configurações externas do modelo. Para obter detalhes, consulte a seção a seguir.

### Configurações de CREATE EXTERNAL MODEL
<a name="r_create_external_model_settings"></a>

MODEL\$1ID model\$1id  
O identificador do modelo externo; por exemplo, `anthropic.claude-v2`. Para ter informações sobre IDs de modelo do Amazon Bedrock, consulte [Amazon Bedrock model IDs](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html).

PROMPT 'prompt prefix'  
Especifica um prompt estático que o Amazon Redshift adiciona ao início de cada solicitação de inferência. Compatível apenas com o `REQUEST_TYPE` `UNIFIED`.

SUFFIX 'prompt suffix'  
Especifica um prompt estático que o Amazon Redshift adiciona ao final de cada solicitação de inferência. Compatível apenas com o `REQUEST_TYPE` `UNIFIED`.

REQUEST\$1TYPE \$1 RAW \$1 UNIFIED \$1  
Especifica o formato da solicitação enviada ao Amazon Bedrock. Entre os valores válidos estão os seguintes:  
+ **RAW**: a função de inferência considera a entrada como um único valor super e sempre envia de volta um valor super. O formato do valor super é específico para o modelo do Amazon Bedrock selecionado. Super é um modelo de previsão que combina vários algoritmos para produzir uma previsão única e aprimorada.
+ **UNIFIED**: a função de inferência usa a API unificada. Todos os modelos têm uma interface unificada e consistente com o Amazon Bedrock. Isso funciona para todos os modelos que comportam mensagens. Esse valor é o padrão.

  Para ter mais informações, consulte a [documentação da API Converse](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html) na *documentação de API do Amazon Bedrock*.

RESPONSE\$1TYPE \$1 VARCHAR \$1 SUPER \$1  
Especifica o formato da resposta. Se `REQUEST_TYPE` for `RAW`, o `RESPONSE_TYPE` é obrigatório e o único valor válido é `SUPER`. Com relação a todos os outros valores de `REQUEST TYPE`, o valor padrão é `VARCHAR` e `RESPONSE_TYPE` é opcional. Entre os valores válidos estão os seguintes:  
+ **VARCHAR**: o Amazon Redshift retorna somente a resposta de texto gerada pelo modelo.
+ **SUPER**: o Amazon Redshift envia de volta toda a resposta JSON gerada pelo modelo como um super. Isso inclui a resposta de texto, além de informações como o motivo da parada e o uso do token de entrada e saída do modelo. Super é um modelo de previsão que combina vários algoritmos para produzir uma previsão única e aprimorada. 

## Parâmetros da função de inferência CREATE EXTERNAL MODEL
<a name="r_create_external_model_if_parameters"></a>

Esta seção descreve os parâmetros válidos para a função de inferência criada pelo comando `CREATE EXTERNAL MODEL`. 

### Parâmetros da função de inferência CREATE EXTERNAL MODEL usando `RAW` como `REQUEST_TYPE`
<a name="r_create_external_model_if_parameters_raw"></a>

Uma função de inferência criada com `RAW` como `REQUEST_TYPE` tem um argumento super de entrada e sempre envia de volta um tipo de dados super. A sintaxe do super de entrada segue a sintaxe da solicitação do modelo específico selecionado no Amazon Bedrock.

### Parâmetros da função de inferência CREATE EXTERNAL MODEL usando `UNIFIED` como `REQUEST_TYPE`
<a name="r_create_external_model_if_parameters_unified"></a>

input\$1text  
O texto que o Amazon Redshift envia ao Amazon Bedrock.

inference\$1config  
Um valor super que contém parâmetros opcionais que o Amazon Redshift envia ao Amazon Bedrock. Isso pode incluir o seguinte:  
+ maxTokens
+ stopSequences
+ temperature
+ topP
Esses parâmetros são todos opcionais e diferenciam maiúsculas e minúsculas. Para ter informações sobre esses parâmetros, consulte [InferenceConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InferenceConfiguration.html) na *Referência de API do Amazon Bedrock*.

# CREATE EXTERNAL SCHEMA
<a name="r_CREATE_EXTERNAL_SCHEMA"></a>

Cria um novo esquema externo no banco de dados atual. Use esse esquema externo para se conectar a bancos de dados do Amazon RDS for PostgreSQL ou Amazon Aurora Edição compatível com PostgreSQL. Também é possível criar um esquema externo que faça referência a um banco de dados em um catálogo de dados externo, como AWS Glue, Athena ou um banco de dados em um metastore do Apache Hive, como Amazon EMR.

O proprietário deste esquema é o emissor do comando CREATE EXTERNAL SCHEMA. Para transferir a propriedade de um esquema externo, use [ALTER SCHEMA](r_ALTER_SCHEMA.md) para alterar o proprietário. Para conceder acesso ao esquema a outros usuários ou grupos de usuário, use o comando [GRANT](r_GRANT.md). 

Você não pode usar os comandos GRANT ou REVOKE para permissões em uma tabela externa. Em vez disso, conceda ou revogue permissões no esquema externo. 

**nota**  
Se você tiver tabelas externas do Redshift Spectrum no catálogo de dados do Amazon Athena, poderá migrar o catálogo de dados do Athena para um AWS Glue Data Catalog. Para usar o catálogo de dados do AWS Glue com o Redshift Spectrum, talvez seja necessário alterar as políticas do AWS Identity and Access Management (IAM). Para obter mais informações, consulte [Atualizar para o catálogo de dados do AWS Glue](https://docs.aws.amazon.com/athena/latest/ug/glue-athena.html#glue-upgrade) no *Manual do usuário do Athena*.

Para visualizar detalhes dos esquemas externos, consulte a exibição do sistema [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md). 

## Sintaxe
<a name="r_CREATE_EXTERNAL_SCHEMA-synopsis"></a>

A sintaxe a seguir descreve o comando CREATE EXTERNAL SCHEMA usado para fazer referência a dados usando um catálogo de dados externo. Para obter mais informações, 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::<Conta da 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>:<Conta da 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' ]
```

A sintaxe a seguir descreve o comando CREATE EXTERNAL SCHEMA usado para fazer referência a dados usando uma consulta federada ao RDS POSTGRES ou Aurora PostgreSQL. Você também pode criar um esquema externo que faça referência a fontes de transmissão, como o Kinesis Data Streams. Para obter mais informações, consulte [Consultar dados com consultas federadas no 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::<Conta da AWS-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

A sintaxe a seguir descreve o comando CREATE EXTERNAL SCHEMA usado para fazer referência a dados usando uma consulta federada ao RDS MySQL ou Aurora MySQL. Para obter mais informações, consulte [Consultar dados com consultas federadas no 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::<Conta da AWS-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

A sintaxe a seguir descreve o comando CREATE EXTERNAL SCHEMA usado para fazer referência a dados em uma transmissão do Kinesis. Para obter mais informações, consulte [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KINESIS
IAM_ROLE [ default | 'arn:aws:iam::<Conta da AWS-id>:role/<role-name>' ]
```

A sintaxe a seguir descreve o comando CREATE EXTERNAL SCHEMA usado para fazer referência ao cluster do Amazon Managed Streaming for Apache Kafka ou Confluent Cloud e os respectivos tópicos para ingestão. Para se conectar, forneça o URI do agente. Para obter mais informações, consulte [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KAFKA
[ IAM_ROLE [ default | 'arn:aws:iam::<Conta da AWS-id>:role/<role-name>' ] ]
URI 'Kafka bootstrap URI'
AUTHENTICATION [ none | iam | mtls ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ];
```

A sintaxe a seguir descreve o comando CREATE EXTERNAL SCHEMA usado para fazer referência a dados usando uma consulta entre bancos de dados.

```
CREATE EXTERNAL SCHEMA local_schema_name
FROM  REDSHIFT
DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'
```

## Parâmetros
<a name="r_CREATE_EXTERNAL_SCHEMA-parameters"></a>

IF NOT EXISTS  
Cláusula que indica que, se o esquema especificado existe, o comando não deve fazer alterações e retorna uma mensagem informando que o esquema existe, em vez de encerrar com um erro. Esta cláusula é útil para realizar desenvolvimento de scripts para que o script não falhe se o comando CREATE EXTERNAL SCHEMA tentar criar um esquema que já existe. 

local\$1schema\$1name  
Nome do novo esquema externo. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

FROM [ DATA CATALOG ] \$1 HIVE METASTORE \$1 POSTGRES \$1 MYSQL \$1 KINESIS \$1 MSK \$1 REDSHIFT   
Uma palavra-chave que indica onde o banco de dados externo está localizado.   
DATA CATALOG indica que o banco de dados externo está definido no catálogo de dados do Athena ou do AWS Glue Data Catalog.   
Se o banco de dados externo estiver definido em um catálogo de dados em uma região da AWS diferente, o parâmetro REGION será obrigatório. DATA CATALOG é o valor padrão.  
HIVE METASTORE indica que o banco de dados externo está definido em um metastore do Apache Hive. Se HIVE METASTORE estiver especificado, URI será obrigatório.   
POSTGRES indica que o banco de dados externo está definido em RDS PostgreSQL ou Aurora PostgreSQL.  
O MYSQL indica que o banco de dados externo está definido no RDS MySQL ou no Aurora MySQL.  
O KINESIS indica que a fonte de dados é uma transmissão do Kinesis Data Streams.  
O MSK indica que a fonte de dados é um cluster provisionado ou sem servidor do Amazon MSK.  
KAFKA indica que a fonte de dados é um cluster do Kafka. Você pode usar essa palavra-chave para o Amazon MSK e o Confluent Cloud.

FROM REDSHIFT  
Uma palavra-chave que indica que o banco de dados está localizado no Amazon Redshift.

DATABASE '*redshift\$1database\$1name*' SCHEMA '*redshift\$1schema\$1name*'  
O nome do banco de dados do Amazon Redshift.   
O *redshift\$1schema\$1name* indica o esquema no Amazon Redshift. O valor *redshift\$1schema\$1name* é `public`.

DATABASE '*federated\$1database\$1name*'  
Uma palavra-chave que indica o nome do banco de dados externo em um mecanismo de banco de dados PostgreSQL ou MySQL compatível. 

[SCHEMA '*schema\$1name*']  
O *schema\$1name* indica o esquema em um mecanismo de banco de dados PostgreSQL compatível. O *schema\$1name* padrão é `public`.  
Você não pode especificar um SCHEMA ao configurar uma consulta federada para um mecanismo de banco de dados MySQL compatível. 

REGION '*aws-region*'  
Se o banco de dados externo for definido em um catálogo de dados do Athena ou do AWS Glue Data Catalog, a região da AWS na qual o banco de dados estará localizado. Esse parâmetro é necessário se o banco de dados for definido em um catálogo de dados . 

URI [ 'hive\$1metastore\$1uri' [ PORT port\$1number ] \$1 'hostname' [ PORT port\$1number ] \$1 'Kafka bootstrap URI' ]  
O URI de nome de host e port\$1number de um mecanismo de banco de dados PostgreSQL ou MySQL compatível. O *hostname* é o nó de cabeçalho do conjunto de réplicas. O endpoint deve ser acessível (roteável) pelo cluster do Amazon Redshift. O port\$1number padrão do PostgreSQL é 5432. O port\$1number padrão do MySQL é 3306.  
O mecanismo de banco de dados PostgreSQL ou MySQL compatível deve estar na mesma VPC do cluster do Amazon Redshift com um grupo de segurança vinculando o Amazon Redshift e o RDS url-rsPostgreSQL ou o Aurora PostgreSQL. Além disso, você pode usar o roteamento aprimorado de VPC para configurar um caso de uso entre VPCs. Para obter mais informações, consulte [Trabalhando com endpoints da VPC gerenciados por Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-cluster-cross-vpc.html).
**Especificar um URI de metastore do Hive**  
Se o banco de dados estiver em um metastore do Hive, especifique o URI e, como opção, o número da porta do metastore. O número da porta padrão é 9083.   
Um URI não contém uma especificação de protocolo (“http://”). Um exemplo de URI válido: `uri '172.10.10.10'`.   
**Especificar um URI de agente para ingestão de streaming**  
Com a inclusão do URI bootstrap-broker, é possível conectar-se com um cluster do Amazon MSK ou Confluent Cloud e receber dados transmitidos. Consulte mais informações e um exemplo em [Conceitos básicos da ingestão de streaming do 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::*<Conta da AWS-id>*:role/*<role-name>*' ]  
Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando CREATE EXTERNAL SCHEMA for executado.  
Use `'SESSION'` se você se conectar ao cluster do Amazon Redshift usando uma identidade federada e acesse as tabelas do esquema externo criado usando esse comando. Para obter mais informações, consulte “[Using a federated identity to manage Amazon Redshift access to local resources and Amazon Redshift Spectrum external tables](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)” (Usar uma identidade federada para gerenciar o acesso do Amazon Redshift aos recursos locais e a tabelas externas do Amazon Redshift Spectrum), que explica como configurar uma identidade federada. Observe que essa configuração, que usa `'SESSION'` no lugar do ARN, só poderá ser usada se o esquema for criado usando `DATA CATALOG`.   
Use o nome do recurso da Amazon (ARN) de uma função do IAM que seu cluster usa para autenticação e autorização. No mínimo, a função do IAM deve ter permissão para executar uma operação LIST no bucket do Amazon S3 a ser acessado e uma operação GET nos objetos do Amazon S3 que constam no bucket.  
O exemplo a seguir mostra a sintaxe da string do parâmetro IAM\$1ROLE para um único ARN.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
Você pode encadear funções para que seu cluster possa assumir outra função do IAM, possivelmente pertencente a outra conta. Você pode encadear até 10 funções. Para ver um exemplo de perfis de encadeamento, consulte [Encadeamento de funções do IAM no Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 Anexe a essa função do IAM uma política de permissões do IAM semelhante à política descrita a seguir.    
****  

```
{
    "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 obter as etapas para criar uma função do IAM a ser usada com consulta federada, consulte [Criar um segredo e uma função do IAM para usar consultas federadas](federated-create-secret-iam-role.md).   
Não inclua espaços na lista de funções encadeadas.
O seguinte mostra a sintaxe do encadeamento de três funções.  

```
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*'  
O nome do recurso da Amazon (ARN) de um segredo de mecanismo de banco de dados PostgreSQL ou MySQL compatível criado usando o AWS Secrets Manager. Para ter informações sobre como criar e recuperar um ARN de um segredo, consulte [Manage secrets with AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) no *Guia do usuário do AWS Secrets Manager* e [Recuperar o nome do recurso da Amazon (ARN) do segredo no 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 se conectar ao cluster do Amazon Redshift usando uma identidade federada para autenticação e autorização para o catálogo de dados. Para obter mais informações sobre como concluir as etapas da identidade federada, consulte “[Using a federated identity to manage Amazon Redshift access to local resources and Amazon Redshift Spectrum external tables](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)” (Usar uma identidade federada para gerenciar o acesso do Amazon Redshift aos recursos locais e a tabelas externas do Amazon Redshift Spectrum). Observe que o perfil `'SESSION'` só poderá ser usado se o esquema for criado no CATÁLOGO DE DADOS.  
Use o nome do recurso da Amazon (ARN) de um perfil do IAM que o cluster usa para autenticação e autorização do catálogo de dados.   
Se CATALOG\$1ROLE não for especificado, o Amazon Redshift usará a IAM\$1ROLE especificada. A função do catálogo deve ter permissão para acessar o catálogo de dados no AWS Glue ou Athena. Para obter mais informações, consulte [Políticas do IAM do Amazon Redshift Spectrum](c-spectrum-iam-policies.md).   
O exemplo a seguir mostra a sintaxe da string do parâmetro CATALOG\$1ROLE para um único ARN.  

```
CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role>'
```
Você pode encadear funções para que seu cluster possa assumir outra função do IAM, possivelmente pertencente a outra conta. Você pode encadear até 10 funções. Para obter mais informações, consulte [Encadeamento de funções do IAM no Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
A lista de funções encadeadas não deve incluir espaços.
O seguinte mostra a sintaxe do encadeamento de três funções.  

```
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  
Cláusula que cria um banco de dados externo com o nome especificado pelo argumento DATABASE, se o banco de dados externo especificado não existir. Se o banco de dados externo especificado existir, o comando não realizará alterações. Nesse caso, o comando retorna uma mensagem informando que o banco de dados externo existe, em vez de finalizar com um erro.  
CREATE EXTERNAL DATABASE IF NOT EXISTS não pode ser usado com o comando HIVE METASTORE.  
Para usar CREATE EXTERNAL DATABASE IF NOT EXISTS com um catálogo de dados habilitado para AWS Lake Formation, você precisa da permissão `CREATE_DATABASE` no catálogo de dados. 

CATALOG\$1ID “*ID da conta da Amazon Web Services que contém o banco de dados do Glue ou do Lake Formation*”  
O ID da conta em que o banco de dados do catálogo de dados está armazenado.  
`CATALOG_ID` só pode ser especificado se você planeja se conectar ao cluster do Amazon Redshift ou ao Amazon Redshift Serverless usando uma identidade federada para autenticação e autorização do catálogo de dados por meio da definição de uma das seguintes opções:   
+ `CATALOG_ROLE` para `'SESSION'`
+ `IAM_ROLE` como `'SESSION'` e `'CATALOG_ROLE'` definido como o padrão 
Para obter mais informações sobre como concluir as etapas da identidade federada, consulte “[Using a federated identity to manage Amazon Redshift access to local resources and Amazon Redshift Spectrum external tables](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)” (Usar uma identidade federada para gerenciar o acesso do Amazon Redshift aos recursos locais e a tabelas externas do Amazon Redshift Spectrum). 

AUTHENTICATION  
O tipo de autenticação definido para ingestão de streaming. A ingestão de streaming com tipos de autenticação funciona com o Managed Streaming for Apache Kafka. Os tipos de `AUTHENTICATION` são os seguintes:  
+ **none**: especifica que não há nenhuma etapa obrigatória. Isso corresponde ao acesso não autenticado no MSK ou ao texto simples com TLS no Apache Kafka.
+ **iam**: especifica a autenticação do IAM. Ao escolher isso, o perfil do IAM tem permissões para autenticação do IAM. Para obter mais informações sobre o esquema externo, consulte [Conceitos básicos da ingestão de streaming de origens do Apache Kafka](materialized-view-streaming-ingestion-getting-started-MSK.md).
+ **mtls**: especifica que a segurança da camada de transporte mútuo oferece comunicação segura ao facilitar a autenticação entre um cliente e um servidor. Nesse caso, o cliente é o Redshift e o servidor é o Amazon MSK. Para ter mais informações sobre como configurar a ingestão de streaming com mTLS, consulte [Autenticação com mTLS para ingestão de streaming do Redshift por meio de origens do Apache Kafka](materialized-view-streaming-ingestion-mtls.md).


AUTHENTICATION\$1ARN  
O ARN do certificado do AWS Certificate Manager usado pelo Amazon Redshift para autenticação mTLS com o Amazon MSK. O ARN está disponível no console do ACM quando você escolhe o certificado emitido.

CLUSTER\$1ARN  
Para ingestão de streaming, o CLUSTER\$1ARN é o identificador do cluster do Amazon Managed Streaming para Apache Kafka do qual você está transmitindo. Ao usar CLUSTER\$1ARN, é necessária uma política de perfil do IAM que inclua a permissão `kafka:GetBootstrapBrokers`. Essa opção é fornecida para compatibilidade com versões anteriores. No momento, recomendamos usar a opção de URI do agente de bootstrap para conexão com os clusters do Amazon Managed Streaming para Apache Kafka. Para obter mais informações, consulte [Ingestão de streaming](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion.html).

## Observações de uso
<a name="r_CREATE_EXTERNAL_SCHEMA_usage"></a>

Para limites ao usar o catálogo de dados do Athena, consulte [Limites do Athena](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#amazon-athena-limits) na Referência geral da AWS.

Para os limites ao usar o AWS Glue Data Catalog, consulte [Limites do AWS Glue](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_glue) no Referência geral da AWS.

Esses limites não se aplicam a um metastore do Hive.

O máximo de esquemas permitido por banco de dados é 9,9 mil. Para obter mais informações, consulte [Cotas e limites](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) no *Guia de gerenciamento do Amazon Redshift*.

Para cancelar o registro do esquema, use o comando [DROP SCHEMA](r_DROP_SCHEMA.md). 

Para visualizar detalhes dos esquemas externos, consulte estas visualizações do 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) 

## Exemplos
<a name="r_CREATE_EXTERNAL_SCHEMA_examples"></a>

O exemplo a seguir cria um esquema externo usando um banco de dados em um catálogo de dados denominado `sampledb` na região Oeste dos EUA (Oregon). Use esse exemplo com um catálogo de dados do Athena ou AWS Glue.

```
create external schema spectrum_schema
from data catalog
database 'sampledb'
region 'us-west-2'
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';
```

O exemplo a seguir cria um esquema externo e um novo banco de dados externo denominado `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;
```

O exemplo a seguir cria um esquema externo usando um banco de dados do metastore do Hive denominado `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';
```

O exemplo a seguir encadeia funções para usar a função `myS3Role` para acessar o Amazon S3 e usa `myAthenaRole` para acesso ao catálogo de dados. Para obter mais informações, consulte [Encadeamento de funções do IAM no 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;
```

O exemplo a seguir cria um esquema externo que faz referência a um banco de dados do 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'
```

O exemplo a seguir cria um esquema externo para referenciar o sales\$1db importado no cluster de consumidor.

```
CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
```

O exemplo a seguir cria um esquema externo que faz referência a um banco de dados do 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>

Cria uma nova tabela externa no esquema especificado. Todas as tabelas externas devem ser criadas em um esquema externo. O caminho de pesquisa não é compatível com esquemas e tabelas externos. Para obter mais informações, consulte [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md).

Além das tabelas externas criadas usando o comando de CREATE EXTERNAL TABLE, o Amazon Redshift pode fazer referência a tabelas externas definidas em um catálogo do AWS Glue ou do AWS Lake Formation ou em uma metastore do Apache Hive. Use o comando [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) para registrar um banco de dados externo definido no catálogo externo e disponibilize as tabelas externas para uso no Amazon Redshift. Se a tabela externa existir em um catálogo do AWS Glue ou do AWS Lake Formation ou na metastore do Hive, você não precisará criar uma tabela usando CREATE EXTERNAL TABLE. Para visualizar as tabelas externas, consulte a exibição do sistema [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md). 

Ao executar o comando CREATE EXTERNAL TABLE AS, você cria uma tabela externa com base na definição da coluna de uma consulta e grava os resultados dessa consulta no Amazon S3. Os resultados estão no Apache Parquet ou no formato de texto delimitado. Se a tabela externa tiver uma chave ou chaves de partições, o Amazon Redshift particionará novos arquivos de acordo com essas chaves de partição e registrará novas partições no catálogo externo automaticamente. Para obter mais informações sobre CREATE EXTERNAL TABLE AS, consulte [Observações de uso](r_CREATE_EXTERNAL_TABLE_usage.md). 

Você pode consultar uma tabela externa usando a mesma sintaxe de SELECT que usa com outras tabelas do Amazon Redshift. Também é possível usar a sintaxe INSERT para gravar novos arquivos no local da tabela externa no Amazon S3. Para obter mais informações, consulte [INSERT (tabela externa)](r_INSERT_external_table.md).

Para criar uma exibição com uma tabela externa, inclua a cláusula WITH NO SCHEMA BINDING na instrução [CREATE VIEW](r_CREATE_VIEW.md).

Não é possível executar CREATE EXTERNAL TABLE em uma transação (BEGIN … END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

## Privilégios obrigatórios
<a name="r_CREATE_EXTERNAL_TABLE-privileges"></a>

Para criar tabelas externas, você deve ser proprietário do esquema externo ou um superusuário. Para transferir a propriedade de um esquema externo, use ALTER SCHEMA para alterar o proprietário. O acesso a tabelas externas é controlado pelo acesso ao esquema externo. Não é possível usar o comando [GRANT](r_GRANT.md) ou [REVOKE](r_REVOKE.md) para permissões em uma tabela externa. Em vez disso, conceda ou revogue USAGE no esquema externo.

As [Observações de uso](r_CREATE_EXTERNAL_TABLE_usage.md) têm informações adicionais sobre permissões específicas para tabelas externas.

## Sintaxe
<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' [, ...] ) ]
```

Veja a seguir a sintaxe 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 }
```

## Parâmetros
<a name="r_CREATE_EXTERNAL_TABLE-parameters"></a>

 *external\$1schema.table\$1name*   
Nome da tabela a ser criada, qualificada por um nome de esquema externo. As tabelas externas devem ser criadas em um esquema externo. Para obter mais informações, consulte [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md).  
O tamanho máximo de um nome de tabela é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes. É possível usar caracteres multibyte UFT-8 até um máximo de quatro bytes. O Amazon Redshift aplica um limite de 9.900 tabelas por cluster, incluindo tabelas temporárias definidas pelo usuário e tabelas temporárias criadas pelo Amazon Redshift durante o processamento de consultas ou a manutenção do sistema. Como opção, é possível qualificar o nome da tabela com o nome do banco de dados. No exemplo a seguir, o nome do banco de dados é `spectrum_db`, o nome do esquema externo é `spectrum_schema` e o nome da tabela é `test`.  

```
create external table spectrum_db.spectrum_schema.test (c1 int)
stored as parquet
location 's3://amzn-s3-demo-bucket/myfolder/';
```
Se o banco de dados ou esquema especificado não existir, a tabela não será criada e a instrução retornará um erro. Você não pode criar tabelas ou exibições nos bancos de dados do sistema `template0`, `template1`, `padb_harvest` ou `sys:internal`.  
O nome da tabela deve ser exclusivo para o esquema especificado.   
Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

( *nome\$1coluna* *tipo\$1dados* )  
O nome e o tipo de dados de cada coluna que está sendo criada.  
O tamanho máximo de um nome de coluna é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes. É possível usar caracteres multibyte UFT-8 até um máximo de quatro bytes. Você não pode especificar nomes de coluna `"$path"` ou `"$size"`. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).  
Por padrão, o Amazon Redshift cria tabelas externas com as pseudocolunas `$path` e `$size`. Você pode desabilitar a criação de pseudocolunas em uma sessão. Basta definir o parâmetro de configuração `spectrum_enable_pseudo_columns` como `false`. Para obter mais informações, consulte [Pseudocolunas](r_CREATE_EXTERNAL_TABLE_usage.md#r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns).  
Se as pseudocolunas forem habilitadas, o número máximo de colunas que você poderá definir em uma única tabela será 1.598. Se pseudocolunas não estiverem habilitadas, o número máximo de colunas que poderá ser definido em uma única tabela será 1.600.   
Se você estiver criando uma "tabela larga", assegure que sua lista de colunas não exceda os limites de largura de linha para resultados intermediários durante cargas e processamento de consultas. Para obter mais informações, consulte [Observações de uso](r_CREATE_TABLE_NEW.md#r_CREATE_TABLE_usage).  
Para um comando CREATE EXTERNAL TABLE AS, não é necessária uma lista de colunas, pois elas são derivadas da consulta.

 *data\$1type*   
Os seguintes [Tipos de dados](c_Supported_data_types.md) são compatíveis:  
+ SMALLINT (INT2)
+ INTEGER (INT, INT4)
+ BIGINT (INT8)
+ DECIMAL (NUMERIC)
+ REAL (FLOAT4)
+ DOUBLE PRECISION (FLOAT8)
+ BOOLEAN (BOOL)
+ CHAR (CHARACTER)
+ VARCHAR (CHARACTER VARYING)
+ VARBYTE (CHARACTER VARYING): pode ser usado com arquivos de dados Parquet e ORC, e somente com tabelas não particionadas.
+ DATE: pode ser usado somente com arquivos de dados de texto, Parquet ou ORC, ou como uma coluna de partição.
+ TIMESTAMP
  
Em DATE, você pode usar os formatos conforme descrito a seguir. Para valores mensais representados usando dígitos, estes formatos são compatíveis:  
+ `mm-dd-yyyy` Por exemplo, `05-01-2017`. Esse é o padrão.
+ `yyyy-mm-dd`, onde o ano é representado por mais de 2 dígitos. Por exemplo, `2017-05-01`.
Para valores mensais representados usando abreviações de três letras, estes formatos são compatíveis:  
+ `mmm-dd-yyyy` Por exemplo, `may-01-2017`. Esse é o padrão.
+ `dd-mmm-yyyy`, onde o ano é representado por mais de 2 dígitos. Por exemplo, `01-may-2017`.
+ `yyyy-mmm-dd`, onde o ano é representado por mais de 2 dígitos. Por exemplo, `2017-may-01`.
Para valores de ano consistentemente inferiores a 100, o ano é calculado desta maneira:  
+ Se o ano for inferior a 70, o ano será calculado como o ano mais 2000. Por exemplo, a data 05-01-17 no formato `mm-dd-yyyy` é convertida para `05-01-2017`.
+ Se o ano for inferior a 100 e maior que 69, o ano será calculado como o ano mais 1900. Por exemplo, a data 05-01-89 no formato `mm-dd-yyyy` é convertida para `05-01-1989`.
+ Para valores de ano representados por dois dígitos, adicione zeros à esquerda para representar o ano em 4 dígitos.
Os valores de data e hora nos arquivos de texto devem estar no formato `yyyy-mm-dd HH:mm:ss.SSSSSS`, como mostra o seguinte valor de data e hora de exemplo: `2017-05-01 11:30:59.000000`.  
O comprimento de uma coluna VARCHAR é definido em bytes, não em caracteres. Por exemplo, uma coluna VARCHAR(12) pode conter 12 caracteres de único byte ou 6 caracteres de dois bytes. Quando você consulta uma tabela externa, os resultados são truncados para se adequar ao tamanho da coluna definido sem retornar um erro. Para obter mais informações, consulte [Armazenamento e intervalos](r_Character_types.md#r_Character_types-storage-and-ranges).   
Para obter uma melhor performance, recomendamos especificar o menor tamanho de coluna que se ajusta aos seus dados. Para encontrar o tamanho máximo em bytes dos valores em uma coluna, use a função [OCTET\$1LENGTH](r_OCTET_LENGTH.md). O exemplo a seguir retorna o tamanho máximo de valores na coluna de email.  

```
select max(octet_length(email)) from users;

max
---
 62
```

PARTITIONED BY (*nome\$1col* *tipo\$1dados* [, … ] )  
Cláusula que define uma tabela particionada com uma ou mais colunas de partição. Um diretório de dados separado é usado para cada combinação específica, o que pode melhorar a performance da consulta em algumas condições. As colunas particionadas não existem na própria tabela de dados. Se você usar um valor para *col\$1name* que é o mesmo valor usado na coluna da tabela, obterá um erro.   
Depois de criar uma tabela particionada, altere-a usando uma instrução [ALTER TABLE](r_ALTER_TABLE.md) … ADD PARTITION para registrar novas partições no catálogo externo. Ao adicionar uma partição, você define a localização da subpasta no Amazon S3 que contém dados da partição.  
Por exemplo, se a tabela `spectrum.lineitem_part` for definida com `PARTITIONED BY (l_shipdate date)`, execute o comando ALTER TABLE a seguir para adicionar uma partição.  

```
ALTER TABLE spectrum.lineitem_part ADD PARTITION (l_shipdate='1992-01-29')
LOCATION 's3://spectrum-public/lineitem_partition/l_shipdate=1992-01-29';
```
Se você estiver usando CREATE EXTERNAL TABLE AS, não será necessário executar ALTER TABLE…ADD PARTITION. O Amazon Redshift registra novas partições no catálogo externo. O Amazon Redshift também grava automaticamente os dados correspondentes nas partições no Amazon S3 com base na chave ou nas chaves de partição definidas na tabela.  
Para visualizar partições, consulte a exibição do sistema [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md).  
Para um comando CREATE EXTERNAL TABLE AS, não é necessário especificar o tipo de dados da coluna de partição, pois essa coluna é derivada da consulta. 

ROW FORMAT DELIMITED *formatodelinha*  
Cláusula que especifica o formato de dados subjacentes. Os valores possíveis para *rowformat* são os seguintes:  
+ LINES TERMINATED BY '*delimiter*' 
+ FIELDS TERMINATED BY '*delimiter*' 
Especifique um único caractere ASCII para '*delimiter*'. É possível especificar caracteres ASCII não imprimíveis usando o sistema octal no formato `'\`*`ddd`*`'`, em que *`d`* é um dígito octal (0-7) até “\$1177”. O exemplo a seguir especifica o caractere BEL (sino) usando o sistema octal.   

```
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\007'
```
Se ROW FORMAT for omitido, o formato padrão será DELIMITED FIELDS TERMINATED BY '\$1A' (início do cabeçalho) e LINES TERMINATED BY '\$1n' (nova linha). 

ROW FORMAT SERDE '*serde\$1name*' [WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
Uma cláusula que especifica o formato SERDE para os dados subjacentes.     
'*serde\$1name*'  
O nome de SerDe. Você pode especificar os seguintes formatos:  
+ org.apache.hadoop.hive.serde2.RegexSerDe 
+ com.amazonaws.glue.serde.GrokSerDe 
+ org.apache.hadoop.hive.serde2.OpenCSVSerde 

  Esse parâmetro é compatível com a seguinte propriedade SerDe para OpenCSVSerde: 

  ```
  'wholeFile' = 'true' 
  ```

  Defina a propriedade `wholeFile` para `true` a fim de analisar corretamente novos caracteres de linha (\$1n) dentro de strings entre aspas para solicitações de OpenCSV. 
+ org.openx.data.jsonserde.JsonSerDe
  + O JSON SERDE também dá suporte aos arquivos Ion. 
  + O JSON bastante deve ser bem formado. 
  + Os timestamps em Ion e JSON precisam ter formato ISO8601.
  + Esse parâmetro é compatível com a seguinte propriedade SerDe para JsonSerDe: 

    ```
    'strip.outer.array'='true' 
    ```

    Processa arquivos Ion/JSON contendo uma matriz muito grande entre colchetes externos ( [ … ] ) como se contivesse vários registros JSON dentro da matriz. 
+ com.amazon.ionhiveserde.IonHiveSerDe

  O formato Amazon ION fornece formatos de texto e binário, além dos tipos de dados. Para uma tabela externa que faz referência a dados no formato ION, mapeie cada coluna na tabela externa para o elemento correspondente nos dados do formato ION. Para obter mais informações, consulte [Amazon Ion](https://amzn.github.io/ion-docs/). Também é necessário especificar os formatos de entrada e saída.  
WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
Opcionalmente, especifique nomes e valores de propriedade, separados por vírgulas.
Se ROW FORMAT for omitido, o formato padrão será DELIMITED FIELDS TERMINATED BY '\$1A' (início do cabeçalho) e LINES TERMINATED BY '\$1n' (nova linha). 

STORED AS *formato do arquivo*  
Formato para arquivos de dados.   
Os formatos válidos são:  
+ PARQUET
+ RCFILE (somente para dados que usem ColumnarSerDe, não LazyBinaryColumnarSerDe)
+ SEQUENCEFILE
+ TEXTFILE (para arquivos de texto, inclusive arquivos JSON).
+ ORC 
+ AVRO 
+ INPUTFORMAT '*input\$1format\$1classname*' OUTPUTFORMAT '*output\$1format\$1classname*' 
O comando CREATE EXTERNAL TABLE AS oferece suporte somente a dois formatos de arquivo, TEXTFILE e PARQUET.  
Para INPUTFORMAT e OUTPUTFORMAT, especifique um nome de classe, conforme exibido no exemplo a seguir:   

```
'org.apache.hadoop.mapred.TextInputFormat'
```

LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*'\$1  <a name="create-external-table-location"></a>
O caminho para a pasta ou bucket do Amazon S3 que contém arquivos de dados ou um arquivo manifesto que contém uma lista de caminhos de objetos do Amazon S3. Os buckets devem estar na mesma região da AWS que o cluster do Amazon Redshift. Para obter uma lista de regiões da AWS compatíveis, consulte [Limitações do Amazon Redshift Spectrum](c-spectrum-considerations.md).  
Se o caminho especificar uma pasta ou bucket, por exemplo `'s3://amzn-s3-demo-bucket/custdata/'`, o Redshift Spectrum fará a varredura dos arquivos na pasta ou bucket especificado e em todas as subpastas. O Redshift Spectrum ignora os arquivos ocultos e os arquivos que começam com um ponto ou um sublinhado.   
Se o caminho especificar um arquivo manifesto, o argumento `'s3://bucket/manifest_file'` deverá fazer referência explícita a um único arquivo, por exemplo, `'s3://amzn-s3-demo-bucket/manifest.txt'`. Ele não pode fazer referência a um prefixo de chaves.   
O manifesto é um arquivo de texto em formato JSON que lista o URL de cada arquivo a ser carregado a partir do Amazon S3 e o tamanho do arquivo em bytes. O URL inclui o nome do bucket e o caminho de objeto completo do arquivo. Os arquivos especificados no manifesto podem estar em buckets diferentes, mas todos os buckets devem estar na mesma região da AWS que o cluster do Amazon Redshift. Se for listado duas vezes, o arquivo será carregado duas vezes. O exemplo a seguir mostra o JSON de um manifesto que carrega três arquivos.   

```
{
  "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 } }
  ]
}
```
Você pode tornar a inclusão de um arquivo específico obrigatória. Para fazer isso, inclua uma opção `mandatory` em nível de arquivo no manifesto. Ao consultar uma tabela externa com um ficheiro obrigatório faltando, a instrução SELECT falha. Certifique-se de que todos os arquivos incluídos na definição da tabela externa estejam presentes. Se nem todos estiverem presentes, um erro será exibido mostrando o primeiro arquivo obrigatório que não foi encontrado. O exemplo a seguir mostra o JSON para um manifesto com a opção `mandatory` definida como `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 fazer referência a arquivos criados usando UNLOAD, use o manifesto criado usando [UNLOAD](r_UNLOAD.md) com o parâmetro MANIFEST. O arquivo manifesto é compatível com um arquivo manifesto para [COPY do Amazon S3](copy-parameters-data-source-s3.md), mas utiliza chaves diferentes. Chaves que não são usadas são ignoradas. 

TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*' [, ...] )   
Uma cláusula que estabelece a definição da tabela para propriedades da tabela.   
As propriedades de tabela fazem distinção entre maiúsculas e minúsculas.  
 'compression\$1type'='*valor*'   
 Uma propriedade que define o tipo de compactação a ser usado se o nome de arquivo não contiver uma extensão. Se você definir essa propriedade e houver uma extensão de arquivo, a extensão será ignorada e o valor definido pela propriedade será usado. Os valores válidos para o tipo de compactação são os seguintes:  
+ bzip2
+ gzip
+ nenhuma
+ snappy  
'data\$1cleansing\$1enabled'='true / false’  
Essa propriedade define se o tratamento de dados está ativado para a tabela. Quando 'data\$1cleansing\$1enabled' está definido como true, o tratamento de dados está ativado para a tabela. Quando 'data\$1cleansing\$1enabled' está definido como false, o tratamento de dados está desativado para a tabela. A seguir, há uma lista das propriedades de tratamento de dados em nível de tabela controladas por essa propriedade:  
+ column\$1count\$1mismatch\$1handling
+ invalid\$1char\$1handling
+ numeric\$1overflow\$1handling
+ replacement\$1char
+ surplus\$1char\$1handling
Para obter exemplos, consulte [Exemplos de tratamento de dados](r_CREATE_EXTERNAL_TABLE_examples.md#r_CREATE_EXTERNAL_TABLE_examples-data-handling).  
'invalid\$1char\$1handling'='*valor*'   
Especifica a ação a ser realizada quando os resultados da consulta contêm valores de caracteres UTF-8 inválidos. Você pode especificar as seguintes ações:    
DESATIVADA  
Não trata os caracteres inválidos.  
FAIL  
Cancela as consultas que retornam dados contendo valores UTF-8 inválidos.  
SET\$1TO\$1NULL   
Substitui os valores UTF-8 inválidos por null.  
DROP\$1ROW  
Substitui todos os valores da linha por null.  
REPLACE  
Substitui o caractere inválido pelo caractere de substituição especificado usando `replacement_char`.  
'replacement\$1char'='*caractere*’  
Especifica o caractere de substituição a ser usado quando você define `invalid_char_handling` como `REPLACE`.  
'numeric\$1overflow\$1handling'='valor’  
Especifica a ação a ser realizada quando os dados ORC contêm um inteiro (por exemplo, BIGINT ou int64) que é maior que a definição da coluna (por exemplo, SMALLINT ou int16). Você pode especificar as seguintes ações:    
DESATIVADA  
O tratamento de caracteres inválidos é desativado.  
FAIL  
Cancelar a consulta quando os dados incluírem caracteres inválidos.  
SET\$1TO\$1NULL  
Definir os caracteres inválidos como null.  
DROP\$1ROW  
Definir todos os valores da linha como null.  
'surplus\$1bytes\$1handling'='*value*'  
Especifica como lidar com os dados sendo carregados que excederem o comprimento do tipo de dado definido para colunas contendo dados VARBYTE. Por padrão, o Redshift Spectrum define o valor como null para dados que excedem a largura da coluna.  
Você pode especificar as seguintes ações a serem realizadas quando a consulta retorna dados que excedem o comprimento do tipo de dado:    
SET\$1TO\$1NULL  
Substitui os dados que excedem a largura da coluna por null.  
DESATIVADA  
Não lida com excesso de bytes.  
FAIL  
Cancela as consultas que retornam dados que excedem a largura da coluna.  
DROP\$1ROW  
Elimine todas as linhas que contêm dados que excedam a largura da coluna.  
TRUNCATE  
Remove os caracteres que excedem o número máximo de caracteres definido para a coluna.  
'surplus\$1char\$1handling'='*valor*'  
Especifica como lidar com os dados sendo carregados que excederem o comprimento do tipo de dados definido para colunas contendo VARCHAR, CHAR ou dados em string. Por padrão, o Redshift Spectrum define o valor como null para dados que excedem a largura da coluna.  
Você pode especificar as seguintes ações a serem realizadas quando a consulta retorna dados que excedem a largura da coluna:    
SET\$1TO\$1NULL  
Substitui os dados que excedem a largura da coluna por null.  
DESATIVADA  
Não trata de caracteres em excesso.  
FAIL  
Cancela as consultas que retornam dados que excedem a largura da coluna.  
DROP\$1ROW  
Substitui todos os valores da linha por null.  
TRUNCATE  
Remove os caracteres que excedem o número máximo de caracteres definido para a coluna.  
'column\$1count\$1mismatch\$1handling'='value’  
Identifica se o arquivo contém um número menor ou maior de valores para uma linha do que o de colunas especificado na definição da tabela externa. Essa propriedade só está disponível para um formato de arquivo de texto não compactado. Você pode especificar as seguintes ações:    
DESATIVADA  
O tratamento de incompatibilidade de contagem de colunas está desativado.  
FAIL  
Há falha na consulta se for detectada incompatibilidade na contagem de colunas.  
SET\$1TO\$1NULL  
Preencha os valores ausentes com NULL e ignore os valores adicionais em cada linha.  
DROP\$1ROW  
Elimine todas as linhas que contêm erro de incompatibilidade de contagem de colunas na verificação.  
'numRows'='*row\$1count*'   
Uma propriedade que define o valor de numRows para a definição da tabela. Para atualizar de maneira explícita as estatísticas de uma tabela externa, defina a propriedade numRows de maneira a indicar o tamanho da tabela. O Amazon Redshift não analisa as tabelas externas para gerar as estatísticas das tabelas que o otimizador de consultas utiliza para gerar um plano de consulta. Se as estatísticas de tabelas não estiverem definidas para uma tabela externa, o Amazon Redshift gera um plano de execução de consulta com base na suposição de que as tabelas externas são maiores e as tabelas locais são menores.  
'skip.header.line.count'='*line\$1count*'  
Uma propriedade que define o número de linhas a serem ignoradas no início de cada arquivo de origem.  
'serialization.null.format'=' '  
Uma propriedade que especifica o Spectrum deve retornar um valor `NULL` quando houver uma correspondência exata com o texto fornecido em um campo.  
'orc.schema.resolution'='mapping\$1type'  
Uma propriedade que define o tipo de mapeamento de coluna para tabelas que usam o formato de dados ORC. Essa propriedade é ignorada para outros formatos de dados.  
Os valores válidos para o tipo de mapeamento de coluna são os seguintes:   
+ name 
+ position 
Se a propriedade *orc.schema.resolution* for omitida, as colunas serão mapeadas por nome por padrão. Se *orc.schema.resolution* estiver definido como qualquer valor diferente de *'name'* ou *'position'*, as colunas serão mapeadas por posição. Para obter mais informações sobre o mapeamento de colunas, consulte [Mapeamento de colunas de tabela externa para colunas do ORC](c-spectrum-external-tables.md#c-spectrum-column-mapping-orc).  
O comando COPY mapeia para arquivos de dados ORC apenas por posição. A propriedade de tabela *orc.schema.resolution* não tem efeito sobre o comportamento do comando COPY.   
'write.parallel'='on / off’  
Uma propriedade que define se CREATE EXTERNAL TABLE AS deve gravar dados em paralelo. Por padrão, CREATE EXTERNAL TABLE AS grava dados em paralelo em vários arquivos, de acordo com o número de fatias no cluster. A opção padrão é ativado. Quando 'write.parallel' está definido como desativado, CREATE EXTERNAL TABLE AS grava em um ou mais arquivos de dados serialmente no Amazon S3. Essa propriedade de tabela também se aplica a qualquer instrução INSERT subsequente na mesma tabela externa.  
‘write.maxfilesize.mb’=‘size’  
Uma propriedade que define o tamanho máximo (em MB) de cada arquivo gravado no Amazon S3 por CREATE EXTERNAL TABLE AS. O tamanho deve ser um número inteiro entre 5 e 6.200. O tamanho máximo padrão do arquivo é 6.200 MB. Essa propriedade de tabela também se aplica a qualquer instrução INSERT subsequente na mesma tabela externa.  
‘write.kms.key.id’=‘*value*’  
É possível especificar uma chave AWS Key Management Service para habilitar a criptografia do lado do servidor (SSE) para objetos do Amazon S3, onde *value* é uma das seguintes ações:   
+ `auto` para usar o chave padrão do AWS KMS armazenada no bucket do Amazon S3.
+ *kms-key*que você especifica para criptografar dados.  
*select\$1statement*  
Uma instrução que insere uma ou mais linhas na tabela externa ao definir qualquer consulta. Todas as linhas que a consulta gera são gravadas no Amazon S3 no formato de texto ou Parquet com base na definição da tabela.

## Exemplos
<a name="r_CREATE_EXTERNAL_TABLE_examples_link"></a>

Uma coleção de exemplos está disponível em [Exemplos](r_CREATE_EXTERNAL_TABLE_examples.md).

# Observações de uso
<a name="r_CREATE_EXTERNAL_TABLE_usage"></a>

Este tópico contém notas de uso do [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). Não é possível exibir os detalhes das tabelas do Amazon Redshift Spectrum usando os mesmos recursos das tabelas padrão do Amazon Redshift, como [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md), [STV\$1TBL\$1PERM](r_STV_TBL_PERM.md), PG\$1CLASS, ou information\$1schema. Caso sua ferramenta de business intelligence ou análise não reconheça as tabelas externas do Redshift Spectrum, configure sua aplicação para consultar [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) e [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md).

## CREATE EXTERNAL TABLE AS
<a name="r_CETAS"></a>

Em alguns casos, é possível executar o comando CREATE EXTERNAL TABLE AS em um catálogo de dados do AWS Glue, em um catálogo externo do AWS Lake Formation ou em um metastore do Apache Hive. Nesses casos, use uma função do AWS Identity and Access Management (IAM) para criar o esquema externo. Essa função do IAM deve conter as permissões de leitura e gravação no Amazon S3. 

Se você usar um catálogo do Lake Formation, a função do IAM deve ter a permissão para criar tabelas no catálogo. Nesse caso, ela também deve ter a permissão do local do data lake no caminho de destino do Amazon S3. Essa função do IAM se torna proprietária da nova tabela do AWS Lake Formation.

Para garantir que os nomes dos arquivos sejam únicos, o Amazon Redshift usa o seguinte formato para o nome de cada arquivo carregado no Amazon S3 por padrão.

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

 Um exemplo é `20200303_004509_810669_1007_0001_part_00.parquet`.

Considere o seguinte ao executar o comando CREATE EXTERNAL TABLE AS:
+ O local do Amazon S3 deve estar vazio.
+ O Amazon Redshift oferece suporte somente aos formatos PARQUET e TEXTFILE ao usar a cláusula STORED AS.
+ Não é necessário criar uma lista de definições de coluna. Os nomes de colunas e os tipos de dados de coluna da nova tabela externa são derivados diretamente da consulta SELECT.
+ Não é necessário definir o tipo de dados da coluna de partição na cláusula PARTITIONED BY. Se você especificar uma chave de partição, o nome dessa coluna deverá existir no resultado da consulta SELECT. Ao ter várias colunas de partição, a ordem na consulta SELECT não importa. O Amazon Redshift usa a ordem definida na cláusula PARTITIONED BY para criar a tabela externa.
+ O Amazon Redshift automaticamente particiona arquivos de saída em pastas de partição com base nas chaves-valor de partição. Por padrão, o Amazon Redshift remove as colunas de partição dos arquivos de saída.
+ Não há suporte para a cláusula LINES TERMINATED BY 'delimiter'.
+ Não há suporte para a cláusula ROW FORMAT SERDE 'serde\$1name'.
+ Não há suporte para o uso de arquivos de manifesto. Dessa forma, não é possível definir a cláusula LOCATION em um arquivo manifesto no Amazon S3.
+ O Amazon Redshift automaticamente atualiza a propriedade da tabela “numRows” no final do comando.
+ A propriedade da tabela 'compression\$1type' aceita somente 'none' ou 'snappy' para o formato de arquivo PARQUET.
+ O Amazon Redshift não permite a cláusula LIMIT na consulta SELECT externa. Em vez disso, você pode usar uma cláusula LIMIT aninhada.
+ É possível usar STL\$1UNLOAD\$1LOG para rastrear os arquivos que são gravados no Amazon S3 por cada operação CREATE EXTERNAL TABLE AS.

## Permissões para criar e consultar tabelas externas
<a name="r_CREATE_EXTERNAL_TABLE_usage-permissions"></a>

Para criar tabelas externas, verifique se você é o proprietário do esquema externo ou um superusuário. Para transferir a propriedade de um esquema externo, use [ALTER SCHEMA](r_ALTER_SCHEMA.md). O exemplo a seguir altera o proprietário do esquema `spectrum_schema` para `newowner`.

```
alter schema spectrum_schema owner to newowner;
```

Para executar uma consulta do Redshift Spectrum, você precisa das seguintes permissões:
+ Permissão de uso no esquema 
+ Permissão para criar tabelas temporárias no banco de dados atual 

O exemplo a seguir concede permissão de uso no esquema `spectrum_schema` para o grupo de usuários `spectrumusers`.

```
grant usage on schema spectrum_schema to group spectrumusers;
```

O exemplo a seguir concede permissão temporária no banco de dados `spectrumdb` para o grupo de usuários `spectrumusers`. 

```
grant temp on database spectrumdb to group spectrumusers;
```

## Pseudocolunas
<a name="r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns"></a>

Por padrão, o Amazon Redshift cria tabelas externas com as pseudocolunas *\$1path* e *\$1size*. Selecione essas colunas para exibir o caminho que levará aos arquivos de dados no Amazon S3 e o tamanho dos arquivos de dados em cada linha retornada por uma consulta. Os nomes de coluna *\$1path* e *\$1size* devem ser delimitados por aspas duplas. A cláusula *SELECT \$1* não retornará as pseudocolunas. Você deve incluir explicitamente os nomes de coluna *\$1path* e *\$1size* na consulta, como mostra o exemplo a seguir.

```
select "$path", "$size"
from spectrum.sales_part
where saledate = '2008-12-01';
```

Você pode desabilitar a criação de pseudocolunas em uma sessão. Basta definir o parâmetro de configuração *spectrum\$1enable\$1pseudo\$1columns* como *false*. 

**Importante**  
A seleção de *\$1size* ou *\$1path* gera cobranças porque o Redshift Spectrum verifica os arquivos de dados no Amazon S3 para determinar o tamanho do conjunto de resultados. Para obter mais informações, consulte [Preço do Amazon Redshift](https://aws.amazon.com/redshift/pricing/).

## Definir opções de tratamento de dados
<a name="r_CREATE_EXTERNAL_TABLE_usage-data-handling"></a>

Você pode definir parâmetros de tabela para especificar o tratamento de entrada para dados que estão sendo consultados em tabelas externas, incluindo: 
+ Caracteres excedentes em colunas contendo VARCHAR, CHAR e dados em string. Para obter mais informações, consulte a propriedade de tabela externa `surplus_char_handling`.
+ Caracteres inválidos em colunas contendo VARCHAR, CHAR e dados em string. Para obter mais informações, consulte a propriedade de tabela externa `invalid_char_handling`.
+ Caractere de substituição a ser usado quando você especificar REPLACE como a propriedade de tabela externa `invalid_char_handling`.
+ Tratamento de transbordamento de conversão em colunas contendo dados inteiros e decimais. Para obter mais informações, consulte a propriedade de tabela externa `numeric_overflow_handling`.
+ Surplus\$1bytes\$1handling para especificar o tratamento de entradas para bytes excedentes em colunas que contêm dados varbyte. Para obter mais informações, consulte a propriedade de tabela externa `surplus_bytes_handling`.

# Exemplos
<a name="r_CREATE_EXTERNAL_TABLE_examples"></a>

O exemplo a seguir cria uma tabela chamada SALES no esquema externo do Amazon Redshift denominado `spectrum`. Os dados estão em arquivos de texto delimitados por tabulação. A cláusula TABLE PROPERTIES define a propriedade numRows como 170.000 linhas.

Dependendo da identidade usada para executar CREATE EXTERNAL TABLE, pode haver permissões do IAM que você precisa configurar. Como prática recomendada, anexe políticas de permissões a um perfil do IAM e, depois, atribua-as a usuários e grupos, conforme necessário. Para obter mais informações, consulte [Gerenciamento de identidade e acesso no 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');
```

O exemplo a seguir cria uma tabela que usa o JsonSerDe para fazer referência aos dados em 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';
```

O exemplo de CREATE EXTERNAL TABLE AS a seguir cria uma tabela externa não particionada. Depois, ele grava o resultado da consulta SELECT como Apache Parquet no local de destino do Amazon S3.

```
CREATE EXTERNAL TABLE spectrum.lineitem
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/lineitem/'
AS SELECT * FROM local_lineitem;
```

O exemplo a seguir cria uma tabela externa particionada e inclui as colunas de partição na 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 obter uma lista de bancos de dados existentes no catálogo de dados externo, consulte a exibição de 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 visualizar detalhes das tabelas externas, consulte as exibições [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) e [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md) do sistema.

O exemplo a seguir consulta a exibição 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
```

O exemplo a seguir consulta a exibição 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 exibir as partições de tabela, use a consulta a seguir.

```
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
```

O exemplo a seguir retorna o tamanho total de arquivos de dados relacionados de uma tabela 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
```

## Exemplos de particionamento
<a name="r_CREATE_EXTERNAL_TABLE_examples-partitioning"></a>

Para criar uma tabela externa particionada por data, execute o seguinte 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 adicionar as partições, execute os seguintes 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 selecionar dados na tabela particionada, execute a consulta a seguir.

```
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 visualizar as partições da tabela externa, consulte a exibição do 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
```

## Exemplos de formato de linha
<a name="r_CREATE_EXTERNAL_TABLE_examples-row-format"></a>

Este é um exemplo da especificação dos parâmetros ROW FORMAT SERDE para arquivos de dados armazenados no 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' ;
```

O exemplo a seguir mostra como especificar os parâmetros ROW FORMAT SERDE usando 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';
```

O exemplo a seguir mostra como especificar os parâmetros ROW FORMAT SERDE usando 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 tabela a seguir mostra um exemplo de definição de um log de acesso ao servidor do Amazon S3 em um bucket do S3. Use o Redshift Spectrum para consultar logs de acesso do 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’;
```

Este é um exemplo da especificação dos parâmetros ROW FORMAT SERDE para dados no 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'
```

## Exemplos de tratamento de dados
<a name="r_CREATE_EXTERNAL_TABLE_examples-data-handling"></a>

Os exemplos a seguir acessam o arquivo: [spi\$1global\$1rankings.csv](https://s3.amazonaws.com/redshift-downloads/docs-downloads/spi_global_rankings.csv). Você pode carregar o arquivo `spi_global_rankings.csv` em um bucket do Amazon S3 para experimentar esses exemplos.

O exemplo a seguir cria o esquema externo `schema_spectrum_uddh` e o banco de dados externo `spectrum_db_uddh`. Para `aws-account-id`, insira o ID da conta da AWS e, para `role-name`, insira seu nome de função do 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;
```

O exemplo a seguir cria uma tabela externa `soccer_league` no 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');
```

Confira o número de linhas da tabela `soccer_league`.

```
select count(*) from schema_spectrum_uddh.soccer_league;
```

Os números de linhas são exibidos.

```
count
645
```

A consulta a seguir exibe os 10 principais clubes. Como clube `Barcelona` tem um caractere inválido na string, um NULL é exibido para o nome.

```
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
```

O exemplo a seguir altera a tabela `soccer_league` para especificar as propriedades `invalid_char_handling`, `replacement_char` e `data_cleansing_enabled` da tabela externa e inserir um ponto de interrogação (?) como substituto de caracteres inesperados.

```
alter  table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='REPLACE','replacement_char'='?','data_cleansing_enabled'='true');
```

O exemplo a seguir consulta a tabela `soccer_league` para times com classificação de 1 a 10.

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

Como as propriedades da tabela foram alteradas, os resultados mostram os dez principais clubes, com o ponto de interrogação (?) como caractere substituto na oitava linha para o clube `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
```

O exemplo a seguir altera a tabela `soccer_league` para especificar que as propriedades `invalid_char_handling` da tabela externa descartem as linhas com caracteres inesperados.

```
alter table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='DROP_ROW','data_cleansing_enabled'='true');
```

O exemplo a seguir consulta a tabela `soccer_league` para times com classificação de 1 a 10.

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

Os resultados exibem os principais clubes, sem incluir a oitava linha para o clube `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>

O recurso de versão prévia das visualizações do Data Catalog só está disponível nas regiões a seguir.
+ Leste dos EUA (Ohio) (us-east-2)
+ Leste dos EUA (Norte da Virgínia) (us-east-1)
+ Oeste dos EUA (Norte da Califórnia) (us-west-1)
+ Ásia Pacific (Tóquio) (ap-northeast-1)
+ Europa (Irlanda) (eu-west-1)
+ UE (Estocolmo) (eu-north-1)

Cria uma exibição do Data Catalog. As exibições do Data Catalog são um esquema de exibição única que funciona com outros mecanismos SQL, como Amazon Athena e Amazon EMR. Você pode consultar a exibição no mecanismo de sua escolha. Consulte mais informações sobre visualizações do Catálogo de Dados em [Criação de uma visualização do Catálogo de Dados](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

## Sintaxe
<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;
```

## Parâmetros
<a name="r_CREATE_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
O esquema anexado ao banco de dados do AWS Glue, seguido do nome da exibição.

PROTECTED  
Especifica que o comando CREATE EXTERNAL VIEW só deverá ser concluído se a consulta dentro da query\$1definition puder ser concluída com êxito.

IF NOT EXISTS  
Cria a exibição se ela ainda não existir.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
A notação do esquema a ser usado durante a criação da exibição. Você pode especificar o uso do AWS Glue Data Catalog, um banco de dados do Glue criado por você, ou um esquema externo também criado por você. Consulte [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) e [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) para obter mais informações.

 *query\$1definition*   
A definição da consulta SQL executada pelo Amazon Redshift para alterar a exibição.

## Exemplos
<a name="r_CREATE_EXTERNAL_VIEW-examples"></a>

O exemplo a seguir cria uma exibição do Data Catalog chamada 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>

Crie uma nova função definida pelo usuário (UDF) escalar usando uma cláusula SQL SELECT ou um programa Python.

Para ter mais informações e exemplos, consulte [Funções definidas pelo usuário (UDFs) no Amazon Redshift](user-defined-functions.md).

## Privilégios obrigatórios
<a name="r_CREATE_FUNCTION-privileges"></a>

Você deve ter permissão de uma das seguintes formas para executar CREATE OR REPLACE FUNCTION:
+ Para CREATE FUNCTION:
  + O superusuário pode usar linguagens confiáveis e não confiáveis para criar funções.
  + Usuários com o privilégio de CREATE [ OR REPLACE ] FUNCTION podem criar funções com linguagens confiáveis.
+ Para REPLACE FUNCTION:
  + Superusuário
  + Usuários com o privilégio CREATE [ OR REPLACE ] FUNCTION
  + Proprietário da função

## Sintaxe
<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 }
```

## Parâmetros
<a name="r_CREATE_FUNCTION-parameters"></a>

OR REPLACE  
Especifica que, se uma função com os mesmos tipos de dados de argumento de nome e entrada, ou *assinatura*, como esta já existir, a função existente será substituída. Você só pode substituir uma função por uma nova função que defina um conjunto idêntico de tipos de dados. É preciso ser um superusuário para substituir uma função.  
Se uma função for definida com o mesmo nome que uma função existente mas com uma assinatura diferente, uma nova função será criada. Em outras palavras, o nome da função fica sobrecarregado. Para obter mais informações, consulte [Sobrecarga de nomes de função](udf-naming-udfs.md#udf-naming-overloading-function-names).

 *f\$1nome\$1função*   
Nome da função. Se você especificar um nome de esquema (como `myschema.myfunction`), a função será criada usando o esquema especificado. Caso contrário, a função será criada no esquema atual. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).  
Recomendamos que você prefixe os nomes de todos os UDF com `f_`. O Amazon Redshift reserva o prefixo `f_` para nomes UDF, portanto, usando o prefixo `f_`, você garante que seu nome UDF não entrará em conflito com nenhum nome de função SQL integrado do Amazon Redshift existente ou futuro. Para obter mais informações, consulte [Evitar conflitos na nomeação da UDF](udf-naming-udfs.md).  
Você pode definir mais de uma função com o mesmo nome se os tipos de dados dos argumentos de entrada forem diferentes. Em outras palavras, o nome da função fica sobrecarregado. Para obter mais informações, consulte [Sobrecarga de nomes de função](udf-naming-udfs.md#udf-naming-overloading-function-names).

 *py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
Para uma UDF Python, uma lista de nomes de argumento de entrada e tipos de dados. Para uma UDF SQL, uma lista de tipos de dados sem nomes de argumento. Em uma UDF Python, consulte argumentos usando nomes de argumento. Em uma UDF SQL, consulte argumentos usando \$11, \$12, etc. com base na ordem dos argumentos na lista de argumentos.   
Para uma UDF SQL, os tipos de dados de entrada e de retorno podem ser qualquer tipo de dados padrão do Amazon Redshift. Para uma UDF Python, os tipos de dados de entrada e retorno podem ser SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE ou TIMESTAMP. Além disso, as funções definidas pelo usuário (UDFs) do Python são compatíveis com um tipo de dados ANYELEMENT. Ele é convertido automaticamente em um tipo de dados padrão com base no tipo de dados do argumento correspondente fornecido no tempo de execução. Se vários argumentos usarem ANYELEMENT, todos encontrarão o mesmo tipo de dados no tempo de execução, com base no primeiro argumento ANYELEMENT da lista. Para obter mais informações, consulte [Tipos de dados da UDF Python](udf-data-types.md) e [Tipos de dados](c_Supported_data_types.md).  
Você pode especificar um máximo de 32 argumentos.

 RETURNS *tipo\$1dados*   
Tipo de dados do valor retornado pela função. O tipo de dados RETURNS pode ser qualquer tipo de dados padrão do Amazon Redshift. Além disso, as UDFs Python podem usar um tipo de dados ANYELEMENT, que é convertido automaticamente em um tipo de dados padrão com base no argumento fornecido no tempo de execução. Se você especificar ANYELEMENT para o tipo de dados de retorno, pelo menos um argumento deverá usar ANYELEMENT. O tipo de dados de retorno corresponde ao tipo de dados fornecido pelo argumento ANYELEMENT quando a função for chamada. Para obter mais informações, consulte [Tipos de dados da UDF Python](udf-data-types.md).

 VOLATILE \$1 STABLE \$1 IMMUTABLE   
Informa o otimizador de consulta sobre a volatilidade da função.   
Você terá a melhor otimização se identificar sua função com a categoria mais restrita de volatilidade válida para ela. Entretanto, se a categoria for restrita demais, o otimizador poderá ignorar erroneamente algumas chamadas, o que resultará em um conjunto incorreto de resultados. Por ordem de nível de restrição, começando a partir da menos restrita, as categorias são:  
+ VOLATILE
+ STABLE
+ IMMUTABLE
VOLATILE  
Dados os mesmos argumentos, a função pode retornar resultados diferentes em chamadas sucessivas, mesmo para as linhas em uma única instrução. O otimizador de consulta não pode fazer suposições sobre o comportamento de uma função volátil, portanto, uma consulta que usa uma função volátil deve reavaliar a função para cada linha de entrada.  
STABLE  
Dados os mesmos argumentos, a função certamente retorna os mesmos resultados para todas as linhas processadas em uma única instrução. A função pode retornar resultados diferentes quando chamada em instruções diferentes. Esta categoria permite que o otimizador aperfeiçoe várias chamadas da função em uma única instrução para uma única chamada da instrução.   
IMMUTABLE  
Dados os mesmos argumentos, a função sempre retorna o mesmo resultado. Quando uma consulta chama uma função `IMMUTABLE` com argumentos constantes, o otimizador faz uma avaliação prévia da função.

AS \$1\$1 *instrução* \$1\$1  
 Uma construção que delimita a instrução a ser executada. As palavras-chave literais `AS $$` e `$$` são obrigatórias.   
O Amazon Redshift exige que você inclua a instrução na sua função usando um formato chamado cotação de dólar. Qualquer item incluído na instrução é aprovado exatamente como está. Não é preciso inserir caracteres de escape antes dos caracteres especiais, pois o conteúdo da string é gravado literalmente.   
 Com a *cotação de dólar*, um par de símbolos de cifrão (\$1\$1) deve ser usado no início e no final da instrução para que ela seja executada, conforme exibido no exemplo a seguir.   

```
$$ my statement $$
```
 Como opção, entre cada par de símbolos de cifrão, você pode especificar uma string para ajudar a identificar a instrução. A string que você usa deve ser a mesma no início e no final dos pares de sinais. A sequência diferencia maiúsculas de minúsculas e segue as mesmas restrições de um identificador sem aspas, com a exceção de que não pode conter cifrões. O exemplo a seguir usa a string `test`.   

```
$test$ my statement $test$
```
Para obter mais informações sobre o uso de símbolos de cifrão, consulte “Constantes de string entre símbolos de cifrão” em [Estrutura lexical](https://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html) na documentação do PostgreSQL. 

*programa\$1python*   
Programa executável válido em Python que retorna um valor. A instrução que você aprovar com a função deve estar em conformidade com os requisitos de recuo como especificado no [Guia de estilo do código Python](https://www.python.org/dev/peps/pep-0008/#indentation) no site do Python. Para obter mais informações, consulte [Suporte da linguagem Python para UDFs](udf-python-language-support.md).

*SQL\$1clause*   
Uma cláusula SQL SELECT.  
A cláusula SELECT não pode conter estes tipos de cláusulas:  
+ FROM
+ INTO
+ WHERE
+ GROUP BY
+ ORDER BY
+ LIMIT

LANGUAGE \$1 plpythonu \$1 sql \$1   
Para Python, especifique `plpythonu`. Para SQL, especifique `sql`. Você deve ter permissão de uso na linguagem para SQL ou plpythonu. Para obter mais informações, consulte [Segurança e permissões de UDFs](udf-security-and-privileges.md).

## Observações de uso
<a name="r_CREATE_FUNCTION-usage-notes"></a>

### Funções aninhadas
<a name="r_CREATE_FUNCTION-usage-notes-nested-functions"></a>

Você pode chamar outra função definida pelo usuário (UDF) SQL a partir de uma UDF SQL. A função aninhada deve existir quando você executa o comando CREATE FUNCTION. O Amazon Redshift não rastreia as dependências das UDFs, portanto, se você remover a função aninhada, o Amazon Redshift não retornará um erro. Contudo, a UDF falhará se a função aninhada não existir. Por exemplo, a função a seguir chama a função `f_sql_greater `na cláusula SELECT.

```
create function f_sql_commission (float, float )
  returns float
stable
as $$
  select f_sql_greater ($1, $2)
$$ language sql;
```

### Segurança e privilégios de UDF
<a name="r_CREATE_FUNCTION-usage-notes-security-and-privileges"></a>

Para criar uma UDF, você deve ter permissão de uso na linguagem para SQL ou plpythonu (Python). Por padrão, USAGE ON LANGUAGE SQL é concedido para PUBLIC. No entanto, é necessário conceder explicitamente USAGE ON LANGUAGE PLPYTHONU a usuários ou grupos específicos. 

Para revogar o uso na SQL, revogue primeiro o uso em PUBLIC. Depois, conceda o uso na SQL somente a usuários ou grupos específicos que tenham permissão para criar UDFs SQL. O exemplo a seguir revoga o uso na SQL em PUBLIC e concede o uso ao grupo de usuários `udf_devs`.

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```

Para executar uma UDF, é necessário ter permissão de execução em cada função. Por padrão, a permissão de execução de novas UDFs é concedida a PUBLIC. Para restringir o uso, revogue a execução da permissão de PUBLIC para a função. Depois, conceda o privilégio a pessoas ou grupos específicos. 

Este exemplo revoga a permissão de execução da função `f_py_greater` em PUBLIC e concede o uso ao grupo de usuários `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;
```

Os superusuários têm todos os privilégios por padrão. 

Para obter mais informações, consulte [GRANT](r_GRANT.md) e [REVOKE](r_REVOKE.md).

## Exemplos
<a name="r_CREATE_FUNCTION-examples"></a>

### Exemplo de UDF Python escalar
<a name="r_CREATE_FUNCTION-python-example"></a>

O exemplo a seguir cria uma UDF Python que compara dois inteiros e retorna o valor maior.

```
create function f_py_greater (a float, b float)
  returns float
stable
as $$
  if a > b:
    return a
  return b
$$ language plpythonu;
```

O exemplo a seguir consulta a tabela SALES e chama a nova função `f_py_greater` para retornar COMMISSION ou 20% de PRICEPAID, o que for maior.

```
select f_py_greater (commission, pricepaid*0.20) from sales;
```

### Exemplo de UDF SQL escalar
<a name="r_CREATE_FUNCTION-sql-example"></a>

O seguinte exemplo cria uma função que compara dois números e retorna o maior valor. 

```
create function f_sql_greater (float, float)
  returns float
stable
as $$
  select case when $1 > $2 then $1
    else $2
  end
$$ language sql;
```

A consulta a seguir chama a nova função `f_sql_greater` para consultar a tabela SALES e retorna COMMISSION ou 20% de PRICEPAID, o que for maior.

```
select f_sql_greater (commission, pricepaid*0.20) from sales;
```

# CREATE GROUP
<a name="r_CREATE_GROUP"></a>

Define um novo grupo de usuários. Somente um superusuário pode criar um grupo.

## Sintaxe
<a name="r_CREATE_GROUP-synopsis"></a>

```
CREATE GROUP group_name
[ [ WITH ] [ USER username ] [, ...] ]
```

## Parâmetros
<a name="r_CREATE_GROUP-parameters"></a>

 *nome\$1grupo*   
Nome do novo grupo de usuários. Nomes de grupos que começam com dois sublinhados são reservados para uso interno do Amazon Redshift. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

WITH  
Sintaxe opcional para indicar parâmetros adicionais de CREATE GROUP.

USER  
Adiciona um ou mais usuários ao grupo.

 *Nome de usuário do*   
Nome do usuário a ser adicionado ao grupo.

## Exemplos
<a name="r_CREATE_GROUP-examples"></a>

O exemplo a seguir cria um grupo de usuários chamado ADMIN\$1GROUP com um dois usuários, ADMIN1 e ADMIN2.

```
create group admin_group with user admin1, admin2;
```

# CREATE IDENTITY PROVIDER
<a name="r_CREATE_IDENTITY_PROVIDER"></a>

Define um novo provedor de identidades. Somente um superusuário pode criar um provedor de identidades.

## Sintaxe
<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
    ]
  ];
```

## Parâmetros
<a name="r_CREATE_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
O nome do provedor de identidades. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

*type\$1name*  
O provedor de identidades com o qual interagir. No momento, o AWSIDC é o único provedor de identidades compatível.

*namespace\$1name*  
O namespace. Esse é um identificador exclusivo abreviado para o diretório do provedor de identidades.

 *parameter\$1string*   
Uma string com um objeto JSON formatado corretamente que contém os parâmetros e valores necessários para o provedor de identidades.

 *arn*   
O nome do recurso da Amazon (ARN) para uma aplicação gerenciada pelo Centro de Identidade do IAM. Esse parâmetro é aplicável somente quando o tipo de provedor de identidades é AWSIDC.

 *iam\$1role*   
O perfil do IAM que fornece permissões para fazer a conexão com o Centro de Identidade do IAM. Esse parâmetro é aplicável somente quando o tipo de provedor de identidades é AWSIDC.

 *auto\$1create\$1roles*   
Habilita ou desabilita o atributo de criação automática de perfil. Se o valor for TRUE, o Amazon Redshift habilitará o recurso de criação automática de perfil. Se o valor for FALSE, o Amazon Redshift desabilitará o recurso de criação automática de perfil. Se o valor desse parâmetro não for especificado, o Amazon Redshift o determinará usando a seguinte lógica:   
+  Se `AUTO_CREATE_ROLES` for habilitado, mas o valor não for especificado, o valor será definido como TRUE. 
+  Se `AUTO_CREATE_ROLES` não for habilitado e o provedor de identidades for AWSIDC, o valor será definido como FALSE. 
+  Se `AUTO_CREATE_ROLES` não for habilitado e o provedor de identidades for o Azure, o valor será definido como TRUE. 
Para incluir grupos, especifique `INCLUDE`. O padrão é vazio, o que significa incluir todos os grupos se `AUTO_CREATE_ROLES` estiver ativado.  
Para excluir grupos, especifique `EXCLUDE`. O padrão é vazio, o que significa não excluir nenhum grupo se `AUTO_CREATE_ROLES` estiver ativado.

 *filter\$1pattern*   
Uma expressão de caractere UTF-8 válida com o padrão para estabelecer correspondência com os nomes de grupo. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_CREATE_IDENTITY_PROVIDER.html)
Se *filter\$1pattern* não contiver metacaracteres, o padrão representará somente a própria string. Nesse caso, LIKE age da mesma forma que o operador de igualdade.   
*filter\$1pattern* aceita os seguintes caracteres:  
+  Caracteres alfabéticos maiúsculos e minúsculos (A-Z e a-z) 
+  Números (0-9) 
+  Os seguintes caracteres especiais: 

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

## Exemplos
<a name="r_CREATE_IDENTITY_PROVIDER-examples"></a>

O exemplo a seguir cria um provedor de identidades chamado *oauth\$1standard*, com um TYPE *Azure*, para estabelecer comunicação com o 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"]
}'
```

Você pode conectar uma aplicação gerenciada pelo Centro de Identidade do IAM a um cluster provisionado ou um grupo de trabalho existente do Amazon Redshift sem servidor. Isso permite gerenciar o acesso a um banco de dados do Redshift por meio do Centro de Identidade do IAM. Para fazer isso, execute um comando SQL de acordo com o exemplo a seguir. Você deve ser administrador de banco de dados.

```
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';
```

O ARN da aplicação, nesse caso, identifica a aplicação gerenciada à qual se conectar. Você pode encontrá-la executando `SELECT * FROM SVV_IDENTITY_PROVIDERS;`.

Para obter mais informações sobre como usar CREATE IDENTITY PROVIDER, incluindo exemplos adicionais, consulte [Federação de um provedor de identidades (IdP) nativo para o Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html). Para obter mais informações sobre a configuração de uma conexão do Redshift ao Centro de Identidade do IAM, consulte [Conectar o Redshift ao IAM Identity Center para proporcionar aos usuários uma experiência de logon ú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 uma biblioteca Python, que fica disponível para os usuários incorporarem ao criar uma função definida pelo usuário (UDF) com o comando [CREATE FUNCTION](r_CREATE_FUNCTION.md). O tamanho total das bibliotecas instaladas pelo usuário não pode exceder 100 MB. 

CREATE LIBRARY não pode ser executado em um bloco de transação (BEGIN … END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

O Amazon Redshift é compatível com Python versão 2.7. Para obter mais informações, acesse [www.python.org](https://www.python.org/).

Para obter mais informações, consulte [Exemplo: importar módulos personalizados da biblioteca Python](udf-importing-custom-python-library-modules.md). 

## Privilégios obrigatórios
<a name="r_CREATE_LIBRARY-privileges"></a>

A seguir estão os privilégios obrigatórios para CREATE LIBRARY:
+ Superusuário
+ Usuários com o privilégio CREATE LIBRARY ou com o privilégio da linguagem especificada

## Sintaxe
<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::<Conta da AWS-id>:role/<role-name>’ }
}
```

## Parâmetros
<a name="r_CREATE_LIBRARY-parameters"></a>

OR REPLACE  
Especifica que, se uma biblioteca com o mesmo nome que a atual já existe, a biblioteca existente será substituída. REPLACE é confirmado imediatamente. Se uma UDF que depende da biblioteca estiver em execução simultaneamente, a UDF poderá falhar ou retornar resultados inesperados, mesmo se a UDF estiver sendo executada em uma transação. É necessário ser o proprietário ou um superusuário para substituir uma biblioteca.

 *nome\$1biblioteca*   
Nome da biblioteca a ser instalada. Você não pode criar uma biblioteca que contenha um módulo com o mesmo nome que um módulo da biblioteca padrão Python ou de um módulo do Python pré-instalado pelo Amazon Redshift. Se uma biblioteca instalada pelo usuário existente usa o mesmo pacote Python que a biblioteca a ser instalada, é necessário remover a biblioteca existente antes de instalar a nova biblioteca. Para obter mais informações, consulte [Suporte da linguagem Python para UDFs](udf-python-language-support.md).

LANGUAGE plpythonu  
A linguagem a ser usada. O Python (plpythonu) é a única linguagem compatível. O Amazon Redshift é compatível com Python versão 2.7. Para obter mais informações, acesse [www.python.org](https://www.python.org/).

FROM  
Localização do arquivo da biblioteca. É possível especificar um nome de bucket e de objeto do Amazon S3, ou um URL para baixar o arquivo de um site público. A biblioteca deve ser compactada na forma de um arquivo `.zip`. Para obter mais informações, acesse [Criar e instalar módulos Python](https://docs.python.org/2/library/distutils.html?highlight=distutils#module-distutils) na documentação do Python.

 https://*file\$1url*   
URL para baixar o arquivo de um site público. O URL pode conter até três redirecionamentos. Veja a seguir um exemplo de URL de arquivo.  

```
'https://www.example.com/pylib.zip'
```

 s3://*bucket\$1name/file\$1name*   
O caminho para um único objeto do Amazon S3 que contém o arquivo de biblioteca. Veja a seguir um exemplo de um caminho de objeto do Amazon S3.  

```
's3://amzn-s3-demo-bucket/my-pylib.zip'
```
Se você especificar um bucket do Amazon S3, também deve fornecer credenciais de um usuário da AWS com permissão para baixar o arquivo.   
 Se o bucket do Amazon S3 não residir na mesma região da AWS que seu cluster do Amazon Redshift, use a opção REGION para especificar a região da AWS na qual os dados estão localizados. O valor da *aws\$1region* deve corresponder a uma região da AWS listada na tabela na descrição do parâmetro [REGION](copy-parameters-data-source-s3.md#copy-region) para o comando COPY.

*authorization*   
Cláusula que indica o método que o cluster usa na autenticação e autorização para acessar o bucket do Amazon S3 que contém o arquivo da biblioteca. Seu cluster deve ter permissão para acessar o Amazon S3 com as ações LIST e GET.  
A sintaxe para autorização é a mesma para a autorização do comando COPY. Para obter mais informações, consulte [Parâmetros de autorização](copy-parameters-authorization.md).  

```
IAM_ROLE { default | ‘arn:aws:iam::<Conta da AWS-id>:role/<role-name>’
```
 Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando CREATE LIBRARY for executado.  
Use o nome do recurso da Amazon (ARN) de uma função do IAM que seu cluster usa para autenticação e autorização. Se especificar IAM\$1ROLE, você não poderá usar ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN ou CREDENTIALS.  
Como opção, se o bucket do Amazon S3 usar criptografia no lado do servidor, forneça a chave de criptografia na string credentials-args. Se você usar credenciais de segurança temporárias, forneça o token temporário na string *credentials-args*.  
Para obter mais informações, consulte [Credenciais de segurança temporárias](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials).

 REGION [AS] *aws\$1region*   
A região da AWS em que o bucket do Amazon S3 está localizado. REGION é necessário quando o bucket do Amazon S3 não está na mesma região da AWS que o cluster do Amazon Redshift. O valor da *aws\$1region* deve corresponder a uma região da AWS listada na tabela na descrição do parâmetro [REGION](copy-parameters-data-source-s3.md#copy-region) para o comando COPY.  
Por padrão, CREATE LIBRARY pressupõe que o bucket do Amazon S3 esteja localizado na mesma região da AWSque o cluster do Amazon Redshift.

## Exemplos
<a name="r_CREATE_LIBRARY-examples"></a>

Os dois exemplos a seguir instalam o módulo Python [urlparse](https://docs.python.org/2/library/urlparse.html#module-urlparse), que é compactado em um arquivo chamado `urlparse3-1.0.3.zip`. 

O comando a seguir instala uma biblioteca de UDF chamada `f_urlparse` a partir de um arquivo compactado carregado no bucket do Amazon S3 localizado na região leste dos EUA.

```
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';
```

O exemplo a seguir instala uma biblioteca chamada `f_urlparse` a partir de um arquivo de biblioteca em um site.



```
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>

Cria uma política de mascaramento dinâmico de dados para ofuscar dados em um determinado formato. Para obter mais informações sobre mascaramento dinâmico de dados, consulte [Mascaramento dinâmico de dados](t_ddm.md).

Superusuários e usuários ou perfis que têm o perfil sys:secadmin podem criar uma política de mascaramento.

## Sintaxe
<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);
```

## Parâmetros
<a name="r_CREATE_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
O nome da política de mascaramento. A política de mascaramento não pode ter o mesmo nome que outra política de mascaramento que já existe no banco de dados.

database\$1name  
O nome do banco de dados de onde a política será criada. A política pode ser criada no banco de dados conectado ou no Catálogo de Permissões Federadas do Amazon Redshift.

*input\$1columns*   
Uma tupla de nomes de colunas no formato (col1 type, col2 type ...).  
Os nomes das colunas são usados como entrada para a expressão de mascaramento. Os nomes das colunas não precisam corresponder aos nomes das colunas que estão sendo mascaradas, mas os tipos de dados de entrada e saída devem corresponder.

*masking\$1expression*  
A expressão SQL usada para transformar as colunas de destino. Ela pode ser escrita usando funções de manipulação de dados, como funções de manipulação de strings, ou em conjunto com funções definidas pelo usuário escritas em SQL, Python ou com o AWS Lambda. Você pode incluir uma tupla de expressões de coluna para políticas de mascaramento que tenham várias saídas. Se você usar uma constante como sua expressão de mascaramento, deverá convertê-la explicitamente em um tipo que corresponda ao tipo de entrada.  
 Você deve ter a permissão USAGE em todas as funções definidas pelo usuário que você usa na expressão de mascaramento. 

Para o uso da CREATE MASKING POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do 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>

Cria uma visão materializada com base em uma ou mais tabelas do Amazon Redshift. Você também pode basear visões materializadas em tabelas externas criadas usando Spectrum ou consulta federada. Para obter informações sobre o Spectrum, consulte [Amazon Redshift Spectrum](c-using-spectrum.md). Para obter informações sobre consulta federada, consulte [Consultar dados com consultas federadas no Amazon Redshift](federated-overview.md).

## Sintaxe
<a name="mv_CREATE_MATERIALIZED_VIEW-synopsis"></a>

```
CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query
```

## Parâmetros
<a name="mv_CREATE_MATERIALIZED_VIEW-parameters"></a>

BACKUP  
Uma cláusula que especifica se uma visão materializada deve ser incluída em snapshots de cluster manuais ou automáticos.   
Para visões materializadas que não contêm dados críticos, especifique BACKUP NO para economizar tempo de processamento ao criar snapshosts, restaurar de snapshots e reduzir o uso de espaço de armazenamento no Amazon Simple Storage Service. A configuração BACKUP NO não tem efeito na replicação automática de dados para outros nós no cluster. Portanto, visões materializadas com BACKUP NO especificado são restauradas em caso de falha de nó. O padrão é BACKUP YES.

 *table\$1attributes*   
Uma cláusula que especifica como os dados na visão materializada são distribuídos, incluindo o seguinte:  
+  O estilo de distribuição da visão materializada, no formato `DISTSTYLE { EVEN | ALL | KEY }`. Se você omitir essa cláusula, o estilo da distribuição será `EVEN`. Para obter mais informações, consulte [Estilos de distribuição](c_choosing_dist_sort.md).
+ O código de distribuição da visão materializada, no formato `DISTKEY ( distkey_identifier )`. Para obter mais informações, consulte [Designação de estilos de distribuição](t_designating_distribution_styles.md).
+ A chave de classificação para a visão materializada, no formato `SORTKEY ( column_name [, ...] )`. Para obter mais informações, consulte [Chaves de classificação](t_Sorting_data.md).

AS *query*  
Uma instrução `SELECT` válida que define a visão materializada e seu conteúdo. O conjunto de resultados da consulta define as colunas e as linhas da visão materializada. Para obter informações sobre limitações ao criar visões materializadas, consulte [Limitações](#mv_CREATE_MATERIALIZED_VIEW-limitations).  
Além disso, os constructos de linguagem SQL específicos usados na consulta determinam se a visão materializada pode ser atualizada de maneira incremental ou total. Para obter informações sobre o método de atualização, consulte [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md). Para obter informações sobre as limitações da atualização incremental, consulte [Limitações para atualização incremental](materialized-view-refresh-sql-command.md#mv_REFRESH_MARTERIALIZED_VIEW_limitations).  
Se a consulta contiver um comando SQL incompatível com a atualização incremental, o Amazon Redshift exibirá uma mensagem indicando que a visão materializada usará uma atualização total. A mensagem poderá ou não ser exibida dependendo da aplicação cliente SQL. Verifique a coluna `state` do [STV\$1MV\$1INFO](r_STV_MV_INFO.md) para ver o tipo de atualização usado por uma visão materializada.

AUTO REFRESH  
Uma cláusula que define se a visão materializada deve ser atualizada automaticamente com as alterações mais recentes de suas tabelas base. O valor padrão é `NO`. Para obter mais informações, consulte [Atualizar uma visualização materializada](materialized-view-refresh.md).

## Observações de uso
<a name="mv_CREATE_MARTERIALIZED_VIEW_usage"></a>

Para criar uma visão materializada, você deve ter os seguintes privilégios:
+ Privilégios CREATE para um esquema.
+ Privilégio SELECT por tabela ou coluna para as tabelas de base a fim de criar uma visão materializada. Se você tiver privilégios por coluna para colunas específicas, poderá criar uma visão materializada somente para essas colunas.

 É possível criar uma visão materializada em um cluster remoto de unidade de compartilhamento de dados fornecendo o nome do banco de dados externo no `mv_name`. 

## Atualização incremental para visões materializadas em uma unidade de compartilhamento de dados
<a name="mv_CREATE_MARTERIALIZED_VIEW_datashare"></a>

 O Amazon Redshift oferece suporte à atualização automática e incremental de visões materializadas em uma unidade de compartilhamento de dados do consumidor quando as tabelas base são compartilhadas. A atualização incremental é uma operação em que o Amazon Redshift identifica alterações em uma ou mais tabelas base que ocorreram após a atualização anterior e atualiza somente os registros correspondentes na visão materializada. Ela é mais rápida do que uma atualização completa e melhora o desempenho da workload. Você não precisa alterar a definição de visão materializada para usar a atualização incremental. 

Há algumas limitações a serem observadas para usar a atualização incremental com uma visão materializada: 
+ A visão materializada deve fazer referência a um banco de dados apenas, seja local ou remoto. 
+ A atualização incremental está disponível somente em novas visões materializadas. Portanto, você deve descartar as visões materializadas existentes e recriá-las para que ocorra a atualização incremental.

Para obter mais informações sobre a criação de visões materializadas em uma unidade de compartilhamento de dados, consulte [Trabalhar com visualizações no compartilhamento de dados do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/datashare-views), que contém vários exemplos de consulta.

## Atualizações em DDL para visões materializadas ou tabelas base
<a name="materialized-view-ddl"></a>

Ao usar visões materializadas no Amazon Redshift, siga estas observações de uso para atualizações em linguagem de definição de dados (DDL) para visões materializadas ou tabelas base.
+ É possível adicionar colunas a uma tabela base sem afetar as visões materializadas que fazem referência à tabela-base.
+ Algumas operações podem deixar a visão materializada em um estado que não pode ser atualizado de forma alguma. Entre os exemplos estão operações como renomeação ou descarte de uma coluna, alteração do tipo de uma coluna e alteração do nome de um esquema. Essas visões materializadas podem ser consultadas, mas não podem ser atualizadas. Nesse caso, você deve descartar e recriar a visão materializada. 
+ Em geral, não é possível alterar a definição de uma visão materializada (instrução SQL desta).
+ Não é possível renomear uma visão materializada. 

## Limitações
<a name="mv_CREATE_MATERIALIZED_VIEW-limitations"></a>

Você não pode definir uma visão materializada que faça referência ou inclua o seguinte:
+ Exibições padrão ou tabelas e exibições do sistema.
+ Tabelas temporárias.
+ Funções definidas pelo usuário.
+ A cláusula ORDER BY, LIMIT ou OFFSET.
+ Referências de vinculação tardia a tabelas base. Ou seja, todas as tabelas base ou colunas relacionadas referenciadas na definição da consulta SQL da visão materializada devem existir e serem válidas. 
+ Funções somente de nó líder: CURRENT\$1SCHEMA, CURRENT\$1SCHEMAS, HAS\$1DATABASE\$1PRIVILEGE, HAS\$1SCHEMA\$1PRIVILEGE, HAS\$1TABLE\$1PRIVILEGE.
+ Você não pode usar a opção AUTO REFRESH YES quando a definição de visão materializada incluir funções mutáveis ou esquemas externos. Você também não pode usá-lo ao definir uma visão materializada em outra visão materializada.
+ Não é necessário executar manualmente o [ANALYZE](r_ANALYZE.md) com visões materializadas. Atualmente, isso acontece apenas via AUTO ANALYZE. Para obter mais informações, consulte [Análise de tabelas](t_Analyzing_tables.md).
+ Tabelas protegidas por RLS ou DDM. 
+ As visões materializadas criadas em clusters remotos de unidades de compartilhamento de dados não são compatíveis com referências em outras visões materializadas, tabelas do Spectrum, tabelas definidas em um cluster diferente do Redshift e UDFs. Isso é possível quando as visões materializadas são criadas no cluster local (produtor). 

## Exemplos
<a name="mv_CREATE_MARTERIALIZED_VIEW_examples"></a>

O exemplo a seguir cria uma visão materializada de três tabelas base que são unidas e agregadas. Cada linha representa uma categoria com o número de bilhetes vendidos. Ao consultar a visão materializada tickets\$1mv, os dados pré-calculados da visão materializada tickets\$1mv são acessados diretamente.

```
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;
```

O exemplo a seguir cria uma visão materializada semelhante ao exemplo anterior e usa a função 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;
```

O exemplo a seguir usa uma cláusula UNION ALL para unir a tabela `public_sales` do Amazon Redshift e a tabela `spectrum.sales` do Redshift Spectrum para criar uma visão materializada `mv_sales_vw`. Para obter informações sobre o comando CREATE EXTERNAL TABLE para Amazon Redshift Spectrum, consulte [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). A tabela externa do Redshift Spectrum referencia os dados no 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
```

O exemplo a seguir cria uma visão materializada `mv_fq` com base em uma tabela externa de consulta federada. Para obter informações sobre consulta federada, 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)
```

O exemplo a seguir mostra a definição de uma visão 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;
```

 O exemplo a seguir mostra como definir AUTO REFRESH na definição de visão materializada e também especifica um DISTSTYLE. Primeiro, crie uma tabela base simples. 

```
CREATE TABLE baseball_table (ball int, bat int);
```

Depois, crie uma visão materializada.

```
CREATE MATERIALIZED VIEW mv_baseball DISTSTYLE ALL AUTO REFRESH YES AS SELECT ball AS baseball FROM baseball_table;
```

Agora você pode consultar a visão materializada de mv\$1baseball. Para verificar se a opção AUTO REFRESH está ativada para uma visão materializada, consulte [STV\$1MV\$1INFO](r_STV_MV_INFO.md).

O exemplo a seguir cria uma visão materializada que faz referência a uma tabela de origem em outro banco de dados. Ele assume que o banco de dados que contém a tabela de origem, database\$1A, está no mesmo cluster ou grupo de trabalho da visão materializada, que é criada em database\$1B. (Você pode usar seus próprios bancos de dados no exemplo.) Primeiro, crie uma tabela em database\$1A chamada *cities*, com uma coluna *cityname*. Defina o tipo de dado da coluna como VARCHAR. Depois de criar a tabela de origem, execute o seguinte comando em database\$1B para criar uma visão materializada cuja origem seja sua tabela *cities*. Especifique o banco de dados e o esquema da tabela de origem na cláusula FROM:

```
CREATE MATERIALIZED VIEW cities_mv AS
SELECT  cityname
FROM    database_A.public.cities;
```

Consulte a visão materializada que você criou. A consulta recupera registros cuja fonte original é a tabela *cities* em database\$1A:

```
select * from cities_mv;
```

Quando você executa a instrução SELECT, *cities\$1mv* retorna os registros. Os registros são atualizados da tabela de origem somente quando uma instrução REFRESH é executada. Além disso, observe que não é possível atualizar registros diretamente na visão materializada. Para obter informações sobre como atualizar os dados em uma visão materializada, consulte [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md).

Para obter detalhes sobre a visão geral da visão materializada e os comandos SQL usados para atualizar e descartar visões materializadas, consulte os seguintes tópicos:
+ [Visões materializadas no 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**
+ [Pré-requisitos](#r_create_model_prereqs)
+ [Privilégios obrigatórios](#r_simple_create_model-privileges)
+ [Controle de custos](#r_create_model_cost)
+ [CREATE MODEL completo](#r_full_create_model)
+ [Parâmetros](#r_create_model_parameters)
+ [Observações de uso](r_create_model_usage_notes.md)
+ [Casos de uso](r_create_model_use_cases.md)

## Pré-requisitos
<a name="r_create_model_prereqs"></a>

Antes de usar a instrução CREATE MODEL, conclua os pré-requisitos em [Configuração de cluster para usar o Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup). A seguir está um resumo de alto nível dos pré-requisitos.
+ Crie um cluster do Amazon Redshift com o Console de Gerenciamento da AWS ou a Interface de linha de comando da AWS (AWS CLI).
+ Anexe a política de Identity and Access Management (IAM) da AWS ao criar o cluster.
+ Para permitir que o Amazon Redshift e o SageMaker AI assumam o perfil a fim de interagir com outros serviços, adicione a política de confiança apropriada ao perfil do IAM.

Para obter detalhes sobre a função do IAM, a política de confiança e outros pré-requisitos, consulte [Configuração de cluster para usar o Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup).

A seguir, você pode encontrar diferentes casos de uso para a instrução CREATE MODEL.
+ [CREATE MODEL simples](r_create_model_use_cases.md#r_simple_create_model)
+ [CREATE MODEL com orientação do usuário](r_create_model_use_cases.md#r_user_guidance_create_model)
+ [Modelos CREATE XGBoost com AUTO OFF](r_create_model_use_cases.md#r_auto_off_create_model)
+ [Traga seu próprio modelo (BYOM): inferência local](r_create_model_use_cases.md#r_byom_create_model)
+ [Traga seu próprio modelo (BYOM): inferência remota](r_create_model_use_cases.md#r_byom_create_model_remote)
+ [CREATE MODEL com K-MEANS](r_create_model_use_cases.md#r_k-means_create_model)
+ [CREATE MODEL completo](#r_full_create_model)

## Privilégios obrigatórios
<a name="r_simple_create_model-privileges"></a>

A seguir estão os privilégios obrigatórios para CREATE MODEL:
+ Superusuário
+ Usuários com o privilégio CREATE MODEL
+ Funções com privilégio GRANT CREATE MODEL

## Controle de custos
<a name="r_create_model_cost"></a>

 O Amazon Redshift ML usa os recursos de cluster existentes para criar modelos de previsão. Portanato, você não precisa pagar a mais. No entanto, você pode ter custos adicionais se precisar redimensionar o cluster ou quiser treinar seus modelos. O Amazon Redshift ML usa o Amazon SageMaker AI para treinar modelos, o que tem um custo adicional associado. Há maneiras de controlar os custos adicionais, como limitar a quantidade máxima de tempo que o treinamento pode levar ou limitar o número de exemplos de treinamento usados para treinar o modelo. Para obter mais informações, consulte [Custos de uso do Amazon Redshift ML](https://docs.aws.amazon.com/redshift/latest/dg/cost.html). 

## CREATE MODEL completo
<a name="r_full_create_model"></a>

A seguir, resume as opções básicas da sintaxe CREATE MODEL completa.

### Sintaxe completa do CREATE MODEL
<a name="r_auto_off-create-model-synposis"></a>

A seguir está a sintaxe completa da instrução CREATE MODEL.

**Importante**  
Ao criar um modelo usando a instrução CREATE MODEL, siga a ordem das palavras-chave na sintaxe a seguir.

```
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
    ) ]
```

## Parâmetros
<a name="r_create_model_parameters"></a>

model\$1name  
O nome do modelo. O nome do modelo em um esquema deve ser exclusivo.

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1 *'job\$1name'*\$1  
O table\$1name ou a consulta que especifica os dados de treinamento. Eles podem ser uma tabela existente no sistema ou uma consulta SELECT compatível com o Amazon RedShift entre parênteses, ou seja, (). Deve haver pelo menos duas colunas no resultado da consulta. 

TARGET *column\$1name*  
O nome da coluna que se torna o alvo da previsão. A coluna deve existir na cláusula FROM. 

FUNCTION *function\$1name* ( *data\$1type* [, ...] )  
O nome da função a ser criada e os tipos de dados dos argumentos de entrada. É possível fornecer o nome de um esquema no banco de dados em vez de um nome de função.

RETURNS *tipo\$1dados*  
O tipo de dados a ser retornado pela função do modelo. O tipo de dados `SUPER` retornado só se aplica a BYOM com inferência remota.

SAGEMAKER *'endpoint\$1name'*[:*'model\$1name'*]  
O nome do endpoint do Amazon SageMaker AI. Se o nome do endpoint apontar para um endpoint multimodelo, adicione o nome do modelo a ser usado. O endpoint deve estar hospedado na mesma Região da AWS que o cluster do Amazon Redshift.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando CREATE MODEL for executado. Como alternativa, você pode especificar o ARN de um perfil do IAM para usar esse perfil.

[ AUTO ON / OFF ]  
 Ativa ou desativa a descoberta automática da seleção de hiperparâmetros, algoritmo e pré-processador de CREATE MODEL. Especificar “on” ao criar um modelo do Forecast indica o uso de um AutoPredictor, em que o Amazon Forecast aplica as combinações ideais de algoritmos a cada série temporal em seu conjunto de dados. 

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1 KMEANS \$1 FORECAST \$1*   
(Opcional) Especifica o tipo de modelo. Você pode especificar se deseja treinar um modelo de um tipo específico, como XGBoost, multilayer perceptron (MLP), KMEANS ou Linear Learner, que são todos algoritmos compatíveis com o Amazon SageMaker AI Autopilot. Se você não especificar o parâmetro, todos os tipos de modelo aceitos serão pesquisados durante o treinamento para obter o melhor modelo. Também é possível gerar um modelo de previsão no Redshift ML para criar previsões precisas de séries temporais.

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(Opcional) Especifica o tipo de problema. Se você souber o tipo de problema, pode restringir o Amazon Redshift a apenas pesquisar o melhor modelo desse tipo de modelo específico. Se você não especificar esse parâmetro, um tipo de problema será descoberto durante o treinamento com base em seus dados.

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 o nome da métrica objetiva usada para medir a qualidade preditiva de um sistema de Machine Learning. Essa métrica é otimizada durante o treinamento para fornecer a melhor estimativa dos valores dos parâmetros do modelo a partir dos dados. Se você não especificar uma métrica explicitamente, o comportamento padrão é usar automaticamente MSE: para regressão, F1: para classificação binária, Precisão: para classificação multiclass. Para obter informações sobre objetivos, consulte [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) na *Referência de API do Amazon SageMaker AI* e [Learning Task Parameters](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters) na documentação do XGBOOST. Os valores RMSE, WAPE, MAPE, MASE e AverageWeightedQuantileLoss são aplicáveis somente aos modelos de previsão. Para obter mais informações, consulte a operação de API [CreateAutoPredictor](https://docs.aws.amazon.com/forecast/latest/dg/API_CreateAutoPredictor.html#forecast-CreateAutoPredictor-request-OptimizationMetric).

 *PREPROCESSORS 'string' *   
(Opcional) Especifica certas combinações de pré-processadores para determinados conjuntos de colunas. O formato é uma lista de columnSets e as transformações apropriadas a serem aplicadas a cada conjunto de colunas. O Amazon Redshift aplica todos os transformadores em uma lista de transformadores específica a todas as colunas no ColumnSet correspondente. Por exemplo, para aplicar OneHotEncoder com Imputer às colunas t1 e t2, use o comando de exemplo a seguir.  

```
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 se os parâmetros padrão do XGBoost são usados ou substituídos por valores especificados pelo usuário. Os valores devem ser colocados entre aspas simples. A seguir estão exemplos de parâmetros para XGBoost e seus padrões.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/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 array of strings )  
A cláusula S3\$1BUCKET especifica o local do Amazon S3 usado para armazenar resultados intermediários.  
(Opcional) O parâmetro TAGS é uma lista separada por vírgulas de pares de chave-valor que você pode usar para marcar recursos criados no Amazon SageMaker AI e no Amazon Forecast. As tags ajudam você a organizar recursos e alocar custos. Os valores no par são opcionais, então você pode criar tags usando o formato `key=value` ou simplesmente criando uma chave. Para obter mais informações sobre tags no Amazon Redshift, consulte [Visão geral da marcação](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-tagging.html).  
(Opcional) KMS\$1KEY\$1ID especifica se o Amazon Redshift usa criptografia do lado do servidor com uma chave do AWS KMS para proteger dados em repouso. Os dados em trânsito são protegidos com Secure Sockets Layer (SSL).   
(Opcional) S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1 especifica se o Amazon Redshift executa a coleta de resíduos nos conjuntos de dados resultantes usados nos modelos e para treiná-los. Se definido como OFF, os conjuntos de dados resultantes usados para treinar modelos e os modelos permanecem no Amazon S3 e podem ser usados para outros fins. Se definido como ON, o Amazon Redshift excluirá os artefatos no Amazon S3 após a conclusão do treinamento. O padrão é ON.  
(Opcional) MAX\$1CELLS especifica o número de células nos dados de treinamento. Esse valor é o produto do número de registros (na consulta de treinamento ou tabela) vezes o número de colunas. O padrão é 1.000.000.  
(Opcional) MAX\$1RUNTIME especifica a quantidade máxima de tempo para treinar. Os trabalhos de treinamento geralmente concluem mais cedo dependendo do tamanho do conjunto de dados. Isso especifica a quantidade máxima de tempo em que o treinamento deve levar. The default is 5.400 (90 minutos).  
HORIZON especifica o número máximo de previsões que o modelo pode retornar. Depois que o modelo é treinado, não é possível alterar esse número inteiro. Esse parâmetro é necessário para treinar um modelo de previsão.  
FREQUENCY especifica o nível de detalhamento que você deseja que as previsões tenham, em unidades de tempo. As opções disponíveis são  `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`. Esse parâmetro é necessário para treinar um modelo de previsão.  
(Opcional) PERCENTILES é uma string delimitada por vírgula que especifica os tipos de previsão usados para treinar um previsor. Os tipos de previsão podem ser quantis de 0,01 a 0,99, em incrementos de 0,01 ou mais. Você também pode especificar a previsão média com mean. É possível especificar até cinco tipos de previsão.

 MAX\$1BATCH\$1ROWS *inteiro*   
(Opcional) O número máximo de linhas que o Amazon Redshift envia em uma única solicitação em lote para uma única invocação do SageMaker AI. Ele é compatível somente com BYOM com inferência remota. O valor mínimo desse parâmetro é 1. O valor máximo é `INT_MAX` ou 2.147.483.647. Esse parâmetro é necessário somente quando os tipos de dados de entrada e retornados são *SUPER*. O valor padrão é `INT_MAX`, ou 2.147.483.647. 

# Observações de uso
<a name="r_create_model_usage_notes"></a>

Ao usar CREATE MODEL, considere o seguinte:
+ A instrução CREATE MODEL opera em um modo assíncrono e retorna após a exportação de dados de treinamento para o Amazon S3. As etapas restantes do treinamento no Amazon SageMaker AI ocorrem em segundo plano. Enquanto o treinamento estiver em andamento, a função de inferência correspondente será visível, mas não pode ser executada. É possível consultar [STV\$1ML\$1MODEL\$1INFO](r_STV_ML_MODEL_INFO.md) para ver o estado do treinamento. 
+ O treinamento pode ser executado por até 90 minutos em segundo plano, por padrão no modelo Automático e pode ser estendido. Para cancelar o treinamento, basta executar o comando [DROP MODEL](r_DROP_MODEL.md).
+ O cluster do Amazon Redshift que você usa para criar o modelo e o bucket do Amazon S3 que é usado para preparar os dados de treinamento e os artefatos do modelo devem estar na mesma região da AWS.
+ Durante o treinamento do modelo, o Amazon Redshift e o SageMaker AI armazenam artefatos intermediários no bucket do Amazon S3 fornecido por você. Por padrão, o Amazon Redshift executa a coleta de resíduos no final da operação CREATE MODEL. O Amazon Redshift remove esses objetos do Amazon S3. Para reter esses artefatos no Amazon S3, defina a opção S3\$1GARBAGE COLLECT OFF.
+ Você deve usar pelo menos 500 linhas nos dados de treinamento fornecidos na cláusula FROM.
+ Você só pode especificar até 256 colunas de recursos (entrada) na cláusula FROM \$1 table\$1name \$1 ( select\$1query ) \$1 ao usar a instrução CREATE MODEL.
+ Para AUTO ON, os tipos de coluna que você pode usar como conjunto de treinamento são SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE, BOOLEAN, CHAR, VARCHAR, DATE, TIME, TIMETZ, TIMESTAMP, e TIMESTAMPTZ. Para AUTO ON, os tipos de coluna que você pode usar como conjunto de treinamento são SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE, e BOOLEAN.
+ Não é possível usar DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, GEOMETRY, GEOGRAPHY, HLLSKETCH, SUPER ou VARBYTE como o tipo de coluna de destino.
+ Para melhorar a precisão do modelo, execute um dos seguintes procedimentos:
  + Adicione tantas colunas relevantes no comando CREATE MODEL quanto possível quando você especificar os dados de treinamento na cláusula FROM.
  + Use um valor maior para MAX\$1RUNTOME e MAX\$1CELLS. Valores maiores para este parâmetro aumentam o custo do treinamento de um modelo.
+ A execução da instrução CREATE MODEL retorna assim que os dados de treinamento são calculados e exportados para o bucket do Amazon S3. Após esse ponto, você pode verificar o status do treinamento usando o comando SHOW MODEL. Quando um modelo que está sendo treinado em segundo plano falhar, você pode verificar o erro usando SHOW MODEL. Não é possível repetir um modelo com falha. Use DROP MODEL para remover um modelo com falha e recriar um novo modelo. Para obter mais informações sobre SHOW MODEL, consulte [SHOW MODEL](r_SHOW_MODEL.md).
+ O BYOM local oferece suporte ao mesmo tipo de modelos que o Amazon Redshift ML oferece suporte para casos não BYOM. O Amazon Redshift é compatível com o XGBoost simples (usando o XGBoost versão 1.0 ou posterior), modelos KMEANS sem pré-processadores e modelos XGBOOST/MLP/Linear Learner treinados pelo Amazon SageMaker AI Autopilot. Ele é compatível com este último com pré-processadores especificados pelo Autopilot e que são compatíveis com o Amazon SageMaker AI Neo.
+ Se o cluster do Amazon Redshift tiver o roteamento aprimorado habilitado para a nuvem privada virtual (VPC), crie um endpoint da VPC do Amazon S3 e um endpoint da VPC do SageMaker AI para a VPC em que o cluster está. Isso permite que o tráfego seja executado através de sua VPC entre esses serviços durante CREATE MODEL. Para obter mais informações, consulte [Sub-redes e grupos de segurança da Amazon VPC dos trabalhos do SageMaker Clarify](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>

Os casos de uso a seguir demonstram como usar CREATE MODEL para atender às suas necessidades.

## CREATE MODEL simples
<a name="r_simple_create_model"></a>

A seguir o resumo das opções básicas da sintaxe CREATE MODEL.

### Sintaxe simples CREATE MODEL
<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 simples CREATE MODEL
<a name="r_simple-create-model-parameters"></a>

 *model\$1name*   
O nome do modelo. O nome do modelo em um esquema deve ser exclusivo.

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1  
O table\$1name ou a consulta que especifica os dados de treinamento. Eles podem ser uma tabela existente no sistema ou uma consulta SELECT compatível com o Amazon RedShift entre parênteses, ou seja, (). Deve haver pelo menos duas colunas no resultado da consulta. 

TARGET *column\$1name*  
O nome da coluna que se torna o alvo da previsão. A coluna deve existir na cláusula FROM. 

FUNCTION *prediction\$1function\$1name*   
Um valor que especifica o nome da função de Machine Learning do Amazon Redshift a ser gerada pelo CREATE MODEL e usada para fazer previsões usando esse modelo. A função é criada no mesmo esquema que o objeto modelo e pode ser sobrecarregada.  
O Machine Learning do Amazon Redshift oferece suporte a modelos, como modelos Xtreme Gradient Boosted tree (XGBoost) para regressão e classificação.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando CREAT MODEL for executado. Como alternativa, você pode especificar o ARN de um perfil do IAM para usar esse perfil.

 *S3\$1BUCKET *'amzn-s3-demo-bucket'**   
O nome do bucket do Amazon S3 que você criou anteriormente era usado para compartilhar dados e artefatos de treinamento entre o Amazon Redshift e o SageMaker AI. O Amazon Redshift cria uma subpasta neste bucket antes do descarregamento dos dados de treinamento. Quando o treinamento for concluído, o Amazon Redshift exclui a subpasta criada e seu conteúdo. 

Inteiro MAX\$1CELLS   
O número máximo de células a serem exportadas da cláusula FROM. O padrão é 1.000.000.   
O número de células é o produto do número de linhas nos dados de treinamento (produzidos pela tabela ou consulta da cláusula FROM) vezes o número de colunas. Se o número de células nos dados de treinamento for maior do que o especificado pelo parâmetro max\$1cells, CREATE MODEL baixará os dados de treinamento da cláusula FROM para reduzir o tamanho do conjunto de treinamento abaixo de MAX\$1CELLS. Permitir conjuntos de dados de treinamento maiores pode produzir maior precisão, mas também pode significar que o modelo leva mais tempo para treinar e custa mais.  
Para obter informações sobre os custos de uso do Amazon Redshift, consulte [Custos para usar o Amazon Redshift ML](cost.md).  
Para obter mais informações sobre os custos associados a vários números de celular e detalhes sobre o teste gratuito, consulte [Preços do Amazon Redshift](https://aws.amazon.com/redshift/pricing).

## CREATE MODEL com orientação do usuário
<a name="r_user_guidance_create_model"></a>

A seguir, você pode encontrar uma descrição das opções para CREATE MODEL, além das opções descritas em [CREATE MODEL simples](#r_simple_create_model).

Por padrão, CREATE MODEL procura a melhor combinação de pré-processamento e modelo para seu conjunto de dados específico. Você pode querer controle adicional ou introduzir conhecimento de domínio adicional (como tipo de problema ou objetivo) sobre seu modelo. Em um cenário de rotatividade do cliente, se o resultado “cliente não está ativo” for raro, o objetivo de F1 geralmente é preferido ao objetivo de precisão. Como os modelos de alta precisão podem prever “o cliente está ativo” o tempo todo, isso resulta em alta precisão, mas pouco valor empresarial. Para obter informações sobre o objetivo F1, consulte [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) na *Referência de API do Amazon SageMaker AI*.

Em seguida, o CREATE MODEL segue suas sugestões sobre os aspectos especificados, como o objetivo. Ao mesmo tempo, o CREATE MODEL descobre automaticamente os melhores pré-processadores e os melhores hiperparâmetros. 

### CREATE MODEL com sintaxe de orientação do usuário
<a name="r_user_guidance-create-model-synposis"></a>

CREATE MODEL oferece mais flexibilidade nos aspectos que você pode especificar e nos aspectos que o Amazon Redshift detecta automaticamente.

```
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 com parâmetros de orientação do usuário
<a name="r_user_guidance-create-model-parameters"></a>

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1*   
(Opcional) Especifica o tipo de modelo. Você pode especificar se deseja treinar um modelo de um tipo específico, como XGBoost, perceptron multicamada (MLP) ou Linear Learner, que são todos algoritmos compatíveis com o Amazon SageMaker AI Autopilot. Se você não especificar o parâmetro, todos os tipos de modelo aceitos serão pesquisados durante o treinamento para obter o melhor modelo.

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(Opcional) Especifica o tipo de problema. Se você souber o tipo de problema, pode restringir o Amazon Redshift a apenas pesquisar o melhor modelo desse tipo de modelo específico. Se você não especificar esse parâmetro, um tipo de problema será descoberto durante o treinamento com base em seus dados.

OBJECTIVE ( 'MSE' \$1 'Accuracy' \$1 'F1' \$1 'F1Macro' \$1 'AUC')  
(Opcional) Especifica o nome da métrica objetiva usada para medir a qualidade preditiva de um sistema de Machine Learning. Essa métrica é otimizada durante o treinamento para fornecer a melhor estimativa dos valores dos parâmetros do modelo a partir dos dados. Se você não especificar uma métrica explicitamente, o comportamento padrão é usar automaticamente MSE: para regressão, F1: para classificação binária, Precisão: para classificação multiclass. Para obter informações sobre os objetivos, consulte [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) na *Referência de API do Amazon SageMaker AI*.

Inteiro MAX\$1CELLS   
(Opcional) Especifica o número de células nos dados de treinamento. Esse valor é o produto do número de registros (na consulta de treinamento ou tabela) vezes o número de colunas. O padrão é 1.000.000.

Inteiro MAX\$1RUNTIME   
(Opcional) Especifica a quantidade máxima de tempo para treinar. Os trabalhos de treinamento geralmente concluem mais cedo dependendo do tamanho do conjunto de dados. Isso especifica a quantidade máxima de tempo em que o treinamento deve levar. The default is 5.400 (90 minutos).

S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1  
(Opcional) Especifica se o Amazon Redshift executa a coleta de lixo nos conjuntos de dados resultantes usados nos modelos e para treiná-los. Se definido como OFF, os conjuntos de dados resultantes usados para treinar modelos e os modelos permanecem no Amazon S3 e podem ser usados para outros fins. Se definido como ON, o Amazon Redshift excluirá os artefatos no Amazon S3 após a conclusão do treinamento. O padrão é ON.

KMS\$1KEY\$1ID 'kms\$1key\$1id'  
(Opcional) Especifica se o Amazon Redshift usa criptografia do lado do servidor com uma chave AWS KMS para proteger dados em repouso. Os dados em trânsito são protegidos com Secure Sockets Layer (SSL). 

 *PREPROCESSORS 'string' *   
(Opcional) Especifica certas combinações de pré-processadores para determinados conjuntos de colunas. O formato é uma lista de columnSets e as transformações apropriadas a serem aplicadas a cada conjunto de colunas. O Amazon Redshift aplica todos os transformadores em uma lista de transformadores específica a todas as colunas no ColumnSet correspondente. Por exemplo, para aplicar OneHotEncoder com Imputer às colunas t1 e t2, use o comando de exemplo a seguir.  

```
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'
)
```

O Amazon Redshift oferece suporte aos seguintes transformadores:
+ OneHotEncoder — Normalmente usado para codificar um valor discreto em um vetor binário com um valor diferente de zero. Este transformador é adequado para muitos modelos de machine learning. 
+ OrdinalEncoder — Codifica valores discretos em um único inteiro. Esse transformador é adequado para determinados modelos de machine learning, como MLP e Linear Learner. 
+ NumericPassThrough — Passa a entrada como está no modelo.
+ Imputer — Preenche valores ausentes e valores não numéricos (NaN).
+ ImputerWithIndicator — Preenche valores ausentes e valores NaN. Este transformador também cria um indicador de se algum valor estava faltando e preenchido.
+ Normalizer — Normaliza valores, o que pode melhorar a performance de muitos algoritmos de Machine Learning.
+ DateTimeVectorizer — Cria uma incorporação vetorial, representando uma coluna do tipo de dados datetime que pode ser usada em modelos de Machine Learning.
+ PCA — Projeta os dados em um espaço dimensional mais baixo para reduzir o número de recursos e, ao mesmo tempo, manter o máximo de informações possível.
+ StandardScaler: padroniza os recursos removendo a média e a escalabilidade para a variância da unidade. 
+ minMax: transforma recursos escalando cada recurso para um determinado intervalo.

O Amazon Redshift ML armazena os transformadores treinados e os aplica automaticamente como parte da consulta de previsão. Você não precisa especificá-los ao gerar previsões do seu modelo. 

## Modelos CREATE XGBoost com AUTO OFF
<a name="r_auto_off_create_model"></a>

O AUTO OFF CREATE MODEL tem geralmente objetivos diferentes do padrão CREATE MODEL.

Como um usuário avançado que já conhece o tipo de modelo que você deseja e hiperparâmetros para usar ao treinar esses modelos, você pode usar CREATE MODEL com AUTO OFF para desativar a descoberta automática CREATE MODEL de pré-processadores e hiperparâmetros. Para fazer isso, especifique explicitamente o tipo de modelo. O XGBoost é atualmente o único tipo de modelo compatível quando AUTO é definido como OFF. Você pode especificar hiperparâmetros. O Amazon Redshift usa valores padrão para quaisquer hiperparâmetros especificados. 

### Modelos CREATE XGBoost com sintaxe 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 (, ...)
)
```

### Modelos CREATE XGBoost com parâmetros AUTO OFF
<a name="r_auto_off-create-model-parameters"></a>

 *AUTO OFF*   
Desativa a descoberta automática de pré-processador, algoritmo e seleção de hiper-parâmetros do CREATE MODEL.

MODEL\$1TYPE XGBOOST  
Especifica o uso do XGBOOST para treinar o modelo. 

OBJECTIVE str  
Especifica um objetivo reconhecido pelo algoritmo. O Amazon Redshift oferece suporte a reg:squarederror, reg:squaredlogerror, reg:logistic, reg:pseudohubererror, reg:tweedie, binary:logistic, binary:hinge e multi:softmax. Para obter mais informações sobre esses objetivos, consulte [Aprendizado de parâmetros de tarefa](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters) na documentação do XGBoost.

HYPERPARAMETERS \$1 DEFAULT \$1 DEFAULT EXCEPT ( key ‘value’ (,..) ) \$1  
Especifica se os parâmetros padrão do XGBoost são usados ou substituídos por valores especificados pelo usuário. Os valores devem ser colocados entre aspas simples. A seguir estão exemplos de parâmetros para XGBoost e seus padrões.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_create_model_use_cases.html)

O exemplo a seguir prepara dados 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;
```

O exemplo a seguir cria um modelo XGBoost com opções avançadas especificadas, como MODEL\$1TYPE, OBJETIVE e 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');
```

O exemplo a seguir usa uma consulta de inferência para prever a idade do peixe com um número de registro maior que 2.500. Ele usa a função ml\$1fn\$1abalone\$1xgboost\$1multi\$1predict\$1age criada a partir do comando acima. 

```
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;
```

## Traga seu próprio modelo (BYOM): inferência local
<a name="r_byom_create_model"></a>

O Amazon Redshift ML é compatível com o uso de BYOM (traga seu próprio modelo) para inferência local.

A seguir o resumo das opções básicas da sintaxe CREATE MODEL para BYOM. Você pode usar um modelo treinado fora do Amazon Redshift com o Amazon SageMaker AI para inferência no banco de dados localmente no Amazon Redshift.

### Sintaxe CREATE MODEL para inferência local
<a name="r_local-create-model"></a>

A seguir é descrito a sintaxe CREATE MODEL para inferência local.

```
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
];
```

Atualmente, o Amazon Redshift comporta apenas modelos XGBoost, MLP e Linear Learner pré-treinados para BYOM. Você pode importar o SageMaker AI Autopilot e modelos treinados diretamente no Amazon SageMaker AI para inferência local usando esse caminho. 

#### Parâmetros CREATE MODEL para inferência local
<a name="r_local-create-model-parameters"></a>

 *model\$1name*   
O nome do modelo. O nome do modelo em um esquema deve ser exclusivo.

FROM (*'job\$1name'* \$1 *'s3\$1path'* )  
O *job\$1name* usa um nome de trabalho do Amazon SageMaker AI como entrada. O nome do trabalho pode ser um nome de trabalho de treinamento do Amazon SageMaker AI ou um nome de trabalho do Amazon SageMaker AI Autopilot. O trabalho deve ser criado na mesma conta da AWS que possui o cluster do Amazon Redshift. Para encontrar o nome do trabalho, inicie o Amazon SageMaker AI. No menu suspenso **Training** (Treinamento), escolha **Training jobs** (Trabalhos de treinamento).  
O *'s3\$1path'* especifica o local S3 do arquivo de artefatos de modelo .tar.gz que deve ser usado ao criar o modelo.

FUNCTION *function\$1name* ( *data\$1type* [, ...] )  
O nome da função a ser criada e os tipos de dados dos argumentos de entrada. Você pode fornecer um nome de esquema.

RETURNS *tipo\$1dados*  
Tipo de dados do valor retornado pela função.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando CREATE MODEL for executado.  
Use o nome do recurso da Amazon (ARN) de uma função do IAM que seu cluster usa para autenticação e autorização. 

SETTINGS ( S3\$1BUCKET *'amzn-s3-demo-bucket'*, \$1 KMS\$1KEY\$1ID *'kms\$1string'*)  
A cláusula S3\$1BUCKET especifica o local do Amazon S3 usado para armazenar resultados intermediários.  
(Opcional) A cláusula KMS\$1KEY\$1ID especifica se o Amazon Redshift usa criptografia do lado do servidor com uma chave do AWS KMS para proteger dados em repouso. Os dados em trânsito são protegidos com Secure Sockets Layer (SSL).  
Para obter mais informações, consulte [CREATE MODEL com orientação do usuário](#r_user_guidance_create_model).

#### CREATE MODEL para exemplo de inferências locais
<a name="r_local-create-model-example"></a>

O exemplo a seguir cria um modelo que foi previamente treinado no Amazon SageMaker AI, fora do Amazon Redshift. Como o tipo de modelo é compatível com o Amazon Redshift ML para inferência local, o seguinte CREATE MODEL cria uma função que pode ser usada localmente no Amazon Redshift. Você pode fornecer um nome de tarefa de treinamento do 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');
```

Depois que o modelo é criado, você pode usar a função *customer\$1churn\$1predict* com os tipos de argumento especificados para fazer previsões.

## Traga seu próprio modelo (BYOM): inferência remota
<a name="r_byom_create_model_remote"></a>

O Amazon Redshift ML também é compatível com o uso de BYOM (traga seu próprio modelo) para inferência remota.

A seguir o resumo das opções básicas da sintaxe CREATE MODEL para BYOM.

### Sintaxe CREATE MODEL para inferência remota
<a name="r_remote-create-model"></a>

A seguir é descrito a sintaxe CREATE MODEL para inferência remota.

```
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 CREATE MODEL para inferência remota
<a name="r_remote-create-model-parameters"></a>

 *model\$1name*   
O nome do modelo. O nome do modelo em um esquema deve ser exclusivo.

FUNCTION *fn\$1name* ( [*data\$1type*] [, ...] )  
O nome da função e os tipos de dados dos argumentos de entrada. Consulte [Tipos de dados](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html) para obter todos os tipos de dados compatíveis. `Geography`,`geometry` e `hllsketch` não são compatíveis.   
Você também pode fornecer um nome de função dentro de um esquema usando a notação em duas partes, como `myschema.myfunction`.

RETURNS *tipo\$1dados*  
Tipo de dados do valor retornado pela função. Consulte [Tipos de dados](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html) para obter todos os tipos de dados compatíveis. `Geography`,`geometry` e `hllsketch` não são compatíveis. 

SAGEMAKER *'endpoint\$1name'*[:*'model\$1name'*]   
O nome do endpoint do Amazon SageMaker AI. Se o nome do endpoint apontar para um endpoint multimodelo, adicione o nome do modelo a ser usado. O endpoint deve ser hospedado na mesma região da AWS e Conta da AWS que o cluster do Amazon Redshift. Para encontrar o endpoint, inicie o Amazon SageMaker AI. No menu suspenso **Inference** (Inferência), escolha **Endpoints**.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando CREATE MODEL for executado. Como alternativa, você pode especificar o ARN de um perfil do IAM para usar esse perfil.

MAX\$1BATCH\$1ROWS *inteiro*  
O número máximo de linhas que o Amazon Redshift envia em uma única solicitação em lote para uma única invocação do SageMaker AI. Ele é compatível somente com BYOM com inferência remota. O número real de linhas em um lote também depende do tamanho da entrada, mas é menor ou igual a esse valor. O valor mínimo desse parâmetro é 1. O valor máximo é `INT_MAX` ou 2.147.483.647. Esse parâmetro é necessário somente quando os tipos de dados de entrada e retornados são `SUPER`. O valor padrão é `INT_MAX`, ou 2.147.483.647. 

Quando o modelo é implantado em um endpoint do SageMaker AI, o SageMaker AI cria as informações do modelo no Amazon Redshift. Em seguida, executa a inferência através da função externa. Você pode usar o comando SHOW MODEL para exibir as informações do modelo no cluster do Amazon Redshift.

#### CREATE MODEL para observações de uso da inferência remota
<a name="r_remote-create-model-usage-notes"></a>

Antes de usar CREATE MODEL para inferência remota, considere o seguinte:
+ O endpoint deve ser hospedado na mesma conta da AWS que possui o cluster do Amazon Redshift.
+ Verifique se o endpoint do Amazon SageMaker AI tem recursos suficientes para atender a chamadas de inferência do Amazon Redshift ou se o endpoint do Amazon SageMaker AI pode ser escalado automaticamente.
+ Se você não estiver usando o tipo de dados `SUPER` como entrada, o modelo só aceitará entradas no formato de valores separados por vírgula (CSV), o que corresponde ao tipo de conteúdo de `text/CSV` no SageMaker AI.
+ Se você não estiver usando o tipo de dados `SUPER` como entrada, a saída dos modelos será um valor único do tipo especificado ao criar a função. A saída está no formato de valores separados por vírgula (CSV) por meio de um tipo de conteúdo de `text/CSV` no SageMaker AI. Os tipos de dados `VARCHAR` não podem estar entre aspas e não podem conter novas linhas, e cada saída precisa estar em uma nova linha.
+ Os modelos aceitam nulos como strings vazias.
+ Quando o tipo de dados de entrada é `SUPER`, somente um argumento de entrada é permitido. 
+ Quando o tipo de dados de entrada é `SUPER`, o tipo de dados retornado também deve ser `SUPER`. 
+ MAX\$1BATCH\$1ROWS é necessário quando os tipos de dados de entrada e retornados são SUPER. 
+ Quando o tipo de dados de entrada é `SUPER` o tipo de conteúdo da invocação do endpoint é `application/json` quando MAX\$1BATCH\$1ROWS é `1` ou `application/jsonlines` em todos os outros casos. 
+ Quando o tipo de dados retornados é `SUPER` o tipo de aceitação da invocação do endpoint é `application/json` quando MAX\$1BATCH\$1ROWS é `1` ou `application/jsonlines` em todos os outros casos. 

##### CREATE MODEL para exemplo de inferências remotas
<a name="r_remote-create-model-example"></a>

O exemplo a seguir cria um modelo que usa o endpoint do SageMaker AI para fazer previsões. Certifique-se de que o endpoint está em execução para fazer previsões e especifique seu nome no 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;
```

 O exemplo a seguir cria um BYOM com inferência remota com um grande modelo de linguagem (LLM). Os LLMs hospedados no Amazon SageMaker AI Jumpstart aceitam e retornam o tipo de conteúdo `application/json` e permitem um único JSON por invocação. Os tipos de dados de entrada e retornados devem ser `SUPER` e MAX\$1BATCH\$1ROWS deve ser definido como 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 com K-MEANS
<a name="r_k-means_create_model"></a>

O Amazon Redshift oferece suporte ao algoritmo K-Means que agrupa dados que não são rotulados. Esse algoritmo resolve problemas de clusterização em que você deseja detectar agrupamentos nos dados. Os dados não classificados são agrupados e particionados de acordo com suas semelhanças e diferenças. 

### CREATE MODEL com sintaxe 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 com parâmetros K-MEANS
<a name="r_k-means-create-model-parameters"></a>

 *AUTO OFF*   
Desativa a descoberta automática de pré-processador, algoritmo e seleção de hiper-parâmetros do CREATE MODEL.

MODEL\$1TYPE KMEANS  
Especifica o uso do KMEANS para treinar o modelo. 

PREPROCESSORS 'string'  
Especifica certas combinações de pré-processadores para determinados conjuntos de colunas. O formato é uma lista de columnSets e as transformações apropriadas a serem aplicadas a cada conjunto de colunas. O Amazon Redshift oferece suporte a três pré-processadores K-Means: StandardScaler, MinMax e NumericPassThrough. Caso não queira aplicar nenhum pré-processamento para K-means, escolha NumericPassthrough explicitamente como um transformador. Para obter mais informações sobre os transformadores compatíveis, consulte [CREATE MODEL com parâmetros de orientação do usuário](#r_user_guidance-create-model-parameters).  
O algoritmo K-Means usa a distância euclidiana para calcular a semelhança. O pré-processamento dos dados garante que os recursos do modelo permaneçam na mesma escala e produzam resultados confiáveis.

HYPERPARAMETERS DEFAULT EXCEPT ( K 'val' [, ...] )  
Especifica se os parâmetros K-Means são usados. É necessário especificar o parâmetro `K` ao usar o algoritmo K-Means. Para obter mais informações, consulte [Hiperparâmetros do k-means](https://docs.aws.amazon.com/sagemaker/latest/dg/k-means-api-config.html) no *Guia do desenvolvedor do Amazon SageMaker AI*

O exemplo a seguir prepara dados 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 com o Forecast
<a name="r_forecast_model"></a>

Os modelos de previsão no Redshift ML usam o Amazon Forecast para criar previsões precisas de séries temporais. Isso permite que você use dados históricos de um período para fazer previsões sobre eventos futuros. Os casos de uso comuns do Amazon Forecast incluem o uso de dados de produtos de varejo para decidir como definir os preços dos itens, dados de quantidade de fabricação para prever quanto de um item pedir e dados de tráfego da web para prever quanto tráfego um servidor da web pode receber. 

 Os [limites de cota do Amazon Forecast](https://docs.aws.amazon.com/forecast/latest/dg/limits.html) são aplicados nos modelos de previsão do Amazon Redshift. Por exemplo, o número máximo de previsões é 100, mas esse valor é ajustável. A eliminação de um modelo de previsão não exclui automaticamente os recursos associados no Amazon Forecast. Se você excluir um cluster do Redshift, todos os modelos associados também serão descartados. 

Observe que, no momento, os modelos do Forecast só estão disponíveis nas seguintes regiões:
+ Leste dos EUA (Ohio) (us-east-2)
+ Leste dos EUA (Norte da Virgínia) (us-east-1)
+ Oeste dos EUA (Oregon) (us-west-2)
+ Ásia-Pacífico (Mumbai) (ap-south-1)
+ Ásia-Pacífico (Seul) (ap-northeast-2)
+ Ásia-Pacífico (Singapura) (ap-southeast-1)
+ Ásia-Pacífico (Sydney) (ap-southeast-2)
+ Ásia Pacific (Tóquio) (ap-northeast-1)
+ Europa (Frankfurt) (eu-central-1)
+ Europa (Irlanda) (eu-west-1)

### Sintaxe de CREATE MODEL com o 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']
  )
```

### Parâmetros de CREATE MODEL com o Forecast
<a name="r_forecast_model-parameters"></a>

 *forecast\$1model\$1name*   
O nome do modelo. O nome do modelo deve ser exclusivo.

FROM \$1 table\$1name \$1 ( select\$1query ) \$1  
O table\$1name ou a consulta que especifica os dados de treinamento. Isso pode ser uma tabela existente no sistema ou uma consulta SELECT compatível com o Amazon Redshift entre parênteses. O resultado da tabela ou consulta deve ter pelo menos três colunas: (1) uma coluna varchar que especifica o nome da série temporal (cada conjunto de dados pode ter várias séries temporais); (2) uma coluna de data e hora; e (3) a coluna de destino das previsões. Essa coluna de destino deve ser do tipo int ou float. Se você fornecer um conjunto de dados com mais de três colunas, o Amazon Redshift vai assumir que todas as colunas adicionais fazem parte de uma série temporal relacionada. Observe que as séries temporais relacionadas devem ser do tipo int ou float. Para obter mais informações sobre séries temporais relacionadas, consulte [Usar conjuntos de dados de séries temporais relacionadas](https://docs.aws.amazon.com/forecast/latest/dg/related-time-series-datasets.html).

TARGET column\$1name  
O nome da coluna que se torna o alvo da previsão. A coluna deve existir na cláusula FROM.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando CREAT MODEL for executado. Como alternativa, você pode especificar o ARN de um perfil do IAM para usar esse perfil. 

AUTO ON  
Ativa a descoberta automática da seleção de hiperparâmetros e algoritmo de CREATE MODEL. Especificar “on” ao criar um modelo do Forecast indica o uso de um Forecast AutoPredictor, em que o Amazon Forecast aplica as combinações ideais de algoritmos a cada série temporal em seu conjunto de dados.

MODEL\$1TYPE FORECAST  
Especifica o uso de FORECAST para treinar o modelo.

S3\$1BUCKET 'amzn-s3-demo-bucket'  
O nome do bucket do Amazon Simple Storage Service que você criou anteriormente e que é usado para compartilhar artefatos e dados de treinamento entre o Amazon Redshift e o Amazon Forecast. O Amazon Redshift cria uma subpasta neste bucket antes de descarregar os dados de treinamento. Quando o treinamento for concluído, o Amazon Redshift exclui a subpasta criada e seu conteúdo.

HORIZON integer  
O número máximo de previsões que o modelo pode retornar. Depois que o modelo é treinado, não é possível alterar esse número inteiro.

FREQUENCY forecast\$1frequency  
Especifica o nível de detalhamento que você deseja que as previsões tenham. As opções disponíveis são  `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`. Obrigatório se você for treinar um modelo de previsão.

PERCENTILES string  
Uma string delimitada por vírgula que especifica os tipos de previsão usados para treinar um previsor. Os tipos de previsão podem ser quantis de 0,01 a 0,99, em incrementos de 0,01 ou mais. Você também pode especificar a previsão média com mean. É possível especificar até cinco tipos de previsão.

O exemplo a seguir demonstra como criar um modelo de previsão simples.

```
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);
```

Depois de criar o modelo de previsão, você pode criar uma tabela com os dados da previsão.

```
CREATE TABLE forecast_model_results as SELECT Forecast(forecast_example)
```

Em seguida, você pode consultar a nova tabela para obter previsões.

```
SELECT * FROM forecast_model_results
```

# CREATE PROCEDURE
<a name="r_CREATE_PROCEDURE"></a>

Cria um novo procedimento armazenado ou substitui um procedimento existente para o banco de dados atual.

Para ter mais informações e exemplos, consulte [Criar procedimentos armazenados no Amazon Redshift](stored-procedure-overview.md).

## Privilégios obrigatórios
<a name="r_CREATE_PROCEDURE-privileges"></a>

Você deve ter permissão de uma das seguintes formas para executar CREATE OR REPLACE PROCEDURE:
+ Para CREATE PROCEDURE:
  + Superusuário
  + Usuários com privilégios CREATE e USAGE no esquema no qual o procedimento armazenado é criado.
+ Para REPLACE PROCEDURE:
  + Superusuário
  + Proprietário do procedimento

## Sintaxe
<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 } ]
```

## Parâmetros
<a name="r_CREATE_PROCEDURE-parameters"></a>

 OR REPLACE   
Uma cláusula que especifica que, se um procedimento com o mesmo nome e tipos de dados do argumento de entrada, ou assinatura, como esse já existir, o procedimento existente será substituído. Só é possível substituir um procedimento por um novo procedimento que defina um conjunto idêntico de tipos de dados.   
Se você definir um procedimento com o mesmo nome de um procedimento existente, mas com uma assinatura diferente, um novo procedimento será criado. Em outras palavras, o nome do procedimento é sobrecarregado. Para obter mais informações, consulte [Sobrecarga de nomes de procedimento](stored-procedure-naming.md#stored-procedure-overloading-name). 

 *sp\$1procedure\$1name*   
O nome do procedimento. Se você especificar um nome de esquema (como **myschema.myprocedure**), o procedimento será criado no esquema especificado. Caso contrário, o procedimento será criado no esquema atual. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).   
Recomendamos que você prefixe os nomes de todos os UDF com `sp_`. O Amazon Redshift reserva o prefixo `sp_` para nomes de procedimentos armazenados. Ao usar o prefixo `sp_`, você garante que o seu nome de procedimento armazenado não entra em conflito com qualquer procedimento armazenado integrado ao Amazon Redshift existente ou futuro ou nomes de função. Para obter mais informações, consulte [Nomeação de procedimentos armazenados](stored-procedure-naming.md).  
É possível definir mais de um procedimento com o mesmo nome se os tipos de dados dos argumentos de entrada, ou assinaturas, forem diferentes. Em outras palavras, nesse caso, o nome do procedimento é sobrecarregado. Para obter mais informações, consulte . [Sobrecarga de nomes de procedimento](stored-procedure-naming.md#stored-procedure-overloading-name)

*[argname] [ argmode] argtype*   
Uma lista de nomes de argumentos, modos de argumentos e tipos de dados. Somente o tipo de dados é obrigatório. O nome e o modo são opcionais e suas posições podem ser alternadas.  
O modo do argumento pode ser IN, OUT ou INOUT. O padrão é IN.  
Use argumentos OUT e INOUT para retornar um ou mais valores de uma chamada de procedimento. Quando houver argumentos OUT ou INOUT, a chamada de procedimento retorna uma linha de resultados que contém *n* colunas, onde *n* é o número total de argumentos OUT ou INOUT.  
Argumentos INOUT são argumentos de entrada e saída ao mesmo tempo. *Argumentos de entrada* incluem argumentos IN e INOUT, e *argumentos de saída* incluem argumentos OUT e INOUT.  
Argumentos OUT não são especificados como parte da instrução CALL. Especifique argumentos INOUT na instrução CALL do procedimento armazenado. Argumentos INOUT podem ser úteis ao enviar e retornar valores de uma chamada aninhada, bem como ao retornar um `refcursor`. Para obter mais informações sobre os tipos `refcursor`, consulte [Cursores](c_PLpgSQL-statements.md#r_PLpgSQL-cursors).  
Os tipos de dados de argumento podem ser qualquer tipo de dados padrão do Amazon Redshift. Além disso, um tipo de dados de argumento pode ser `refcursor`.  
Você pode especificar no máximo 32 argumentos de entrada e 32 argumentos de saída. 

AS \$1\$1 *procedure\$1body* \$1\$1   
Uma construção que delimita o procedimento a ser executado. As palavras-chave literais AS \$1\$1 e \$1\$1 são obrigatórias.  
O Amazon Redshift exige que você inclua a instrução em seu procedimento usando um formato chamado cotação de dólar. Qualquer item incluído na instrução é aprovado exatamente como está. Não é preciso inserir caracteres de escape antes dos caracteres especiais, pois o conteúdo da string é gravado literalmente.  
Com a *cotação de dólar*, um par de símbolos de cifrão (\$1\$1) deve ser usado no início e no final da instrução para que ela seja executada, conforme exibido no exemplo a seguir.  

```
$$ my statement $$
```
Como opção, entre cada par de símbolos de cifrão, você pode especificar uma string para ajudar a identificar a instrução. A string que você usa deve ser a mesma no início e no final dos pares de sinais. A sequência diferencia maiúsculas de minúsculas e segue as mesmas restrições de um identificador sem aspas, com a exceção de que não pode conter cifrões. O exemplo a seguir usa a string test.  

```
$test$ my statement $test$
```
Essa sintaxe também é útil para cotação de dólar aninhada. Para obter mais informações sobre o uso de símbolos de cifrão, consulte “Constantes de string entre símbolos de cifrão” em [Estrutura lexical](https://www.postgresql.org/docs/9.0/sql-syntax-lexical.html) na documentação do PostgreSQL.

 *procedure\$1body*   
Um conjunto de instruções válidas da PL/pgSQL. As instruções da PL/pgSQL aumentam comandos SQL com construções processuais, incluindo loops e expressões condicionais, a fim de controlar o fluxo lógico. A maioria dos comandos SQL podem ser usados no corpo do procedimento, incluindo linguagem de modificação de dados (DML), como COPY, UNLOAD e INSERT, e linguagem de definição de dados (DDL), como CREATE TABLE. Para obter mais informações, consulte [Referência da linguagem PL/pgSQL](c_pl_pgSQL_reference.md). 

LANGUAGE *plpgsql*  
Um valor de linguagem. Especifique `plpgsql`. É necessário ter permissão de uso na linguagem para usar `plpgsql`. Para obter mais informações, consulte [GRANT](r_GRANT.md). 

NONATOMIC  
Cria o procedimento armazenado em um modo de transação não atômico. O modo NONATOMIC confirma automaticamente as instruções dentro do procedimento. Além disso, quando ocorre um erro dentro do procedimento NONATOMIC, o erro não será relançado se for tratado por um bloco de exceções. Para obter mais informações, consulte [Gerenciamento de transações](stored-procedure-transaction-management.md) e [RAISE](c_PLpgSQL-statements.md#r_PLpgSQL-messages-errors).  
Ao definir um procedimento armazenado como `NONATOMIC`, considere o seguinte:  
+ Quando você aninha chamadas de procedimentos armazenados, todos os procedimentos devem ser criados no mesmo modo de transação.
+ A opção `SECURITY DEFINER` e a opção `SET configuration_parameter` não são compatíveis ao criar um procedimento no modo NONATOMIC.
+ Qualquer cursor aberto (explícita ou implicitamente) será fechado automaticamente quando uma confirmação implícita for processada. Portanto, você deve abrir uma transação explícita antes de iniciar um loop de cursor para garantir que nenhuma instrução SQL dentro da iteração do loop seja confirmada implicitamente.

SECURITY INVOKER \$1 SECURITY DEFINER  
A opção `SECURITY DEFINER` não é compatível quando `NONATOMIC` é especificado.  
O modo de segurança para o procedimento determina os privilégios de acesso do procedimento em tempo de execução. O procedimento deve ter permissão para acessar os objetos de banco de dados subjacentes.   
Para o modo SECURITY INVOKER, o procedimento usa os privilégios do usuário que chama o procedimento. O usuário deve ter permissões explícitas para os objetos de banco de dados subjacentes. O padrão é SECURITY INVOKER.  
Para o modo SECURITY DEFINER, o procedimento usa os privilégios do proprietário do procedimento. O proprietário do procedimento é definido como o usuário que possui o procedimento no tempo de execução, não necessariamente o usuário que definiu o procedimento inicialmente. O usuário que chama o procedimento precisa ter privilégio de execução no procedimento, mas não precisa de qualquer privilégio nos objetos subjacentes. 

SET configuration\$1parameter \$1 TO value \$1 = value \$1  
Essas opções não são compatíveis quando `NONATOMIC` é especificado.  
A cláusula SET faz com que o `configuration_parameter` especificado seja definido como o valor especificado quando o procedimento for inserido. Depois, essa cláusula restaurará `configuration_parameter` para seu valor anterior quando o procedimento sair. 

## Observações de uso
<a name="r_CREATE_PROCEDURE-usage"></a>

Se um procedimento armazenado tiver sido criado usando a opção SECURITY DEFINER, ao invocar a função CURRENT\$1USER de dentro do procedimento armazenado, o Amazon Redshift retornará o nome de usuário do proprietário do procedimento armazenado.

## Exemplos
<a name="r_CREATE_PROCEDURE-examples"></a>

**nota**  
Se você encontrar um erro na execução desses exemplos parecido com:  

```
ERROR: 42601: [Amazon](500310) unterminated dollar-quoted string at or near "$$
```
Consulte [Visão geral dos procedimentos armazenados no Amazon Redshift](stored-procedure-create.md). 

O exemplo a seguir cria um procedimento com dois 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**  
 Quando você escreve procedimentos armazenados, recomendamos a prática de proteger valores confidenciais:   
 Não codifique nenhuma informação confidencial na lógica do procedimento armazenado. Por exemplo, não atribua uma senha de usuário em uma instrução CREATE USER no corpo de um procedimento armazenado. Isso representa um risco de segurança, pois valores codificados podem ser registrados como metadados de esquema nas tabelas do catálogo. Em vez disso, transmita valores confidenciais, como senhas, como argumentos ao procedimento armazenado por meio de parâmetros.   
Para obter mais informações sobre os procedimentos armazenados, consulte [CREATE PROCEDURE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_PROCEDURE.html) e [“Criar procedimentos armazenados no Amazon Redshift”](https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-overview.html). Para obter mais informações sobre tabelas de catálogo, consulte [“Tabelas de catálogo do sistema”](https://docs.aws.amazon.com/redshift/latest/dg/c_intro_catalog_views.html).

O exemplo a seguir cria um procedimento com um parâmetro IN, um parâmetro OUT e um 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;
```

O exemplo a seguir cria um procedimento que usa o parâmetro `SECURITY DEFINER`. Esse procedimento é executado usando os privilégios do usuário proprietário do procedimento.

```
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;
```

O exemplo a seguir cria um procedimento que usa o parâmetro `SECURITY INVOKER`. Esse procedimento é executado usando os privilégios do usuário que executa o procedimento.

```
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>

Cria uma nova política de segurança no nível da linha para fornecer acesso granular aos objetos do banco de dados.

Superusuários e usuários ou funções que têm a função sys:secadmin podem criar uma política.

## Sintaxe
<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 )
```

## Parâmetros
<a name="r_CREATE_RLS_POLICY-parameters"></a>

 *policy\$1name*   
O nome da política.

database\$1name  
O nome do banco de dados de onde a política será criada. A política pode ser criada no banco de dados conectado ou em um banco de dados que aceite as permissões federadas do Amazon Redshift.

WITH (*column\$1name data\$1type [, ...]*)   
Especifica o *column\$1name* e *data\$1type* referenciada às colunas de tabelas às quais a política está anexada.   
É possível omitir a cláusula WITH somente quando a política de RLS não fizer referência a nenhuma coluna de tabelas às quais a política está anexada.

AS *relation\$1alias*  
Especifica um alias opcional para a tabela à qual a política de RLS será anexada.

USING (* using\$1predicate\$1exp *)  
Especifica um filtro que é aplicado à cláusula WHERE da consulta. O Amazon Redshift aplica um predicado de política antes dos predicados do usuário no nível da consulta. Por exemplo, **current\$1user = ‘joe’ and price > 10** limita Joe a ver apenas registros com o preço superior a US\$1 10.

Para o uso da CREATE RLS POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Observações de uso
<a name="r_CREATE_RLS_POLICY-usage"></a>

Ao trabalhar com a instrução CREATE RLS POLICY, observe o seguinte:
+ O Amazon Redshift é compatível com filtros que podem fazer parte de uma cláusula WHERE de uma consulta.
+ Todas as políticas anexadas a uma tabela devem ter sido criadas com o mesmo alias de tabela.
+ Você deve usar as instruções GRANT e REVOKE para conceder e revogar explicitamente permissões SELECT para políticas de RLS que fazem referência a tabelas de pesquisa. Uma tabela de pesquisa é um objeto de tabela usado dentro de uma definição de política. Para obter mais informações, consulte [GRANT](r_GRANT.md) e [REVOKE](r_REVOKE.md). 
+ A segurança por linha do Amazon Redshift não é compatível com os seguintes tipos de objeto dentro de uma definição de política: tabelas de catálogo, relações entre bancos de dados, tabelas externas, visualizações regulares, visualizações de vinculação tardia, tabelas com políticas RLS ativadas e tabelas temporárias.

## Exemplos
<a name="r_CREATE_RLS_POLICY-examples"></a>

O exemplo a seguir cria uma política de RLS chamada policy\$1concerts. Essa política se aplica a uma coluna VARCHAR (10) chamada catgroup e define o filtro USING para exibir somente as linhas em que o valor de catgroup seja `'Concerts'`.

```
CREATE RLS POLICY policy_concerts
WITH (catgroup VARCHAR(10))
USING (catgroup = 'Concerts');
```

Para ver um exemplo completo de uso de políticas de RLS, consulte [Exemplo completo de segurança em nível de linha](t_rls-example.md).

# CREATE ROLE
<a name="r_CREATE_ROLE"></a>

Cria um novo perfil personalizado que é um conjunto de permissões. Para conferir a lista de perfis definidos pelo sistema do Amazon Redshift, consulte [Funções definidas pelo sistema do Amazon Redshift](r_roles-default.md). Consulte [SVV\$1ROLES](r_SVV_ROLES.md) para exibir as funções criadas no cluster ou no grupo de trabalho no momento.

Há uma cota do número de funções que podem ser criadas. Para obter mais informações, consulte “[Cotas e limites no Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)” no *Guia de gerenciamento de clusters do Amazon Redshift*.

## Permissões obrigatórias
<a name="r_CREATE_ROLE-privileges"></a>

A seguir estão os privilégios obrigatórios para CREATE ROLE.
+ Superusuário
+ Usuários com o privilégio CREATE ROLE

## Sintaxe
<a name="r_CREATE_ROLE-synopsis"></a>

```
CREATE ROLE role_name
[ EXTERNALID external_id ]
```

## Parâmetros
<a name="r_CREATE_ROLE-parameters"></a>

*role\$1name*  
O nome da função. O nome da função deve ser exclusivo e não pode ser o mesmo que nenhum nome de usuário. Um nome de função não pode ser uma palavra reservada.  
Um superusuário ou usuário regular com o privilégio CREATE ROLE pode criar funções. Um usuário que não seja um superusuário, mas que tenha recebido USAGE para a função WITH GRANT OPTION e o privilégio ALTER pode conceder essa função a qualquer pessoa.

EXTERNALID *external\$1id*  
O identificador para a função, que está associada a um provedor de identidades. Para obter mais informações, consulte [Federação do provedor de identidades (IdP) nativo para o Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

## Exemplos
<a name="r_CREATE_ROLE-examples"></a>

O exemplo a seguir cria uma função `sample_role1`.

```
CREATE ROLE sample_role1;
```

O exemplo a seguir cria uma função `sample_role1` com um ID externo associado a um provedor de identidade.

```
CREATE ROLE sample_role1 EXTERNALID "ABC123";
```

# CREATE SCHEMA
<a name="r_CREATE_SCHEMA"></a>

Define um novo esquema para o banco de dados atual.

## Privilégios obrigatórios
<a name="r_CREATE_SCHEMA-privileges"></a>

A seguir estão os privilégios obrigatórios para CREATE SCHEMA:
+ Superusuário
+ Usuários com o privilégio CREATE SCHEMA

## Sintaxe
<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 [ ... ] ]
```

## Parâmetros
<a name="r_CREATE_SCHEMA-parameters"></a>

 IF NOT EXISTS   
Cláusula que indica que, se o esquema especificado existe, o comando não deve fazer alterações e deve retornar uma mensagem informando que o esquema existe, em vez de encerrar com um erro.  
Esta cláusula é útil para realizar scripting para que o script não falhe se o comando CREATE SCHEMA tentar criar um esquema que já existe.

 *schema\$1name*   
Nome do novo esquema. O nome do esquema não pode ser `PUBLIC`. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).  
A lista de esquemas no parâmetro de configuração [search\$1path](r_search_path.md) determina a precedência de objetos com nomes idênticos quando forem mencionados sem os nomes dos esquemas.

AUTHORIZATION   
Cláusula que dá a propriedade a um usuário especificado.

 *Nome de usuário do*   
Nome do proprietário do esquema.

 *elemento\$1esquema*   
Definição de um ou mais objetos a serem criados no esquema.

QUOTA  
A quantidade máxima de espaço em disco que o esquema especificado pode usar. Esse espaço é o uso coletivo do disco. Ele inclui todas as tabelas permanentes, visões materializadas do esquema especificado e cópias duplicadas de todas as tabelas com distribuição ALL em cada nó de computação. A cota do esquema não contabiliza tabelas temporárias criadas como parte de um esquema ou namespace temporário.   
Para exibir as cotas de esquema configuradas, consulte [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md).  
Para exibir os registros em que as cotas de esquema foram excedidas, consulte [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md).  
O Amazon Redshift converte o valor selecionado para megabytes. Gigabytes é a unidade de medida padrão quando um valor não é especificado.  
Você deve ser um superusuário de banco de dados para definir e alterar uma cota de esquema. Um usuário que não seja um superusuário, mas que tenha permissão CREATE SCHEMA, poderá criar um esquema com uma cota definida. Quando você cria um esquema sem definir uma cota, o esquema assume uma cota ilimitada. Quando você define a cota abaixo do valor atual usado pelo esquema, o Amazon Redshift impede novas ingestões até liberar espaço em disco. Uma instrução DELETE exclui os dados de uma tabela e o espaço em disco é liberado somente quando VACUUM é executada.   
O Amazon Redshift verifica cada transação em busca de violações de cota antes de confirmar a transação. O Amazon Redshift verifica o tamanho (o espaço em disco usado por todas as tabelas em um esquema) de cada esquema modificado em relação à cota definida. Como a verificação de violação de cota ocorre no final de uma transação, o limite de tamanho poderá exceder temporariamente a cota enquanto a transação não é confirmada. Quando uma transação excede a cota, o Amazon Redshift aborta a transação, proíbe ingestões subsequentes e reverte todas as alterações até você liberar espaço em disco. Devido à VACUUM em segundo plano e limpeza interna, é possível que um esquema não esteja cheio no momento da verificação após uma transação cancelada.   
Como exceção, o Amazon Redshift desconsidera a violação da cota e confirma transações em determinados casos. O Amazon Redshift faz isso para transações que consistem apenas em uma ou mais das seguintes instruções, onde não houver uma instrução de consumo INSERT ou COPY na mesma transação:  
+ DELETE
+ TRUNCATE
+ VACUUM
+ DESCARTAR TABELA
+ ALTER TABLE APPEND somente ao mover dados do esquema cheio para outro esquema não cheio

 *UNLIMITED*   
O Amazon Redshift não impõe limite para o crescimento do tamanho total do esquema.

## Limites
<a name="r_CREATE_SCHEMA-limit"></a>

O Amazon Redshift aplica os limites a seguir a esquemas.
+ O máximo de esquemas permitido por banco de dados é 9.900.

## Exemplos
<a name="r_CREATE_SCHEMA-examples"></a>

O exemplo a seguir cria um esquema chamado US\$1SALES e dá sua propriedade ao usuário DWUSER.

```
create schema us_sales authorization dwuser;
```

O exemplo a seguir cria um esquema chamado US\$1SALES, dá sua propriedade ao usuário DWUSER e define a cota para 50 GB.

```
create schema us_sales authorization dwuser QUOTA 50 GB;
```

Para exibir o novo esquema, consulte a tabela de catálogo PG\$1NAMESPACE, conforme mostrado a seguir.

```
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)
```

O exemplo a seguir cria o esquema US\$1SALES, ou não realiza ação nenhuma, e retorna uma mensagem se o esquema já existir.

```
create schema if not exists us_sales;
```

# CRIAR TABELA
<a name="r_CREATE_TABLE_NEW"></a>

Cria uma nova tabela no banco de dados atual. Você define uma lista de colunas, cada uma contendo dados de um tipo distinto. O proprietário desta tabela é o emissor do comando CREATE TABLE.

## Privilégios obrigatórios
<a name="r_CREATE_TABLE-privileges"></a>

A seguir estão os privilégios obrigatórios para CREATE TABLE:
+ Superusuário
+ Usuários com o privilégio CREATE TABLE

## Sintaxe
<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 ]
```

## Parâmetros
<a name="r_CREATE_TABLE_NEW-parameters"></a>

LOCAL   
Opcional. Embora a instrução aceite esta palavra-chave, ela não tem efeito no Amazon Redshift.

TEMPORARY \$1 TEMP   
Palavra-chave que cria uma tabela temporária visível somente na sessão atual. A tabela é automaticamente descartada no final da sessão na qual é criada. A tabela temporária pode ter o mesmo nome de uma tabela permanente. A tabela temporária é criada em um esquema separado e específico da sessão. (Não é possível especificar um nome para este esquema.) Este esquema temporário se torna o primeiro no caminho de pesquisa. Dessa forma, a tabela temporária tem precedência sobre a tabela permanente a menos que você qualifique o nome da tabela com o nome do esquema para acessar a tabela permanente. Para obter mais informações sobre esquemas e precedência, consulte [search\$1path](r_search_path.md).  
Por padrão, os usuários do banco de dados têm permissão para criar tabelas temporárias por associação automática ao grupo PUBLIC. Para negar esse privilégio a um usuário, revogue o privilégio TEMP do grupo PUBLIC, e explicitamente conceda o privilégio TEMP somente a usuários ou grupos específicos de usuários.

IF NOT EXISTS  
Cláusula que indica que, se a tabela especificada já existir, o comando não deverá fazer alterações e deverá retornar uma mensagem informando que a tabela existe, em vez de parar com um erro. Observe que a tabela existente pode não parecer em nada com aquela que seria criada; somente o nome da tabela é comparado.  
Esta cláusula é útil para realizar scripting para que o script não falhe se o comando CREATE TABLE tentar criar uma tabela que já existe.

 *table\$1name*   
Nome da tabela a ser criada.  
Se você especificar um nome de tabela que comece com “\$1”, a tabela será criada como temporária. Este é um exemplo:  

```
create table #newtable (id int);
```
Você também faz referência à tabela com “\$1 ”. Por exemplo:   

```
select * from #newtable;
```
O tamanho máximo de um nome de tabela é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes. É possível usar caracteres multibyte UFT-8 até um máximo de quatro bytes. O Amazon Redshift aplica uma cota do número de tabelas por cluster por tipo de nó, incluindo tabelas temporárias definidas pelo usuário e tabelas temporárias criadas pelo Amazon Redshift durante o processamento de consultas ou a manutenção do sistema. Como opção, é possível qualificar o nome da tabela com o nome do banco de dados e do esquema. No exemplo a seguir, o nome do banco de dados é `tickit`, o nome do esquema é `public` e o nome da tabela é `test`.   

```
create table tickit.public.test (c1 int);
```
Se o banco de dados ou o esquema não existir, a tabela não será criada e a instrução retornará um erro. Você não pode criar tabelas ou exibições nos bancos de dados do sistema `template0`, `template1`, `padb_harvest` ou `sys:internal`.  
Se um nome de esquema for fornecido, a nova tabela será criada naquele esquema (presumindo que o criador tenha acesso ao esquema). O nome da tabela deve ser exclusivo para aquele esquema. Se nenhum esquema for especificado, a tabela será criada usando o esquema atual do banco de dados. Se estiver criando uma tabela temporária, você não poderá especificar um nome de esquema, porque as tabelas temporárias existem em um esquema especial.  
Podem existir várias tabelas temporárias com o mesmo nome ao mesmo tempo no mesmo banco de dados se elas forem criadas em sessões separadas, uma vez que as tabelas são atribuídas a esquemas diferentes. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

 *column\$1name*   
Nome de uma coluna a ser criada na nova tabela. O tamanho máximo de um nome de coluna é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes. É possível usar caracteres multibyte UFT-8 até um máximo de quatro bytes. O número máximo de colunas que você pode definir em uma única tabela é 1.600. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).  
Se você estiver criando uma “tabela ampla”, tome cuidado para que sua lista de colunas não exceda o limite de largura de linha para resultados intermediários durante cargas e processamento de consultas. Para obter mais informações, consulte [Observações de uso](#r_CREATE_TABLE_usage).

 *data\$1type*   
Tipo de dados da coluna que está sendo criada. Para as colunas CHAR e VARCHAR, é possível usar a palavra-chave MAX em vez de declarar o tamanho máximo. MAX define o tamanho máximo de CHAR para 4.096 bytes ou de VARCHAR para 65.535 bytes. O tamanho máximo de um objeto GEOMETRY é 1.048.447 bytes.  
Para obter mais informações sobre os tipos de dados que o Amazon Redshift aceita, consulte [Tipos de dados](c_Supported_data_types.md).

DEFAULT *default\$1expr*   <a name="create-table-default"></a>
Cláusula que atribui um valor de dados padrão à coluna. O tipo de dados *expr\$1padrão* deve ser compatível com o tipo de dados da coluna. O valor DEFAULT deve ser uma expressão sem variáveis. Não são permitidas subconsultas, referências cruzadas de outras colunas na tabela atual e funções definidas pelo usuário.  
A expressão *default\$1expr* é usada em qualquer operação INSERT que não especifique um valor para a coluna. Se não houver um valor padrão especificado, o valor padrão da coluna é nulo.  
Se uma operação COPY com uma lista de colunas definida omitir uma coluna com um valor DEFAULT, o comando COPY deve inserir o valor *default\$1expr*.

IDENTITY(*seed*, *step*)   <a name="identity-clause"></a>
Cláusula que especifica que a coluna é uma coluna IDENTITY. Uma coluna IDENTITY contém valores exclusivos gerados automaticamente. O tipo de dados para uma coluna IDENTITY deve ser INT ou BIGINT.   
Quando você adicionar linhas usando uma instrução `INSERT` ou `INSERT INTO [tablename] VALUES()`, esses valores são iniciados com o valor especificado como *seed* e o incremento com o número especificado como *step*.   
Quando você carrega a tabela usando uma instrução `INSERT INTO [tablename] SELECT * FROM` ou `COPY`, os dados são carregados em paralelo e distribuídos para as fatias do nó. Para garantir que os valores de identidade sejam exclusivos, o Amazon Redshift ignora diversos valores ao criar valores de identidade. Os valores de identidade são exclusivos, mas a ordem pode não corresponder à ordem nos arquivos de origem. 

GENERATED BY DEFAULT AS IDENTITY (*seed*, *step*)   <a name="identity-generated-bydefault-clause"></a>
Cláusula que especifica que a coluna é IDENTITY padrão e permite que você atribua automaticamente um valor exclusivo à coluna. O tipo de dados para uma coluna IDENTITY deve ser INT ou BIGINT. Quando você adicionar linhas sem valores, esses valores serão iniciados com o valor especificado como *seed* e o incremento com o número especificado como *step.* Para obter informações sobre como os valores são gerados, consulte [IDENTITY](#identity-clause) .  
Além disso, durante INSERT, UPDATE ou COPY é possível fornecer um valor sem EXPLICIT\$1IDS. O Amazon Redshift usa esse valor para inseri-lo na coluna de identidade em vez de usar o valor gerado pelo sistema. O valor pode ser uma duplicação, um valor inferior ao da semente ou um valor entre os valores das etapas. O Amazon Redshift não verifica a exclusividade dos valores na coluna. O fornecimento de um valor não afeta o próximo valor gerado pelo sistema.  
Se você precisar de exclusividade na coluna, não adicione um valor duplicado. Adicione um valor exclusivo menor do que a semente ou entre os valores das etapas.
Lembre-se do seguinte sobre colunas de identidade padrão:   
+ As colunas de identidade padrão são NOT NULL. NULL não pode ser inserido.
+ Para inserir um valor gerado em uma coluna de identidade padrão, use a palavra-chave `DEFAULT`. 

  ```
  INSERT INTO tablename (identity-column-name) VALUES (DEFAULT);
  ```
+ A substituição de valores de uma coluna de identidade padrão não afeta o próximo valor gerado. 
+ Não é possível associar uma coluna de identidade padrão com a instrução ALTER TABLE ADD COLUMN. 
+ É possível associar uma coluna de identidade padrão com a instrução ALTER TABLE APPEND. 

ENCODE *encoding*   
Codificação de compactação de uma coluna. ENCODE AUTO é o padrão para tabelas. O Amazon Redshift gerencia automaticamente a codificação de compactação para todas as colunas da tabela. Se você especificar a codificação de compactação para qualquer coluna da tabela, a tabela não será mais definida como ENCODE AUTO. O Amazon Redshift não gerencia mais automaticamente a codificação de compactação para todas as colunas da tabela. Você pode especificar a opção ENCODE AUTO para a tabela para permitir que o Amazon Redshift gerencie automaticamente a codificação de compactação para todas as colunas da tabela.  
  
O Amazon Redshift atribui automaticamente uma codificação de compactação inicial a colunas para as quais você não especifica a codificação de compactação da seguinte maneira:  
+ Todas as colunas nas tabelas temporárias são atribuídas à compactação RAW como padrão.
+ Colunas que são definidas como chaves de classificação são designadas a compactação RAW.
+ Colunas que são definidas como tipos de dados BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY ou GEOGRAPHY recebem a compactação RAW.
+ As colunas definidas como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ recebem a compactação AZ64.
+ As colunas definidas como CHAR, VARCHAR ou VARBYTE recebem a compactação LZO.
Se você não quiser que uma coluna seja compactada, especifique explicitamente codificação RAW.
 Os seguintes [compression encodings](c_Compression_encodings.md#compression-encoding-list) são compatíveis:  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (sem compactação)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD

DISTKEY  
Palavra-chave que especifica que a coluna é a chave de distribuição da tabela. Somente uma coluna da tabela pode ser a chave de distribuição. Você pode usar a palavra-chave DISTKEY depois do nome de uma coluna ou como parte da definição da tabela usando a sintaxe DISTKEY (*nome\$1coluna*). Qualquer dos métodos tem o mesmo efeito. Para obter mais informações, consulte o parâmetro DISTSTYLE mais adiante neste tópico.  
O tipo dos dados de uma coluna de chave de distribuição pode ser: BOOLEAN, REAL, DOUBLE PRECISION, SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ e CHAR ou VARCHAR.

SORTKEY  
Palavra-chave que especifica que a coluna é a chave de classificação da tabela. Quando carregados na tabela, os dados são classificados em uma ou mais colunas designadas como chaves de classificação. Você pode usar a palavra-chave SORTKEY depois de um nome de coluna para especificar uma chave de classificação única, ou especificar uma ou mais colunas como colunas de chave de classificação para a tabela usando a sintaxe SORTKEY (*nome\$1coluna* [, ...]). Somente chaves de classificação compostas são criadas com essa sintaxe.  
Você pode definir um máximo de 400 colunas SORTKEY por tabela.  
O tipo dos dados de uma coluna de chave de classificação pode ser: BOOLEAN, REAL, DOUBLE PRECISION, SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ e CHAR ou VARCHAR.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Uma cláusula que especifica se a pesquisa ou comparação de string na coluna distingue ou não maiúscula e minúsculas. O valor padrão é o mesmo da configuração atual de diferenciação de maiúsculas e minúsculas do banco de dados.  
COLLATE é aceito somente em tipos de dados baseados em string, incluindo CHAR, VARCHAR e valores de string nas colunas SUPER. Para acessar detalhes sobre a consulta de dados SUPER sem distinção entre maiúsculas e minúsculas, consulte [Consulta sem distinção entre maiúsculas e minúsculas](query-super.md#case-insensitive-super-queries).  
Para localizar as informações de agrupamento de banco de dados, use o seguinte comando:  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE e CS são intercambiáveis e geram os mesmos resultados. Da mesma forma, CASE\$1INSENSITIVE e CI são intercambiáveis e geram os mesmos resultados.

NOT NULL \$1 NULL   
NOT NULL especifica que a coluna não deve conter valores nulos. NULL, o padrão, especifica que a coluna aceita valores nulos. As colunas IDENTITY são declaradas como NOT NULL por padrão.

UNIQUE  
Palavra-chave que especifica que a coluna somente pode conter valores exclusivos. O comportamento da restrição exclusiva de tabela é o mesmo das restrições de coluna, com capacidade adicional para abranger diversas colunas. Para definir uma restrição exclusiva de tabela, use a sintaxe UNIQUE ( *nome\$1coluna* [, …] ).  
As restrições exclusivas são informativas e não são aplicadas pelo sistema.

PRIMARY KEY  
Palavra-chave que especifica que a coluna é a chave primária para a tabela. Somente uma coluna pode ser definida como a chave primária usando uma definição de coluna. Para definir uma restrição de tabela com uma chave primária de várias colunas, use a sintaxe PRIMARY KEY ( *nome\$1coluna* [, ... ] ).  
Identificar uma coluna como a chave primária fornece metadados sobre o design do esquema. Uma chave primária implica que outras tabelas podem se basear nesse conjunto de colunas como um identificador exclusivo de linhas. Uma chave primária pode ser especificada para uma tabela, como uma restrição de coluna ou de tabela. A restrição de chave primária deve denominar um conjunto de colunas diferente de outros conjuntos denominados por qualquer restrição exclusiva definida para a mesma tabela.  
As colunas PRIMARY KEY também são definidas como NOT NULL.  
As restrições de chave primária são somente informativas. Elas não são impostas pelo sistema, mas são usadas pelo planejador.

References *tabelaref* [ ( *colunaref* ) ]  
Cláusula que especifica uma restrição de chave externa, que significa que a coluna deve conter somente valores que correspondam a valores na referida coluna de alguma linha na referida tabela. As colunas referidas devem ser as colunas de uma restrição exclusiva ou de chave primária na tabela referida.   
 As restrições de chave externa são somente informativas. Elas não são impostas pelo sistema, mas são usadas pelo planejador. 

LIKE *parent\$1table* [ \$1 INCLUDING \$1 EXCLUDING \$1 DEFAULTS ]   <a name="create-table-like"></a>
Cláusula que especifica uma tabela existente da qual uma nova tabela copia automaticamente nomes de colunas, tipos de dados e restrições NOT NULL. A nova tabela e a tabela pai são desacopladas, e nenhuma alteração realizada na tabela pai é aplicada na nova tabela. As expressões padrão para as definições de colunas copiadas são copiadas somente se INCLUDING DEFAULTS for especificado. O comportamento padrão é excluir expressões padrão para que todas as colunas da nova tabela tenham padrões nulos.   
As tabelas criadas com a opção LIKE não herdam restrições de chave primária e externa. O estilo de distribuição, as chaves de classificação e as propriedades BACKUP e NULL são herdados pelas tabelas LIKE, mas você não pode defini-los explicitamente na instrução CREATE TABLE... LIKE.

BACKUP \$1 YES \$1 NO \$1   <a name="create-table-backup"></a>
Cláusula que especifica se uma tabela deve ser incluída em snapshots de cluster manuais ou automatizadas.   
Para tabelas como as de preparação, que não contêm dados críticos, especifique BACKUP NO para economizar tempo de processamento ao criar snapshost, restaurar de snapshots e reduzir o uso de espaço de armazenamento no Amazon Simple Storage Service. A configuração BACKUP NO não tem efeito na replicação automática de dados para outros nós no cluster. Portanto, tabelas com BACKUP NO especificado são restauradas em caso de falha de nó. O padrão é BACKUP YES.  
Tabelas sem backup não são aceitas em clusters provisionados com RA3 e grupos de trabalho do Amazon Redshift sem servidor. Uma tabela marcada como sem backup em um cluster do RA3 ou um grupo de trabalho sem servidor será tratada como uma tabela permanente da qual sempre será feito backup durante a criação de um snapshot e sempre restaurada quando ocorrer a restauração por meio de um snapshot. Para evitar custos de snapshots em tabelas sem backup, trunque-as antes de tirar um snapshot.

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
Palavra-chave que define o estilo de distribuição de dados para toda a tabela. O Amazon Redshift distribui as linhas de uma tabela para cada um dos nós de computação de acordo com o estilo de distribuição especificado para a tabela. O padrão é AUTO.  
O estilo de distribuição selecionado para as tabelas afeta a performance geral do seu banco de dados. Para obter mais informações, consulte [Distribuição de dados para otimização de consultas](t_Distributing_data.md). Estilos de distribuição possíveis são os seguintes:  
+ AUTO: o Amazon Redshift atribui um estilo de distribuição ideal com base nos dados da tabela. Por exemplo, se o estilo de distribuição AUTO for especificado, o Amazon Redshift inicialmente vai atribuir o estilo de distribuição ALL a uma tabela pequena. Quando a tabela crescer, o Amazon Redshift poderá alterar o estilo de distribuição para KEY, escolhendo a chave primária (ou uma coluna da chave primária composta) como DISTKEY. Se a tabela crescer e nenhuma das colunas for adequada para ser DISTKEY, o Amazon Redshift vai alterar o estilo de distribuição para EVEN. A mudança no estilo de distribuição ocorre em segundo plano com impacto mínimo nas consultas do usuário. 

  Para visualizar o estilo de distribuição aplicado a uma tabela, consulte a tabela de catálogo de sistema PG\$1CLASS. Para obter mais informações, consulte [Visualização dos estilos de distribuição](viewing-distribution-styles.md). 
+ EVEN: Os dados na tabela são espalhados de maneira uniforme pelos nós em um cluster, em uma distribuição de ida e volta. Os IDs de linha são usados para determinar a distribuição e aproximadamente o mesmo número de linhas é distribuído para cada nó. 
+ KEY: Os dados são distribuídos pelos valores na coluna DISTKEY. Quando você define as colunas de junção das tabelas de junção como chaves de distribuição, as linhas de junção de ambas as tabelas são dispostas nos nós de computação. Quando os dados são dispostos, o otimizador pode realizar junções de maneira mais eficiente. Se você especificar DISTSTYLE KEY, deve denominar uma coluna DISTKEY, seja para a tabela ou como parte da definição de coluna. Para obter mais informações, consulte o parâmetro DISTKEY mencionado anteriormente neste tópico.
+  ALL: Uma cópia de toda a tabela é distribuída para cada nó. Este estilo de distribuição garante que todas as linhas necessárias para qualquer junção estejam disponíveis em cada nó, mas multiplica os requisitos de armazenamento e aumenta a carga e os tempos de manutenção da tabela. A distribuição ALL pode melhorar o tempo de execução quando usada com determinadas tabelas de dimensão nas quais a distribuição KEY não é apropriada, mas as melhorias de performance devem ser comparadas aos custos de manutenção. 

DISTKEY ( *nome\$1coluna* )  
Restrição que especifica a coluna a ser usada como a chave de distribuição da tabela. Você pode usar a palavra-chave DISTKEY depois do nome de uma coluna ou como parte da definição da tabela usando a sintaxe DISTKEY (*nome\$1coluna*). Qualquer dos métodos tem o mesmo efeito. Para obter mais informações, consulte o parâmetro DISTSTYLE mencionado anteriormente neste tópico.

[COMPOUND \$1 INTERLEAVED ] SORTKEY (* column\$1name* [,...]) \$1 [ SORTKEY AUTO ]  
Especifica uma ou mais chaves de classificação da tabela. Quando carregados na tabela, os dados são classificados pelas colunas designadas como chaves de classificação. Você pode usar a palavra-chave SORTKEY depois de um nome de coluna para especificar uma chave de classificação única, ou especificar uma ou mais colunas como colunas de chave de classificação para a tabela usando a sintaxe `SORTKEY (column_name [ , ... ] )`.   
Como opção, você pode especificar um estilo de classificação COMPOUND ou INTERLEAVED. Se você especificar SORTKEY com colunas, o padrão será COMPOUND. Para obter mais informações, consulte [Chaves de classificação](t_Sorting_data.md).  
Se você não especificar nenhuma opção de chave de classificação, o padrão será AUTO.  
Você pode definir um máximo de 400 colunas COMPOUND SORTKEY ou 8 colunas INTERLEAVED SORTKEY por tabela.     
AUTO  
Especifica que o Amazon Redshift atribui uma chave de classificação ideal com base nos dados da tabela. Por exemplo, se a chave de classificação AUTO for especificada, o Amazon Redshift inicialmente não atribuirá nenhuma chave de classificação a uma tabela. Se o Amazon Redshift determinar que uma nova chave de classificação melhorará a performance das consultas, o Amazon Redshift poderá alterar a chave de classificação da sua tabela. A classificação real da tabela é feita pela classificação automática da tabela. Para obter mais informações, consulte [Classificação automática de tabela](t_Reclaiming_storage_space202.md#automatic-table-sort).   
O Amazon Redshift não modifica tabelas que possuem chaves de classificação ou distribuição existentes. Com uma exceção, se uma tabela tiver uma chave de distribuição que nunca foi usada em um JOIN, a chave poderá ser alterada se o Amazon Redshift determinar que há uma chave melhor.   
Para exibir a chave de classificação de uma tabela, consulte a visualização do catálogo do sistema SVV\$1TABLE\$1INFO. Para obter mais informações, consulte [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Para exibir as recomendações do Amazon Redshift Advisor para tabelas, consulte a visualização do catálogo do sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Para obter mais informações, consulte [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Para exibir as ações executadas pelo Amazon Redshift, consulte a visualização do catálogo do sistema SVL\$1AUTO\$1WORKER\$1ACTION. Para obter mais informações, consulte [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md).   
COMPOUND  
Especifica que os dados sejam classificados usando uma chave composta por todas as colunas listadas, na ordem em que estão listadas. Uma chave de classificação composta é mais útil quando uma consulta faz a varredura de linhas de acordo com a ordem das colunas classificadas. Os benefícios de performance da classificação com uma chave composta diminuem quando as consultas se baseiam em colunas de classificação secundárias. Você pode definir um máximo de 400 colunas COMPOUND SORTKEY por tabela.   
INTERLEAVED  
Especifica que os dados sejam classificados usando uma chave de classificação intercalada. Um máximo de oito colunas pode ser especificado para uma chave de classificação intercalada.   
Uma classificação intercalada concede peso igual a todas as colunas, ou subconjuntos de colunas, na chave de classificação para que as consultas não dependam da ordem das colunas na chave de classificação. Quando uma consulta usa uma ou mais colunas de classificação secundárias, a classificação intercalada apresenta uma melhoria significativa de performance de consulta. A classificação intercalada carrega um pequeno custo de sobrecarga para operações de carregamento de dados e limpeza de operações.   
Não use uma chave de classificação intercalada em colunas com atributos que aumentam monotonicamente, como colunas de identidade, datas ou timestamps.

ENCODE AUTO   
Permite que o Amazon Redshift ajuste automaticamente o tipo de codificação de todas as colunas da tabela para otimizar a performance da consulta. O ENCODE AUTO preserva os tipos de codificação iniciais especificados na criação da tabela. Em seguida, se o Amazon Redshift determinar que um novo tipo de codificação pode melhorar a performance da consulta, o Amazon Redshift poderá alterar o tipo de codificação das colunas da tabela. ENCODE AUTO é o padrão se você não especificar um tipo de codificação em qualquer coluna na tabela.

UNIQUE ( *nome\$1coluna* [,...] )  
Restrição que especifica que um grupo contendo uma ou mais colunas de uma tabela pode conter somente valores exclusivos. O comportamento da restrição exclusiva de tabela é o mesmo das restrições de coluna, com capacidade adicional para abranger diversas colunas. No contexto de restrições exclusivas, valores nulos não são considerados iguais. Cada restrição de tabela exclusiva deve denominar um conjunto de colunas diferente do conjunto de colunas denominado por qualquer restrição exclusiva ou de chave primária definida para a tabela.   
 As restrições exclusivas são informativas e não são aplicadas pelo sistema. 

PRIMARY KEY ( *nome\$1coluna* [,...] )  
Restrição que especifica que uma ou mais colunas de uma tabela pode conter somente valores exclusivos (não copiados) não nulos. Identificar um conjunto de colunas como a chave primária também fornece metadados sobre o design do esquema. Uma chave primária implica que outras tabelas podem se basear nesse conjunto de colunas como um identificador exclusivo de linhas. Uma chave primária pode ser especificada para uma tabela, como uma restrição única de coluna ou de tabela. A restrição de chave primária deve denominar um conjunto de colunas diferente de outros conjuntos denominados por qualquer restrição exclusiva definida para a mesma tabela.   
 As restrições de chave primária são somente informativas. Elas não são impostas pelo sistema, mas são usadas pelo planejador. 

FOREIGN KEY ( *nome\$1coluna* [, ... ] ) REFERENCES *tabelaref* [ ( *colunaref* ) ]   
Restrição que especifica uma restrição de chave externa, que exige que um grupo contendo uma ou mais colunas da nova tabela deve apresentar somente valores que correspondam aos valores na(s) coluna(s) mencionada(s) de alguma linha na tabela referida. Se *colunaref* for omitido, a chave primária de *tabelaref* será usada. As colunas mencionadas devem ser as colunas de uma restrição exclusiva ou de chave primária na tabela referida.  
As restrições de chave externa são somente informativas. Elas não são impostas pelo sistema, mas são usadas pelo planejador.

## Observações de uso
<a name="r_CREATE_TABLE_usage"></a>

As restrições de exclusividade, chave primária e chave estrangeira são apenas informativas; *elas não são impostas pelo Amazon Redshift* quando você preenche uma tabela. Por exemplo, se você inserir dados em uma tabela com dependências, a inserção poderá ser bem-sucedida mesmo que viole a restrição. Apesar disso, chaves primárias e chaves estrangeiras são usadas como sugestões de planejamento e devem ser declaradas se seu processo de ETL ou algum outro processo em seu aplicativo reforçar sua integridade. Para obter informações sobre como descartar uma tabela com dependências, consulte [DESCARTAR TABELA](r_DROP_TABLE.md).

### Limites e cotas
<a name="r_CREATE_TABLE_usage-limits"></a>

Considere os seguintes limites ao criar uma tabela.
+ Há um limite para o número máximo de tabelas em um cluster por tipo de nó. Para obter mais informações, consulte “[Limites](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)” no *Guia de gerenciamento de clusters do Amazon Redshift*. 
+ O número máximo de caracteres para um nome de tabela é 127. 
+ O número máximo de colunas que você pode definir em uma única tabela é 1.600. 
+ O número máximo de colunas SORTKEY que você pode definir em uma única tabela é 400. 

### Resumo de configurações de nível de coluna e de nível de tabela
<a name="r_CREATE_TABLE_usage-summary_of_settings"></a>

 Diversos atributos e configurações podem ser definidos no nível da coluna ou no nível da tabela. Em alguns casos, configurar um atributo ou restrição no nível da coluna ou da tabela tem o mesmo efeito. Em outros casos, produz resultados diferentes. 

 A lista a seguir resume configurações nos níveis da coluna e da tabela:: 

DISTKEY  
Não há diferenças no efeito, seja definido no nível da coluna ou no nível da tabela.   
Se DISTKEY for definido, no nível da coluna ou no nível da tabela, DISTSTYLE deve ser definido como KEY ou não ser definido. DISTSTYLE pode ser definido somente no nível da tabela. 

SORTKEY  
Se definido no nível de coluna, SORTKEY deve ser uma coluna única. Se SORTKEY for definido no nível da tabela, uma ou mais colunas podem gerar uma chave de classificação composta ou intercalada. 

COLLATE CASE\$1SENSITIVE \$1 COLLATE CASE\$1INSENSITIVE  
O Amazon Redshift não permite a alteração da configuração de diferenciação de maiúsculas e minúsculas para uma coluna. Quando você anexa uma nova coluna à tabela, o Amazon Redshift usa o valor padrão para diferenciação de maiúsculas e minúsculas. O Amazon Redshift não oferece suporte à palavra-chave COLLATE ao anexar uma nova coluna.  
Para obter informações sobre como criar banco de dados usando o agrupamento de banco de dados, consulte [CREATE DATABASE](r_CREATE_DATABASE.md).  
Para obter mais informações sobre funções COLLATE, consulte [Função COLLATE](r_COLLATE.md).

UNIQUE  
No nível de coluna, uma ou mais chaves podem ser definidas como UNIQUE; a restrição UNIQUE se aplica a cada coluna individualmente. Se UNIQUE for definida no nível da tabela, uma ou mais colunas podem gerar uma restrição UNIQUE composta. 

PRIMARY KEY  
Se definida no nível de coluna, PRIMARY KEY deve ser uma coluna única. Se PRIMARY KEY for definida no nível da tabela, uma ou mais colunas podem gerar uma chave primária composta. 

FOREIGN KEY  
Não há diferenças no efeito seja a FOREIGN KEY definida no nível da coluna ou no nível da tabela. No nível da coluna, a sintaxe é simplesmente `REFERENCES` *tabelaref* [ ( *colunaref* )]. 

### Distribuição de dados de entrada
<a name="r_CREATE_TABLE_usage-distribution-of-incoming-data"></a>

Quando o esquema de distribuição de hash de dados de entrada corresponder aos dados da tabela de destino, nenhuma distribuição física de dados é realmente necessária quando os dados são carregados. Por exemplo, se uma chave de distribuição for definida para a nova tabela e os dados estiverem sendo introduzidos a partir de outra tabela que é distribuída na mesma coluna chave, os dados serão carregados no local, usando os mesmos nós e fatias. No entanto, se as tabelas de origem e de destino forem definidas com a distribuição EVEN, os dados serão redistribuídos em uma tabela de destino.

### Tabelas largas
<a name="r_CREATE_TABLE_usage-wide-tables"></a>

Você pode conseguir criar uma tabela muito larga, mas não conseguir realizar processamento de consultas, como as instruções INSERT ou SELECT, na tabela. A largura máxima de uma tabela com colunas de largura fixa, como CHAR, é de 64 KB - 1 (ou 65.535 bytes). Se a tabela incluir colunas VARCHAR, ela poderá ter uma largura declarada maior sem retornar um erro, pois as colunas VARCHARS não contribuem com sua largura total declarada para o limite de processamento de consulta calculado. O limite de processamento de consultas efetivo em colunas VARCHAR varia com base em diversos fatores.

Se uma tabela for muito larga para ser inserida ou selecionada, você receberá o erro a seguir.

```
ERROR:  8001
DETAIL:  The combined length of columns processed in the SQL statement
exceeded the query-processing limit of 65535 characters (pid:7627)
```

## Exemplos
<a name="r_CREATE_TABLE_usage-examples"></a>

Para exemplos que mostram como usar o comando CREATE TABLE, confira o tópico [Exemplos](r_CREATE_TABLE_examples.md).

# Exemplos
<a name="r_CREATE_TABLE_examples"></a>

Os exemplos a seguir demonstram vários atributos de coluna e tabela nas instruções CREATE TABLE do Amazon Redshift. Para obter mais informações sobre CREATE TABLE, incluindo definições de parâmetros, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md).

Muitos dos exemplos usam tabelas e dados do conjunto de dados de amostra *TICKIT*. Para obter mais informações, consulte [Banco de dados de amostra](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html).

 Você pode prefixar o nome da tabela com o nome do banco de dados e o nome do esquema em um comando CREATE TABLE. Por exemplo, `dev_database.public.sales`. O nome do banco de dados deve ser o banco de dados ao qual você se conectou. Qualquer tentativa de criar objetos de banco de dados em outro banco de dados falha com um erro de operação inválida.

## Criar uma tabela com uma chave de distribuição, uma chave composta de classificação e compactação
<a name="r_CREATE_TABLE_examples-create-a-table-with-distribution-key"></a>

O exemplo a seguir cria uma tabela SALES no banco de dados TICKIT com a compactação definida para várias colunas. O LISTID é declarado como a chave de distribuição, e o LISTID e o SELLERID são declarados como chave de classificação composta com várias colunas. As restrições de chave primária e de chave externa também são definidas para a tabela. Antes de criar a tabela no exemplo, talvez seja necessário adicionar uma restrição UNIQUE a cada coluna referenciada por uma chave estrangeira, caso não existam restrições.

```
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);
```

Os resultados são os seguintes:

```
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
```

O exemplo a seguir cria a tabela t1 com uma coluna col1 que não diferencia maiúsculas e minúsculas.

```
create table T1 (
  col1 Varchar(20) collate case_insensitive
 );
            
insert into T1 values ('bob'), ('john'), ('Tom'), ('JOHN'), ('Bob');
```

Consulte a tabela:

```
select * from T1 where col1 = 'John';
   
col1
------
 john
 JOHN
(2 rows)
```

## Criar uma tabela usando uma chave de classificação intercalada
<a name="CREATE_TABLE_NEW-create-a-table-using-interleaved-sortkey"></a>

O exemplo a seguir cria a tabela CUSTOMER com uma chave de classificação 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);
```

## Criar uma tabela usando IF NOT EXISTS
<a name="CREATE_TABLE_NEW-create-a-table-using-if-not-exists"></a>

 O exemplo a seguir cria a tabela CITIES ou não realiza ação nenhuma e retorna uma mensagem se a tabela já existir:

```
create table if not exists cities(
cityid integer not null,
city varchar(100) not null,
state char(2) not null);
```

## Criar uma tabela com a distribuição ALL
<a name="CREATE_TABLE_NEW-create-a-table-with-all-distribution"></a>

 O exemplo a seguir cria a tabela VENUE com a distribuição ALL. 

```
create table venue(
venueid smallint not null,
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid))
diststyle all;
```

## Criar uma tabela com a distribuição EVEN
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-even-distribution"></a>

O exemplo a seguir cria uma tabela denominada MYEVENT com três colunas. 

```
create table myevent(
eventid int,
eventname varchar(200),
eventcity varchar(30))
diststyle even;
```

A tabela é distribuída de maneira uniforme e não é classificada. A tabela não tem qualquer coluna DISTKEY ou SORTKEY declarada. 

```
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)
```

## Criar uma tabela temporária que se seja LIKE em relação a outra tabela
<a name="r_CREATE_TABLE_NEW-create-a-temporary-table-that-is-like-another-table"></a>

O exemplo a seguir cria uma tabela temporária denominada TEMPEVENT, que herda as colunas da tabela EVENT. 

```
create temp table tempevent(like event); 
```

Essa tabela também herda os atributos DISTKEY e SORTKEY da tabela pai: 

```
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)
```

## Criar uma tabela com uma coluna IDENTITY
<a name="r_CREATE_TABLE_NEW-create-a-table-with-an-identity-column"></a>

O exemplo a seguir cria uma tabela denominada VENUE\$1IDENT, com uma coluna IDENTITY denominada VENUEID. A coluna inicia com 0 e é incrementada por 1 para cada registro. VENUEID é também declarada como a chave primária da tabela. 

```
create table venue_ident(venueid bigint identity(0, 1),
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid));
```

## Criar uma tabela com uma coluna IDENTITY padrão
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-identity-column"></a>

O exemplo a seguir cria uma tabela chamada `t1`. Essa tabela tem uma coluna IDENTITY denominada `hist_id` e uma coluna IDENTITY padrão denominada `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)
);
```

A inserção de uma linha na tabela mostra que os valores `hist_id` e `base_id` foram gerados. 

```
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
```

A inserção de uma segunda linha mostra que o valor padrão de `base_id` foi gerado.

```
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
```

A inserção de uma terceira linha mostra que o valor de `base_id` não precisa ser exclusivo.

```
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
```

## Criar uma tabela com valores DEFAULT de coluna
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-column-values"></a>

O exemplo a seguir cria uma tabela CATEGORYDEF que declara valores padrão para cada coluna: 

```
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)
```

## Opções DISTSTYLE, DISTKEY e SORTKEY
<a name="r_CREATE_TABLE_NEW-diststyle-distkey-and-sortkey-options"></a>

O exemplo a seguir mostra como as opções DISTKEY, SORTKEY e DISTSTYLE funcionam. Neste exemplo, COL1 é a chave de distribuição. Portanto, o estilo de distribuição deve ser definido como KEY ou não deve ser definido. Por padrão, a tabela não tem chave de classificação e, portanto, não é classificada: 

```
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
```

No exemplo, a mesma coluna é definida como a chave de distribuição e a chave de classificação. Além disso, o estilo de distribuição deve ser definido como KEY ou não deve ser definido. 

```
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
```

No exemplo, nenhuma coluna é definida como chave de distribuição, COL2 é definida como chave de classificação e o estilo de distribuição é definido como 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
```

No exemplo, o estilo de distribuição é definido como EVEN e nenhuma chave de classificação é explicitamente definida. Portanto, a tabela é distribuída de maneira uniforme, mas não é classificada. 

```
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
```

## Criar uma tabela com a opção ENCODE AUTO
<a name="r_CREATE_TABLE_NEW-create-a-table-with-encode-option"></a>

O exemplo a seguir cria a tabela `t1` com codificação de compactação automática. ENCODE AUTO é o padrão para tabelas quando você não especifica um tipo de codificação para qualquer coluna.

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

O exemplo a seguir cria a tabela `t2` com codificação de compactação automática especificando ENCODE AUTO.

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

O exemplo a seguir cria a tabela `t3` com codificação de compactação automática especificando ENCODE AUTO. A coluna `c0` é definida com um tipo de codificação inicial de DELTA. O Amazon Redshift pode alterar a codificação se outra codificação fornecer melhor performance de consulta.

```
create table t3(c0 int encode delta, c1 varchar) encode auto;
```

O exemplo a seguir cria a tabela `t4` com codificação de compactação automática especificando ENCODE AUTO. A coluna `c0` é definida com uma codificação inicial de DELTA, e coluna `c1` é definida com uma codificação inicial de LZO. O Amazon Redshift pode alterar a codificação se outra codificação fornecer melhor performance de consulta.

```
create table t4(c0 int encode delta, c1 varchar encode lzo) encode auto;
```

# CREATE TABLE AS
<a name="r_CREATE_TABLE_AS"></a>

**Topics**
+ [Sintaxe](#r_CREATE_TABLE_AS-synopsis)
+ [Parâmetros](#r_CREATE_TABLE_AS-parameters)
+ [Observações de uso CTAS](r_CTAS_usage_notes.md)
+ [Exemplos de CTAS](r_CTAS_examples.md)

Cria uma nova tabela com base em uma consulta. O proprietário desta tabela é o usuário que emite o comando.

A nova tabela é carregada com dados definidos pela consulta no comando. As colunas da tabela têm nomes e tipos de dados associados às colunas de saída da consulta. O comando CREATE TABLE AS (CTAS) cria uma nova tabela e avalia a consulta para carregar a nova tabela.

## Sintaxe
<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 [, ...] ) ]
```

## Parâmetros
<a name="r_CREATE_TABLE_AS-parameters"></a>

LOCAL   
Embora a instrução aceite esta palavra-chave, ela não tem efeito no Amazon Redshift.

TEMPORARY \$1 TEMP   
Cria uma tabela temporária. Uma tabela temporária é automaticamente descartada no final da sessão na qual ela foi criada.

 *table\$1name*   
Nome da tabela a ser criada.  
Se você especificar um nome de tabela que comece com “\$1”, a tabela será criada como temporária. Por exemplo:  

```
create table #newtable (id) as select * from oldtable;
```
O tamanho máximo do nome da tabela é 127 bytes; nomes mais longos são truncados para ter no máximo 127 bytes. O Amazon Redshift impõe uma cota do número de tabelas por cluster por tipo de nó. É possível qualificar o nome da tabela com o nome do banco de dados e do esquema, conforme mostra a tabela a seguir.  

```
create table tickit.public.test (c1) as select * from oldtable;
```
Neste exemplo, `tickit` é o nome do banco de dados e `public` é o nome do esquema. Se o banco de dados ou o esquema não existir, a instrução retornará um erro.  
Se um nome de esquema for fornecido, a nova tabela será criada naquele esquema (presumindo que o criador tenha acesso ao esquema). O nome da tabela deve ser exclusivo para aquele esquema. Se nenhum esquema for especificado, a tabela será criada usando o esquema atual do banco de dados. Se estiver criando uma tabela temporária, você não poderá especificar um nome de esquema, uma vez que as tabelas temporárias existem em um esquema especial.  
Podem existir várias tabelas temporárias com o mesmo nome ao mesmo tempo no mesmo banco de dados, se elas forem criadas em sessões separadas. Essas tabelas são atribuídas a esquemas diferentes.

 *column\$1name*   
Nome de uma coluna na nova tabela. Se nenhum nome de coluna for fornecido, os nomes de colunas podem ser obtidos com base nos nomes de coluna de saída da consulta. Os nomes de coluna padrão são usados para expressões. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

BACKUP \$1 YES \$1 NO \$1   
Cláusula que especifica se uma tabela deve ser incluída em snapshots de cluster manuais ou automatizadas.   
Para tabelas como as de preparação, que não contêm dados críticos, especifique BACKUP NO para economizar tempo de processamento ao criar snapshost, restaurar de snapshots e reduzir o uso de espaço de armazenamento no Amazon Simple Storage Service. A configuração BACKUP NO não tem efeito em replicação automática de dados para outros nós no cluster. Portanto, tabelas com BACKUP NO especificado são restauradas em caso de erro de nó. O padrão é BACKUP YES.  
Tabelas sem backup não são aceitas em clusters provisionados com RA3 e grupos de trabalho do Amazon Redshift sem servidor. Uma tabela marcada como sem backup em um cluster do RA3 ou um grupo de trabalho sem servidor será tratada como uma tabela permanente da qual sempre será feito backup durante a criação de um snapshot e sempre restaurada quando ocorrer a restauração por meio de um snapshot. Para evitar custos de snapshots em tabelas sem backup, trunque-as antes de tirar um snapshot.

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
Palavra-chave que define o estilo de distribuição de dados para toda a tabela. O Amazon Redshift distribui as linhas de uma tabela para cada um dos nós de computação de acordo com o estilo de distribuição especificado para a tabela. O padrão é DISTSTYLE AUTO.  
O estilo de distribuição selecionado para as tabelas afeta a performance geral do seu banco de dados. Para obter mais informações, consulte [Distribuição de dados para otimização de consultas](t_Distributing_data.md).  
+ AUTO: o Amazon Redshift atribui um estilo de distribuição ideal com base nos dados da tabela. Para visualizar o estilo de distribuição aplicado a uma tabela, consulte a tabela de catálogo de sistema PG\$1CLASS. Para obter mais informações, consulte [Visualização dos estilos de distribuição](viewing-distribution-styles.md). 
+ EVEN: Os dados na tabela são espalhados de maneira uniforme pelos nós em um cluster, em uma distribuição de ida e volta. Os IDs de linha são usados para determinar a distribuição e aproximadamente o mesmo número de linhas é distribuído para cada nó. Este método de distribuição é o padrão.
+ KEY: Os dados são distribuídos pelos valores na coluna DISTKEY. Quando você define as colunas de junção das tabelas de junção como chaves de distribuição, as linhas de junção de ambas as tabelas são dispostas nos nós de computação. Quando os dados são dispostos, o otimizador pode realizar junções de maneira mais eficiente. Se você especificar a DISTSTYLE KEY, é preciso nomear uma coluna DISTKEY.
+  ALL: Uma cópia de toda a tabela é distribuída para cada nó. Este estilo de distribuição garante que todas as linhas necessárias para qualquer junção estejam disponíveis em cada nó, mas multiplica os requisitos de armazenamento e aumenta a carga e os tempos de manutenção da tabela. A distribuição ALL pode melhorar o tempo de execução quando usada com determinadas tabelas de dimensão nas quais a distribuição KEY não é apropriada, mas as melhorias de performance devem ser comparadas aos custos de manutenção. 

DISTKEY (*coluna*)  
Especifica um nome de coluna ou um número de posição para a chave de distribuição. Use o nome especificado na lista opcional de coluna para a tabela ou na lista selecionada da consulta. Como opção, você pode usar um número de posição, onde a primeira coluna selecionada é 1, a segunda é 2 e assim por diante. Somente uma coluna da tabela pode ser a chave de distribuição:  
+ Se você declarar uma coluna como DISTKEY, DISTSTYLE deve ser definida como KEY ou não deve ser definida.
+ Se você não declarar uma coluna DISTKEY, é possível definir DISTSTYLE como EVEN.
+ Se você não especificar DISTKEY ou DISTSTYLE, o CTAS determina o estilo de distribuição para a nova tabela com base no plano de consulta para a cláusula SELECT. Para obter mais informações, consulte [Herança de atributos de coluna e tabela](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes).
Você pode definir a mesma coluna como chave de distribuição e chave de classificação. Esta abordagem tende a acelerar a junção quando a coluna em questão é uma coluna de junção na consulta.

[ COMPOUND \$1 INTERLEAVED ] SORTKEY ( *column\$1name* [, ... ] )  
Especifica uma ou mais chaves de classificação da tabela. Quando carregados na tabela, os dados são classificados pelas colunas designadas como chaves de classificação.   
Como opção, você pode especificar um estilo de classificação COMPOUND ou INTERLEAVED. O padrão é COMPOUND. Para obter mais informações, consulte [Chaves de classificação](t_Sorting_data.md).  
Você pode definir um máximo de 400 colunas COMPOUND SORTKEY ou 8 colunas INTERLEAVED SORTKEY por tabela.   
Se você não especificar SORTKEY, o CTAS determina as chaves de classificação para a nova tabela com base no plano de consulta para a cláusula SELECT. Para obter mais informações, consulte [Herança de atributos de coluna e tabela](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes).    
COMPOUND  
Especifica que os dados sejam classificados usando uma chave composta por todas as colunas listadas, na ordem em que estão listadas. Uma chave de classificação composta é mais útil quando uma consulta faz a varredura de linhas de acordo com a ordem das colunas classificadas. Os benefícios de performance da classificação com uma chave composta diminuem quando as consultas se baseiam em colunas de classificação secundárias. Você pode definir um máximo de 400 colunas COMPOUND SORTKEY por tabela.   
INTERLEAVED  
Especifica que os dados sejam classificados usando uma chave de classificação intercalada. Um máximo de oito colunas pode ser especificado para uma chave de classificação intercalada.   
Uma classificação intercalada concede peso igual a todas as colunas, ou subconjuntos de colunas, na chave de classificação para que as consultas não dependam da ordem das colunas na chave de classificação. Quando uma consulta usa uma ou mais colunas de classificação secundárias, a classificação intercalada apresenta uma melhoria significativa de performance de consulta. A classificação intercalada carrega um pequeno custo de sobrecarga para operações de carregamento de dados e limpeza de operações. 

AS *query*   
Qualquer consulta (instrução SELECT) compatível com o Amazon Redshift.

# Observações de uso CTAS
<a name="r_CTAS_usage_notes"></a>

## Limites
<a name="r_CTAS_usage_notes-limits"></a>

O Amazon Redshift impõe uma cota do número de tabelas por cluster por tipo de nó. 

O número máximo de caracteres para um nome de tabela é 127. 

O número máximo de colunas que você pode definir em uma única tabela é 1.600. 

## Herança de atributos de coluna e tabela
<a name="r_CTAS_usage_notes-inheritance-of-column-and-table-attributes"></a>

Tabelas CREATE TABLE AS (CTAS) não herdam restrições, colunas de identidade, valores de coluna padrão ou a chave primária da tabela com base na qual foram criadas. 

Você não pode especificar codificações de compactação de coluna para tabelas CTAS. O Amazon Redshift atribui automaticamente a codificação de compactação da seguinte maneira:
+ Colunas que são definidas como chaves de classificação são designadas a compactação RAW.
+ Colunas que são definidas como tipos de dados BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY ou GEOGRAPHY recebem a compactação RAW.
+ As colunas definidas como SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP ou TIMESTAMPTZ recebem a compactação AZ64.
+ As colunas definidas como CHAR, VARCHAR ou VARBYTE recebem a compactação LZO.

Para obter mais informações, consulte [Codificações de compactação](c_Compression_encodings.md) e [Tipos de dados](c_Supported_data_types.md). 

Para atribuir explicitamente codificações de coluna, use [CRIAR TABELA](r_CREATE_TABLE_NEW.md).

O CTAS determina o estilo de distribuição e a chave de classificação para a nova tabela com base no plano de consulta para a cláusula SELECT. 

Para consultas complexas, como consultas incluindo junções, agregações, classificação por cláusula ou uma cláusula de limite, o CTAS se esforça para escolher o melhor estilo de distribuição e chave de classificação com base no plano de consulta. 

**nota**  
Para uma melhor performance com grandes conjuntos de dados ou consultas complexas, recomendamos testar usando conjuntos de dados típicos.

Muitas vezes você pode prever qual chave de distribuição e chave de classificação o CTAS escolhe examinando o plano de consulta para ver quais colunas, se houver, o otimizador de consulta escolherá para classificação e distribuição de dados. Se o nó superior do plano de consulta for uma varredura sequencial simples de uma tabela única (XN Seq Scan), o CTAS usará o estilo de distribuição e a chave de classificação da tabela de origem. Se o nó superior do plano de consulta for qualquer outra varredura sequencial (como XN Limit, XN Sort, XN HashAggregate, etc.), o CTAS se esforça para escolher o melhor estilo de distribuição e chave de classificação com base no plano de consulta.

Por exemplo, suponhamos que você crie cinco tabelas usando os seguintes tipos de cláusulas SELECT:
+ Um instrução simples de seleção 
+ Uma cláusula de limitação 
+ Um classificação por cláusula usando LISTID 
+ Um classificação por cláusula usando QTYSOLD 
+ Uma função agregada SUM com um agrupamento por cláusula.

Os exemplos a seguir mostram o plano de consulta para cada comando 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 exibir a chave de distribuição e a chave de classificação para cada tabela, consulte a tabela de catálogo de sistema PG\$1TABLE\$1DEF, como mostrado a seguir. 

```
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
```

A tabela a seguir resume os resultados. Para simplificar, omitimos os custos, as linhas e os detalhes de largura do plano de explicação.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_CTAS_usage_notes.html)

Você pode especificar explicitamente o estilo de distribuição e a chave de classificação da instrução CTAS. Por exemplo, a instrução a seguir cria uma tabela usando a distribuição EVEN e especifica SALESID como a chave de classificação.

```
create table sales_disteven
diststyle even
sortkey (salesid)
as
select eventid, venueid, dateid, eventname
from event;
```

## Codificação de compactação
<a name="r_CTAS_usage_notes_encoding"></a>

ENCODE AUTO é usado como o padrão para tabelas. O Amazon Redshift gerencia automaticamente a codificação de compactação para todas as colunas da tabela.

## Distribuição de dados de entrada
<a name="r_CTAS_usage_notes-distribution-of-incoming-data"></a>

Quando o esquema de distribuição de hash de dados de entrada corresponder aos dados da tabela de destino, nenhuma distribuição física de dados é realmente necessária quando os dados são carregados. Por exemplo, se uma chave de distribuição for definida para a nova tabela e os dados estiverem sendo introduzidos a partir de outra tabela que é distribuída na mesma coluna chave, os dados serão carregados no local, usando os mesmos nós e fatias. No entanto, se as tabelas de origem e de destino forem definidas com a distribuição EVEN, os dados serão redistribuídos em uma tabela de destino. 

## Operações ANALYZE automáticas
<a name="r_CTAS_usage_notes-automatic-analyze-operations"></a>

O Amazon Redshift analisa automaticamente tabelas criadas com comandos CTAS. Não precisar executar o comando ANALYZE nessas tabelas quando elas são inicialmente criadas. Se você as modificar, você deve analisá-las da mesma forma que outras tabelas. 

# Exemplos de CTAS
<a name="r_CTAS_examples"></a>

O exemplo a seguir cria uma tabela denominada EVENT\$1BACKUP para a tabela EVENT:

```
create table event_backup as select * from event;
```

A tabela resultante herda as chaves de distribuição e de classificação da tabela 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
```

O comando a seguir cria uma nova tabela denominada EVENTDISTSORT selecionando quatro colunas da tabela EVENT. A nova tabela é distribuída por EVENTID e classificada por EVENTID e DATEID: 

```
create table eventdistsort
distkey (1)
sortkey (1,3)
as
select eventid, venueid, dateid, eventname
from event;
```

O resultado é o seguinte:

```
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
```

Você pode criar exatamente a mesma tabela usando nomes de coluna para as chaves de distribuição e de classificação. Por exemplo:

```
create table eventdistsort1
distkey (eventid)
sortkey (eventid, dateid)
as
select eventid, venueid, dateid, eventname
from event;
```

A instrução a seguir aplica distribuição uniforme à tabela, mas não define uma chave de classificação explícita. 

```
create table eventdisteven
diststyle even
as
select eventid, venueid, dateid, eventname
from event;
```

A tabela não herda a chave de classificação da tabela EVENT (EVENTID), pois a distribuição EVEN é especificada para a nova tabela. A nova tabela não tem chave de classificação e de distribuição. 

```
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
```

A instrução a seguir aplica a distribuição uniforme e define uma chave de classificação: 

```
create table eventdistevensort diststyle even sortkey (venueid)
as select eventid, venueid, dateid, eventname from event;
```

 A tabela resultante tem uma chave de classificação, mas não uma de distribuição. 

```
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
```

A instrução a seguir redistribui a tabela EVENT em uma coluna chave diferente dos dados de entrada, que são classificados na coluna EVENTID, e não define nenhuma coluna SORTKEY. Portanto, a tabela não é classificada. 

```
create table venuedistevent distkey(venueid)
as select * from event;
```

O resultado é o seguinte: 

```
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>

Cria modelos reutilizáveis para comandos do Amazon Redshift, como [COPY](r_COPY.md). Os modelos armazenam parâmetros comumente usados que podem ser referidos em várias execuções de comando, melhorando a consistência e reduzindo a especificação manual de parâmetros.

Os modelos eliminam a necessidade de especificar repetidamente os mesmos parâmetros de formatação em várias operações, enquanto os caminhos de origem, as tabelas de destino e a autorização podem variar entre as operações.

## Privilégios obrigatórios
<a name="r_CREATE_TEMPLATE-privileges"></a>

Para criar um modelo, é necessário ter uma das seguintes opções:
+ Privilégios de superusuário.
+ Permissão CREATE no esquema em que você deseja criar o modelo ou permissão CREATE com escopo nos esquemas no banco de dados em que você deseja criar o modelo

## Sintaxe
<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 ] [ , ... ] ];
```

## Parâmetros
<a name="r_CREATE_TEMPLATE-parameters"></a>

 *OR REPLACE*   
Se um modelo com o mesmo nome já existir no banco de dados e no esquema especificados, o modelo existente será substituído. Só é possível substituir um modelo por um novo modelo que defina o mesmo tipo de operação; por exemplo, COPY. Você deve ter os privilégios necessários para substituir um modelo.

*database\$1name*  
(Opcional) O nome do banco de dados onde o modelo será criado. Se não especificado, o modelo será criado no banco de dados atual.  
Se o banco de dados ou o esquema não existir, o modelo não será criado e a instrução exibirá um erro. Não é possível criar modelos nos bancos de dados `template0`,`template1`, `padb_harvest` ou `sys:internal` do sistema.

*schema\$1name*  
(Opcional) O nome do esquema onde o modelo será criado. Se não especificado, o modelo será criado no esquema atual.  
Se um nome de esquema for fornecido, o novo modelo será criado no esquema em questão (presumindo que o criador tenha acesso ao esquema). O nome do modelo deve ser exclusivo para o esquema em questão.

*template\$1name*  
O nome do modelo a ser criado. Como opção, é possível qualificar o nome do modelo com o nome do banco de dados e do esquema. No exemplo a seguir, o nome do banco de dados é `demo_database`, o nome do esquema é `demo_schema` e o nome do modelo é `test`. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).  

```
CREATE TEMPLATE demo_database.demo_schema.test FOR COPY AS CSV;
```

COPY  
Especifica o tipo de comando do Redshift para o qual o modelo foi criado. No momento, é possível usar apenas o comando COPY.

[ [ FORMAT ] [ AS ] *data\$1format* ]   
Esse parâmetro é opcional. Isso especifica o formato de dados para operações COPY.

[ *parameter* [ argument ]]  
Qualquer parâmetro válido para o comando do Redshift especificado.  
Por exemplo, os modelos para o comando COPY podem incluir:  
+ [Parâmetros de formato de dados](copy-parameters-data-format.md)
+ [Parâmetros de compactação de arquivo](copy-parameters-file-compression.md)
+ [Parâmetros da conversão de dados](copy-parameters-data-conversion.md)
+ [Operações de carregamento de dados](copy-parameters-data-load.md)
Para ver uma lista completa de parâmetros compatíveis, consulte o comando [COPY](r_COPY.md).

### Observações de uso
<a name="create_template-usage-notes"></a>
+ Por padrão, todos os usuários têm privilégios CREATE e USAGE no esquema PUBLIC. Para impedir que usuários criem objetos no esquema PUBLIC de um banco de dados, use o comando REVOKE para remover esse privilégio.
+ Quando existe um parâmetro no modelo e no comando, o parâmetro do comando tem precedência.
+ Os modelos são objetos de banco de dados e seguem as regras padrão de nomeação e permissão de objetos do Redshift. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).
+ Os modelos não podem conter especificações de arquivo de manifesto para o comando [COPY](r_COPY.md).

### Limitações
<a name="create_template-limitations"></a>
+ Pelo menos um parâmetro deve ser especificado ao criar um modelo.
+ Parâmetros excluídos: parâmetros específicos de comando, como caminhos de origem, tabelas de destino, credenciais de autorização e especificações de arquivos de manifesto, não podem ser incluídos nos modelos. Esses parâmetros devem ser especificados no comando real.
+ Número máximo de modelos por cluster: é possível criar um máximo de 1.000 modelos por cluster. Esse limite se aplica ao número total de modelos em todos os bancos de dados e esquemas no cluster.
+ Referências entre bancos de dados: não é possível referir modelos em bancos de dados.
+ Compartilhamento de dados: não é possível incluir modelos em unidades de compartilhamentos de dados. Os modelos devem ser criados separadamente em cada cluster em que são necessários.

## Exemplos
<a name="r_CREATE_TEMPLATE-examples"></a>

O exemplo a seguir cria um modelo para o 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 obter a definição do modelo:

```
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 a visualização [SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md) do sistema para obter mais detalhes sobre um modelo. 

```
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>

Cria um usuário de banco de dados. Os usuários do banco de dados podem recuperar dados, executar comandos e realizar outras ações em um banco de dados, dependendo de seus privilégios e perfis. Você deve ser um superusuário do banco de dados para executar este comando.

## Privilégios obrigatórios
<a name="r_CREATE_USER-privileges"></a>

A seguir estão os privilégios obrigatórios para CREATE USER:
+ Superusuário
+ Usuários com o privilégio CREATE USER

## Sintaxe
<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
```

## Parâmetros
<a name="r_CREATE_USER-parameters"></a>

 *name*   
O nome do usuário a ser criado. O nome do usuário não pode ser `PUBLIC`. Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md).

WITH  
Palavra-chave opcional. WITH é ignorado pelo Amazon Redshift

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
Define a senha do usuário.   
Por padrão, os usuários podem alterar suas próprias senhas, a menos que a senha esteja desabilitada. Para desabilitar a senha de um usuário, especifique DISABLE. Quando a senha de um usuário for desabilitada, ela será excluída do sistema e o usuário poderá fazer logon apenas usando as credenciais temporárias do usuário do AWS Identity and Access Management (IAM). Para obter mais informações, consulte [Uso da autenticação do IAM para gerar credenciais do usuário do banco de dados](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html). Apenas um superusuário pode habilitar ou desabilitar senhas. Não é possível desabilitar a senha de um superusuário. Para habilitar uma senha, execute [ALTER USER](r_ALTER_USER.md) e especifique uma senha.  
É possível especificar a senha em texto simples, como uma string de hash MD5 ou como uma string de hash SHA256.   
 Ao executar um novo cluster usando o Console de gerenciamento da AWS, a AWS CLI, ou a API do Amazon Redshift,, você deverá fornecer uma senha de texto não criptografado para o usuário inicial do banco de dados. Você pode alterar a senha posteriormente usando [ALTER USER](r_ALTER_USER.md). 
Para texto simples, a senha deve atender às seguintes restrições:  
+ Deve ter de 8 a 64 caracteres.
+ Deve conter pelo menos uma letra maiúscula, uma letra minúscula e um número.
+ Pode conter qualquer caractere ASCII com códigos ASCII 33–126, exceto aspas simples ('), aspas duplas ("), \$1, / ou @.
É possível especificar uma sequência de hash MD5 que inclua a senha e o nome do usuário como alternativa mais segura para o parâmetro CREATE USER em texto simples.   
Quando você especifica uma sequência de hash MD5, o comando CREATE USER procura uma sequência de hash MD5 válida, mas não valida a parte da sequência contendo a senha. Nesse caso, é possível criar uma senha, como uma sequência vazia, que você não pode usar para acessar o banco de dados.
Para especificar uma senha MD5, siga estas etapas:   

1. Concatene a senha e o nome do usuário. 

   Por exemplo, para senha `ez` e usuário `user1`, a sequência concatenada é `ezuser1`. 

1. Converta a sequência concatenada em uma sequência de hash MD5 de 32 caracteres. É possível usar qualquer utilitário de MD5 para criar a sequência de hash. O exemplo a seguir usa o [Função MD5](r_MD5.md) do Amazon Redshift e o operador de concatenação (\$1\$1) para retornar uma string de hash MD5 de 32 caracteres. 

   ```
   select md5('ez' || 'user1');
                           
   md5
   --------------------------------
   153c434b4b77c89e6b94f12c5393af5b
   ```

1. Concatene '`md5`' na frente da sequência de hash MD5 e forneça a sequência concatenada como argumento *md5hash*.

   ```
   create user user1 password 'md5153c434b4b77c89e6b94f12c5393af5b';
   ```

1. Faça login no banco de dados usando as credenciais de login. 

   Para este exemplo, faça logon como `user1` com a senha `ez`. 
Uma alternativa segura é especificar o hash SHA-256 de uma string de senha; ou você pode fornecer seu próprio digest SHA-256 válido e salt de 256 bits que foi usado para criar o digest.  
+ Digest: a saída de uma função de hash.
+ Salt: dados gerados aleatoriamente combinados com a senha para ajudar a reduzir padrões na saída da função de hash.

```
'sha256|Mypassword'
```

```
'sha256|digest|256-bit-salt'
```
No exemplo a seguir, o Amazon Redshift gera e gerencia o salt.   

```
CREATE USER admin PASSWORD 'sha256|Mypassword1';
```
No exemplo a seguir, são fornecidos um resumo SHA-256 válido e salt de 256 bits que foi usado para criar o resumo.  
Para especificar uma senha e aplicar hash com seu próprio sal, siga estas etapas:  

1. Crie um sal de 256 bits. É possível obter um sal usando qualquer gerador de string hexadecimal para gerar uma string de 64 caracteres. Neste exemplo, o sal é `c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6`. 

1.  Use a função FROM\$1HEX para converter o sal em binário. Isso ocorre porque a função SHA2 requer a representação binária do sal. Veja a instrução a seguir. 

   ```
   SELECT FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6');
   ```

1.  Use a função CONCAT para acrescentar o sal à sua senha. Neste exemplo, a senha é `Mypassword1`. Veja a instrução a seguir. 

   ```
   SELECT CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6'));
   ```

1. Use a função SHA2 para criar um resumo da combinação de senha e sal. Veja a instrução a seguir.

   ```
   SELECT SHA2(CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6')), 0);
   ```

1.  Usando o resumo e o sal das etapas anteriores, crie o usuário. Veja a instrução a seguir. 

   ```
   CREATE USER admin PASSWORD 'sha256|821708135fcc42eb3afda85286dee0ed15c2c461d000291609f77eb113073ec2|c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6';
   ```

1. Faça login no banco de dados usando as credenciais de login.

    Para este exemplo, faça logon como `admin` com a senha `Mypassword1`.
Se você definir uma senha em texto sem especificar a função de hash, um digest MD5 será gerado usando o nome de usuário como salt. 

CREATEDB \$1 NOCREATEDB   
A opção CREATEDB permite que o novo usuário crie bancos de dados. NOCREATEDB é o padrão.

CREATEUSER \$1 NOCREATEUSER   
A opção CREATEUSER cria um superusuário com todos os privilégios de banco de dados, incluindo CREATE USER. NOCREATEUSER é o valor padrão. Para obter mais informações, consulte [Superusuários](r_superusers.md).

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="create-user-syslog-access"></a>
Uma cláusula que especifica o nível de acesso do usuário para as tabelas e as visualizações de sistema do Amazon Redshift.   
Usuários regulares que têm a permissão SYSLOG ACCESS RESTRICTED podem ver somente as linhas geradas por esse usuário nas tabelas e visualizações do sistema visíveis ao usuário. O padrão é RESTRICTED.   
Usuários regulares que têm a permissão UNRESTRICTED podem ver todas as linhas nas tabelas e visualizações de sistema visíveis ao usuário, incluindo as linhas geradas por outro usuário. UNRESTRICTED não fornece acesso para os usuários regulares às tabelas visíveis para superusuários. Somente superusuários podem visualizar tabelas visíveis para superusuários.   
Fornecer acesso ilimitado para um usuário às tabelas de sistema é o mesmo que dar ao usuário visibilidade para os dados gerados por outros usuários. Por exemplo, STL\$1QUERY e STL\$1QUERYTEXT contêm texto completo de instruções INSERT, UPDATE e DELETE, e podem conter dados confidenciais gerados pelos usuários. 
Todas as linhas em SVV\$1TRANSACTIONS são visíveis a todos os usuários.   
Para obter mais informações, consulte [Visibilidade de dados em tabelas e visualizações de sistema](cm_chap_system-tables.md#c_visibility-of-data).

IN GROUP *groupname*   
Especifica o nome de um grupo existente ao qual o usuário pertence. Vários nomes de grupos podem ser listados.

VALID UNTIL *abstime*   
A opção VALID UNTIL define um tempo absoluto após o qual a senha do usuário não é mais válida. Por padrão, a senha não tem um limite de tempo.

CONNECTION LIMIT \$1 *limite* \$1 UNLIMITED \$1   
Número máximo de conexões de banco de dados que o usuário pode abrir simultaneamente. Não há aplicação de limite para superusuários. Use a palavra-chave UNLIMITED para permitir o número máximo de conexões simultâneas. Um limite no número de conexões para cada banco de dados pode ser aplicável. Para obter mais informações, consulte [CREATE DATABASE](r_CREATE_DATABASE.md). O valor padrão é UNLIMITED. Para visualizar as conexões atuais, consulte a exibição [STV\$1SESSIONS](r_STV_SESSIONS.md) do sistema.  
Se limites de usuário e de conexão de banco de dados forem aplicáveis, um slot de conexão não utilizado que esteja dentro de ambos os limites deve estar disponível quando um usuário tenta se conectar.

SESSION TIMEOUT *limit*  
O tempo máximo em segundos em que uma sessão permanece inativa ou ociosa. O intervalo é de 60 segundos (um minuto) a 1.728.000 segundos (20 dias). Se nenhum tempo limite de sessão estiver definido para o usuário, a configuração de cluster será aplicada. Para obter mais informações, consulte “[Cotas e limites no Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)” no *Guia de gerenciamento de clusters do Amazon Redshift*.  
Quando você define o tempo limite da sessão, ele é aplicado somente a novas sessões.  
Para exibir informações sobre sessões de usuário ativas, incluindo a hora de início, o nome de usuário e o tempo limite da sessão, consulte a visualização de sistema [STV\$1SESSIONS](r_STV_SESSIONS.md). Para exibir informações sobre o histórico de sessões de usuário, consulte a visualização [STL\$1SESSIONS](r_STL_SESSIONS.md). Para recuperar informações sobre usuários do banco de dados, incluindo valores de tempo limite de sessão, consulte a visualização [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md).

EXTERNALID *external\$1id*  
O identificador para o usuário, que está associado a um provedor de identidades. O usuário deve ter a senha desabilitada. Para obter mais informações, consulte [Federação do provedor de identidades (IdP) nativo para o Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html).

### Observações de uso
<a name="create_user-usage-notes"></a>

Por padrão, todos os usuários têm privilégios CREATE e USAGE no esquema PUBLIC. Para impedir que usuários criem objetos no esquema PUBLIC de um banco de dados, use o comando REVOKE para remover esse privilégio.

Ao usar a autenticação do IAM para criar credenciais de usuário de banco de dados, convém criar um superusuário que possa fazer logon usando apenas credenciais temporárias. Você não pode desabilitar a senha de um superusuário, mas pode criar uma senha desconhecida usando uma string de hash MD5 gerada aleatoriamente.

```
create user iam_superuser password 'md5A1234567890123456780123456789012' createuser;
```

As maiúsculas e minnúsculas de um *nome de usuário* entre aspas duplas são sempre mantidas, independentemente da opção de configuração `enable_case_sensitive_identifier`. Para obter mais informações, consulte [enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md).

## Exemplos
<a name="r_CREATE_USER-examples"></a>

O comando a seguir cria um usuário chamado dbuser, com a senha “abcD1234”, privilégios de criação de banco de dados e um limite de 30 conexões.

```
create user dbuser with password 'abcD1234' createdb connection limit 30;
```

 Consulte a tabela de catálogo PG\$1USER\$1INFO para exibir detalhes sobre o usuário do bancos de dados. 

```
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
```

No exemplo, a senha da conta é válida até 10 de junho de 2017.

```
create user dbuser with password 'abcD1234' valid until '2017-06-10';
```

 O exemplo a seguir cria um usuário com uma senha que diferencia maiúsculas de minúsculas e que contém caracteres especiais.

```
create user newman with password '@AbC4321!';
```

 Para usar uma barra invertida (“\$1") na sua senha MD5, ignore a barra invertida com uma barra invertida na sua string de origem. O exemplo a seguir cria um usuário denominado `slashpass` com uma única barra invertida ("`\`") como senha. 

```
select md5('\\'||'slashpass');
         
md5
--------------------------------
0c983d1a624280812631c5389e60d48c
```

Crie um usuário com a senha md5.

```
create user slashpass password 'md50c983d1a624280812631c5389e60d48c';
```

O exemplo a seguir cria um usuário chamado `dbuser` com um tempo limite de sessão ociosa definido para 120 segundos.

```
CREATE USER dbuser password 'abcD1234' SESSION TIMEOUT 120;
```

O exemplo a seguir cria um usuário denominado `bob`. Esse namespace é `myco_aad`. Isso é apenas um exemplo. Para executar o comando com êxito, você deve ter um provedor de identidades registrado. Para obter mais informações, consulte [Federação do provedor de identidades (IdP) nativo para o 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>

Cria uma exibição em um banco de dados. A exibição não é materializada fisicamente. A consulta que define a exibição é executada sempre que ela é mencionada em uma consulta. Para criar uma exibição com uma tabela externa, inclua a cláusula WITH NO SCHEMA BINDING.

Para criar uma visualização padrão, você precisa acessar as tabelas subjacentes ou as visualizações subjacentes. Para consultar uma exibição padrão, você precisa selecionar permissões para a própria exibição, mas não precisa selecionar permissões para as tabelas subjacentes. Quando criar uma exibição que referencia uma tabela ou uma exibição em outro esquema ou se criar uma exibição que referencia uma visão materializada, você precisará de permissões de uso. Para consultar uma exibição de vinculação tardia, você precisa selecionar permissões para ela. Você também precisa verificar se o proprietário da visualização de vinculação tardia selecionou as permissões para os objetos referenciados (tabelas, visualizações ou funções definidas pelo usuário). Para obter mais informações sobre exibições de vinculação tardia, consulte [Observações de uso](#r_CREATE_VIEW_usage_notes).

## Permissões obrigatórias
<a name="r_CREATE_VIEW-privileges"></a>

Para usar CREATE VIEW, uma das permissões a seguir é necessária.
+ Para criar uma visualização usando CREATE [ OR REPLACE ] VIEW:
  + Superusuário
  + Usuários com a permissão CREATE [ REPLACE ] VIEW
+ Para substituir uma visualização existente usando CREATE OR REPLACE VIEW:
  + Superusuário
  + Usuários com a permissão CREATE [ OR REPLACE ] VIEW
  + Proprietário da exibição

Se um usuário quiser acessar uma visualização que incorpora uma função definida pelo usuário, o usuário deverá ter a permissão EXECUTE nessa função.

## Sintaxe
<a name="r_CREATE_VIEW-synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]
```

## Parâmetros
<a name="r_CREATE_VIEW-parameters"></a>

OR REPLACE   
Se uma exibição com o mesmo nome já existir, a exibição será substituída. Você somente pode substituir uma exibição com uma consulta nova que gere o conjunto idêntico de colunas, usando os mesmos nomes de coluna e tipos de dados. CREATE OR REPLACE VIEW bloqueia a exibição para leituras e gravações até que a operação seja concluída.  
Quando uma exibição é substituída, suas outras propriedades, como propriedade e privilégios concedidos, são preservadas. 

 *name*   
Nome da exibição. Se um nome de esquema (como `myschema.myview`) for fornecido, a exibição será criada usando o esquema especificado. Caso contrário, a exibição será criada no esquema atual. O nome da exibição deve ser diferente do nome de qualquer outra exibição ou tabela no mesmo esquema.   
Se você especificar um nome para a exibição que comece com “\$1”, a exibição é criada como temporária e será visível somente na sessão atual.  
Para obter mais informações sobre nomes válidos, consulte [Nomes e identificadores](r_names.md). Você não pode criar tabelas ou exibições nos bancos de dados do sistema template0, template1, padb\$1harvest ou sys:internal.

 *column\$1name*   
Lista opcional de nomes a serem usados para as colunas na exibição. Se nenhum nome de coluna for fornecido, os nomes de colunas serão derivados da consulta. O número máximo de colunas que você pode definir em uma única exibição é 1.600.

 *query*   
Consulta (na forma de instrução SELECT) que avalia uma tabela. Esta tabela define as colunas e linhas na exibição. 

 WITH NO SCHEMA BINDING   
Cláusula que especifica que a exibição não está vinculada a objetos de banco de dados subjacentes, como tabelas e funções definidas pelo usuário. Como resultado, não há nenhuma dependência entre a exibição e os objetos aos quais ela faz referência. Você pode criar uma exibição mesmo se não houver objetos referenciados. Como não há dependência, você pode descartar ou alterar um objeto referenciado sem afetar a visualização. O Amazon Redshift não verifica as dependências até que a exibição seja consultada. Expressões de tabela comuns recursivas (rCTE) não são compatíveis com visualizações de vinculação tardia. Para consultar detalhes sobre exibições de vinculação tardia, execute a função [PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS](PG_GET_LATE_BINDING_VIEW_COLS.md).  
Quando você incluir a cláusula WITH NO SCHEMA BINDING, as tabelas e as exibições referenciadas na instrução SELECT deverão ser qualificadas com um nome de esquema. Deve haver um esquema quando a exibição for criada, mesmo se a tabela referenciada não existir. Por exemplo, a seguinte instrução retorna um erro.   

```
create view myevent as select eventname from event
with no schema binding;
```
A instrução a seguir é executada com êxito.  

```
create view myevent as select eventname from public.event
with no schema binding;
```

**nota**  
Não é possível atualizar, inserir ou excluir em uma visualização. 

## Observações de uso
<a name="r_CREATE_VIEW_usage_notes"></a>



### Visualizações de vinculação tardia
<a name="r_CREATE_VIEW_late-binding-views"></a>

Uma exibição de vinculação tardia só verifica os objetos de banco de dados subjacentes, como tabelas e outras exibições, depois que a exibição for consultada. Consequentemente, você pode alterar ou remover os objetos subjacentes sem remover e recriar a exibição. Se você eliminar objetos subjacentes, as consultas para a exibição de vinculação tardia apresentarão falha. Se a consulta à exibição de vinculação tardia fizer referência às colunas no objeto subjacente que não estão presentes, ela apresentará falha. 

 Se você descartar e recriar a tabela ou exibição subjacente de uma exibição de vinculação tardia, o novo objeto será criado com permissões de acesso padrão. Você precisará conceder permissões aos objetos subjacentes para usuários que farão consultas na visualização. 

Para criar uma exibição de vinculação tardia, inclua a cláusula WITH NO SCHEMA BINDING. O exemplo a seguir cria uma exibição sem vinculação de 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
```

O exemplo a seguir mostra que você pode alterar uma tabela subjacente sem recriar a exibição. 

```
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
```

Você pode fazer referência às tabelas externas do Amazon Redshift Spectrum somente em uma visualização de vinculação tardia. Uma aplicação de visualizações de vinculação tardia consulta as tabelas do Amazon Redshift e do Redshift Spectrum. Por exemplo, você pode usar o comando [UNLOAD](r_UNLOAD.md) para arquivar os dados mais antigos no Amazon S3. Em seguida, crie uma tabela externa do Redshift Spectrum que faça referência aos dados no Amazon S3 e crie uma exibição que consulte as duas tabelas. O exemplo a seguir usa uma cláusula UNION ALL para unir a tabela `SALES` do Amazon Redshift e a tabela `SPECTRUM.SALES` do Redshift Spectrum.

```
create view sales_vw as
select * from public.sales
union all
select * from spectrum.sales
with no schema binding;
```

Para obter mais informações sobre como criar tabelas externas do Redshift Spectrum, incluindo a tabela `SPECTRUM.SALES`, consulte [Conceitos básicos do Amazon Redshift Spectrum](c-getting-started-using-spectrum.md).

**Importante**  
Ao criar uma visualização padrão com base em uma visualização de vinculação tardia, a definição da visualização padrão inclui a definição da visualização de vinculação tardia no momento em que a visualização padrão foi criada, incluindo o proprietário da visualização de vinculação tardia. Se você fizer uma alteração na visualização de vinculação tardia subjacente, ela não será usada na visualização padrão enquanto você não recriar a visualização padrão. Portanto, quando a visualização padrão for consultada, ela sempre usará a definição e o proprietário da visualização de vinculação tardia para verificação de permissão no momento da criação dessa visualização padrão.

Para atualizar a exibição padrão a fim de referenciar a definição mais recente da exibição de vinculação tardia, execute CREATE OR REPLACE VIEW com a definição de exibição inicial usada por você para criar a exibição padrão.

Consulte o exemplo a seguir da criação de uma exibição padrão a partir de uma exibição de vinculação tardia.

```
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)
```

A exibição de vinculação tardia, conforme mostrada na instrução DDL da exibição padrão, é definida quando a exibição padrão é criada e não será atualizada com nenhuma alteração feita posteriormente por você na exibição de vinculação tardia.

## Exemplos
<a name="r_CREATE_VIEW-examples"></a>

Os comandos de exemplo usam um conjunto de objetos e dados de amostra chamado banco de dados *TICKIT*. Para obter mais informações, consulte [Banco de dados de amostra](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html).

O comando a seguir cria uma exibição denominada *myevent* a partir de uma tabela denominada EVENT. 

```
create view myevent as select eventname from event
where eventname = 'LeAnn Rimes';
```

O comando a seguir cria uma exibição denominada* myuser* a partir de uma tabela denominada USERS. 

```
create view myuser as select lastname from users;
```

O comando a seguir cria ou substitui uma exibição denominada* myuser* a partir de uma tabela denominada USERS. 

```
create or replace view myuser as select lastname from users;
```

O exemplo a seguir cria uma exibição sem vinculação de esquema. 

```
create view myevent as select eventname from public.event
with no schema binding;
```

# DEALLOCATE
<a name="r_DEALLOCATE"></a>

Libera uma instrução preparada. 

## Sintaxe
<a name="r_DEALLOCATE-synopsis"></a>

```
DEALLOCATE [PREPARE] plan_name
```

## Parâmetros
<a name="r_DEALLOCATE-parameters"></a>

PREPARE   
Esta palavra-chave é opcional e ignorada. 

 *plan\$1name*   
Nome da instrução preparada para a liberação. 

## Observações sobre o uso
<a name="r_DEALLOCATE_usage_notes"></a>

DEALLOCATE é usada para liberar uma instrução SQL preparada anteriormente. Se você não liberar explicitamente uma instrução preparada, ela será liberada quando a sessão atual for finalizada. Para obter mais informações sobre instruções preparadas, consulte [PREPARE](r_PREPARE.md).

## Consulte também
<a name="r_DEALLOCATE-see-also"></a>

 [EXECUTE](r_EXECUTE.md), [PREPARE](r_PREPARE.md) 

# DECLARE
<a name="declare"></a>

Define um novo cursor. Use um cursor para recuperar algumas linhas de cada vez do conjunto de resultados de uma consulta maior. 

Quando a primeira linha do cursor é buscada, o conjunto inteiro de resultados é materializado no nó líder, na memória ou em disco, se necessário. Devido ao impacto da performance negativa potencial de usar cursores com grandes conjuntos de resultado, recomendamos abordagens alternativas sempre que possível. Para obter mais informações, consulte [Considerações sobre a performance ao usar cursores](#declare-performance).

Você deve declarar um cursor em um bloco de transação. Apenas um cursor pode ser aberto por sessão. 

Para obter mais informações, consulte [FETCH](fetch.md)[CLOSE](close.md).

## Sintaxe
<a name="declare-synopsis"></a>

```
DECLARE cursor_name CURSOR FOR query
```

## Parâmetros
<a name="declare-parameters"></a>

*nome\$1cursor*   
Nome do novo cursor. 

 *query*   
Uma instrução SELECT que preenche o cursor.

## Observações de uso de DECLARE CURSOR
<a name="declare-usage"></a>

Se seu aplicativo cliente usa uma conexão ODBC e sua consulta cria um conjunto de resultados que é muito grande para caber na memória, você pode transmitir o conjunto de resultados para seu aplicativo cliente usando um cursor. Quando você usa um cursor, o conjunto inteiro de resultados é materializado no nó líder, e a partir de então seu cliente pode buscar os resultados adicionais. 

**nota**  
Para permitir cursores em ODBC para Microsoft Windows, habilite a opção **Use Declare/Fetch** no DSN ODBC que você usa para o Amazon Redshift. Recomendamos configurar o tamanho do cache de ODBC usando o campo **Cache Size** nas opções da caixa de diálogo do DSN de ODBC, para 4.000 ou superior em clusters de nós múltiplos para minimizar round trips. Em um cluster de nó único, defina o tamanho do cache para 1.000.

Devido ao impacto da performance negativa potencial do uso de cursores, recomendamos abordagens alternativas sempre que possível. Para obter mais informações, consulte [Considerações sobre a performance ao usar cursores](#declare-performance).

Os cursores do Amazon Redshift são compatíveis com as seguintes restrições:
+ Apenas um cursor pode ser aberto por sessão. 
+ Os cursores devem ser usados em uma transação (BEGIN … END). 
+ O tamanho máximo do conjunto de resultados cumulativo para todos os cursores é restringido com base no tipo de nó do cluster. Se você precisar de conjuntos de resultados maiores, é possível redimensionar o tamanho para uma configuração de nó XL ou 8XL.

  Para obter mais informações, consulte [Restrições de cursor](#declare-constraints). 

## Restrições de cursor
<a name="declare-constraints"></a>

Quando a primeira linha de um cursor é buscada, o conjunto inteiro de resultados é materializado no nó líder. Se o resultado não couber na memória, ele será gravado em disco conforme necessário. Para proteger a integridade do nó líder, o Amazon Redshift aplica restrições de tamanho a todos os conjuntos de resultados de cursor com base no tipo de nó do cluster.

A tabela a seguir mostra o tamanho total máximo do conjunto de resultados para cada tipo de nó do cluster. O tamanho máximo do conjunto de resultados é fornecido em megabytes.


| Tipo de nó | Conjunto máximo de resultados por cluster (MB) | 
| --- | --- | 
|   DC2 LargeVários nós   | 192.000 | 
|   DC2 LargeNó simples   | 8.000 | 
|   Vários nós 8XL DC2   | 3.200.000 | 
|   Vários nós RA3 16XL   | 14.400.000 | 
|   Vários nós RA3 4XL   | 3.200.000 | 
|   Vários nós do RA3 XLPLUS   | 1.000.000 | 
|   Nó único RA3 XLPLUS   | 64.000 | 
|   Vários nós RA3 LARGE   | 240.000 | 
|   Nó único RA3 LARGE   | 8.000 | 
| Amazon Redshift Sem Servidor | 150.000 | 

Para visualizar a configuração de cursor ativa para um cluster, consulte a tabela de sistema [STV\$1CURSOR\$1CONFIGURATION](r_STV_CURSOR_CONFIGURATION.md) como superusuário. Para exibir o estado de cursores ativos, consulte a tabela de sistema [STV\$1ACTIVE\$1CURSORS](r_STV_ACTIVE_CURSORS.md). Somente as linhas dos cursores do próprio usuário são visíveis para ele, mas um superusuário pode visualizar todos os cursores.

## Considerações sobre a performance ao usar cursores
<a name="declare-performance"></a>

Como os cursores materializam o conjunto de resultados inteiro no nó líder antes de começar a retornar resultados para o cliente, usar cursores com conjuntos muito grandes de resultados pode ter um impacto negativo na performance. É altamente recomendável não usar cursores com conjuntos muito grandes de resultados. Em alguns casos, como quando seu aplicativo usa uma conexão ODBC, os cursores podem ser a única solução viável. Se possível, recomendamos o uso destas alternativas:
+ Use [UNLOAD](r_UNLOAD.md) para exportar uma tabela grande. Quando você usa UNLOAD, os nós de computação funcionam em paralelo para transferir os dados diretamente para arquivos de dados no Amazon Simple Storage Service. Para obter mais informações, consulte [Descarregar dados no Amazon Redshift](c_unloading_data.md). 
+ Defina o parâmetro de tamanho de busca JDBC no seu aplicativo cliente. Se você utiliza uma conexão JDBC e estiver encontrando erros de falta de memória por parte do cliente, é possível habilitar seu cliente para recuperar conjuntos de resultados em lotes menores configurando o parâmetro de tamanho de busca JDBC. Para obter mais informações, consulte [Como configurar o parâmetro JDBC para o tamanho da busca](set-the-JDBC-fetch-size-parameter.md). 

## Exemplo de DECLARE CURSOR
<a name="declare-example"></a>

O exemplo a seguir declara um cursor denominado LOLLAPALOOZA para selecionar informações de vendas para o evento Lollapalooza e busca linhas do conjunto de resultados usando o 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;
```

O exemplo a seguir percorre um refcursor com todos os resultados de uma tabela:

```
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>

Exclui linhas de tabelas.

**nota**  
O tamanho máximo de uma única instrução SQL é 16 MB.

## Sintaxe
<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 ]
```

## Parâmetros
<a name="r_DELETE-parameters"></a>

Cláusula WITH  
Cláusula opcional que especifica uma ou mais *expressões de tabela-comum*. Consulte [Cláusula WITH](r_WITH_clause.md). 

FROM  
A palavra-chave FROM é opcional, exceto quando a cláusula USING for especificada. As instruções `delete from event;` e `delete event;` são operações equivalentes que eliminam todas as linhas da tabela EVENT.  
Para excluir todas as linhas de uma tabela, use [TRUNCATE](r_TRUNCATE.md) na tabela. TRUNCATE é muito mais eficiente do que DELETE e não requer VACUUM nem ANALYZE. No entanto, esteja ciente de que TRUNCATE confirma a transação em que é executado.

 *table\$1name*   
Uma tabela temporária ou persistente. Somente o proprietário da tabela ou um usuário com o privilégio DELETE na tabela pode excluir linhas da tabela.  
Considere usar o comando TRUNCATE para operações de exclusão não qualificadas rápidas em grandes tabelas. Consulte [TRUNCATE](r_TRUNCATE.md).  
Depois de excluir um grande número de linhas de uma tabela:  
+ Limpe a tabela para recuperar espaço e reclassificar as linhas.
+ Analise a tabela para atualizar as estatísticas do planejador de consulta.

 *materialized\$1view\$1name*   
Uma visão materializada. O comando DELETE funciona em uma visão materializada usada para [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md). Somente o proprietário da visão materializada ou um usuário com privilégio DELETE na visão materializada pode excluir linhas dela.  
Você não pode executar DELETE em uma visão materializada para ingestão de streaming com uma política de segurança por linha (RLS) que não tenha a permissão IGNORE RLS concedida ao usuário. Há uma exceção: se o usuário que está executando DELETE tiver IGNORE RLS concedido, ele será executado com êxito. Para obter mais informações, consulte [Propriedade e gerenciamento da política de RLS](https://docs.aws.amazon.com/redshift/latest/dg/t_rls_ownership.html).

USING *nome\$1tabela*, ...  
A palavra-chave USING é usada para inserir uma lista da tabela quando tabelas adicionais são mencionadas na condição de cláusula WHERE. Por exemplo, o comando a seguir exclui todas as linhas da tabela EVENT que atendem a condição de junção nas tabelas EVENT e SALES. A tabela SALES deve ser explicitamente denominada na lista FROM:  

```
delete from event using sales where event.eventid=sales.eventid;
```
Se você repetir o nome da tabela de destino na cláusula USING, a operação DELETE executa uma junção automática. Você pode usar um subconsulta na cláusula WHERE em vez da sintaxe USING como alternativa para gravar a mesma consulta.

WHERE *condição*   
Cláusula opcional que limita a exclusão de linhas àquelas que correspondem à condição. Por exemplo, a condição pode ser uma restrição em uma coluna, uma condição de junção ou uma condição baseada no resultado de uma consulta. A consulta pode fazer referência a tabelas diferentes do destino do comando DELETE. Por exemplo:  

```
delete from t1
where col1 in(select col2 from t2);
```
Se nenhuma condição for especificada, todas as linhas na tabela serão excluídas.

## Observações de uso
<a name="r_DELETE-usage"></a>
+ As operações DELETE mantêm bloqueios exclusivos quando executadas em visões materializadas de streaming do Amazon Redshift conectadas a qualquer um dos seguintes:
  +  Um Amazon Kinesis data stream 
  +  Um tópico Amazon Managed Streaming for Apache Kafka 
  +  Um stream externo compatível, como um tópico do Confluent Cloud Kafka 

  Para obter mais informações, consulte [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md).

## Exemplos
<a name="r_DELETE-examples"></a>

Excluir todas as linhas da tabela CATEGORY:

```
delete from category;
```

Excluir linhas com valores CATID entre 0 e 9 da tabela CATEGORY:

```
delete from category
where catid between 0 and 9;
```

Excluir linhas da tabela LISTING cujos valores SELLERID não existem na tabela SALES:

```
delete from listing
where listing.sellerid not in(select sales.sellerid from sales);
```

As duas consultas a seguir excluem uma linha da tabela CATEGORY, com base em uma junção à tabela EVENTO e a uma restrição adicional na coluna 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);
```

A consulta a seguir exclui todas as linhas da visão materializada `mv_cities`. Neste exemplo, o nome da visão materializada é uma amostra:

```
delete from mv_cities;
```

# DESC DATASHARE
<a name="r_DESC_DATASHARE"></a>

Exibe uma lista dos objetos de banco de dados dentro de um datashare que são adicionados a ele usando ALTER DATASHARE. O Amazon Redshift exibe os nomes, bancos de dados, esquemas e tipos de tabelas, visualizações e funções. 

Informações adicionais sobre objetos da unidade de compartilhamento de dados podem ser encontradas usando visualizações do sistema. Para obter mais informações, consulte [SVV\$1DATASHARE\$1OBJECTS](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_DATASHARE_OBJECTS.html) e [SVV\$1DATASHARES](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_DATASHARES.html).

## Sintaxe
<a name="r_DESC_DATASHARE-synopsis"></a>

```
DESC DATASHARE datashare_name [ OF [ ACCOUNT account_id ] NAMESPACE namespace_guid ]
```

## Parâmetros
<a name="r_DESC_DATASHARE-parameters"></a>

 *datashare\$1name*   
O nome do datashare. 

NAMESPACE *namespace\$1guid*   
Um valor que especifica o namespace que o datashare usa. Quando você executa o DESC DATAHSARE como um administrador de cluster de consumidor, especifique o parâmetro NAMESPACE para exibir os datashares de entrada.

ACCOUNT *account\$1id*  
Valor que especifica a conta a qual o datashare pertence.

## Observações sobre o uso
<a name="r_DESC_DATASHARE-usage"></a>

Como administrador de conta de consumidor, quando você executa o DESC DATASHARE para ver os datashares de entrada da AWS, especifique a opção NAMESPACE. Quando você executa o DESC DATASHARE para ver os datashares de entrada em contas da AWS, especifique as opções ACCOUNT e NAMESPACE.

## Exemplos
<a name="r_DESC_DATASHARE-examples"></a>

O exemplo a seguir exibe as informações para datashares de saída em um cluster de produtores.

```
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
```

O exemplo a seguir exibe as informações para datashares de entrada em um cluster de produtores.

```
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>

Exibe informações sobre um provedor de identidades. Somente um superusuário pode descrever um provedor de identidades.

## Sintaxe
<a name="r_DESC_IDENTITY_PROVIDER-synopsis"></a>

```
DESC IDENTITY PROVIDER identity_provider_name
```

## Parâmetros
<a name="r_DESC_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
O nome do provedor de identidades.

## Exemplo
<a name="r_DESC_IDENTITY_PROVIDER-examples"></a>

O exemplo a seguir exibe informações sobre o provedor de identidades.

```
DESC IDENTITY PROVIDER azure_idp;
```

Exemplo de resultado.

```
  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>

Desanexa uma política de mascaramento dinâmico de dados que já está anexada a uma coluna. Para obter mais informações sobre mascaramento dinâmico de dados, consulte [Mascaramento dinâmico de dados](t_ddm.md).

Superusuários e usuários ou perfis que têm o perfil sys:secadmin podem desanexar uma política de mascaramento.

## Sintaxe
<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 };
```

## Parâmetros
<a name="r_DETACH_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
O nome da política de mascaramento a ser desanexada.

database\$1name  
O nome do banco de dados no qual a política e a relação são criadas. A política e a relação precisam estar no mesmo banco de dados. O banco de dados pode ser o conectado ou um banco de dados que comporte as permissões federadas do Amazon Redshift.

schema\$1name  
O nome do esquema ao qual pertence a relação.

 *table\$1name*   
O nome da tabela da qual deseja desanexar a política de mascaramento.

*output\$1column\$1names*   
Os nomes das colunas às quais a política de mascaramento foi anexada.

*user\$1name*   
O nome do usuário ao qual a política de mascaramento foi anexada.  
Só é possível definir uma opção entre user\$1name, role\$1name e PUBLIC em uma instrução DETACH MASKING POLICY.

*role\$1name*   
O nome do perfil ao qual a política de mascaramento foi anexada.  
Só é possível definir uma opção entre user\$1name, role\$1name e PUBLIC em uma instrução DETACH MASKING POLICY.

*PUBLIC*   
Mostra que a política foi anexada a todos os usuários na tabela.  
Só é possível definir uma opção entre user\$1name, role\$1name e PUBLIC em uma instrução DETACH MASKING POLICY.

Para o uso da DETACH MASKING POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.7/redshift-jdbc42-2.1.0.7.zip Na região da China (Pequim), use o seguinte link: https://s3---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/redshift-downloads-cn/drivers/jdbc/2.1.0.7/redshift-jdbc42-2.1.0.7.zip
<a name="r_DETACH_RLS_POLICY"></a>

Desanexe uma política de segurança no nível da linha em uma tabela de um ou mais usuários ou funções.

Superusuários e usuários ou funções que têm a função `sys:secadmin` podem desanexar uma política.

## Sintaxe
<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 } [, ...];
```

## Parâmetros
<a name="r_DETACH_RLS_POLICY-parameters"></a>

 *policy\$1name*   
O nome da política.

database\$1name  
O nome do banco de dados no qual a política e a relação são criadas. A política e a relação precisam estar no mesmo banco de dados. O banco de dados pode ser o conectado ou um banco de dados que comporte as permissões federadas do Amazon Redshift.

schema\$1name  
O nome do esquema ao qual pertence a relação.

table\$1name  
A relação à qual a política de segurança no nível da linha está anexada.

FROM \$1 *user\$1name* \$1 ROLE *role\$1name* \$1 PUBLIC\$1 [, ...]  
Especifica se a política está desanexada de um ou mais usuários ou funções especificados. 

Para o uso da DETACH RLS POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Observações de uso
<a name="r_DETACH_RLS_POLICY-usage"></a>

Ao trabalhar com a instrução DETACH RLS POLICY, observe o seguinte:
+ É possível desanexar uma política de uma relação, usuário, função ou público.

## Exemplos
<a name="r_DETACH_RLS_POLICY-examples"></a>

O exemplo a seguir desvincula uma tabela de uma função.

```
DETACH RLS POLICY policy_concerts ON tickit_category_redshift FROM ROLE analyst, ROLE dbadmin;
```

# DROP DATABASE
<a name="r_DROP_DATABASE"></a>

Remove um banco de dados. 

Não é possível executar DROP DATABASE em um bloco de transação (BEGIN ... END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

## Sintaxe
<a name="r_DROP_DATABASE-synopsis"></a>

```
DROP DATABASE database_name [ FORCE ]
```

## Parâmetros
<a name="r_DROP_DATABASE-parameters"></a>

 *database\$1name*   
Nome do banco de dados a ser removido. Você não pode descartar os bancos de dados dev, padb\$1harvest, template0, template1, ou sys:internal, além de não pode descartar o banco de dados atual.  
Para descartar um banco de dados externo, descarte o esquema externo. Para obter mais informações, consulte [DROP SCHEMA](r_DROP_SCHEMA.md).

 FORCE   
Quando você especifica FORCE, DROP DATABASE tenta encerrar as conexões ativas antes de eliminar o banco de dados. Se todas as conexões ativas forem encerradas com êxito dentro de um tempo limite, a eliminação prosseguirá. Se nem todas as conexões forem encerradas, o comando lançará um erro.

## Observações sobre o uso de DROP DATABASE
<a name="r_DROP_DATABASE_usage"></a>

Ao usar a instrução DROP DATABASE, considere o seguinte:
+ Em geral, recomendamos não descartar um banco de dados que contenha uma unidade de compartilhamento de dados AWS Data Exchange usando a instrução DROP DATASHARE. Caso altere, as Contas da AWS com acesso à unidade de compartilhamento de dados perdem o acesso. Executar esse tipo de alteração pode violar os termos do produto de dados no AWS Data Exchange.

  O exemplo a seguir mostra um erro quando um banco de dados que contém uma unidade de compartilhamento de dados do AWS Data Exchange é descartada.

  ```
  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 o descarte do banco de dados, defina a seguinte variável e execute a instrução DROP DATABASE novamente.

  ```
  SET datashare_break_glass_session_var to 'ce8d280c10ad41';
  ```

  ```
  DROP DATABASE test_db;
  ```

  Nesse caso, o Amazon Redshift gera um valor único aleatório para definir a variável de sessão para permitir DROP DATABASE para um banco de dados que contenha uma unidade de compartilhamento de dados do AWS Data Exchange.

## Exemplos
<a name="r_DROP_DATABASE-examples"></a>

O exemplo a seguir permite remover um banco de dados com o nome TICKIT\$1TEST: 

```
drop database tickit_test;
```

# DROP DATASHARE
<a name="r_DROP_DATASHARE"></a>

Descarta um datashare. Esse comando é irreversível.

Somente um superusuário ou o proprietário do datashare pode descartar um datashare.

## Privilégios obrigatórios
<a name="r_DROP_DATASHARE-privileges"></a>

A seguir estão os privilégios obrigatórios para DROP DATASHARE:
+ Superusuário
+ Usuários com o privilégio DROP DATASHARE
+ Proprietário da unidade de compartilhamento de dados

## Sintaxe
<a name="r_DROP_DATASHARE-synopsis"></a>

```
DROP DATASHARE datashare_name;
```

## Parâmetros
<a name="r_DROP_DATASHARE-parameters"></a>

 *datashare\$1name*   
Nome do banco de dados a ser descartado.

## Observações sobre o uso de DROP DATASHARE
<a name="r_DROP_DATASHARE_usage"></a>

Ao usar a instrução DROP DATASHARE, considere o seguinte:
+ Em geral, recomendamos não descartar uma unidade de compartilhamento de dados AWS Data Exchange usando a instrução DROP DATASHARE. Caso altere, as Contas da AWS com acesso à unidade de compartilhamento de dados perdem o acesso. Executar esse tipo de alteração pode violar os termos do produto de dados no AWS Data Exchange.

  O exemplo a seguir mostra um erro quando uma unidade de compartilhamento de dados do AWS Data Exchange é descartada.

  ```
  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 o descarte de uma unidade de compartilhamento de dados do AWS Data Exchange, defina a seguinte variável e execute a instrução DROP DATASHARE novamente.

  ```
  SET datashare_break_glass_session_var to '620c871f890c49';
  ```

  ```
  DROP DATASHARE salesshare;
  ```

  Nesse caso, o Amazon Redshift gera um valor único aleatório para definir a variável de sessão para permitir DROP DATASHARE para uma unidade de compartilhamento de dados do AWS Data Exchange.

## Exemplos
<a name="r_DROP_DATASHARE-examples"></a>

O exemplo a seguir descarta uma unidade de compartilhamento de dados chamada `salesshare`.

```
DROP DATASHARE salesshare;
```

# DROP EXTERNAL VIEW
<a name="r_DROP_EXTERNAL_VIEW"></a>

Elimina uma exibição externa do banco de dados. A eliminação de uma exibição externa a remove de todos os mecanismos SQL aos quais a exibição está associada, como Amazon Athena e Amazon EMR Spark. O comando não pode ser revertido. Para obter mais informações sobre visualizações do Catálogo de Dados, consulte [Visualizações do AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

## Sintaxe
<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}
```

## Parâmetros
<a name="r_DROP_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
O esquema anexado ao banco de dados do AWS Glue, seguido do nome da exibição.

IF EXISTS  
Só eliminará a exibição se ela existir.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
A notação do esquema a ser usado durante a eliminação da exibição. Você pode especificar o uso do AWS Glue Data Catalog, um banco de dados do Glue criado por você, ou um esquema externo também criado por você. Consulte [CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) e [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) para obter mais informações.

 *query\$1definition*   
A definição da consulta SQL executada pelo Amazon Redshift para alterar a exibição.

## Exemplos
<a name="r_DROP_EXTERNAL_VIEW-examples"></a>

O exemplo a seguir elimina uma exibição do Data Catalog chamada 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>

Remove uma função definida pelo usuário (UDF) do banco de dados. A assinatura da função, ou a lista de tipos de dados de argumento, deve ser especificada pelas funções múltiplas que podem existir com o mesmo nome mas assinaturas diferentes. Você não pode descartar uma função integrada do Amazon Redshift.

Esse comando é irreversível.

## Privilégios obrigatórios
<a name="r_DROP_FUNCTION-privileges"></a>

A seguir estão os privilégios obrigatórios para DROP FUNCTION:
+ Superusuário
+ Usuários com o privilégio DROP FUNCTION
+ Proprietário da função

## Sintaxe
<a name="r_DROP_FUNCTION-synopsis"></a>

```
DROP FUNCTION name
( [arg_name] arg_type   [, ...] )
[ CASCADE | RESTRICT ]
```

## Parâmetros
<a name="r_DROP_FUNCTION-parameters"></a>

 *name*   
Nome da função a ser removida.

 *nome\$1arg*   
O nome de um argumento de entrada. DROP FUNCTION ignora nomes de argumento, pois somente os tipos de dados de argumento são necessários para determinar a identidade da função.

 *tipo\$1arg*   
Tipo de dados do argumento de entrada. Você pode fornecer uma lista separada por vírgulas com um máximo de 32 tipos de dados.

 CASCADE   
Palavra-chave que especifica a remoção automática de objetos que dependem da função, como exibições.   
Para criar uma exibição que não dependa de uma função, inclua a cláusula WITH NO SCHEMA BINDING na definição de exibição. Para obter mais informações, consulte [CREATE VIEW](r_CREATE_VIEW.md).

 RESTRICT   
Palavra-chave que especifica que se houver objetos dependentes da função, a função não deve ser descartada e deve retornar uma mensagem. Esta ação é o padrão.

## Exemplos
<a name="r_DROP_FUNCTION-examples"></a>

O exemplo a seguir remove a função denominada `f_sqrt`:

```
drop function f_sqrt(int);
```

Para remover uma função com dependências, use a opção CASCADE, conforme exibido no exemplo a seguir:

```
drop function f_sqrt(int)cascade;
```

# DROP GROUP
<a name="r_DROP_GROUP"></a>

Exclui um grupo de usuários. Esse comando é irreversível. Esse comando não exclui os usuários individuais em um grupo.

Consulte DROP USER para excluir um usuário individual.

## Sintaxe
<a name="r_DROP_GROUP-synopsis"></a>

```
DROP GROUP name
```

## Parâmetro
<a name="r_DROP_GROUP-parameter"></a>

 *name*   
Nome do grupo de usuários a ser excluído.

## Exemplo
<a name="r_DROP_GROUP-example"></a>

O seguinte exemplo exclui o grupo de usuários `guests`:

```
DROP GROUP guests;
```

Você não pode descartar um grupo se o grupo tiver privilégios sobre um objeto. Se você tentar remover esse grupo, receberá o erro a seguir.

```
ERROR: group "guests" can't be dropped because the group has a privilege on some object
```

Se o grupo tiver privilégios para um objeto, revogue-os antes de remover o grupo. Para encontrar os objetos para os quais o grupo `guests` tem privilégios, use o exemplo a seguir. Para ter mais informações sobre a visualização de metadados utilizada no exemplo, 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         |
+----------------+---------------+---------------+---------------+
```

O exemplo a seguir revoga todos os privilégios em todas as tabelas no esquema `public` do grupo de usuários `guests` e, em seguida, remove o 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>

Exclui um provedor de identidades. Esse comando é irreversível. Somente um superusuário pode remover um provedor de identidades.

## Sintaxe
<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*   
O nome do provedor de identidades a excluir.

 CASCADE   
Exclui usuários e funções anexados ao provedor de identidades quando ele é excluído.

## Exemplo
<a name="r_DROP_IDENTITY_PROVIDER-example"></a>

O exemplo a seguir exclui o provedor de identidades *oauth\$1provider*.

```
DROP IDENTITY PROVIDER oauth_provider;
```

Se você remover o provedor de identidades, alguns usuários talvez não consigam fazer login ou usar ferramentas de cliente configuradas para utilizá-lo.

# DROP LIBRARY
<a name="r_DROP_LIBRARY"></a>

Remove uma biblioteca personalizada Python do banco de dados. Somente o proprietário da biblioteca ou um superusuário pode remover uma biblioteca. 

DROP LIBRARY não pode ser executado em um bloco de transação (BEGIN … END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

Esse comando é irreversível. O comando DROP LIBRARY é confirmado imediatamente. Se uma UDF que depende da biblioteca estiver em execução simultaneamente, a UDF pode falhar, mesmo se a UDF estiver sendo executada em uma transação.

Para obter mais informações, consulte [CREATE LIBRARY](r_CREATE_LIBRARY.md). 

## Privilégios obrigatórios
<a name="r_DROP_LIBRARY-privileges"></a>

A seguir estão os privilégios obrigatórios para DROP LIBRARY:
+ Superusuário
+ Usuários com o privilégio DROP LIBRARY
+ Proprietário da biblioteca

## Sintaxe
<a name="r_DROP_LIBRARY-synopsis"></a>

```
DROP LIBRARY library_name
```

## Parâmetros
<a name="r_DROP_LIBRARY-parameters"></a>

 *nome\$1biblioteca*   
O nome da biblioteca.

# DROP MASKING POLICY
<a name="r_DROP_MASKING_POLICY"></a>

Descarta uma política de mascaramento dinâmico de dados de todos os bancos de dados. Não é possível descartar uma política de mascaramento que ainda esteja anexada a uma ou mais tabelas. Para obter mais informações sobre mascaramento dinâmico de dados, consulte [Mascaramento dinâmico de dados](t_ddm.md).

Superusuários e usuários ou perfis que têm o perfil sys:secadmin podem descartar uma política de mascaramento.

## Sintaxe
<a name="r_DROP_MASKING_POLICY-synopsis"></a>

```
DROP MASKING POLICY { policy_name | database_name.policy_name };
```

## Parâmetros
<a name="r_DROP_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
O nome da política de mascaramento que deseja descartar.

database\$1name  
O nome do banco de dados do qual a política será descartada. O banco de dados pode ser o conectado ou um banco de dados que comporte as permissões federadas do Amazon Redshift.

Para o uso da DROP MASKING POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# DROP MODEL
<a name="r_DROP_MODEL"></a>

Remove um modelo do banco de dados. Somente o proprietário do modelo ou um superusuário pode descartar um modelo. 

O DROP MODEL também exclui toda a função de previsão associada derivada desse modelo, todos os artefatos do Amazon Redshift relacionados ao modelo e todos os dados do Amazon S3 relacionados ao modelo. Enquanto o modelo ainda estiver sendo treinado no Amazon SageMaker AI, DROP MODEL cancelará essas operações.

Esse comando é irreversível. O comando DROP MODEL é confirmado imediatamente.

## Permissões obrigatórias
<a name="r_DROP_MODEL-privileges"></a>

A seguir estão as permissões obrigatórias para DROP MODEL:
+ Superusuário
+ Usuários com a permissão DROP MODEL
+ Proprietário do modelo
+ Proprietário do esquema

## Sintaxe
<a name="r_DROP_MODEL-synopsis"></a>

```
DROP MODEL [ IF EXISTS ] model_name
```

## Parâmetros
<a name="r_DROP_MODEL-parameters"></a>

 *SE EXISTIR*   
Cláusula que indica que, se o esquema especificado existe, o comando não deve fazer alterações e retorna uma mensagem informando que o esquema existe.

 *model\$1name*   
O nome do modelo. O nome do modelo em um esquema deve ser exclusivo.

## Exemplos
<a name="r_DROP_MODEL-examples"></a>

O exemplo a seguir descarta o modelo demo\$1ml.customer\$1churn.

```
DROP MODEL demo_ml.customer_churn
```

# DROP MATERIALIZED VIEW
<a name="materialized-view-drop-sql-command"></a>

Remove uma visualização materializada.

Para obter mais informações sobre visões materializadas, consulte [Visões materializadas no Amazon Redshift](materialized-view-overview.md).

## Sintaxe
<a name="mv_DROP_MATERIALIZED_VIEW-synopsis"></a>

```
DROP MATERIALIZED VIEW [ IF EXISTS ] mv_name [, ... ] [ CASCADE | RESTRICT ]
```

## Parâmetros
<a name="mv_DROP_MATERIALIZED_VIEW-parameters"></a>

IF EXISTS  
Uma cláusula que especifica para verificar se a visão materializada nomeada existe. Se a visão materializada não existir, o comando `DROP MATERIALIZED VIEW` retornará uma mensagem de erro. Essa cláusula é útil ao criar scripts, para evitar que o script falhe se você descartar uma visão materializada não existente.

*mv\$1name*  
O nome da visão materializada a ser descartada.

CASCADE  
Cláusula que indica que se deve remover automaticamente os objetos dos quais a visão materializada depende, como outras visualizações.

RESTRICT  
Cláusula que indica que não se deve remover a visão materializada se qualquer objeto depender dela. Esse é o padrão.

## Observações sobre o uso
<a name="mv_DROP_MATERIALIZED_VIEW-usage"></a>

Somente o proprietário de uma visão materializada pode usar `DROP MATERIALIZED VIEW` naquela exibição. Um superusuário ou um usuário que recebeu especificamente privilégios DROP podem ser exceções a isso.

Quando você escreve uma instrução de descarte para uma visão materializada e existe uma visualização com um nome correspondente, isso resulta em um erro que instrui você a usar DROP VIEW. Um erro ocorre mesmo no caso em que você usa `DROP MATERIALIZED VIEW IF EXISTS`.

## Exemplo
<a name="mv_DROP_MATERIALIZED_VIEW-examples"></a>

O exemplo a seguir descarta a visão materializada `tickets_mv`.

```
DROP MATERIALIZED VIEW tickets_mv;
```

# DROP PROCEDURE
<a name="r_DROP_PROCEDURE"></a>

Descarta um procedimento. Para descartar um procedimento, são necessários o nome do procedimento e os tipos de dados do argumento de entrada (assinatura). Opcionalmente, você pode incluir todos os tipos de dados de argumentos, incluindo argumentos OUT. Para encontrar a assinatura de um procedimento, use o comando [SHOW PROCEDURE](r_SHOW_PROCEDURE.md). Para obter mais informações sobre assinaturas de procedimento, consulte [PG\$1PROC\$1INFO](r_PG_PROC_INFO.md).

## Privilégios obrigatórios
<a name="r_DROP_PROCEDURE-privileges"></a>

A seguir estão os privilégios obrigatórios para DROP PROCEDURE:
+ Superusuário
+ Usuários com o privilégio DROP PROCEDURE
+ Proprietário do procedimento

## Sintaxe
<a name="r_DROP_PROCEDURE-synopsis"></a>

```
DROP PROCEDURE sp_name ( [ [ argname ] [ argmode ] argtype [, ...] ] )
```

## Parâmetros
<a name="r_DROP_PROCEDURE-parameters"></a>

 *sp\$1name*   
O nome do procedimento a ser removido. 

 *argname*   
O nome de um argumento de entrada. DROP PROCEDURE ignora nomes de argumento, pois somente os tipos de dados de argumento são necessários para determinar a identidade do procedimento. 

 *argmode*   
O modo de um argumento, que pode ser IN, OUT ou INOUT. Argumentos OUT são opcionais pois eles não são usados para identificar um procedimento armazenado. 

 *argtype*   
Tipo de dados do argumento de entrada. Para obter uma lista dos tipos de dados compatíveis, consulte [Tipos de dados](c_Supported_data_types.md). 

## Exemplos
<a name="r_DROP_PROCEDURE-examples"></a>

O exemplo a seguir descarta um procedimento armazenado chamado `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>

Descarta uma política de segurança no nível da linha para todas as tabelas em todos os bancos de dados.

Superusuários e usuários ou funções que têm a função sys:secadmin podem descartar uma política.

## Sintaxe
<a name="r_DROP_RLS_POLICY-synopsis"></a>

```
DROP RLS POLICY [ IF EXISTS ] 
{ policy_name | database_name.policy_name }
[ CASCADE | RESTRICT ]
```

## Parâmetros
<a name="r_DROP_RLS_POLICY-parameters"></a>

 *SE EXISTIR*   
Uma cláusula que indica se a política especificada já existe.

 *policy\$1name*   
O nome da política.

database\$1name  
O nome do banco de dados do qual a política será descartada. O banco de dados pode ser o conectado ou um banco de dados que comporte as permissões federadas do Amazon Redshift.

 *CASCADE*   
Uma cláusula que indica para desanexar automaticamente a política de todas as tabelas anexadas antes de descartar a política.

 *RESTRICT*   
Uma cláusula que indica que a política não se deve ser descartada quando ela é anexada a algumas tabelas. Esse é o padrão.

Para o uso da DROP RLS POLICY no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso com permissões federadas do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Exemplos
<a name="r_DROP_RLS_POLICY-examples"></a>

O exemplo a seguir descarta a política de segurança no nível da linha.

```
DROP RLS POLICY policy_concerts;
```

# DROP ROLE
<a name="r_DROP_ROLE"></a>

Remove uma função de um banco de dados. Somente o proprietário da função que criou a função, um usuário com a opção WITH ADMIN ou um superusuário pode descartar uma função.

Você não pode descartar uma função concedida a um usuário ou outra função que dependa dessa função.

## Privilégios obrigatórios
<a name="r_DROP_ROLE-privileges"></a>

A seguir estão os privilégios obrigatórios para DROP ROLE:
+ Superusuário
+ Proprietário da função que é o usuário que criou a função ou um usuário que recebeu a função com o privilégio WITH ADMIN OPTION.

## Sintaxe
<a name="r_DROP_ROLE-synopsis"></a>

```
DROP ROLE role_name [ FORCE | RESTRICT ] 
```

## Parâmetros
<a name="r_DROP_ROLE-parameters"></a>

*role\$1name*  
O nome da função.

[ FORCE \$1 RESTRICT ]  
A configuração padrão é RESTRICT. O Amazon Redshift emite um erro quando você tenta eliminar uma função que tenha herdado outra função. Use FORCE para remover todas as atribuições de função, se houver alguma. 

## Exemplos
<a name="r_DROP_ROLE-examples"></a>

O exemplo a seguir usa a função `sample_role`.

```
DROP ROLE sample_role FORCE;
```

O exemplo a seguir tenta descartar a função sample\$1role1 que foi concedida a um usuário com a opção RESTRICT padrão.

```
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 descartar com êxito a função sample\$1role1 que foi concedida a um usuário, use a opção FORCE.

```
DROP ROLE sample_role1 FORCE;
```

O exemplo a seguir tenta descartar a função sample\$1role2 que tem uma outra função dependente dela com a opção RESTRICT padrão.

```
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 descartar com êxito a função sample\$1role2 que tem outra função dependente dela, use a opção FORCE.

```
DROP ROLE sample_role2 FORCE;
```

# DROP SCHEMA
<a name="r_DROP_SCHEMA"></a>

Exclui um esquema. No caso do esquema externo, você também poderá descartar o banco de dados externo associado ao esquema. Esse comando é irreversível.

## Privilégios obrigatórios
<a name="r_DROP_SCHEMA-privileges"></a>

A seguir estão os privilégios obrigatórios para DROP SCHEMA:
+ Superusuário
+ Proprietário do esquema
+ Usuários com o privilégio DROP SCHEMA

## Sintaxe
<a name="r_DROP_SCHEMA-synopsis"></a>

```
DROP SCHEMA [ IF EXISTS ] name [, ...]
[ DROP EXTERNAL DATABASE ]
[ CASCADE | RESTRICT ]
```

## Parâmetros
<a name="r_DROP_SCHEMA-parameters"></a>

IF EXISTS  
Cláusula que indica que, se o esquema especificado não existe, o comando não deve fazer alterações e retorna uma mensagem informando que o esquema não existe, em vez de encerrar com um erro.  
Esta cláusula é útil durante scripting para que o script não falhe se o comando DROP SCHEMA for executado em um esquema não existente.

 *name*   
Nomes dos esquemas a serem descartados. É possível especificar vários nomes de esquemas separados por vírgulas.

 DROP EXTERNAL DATABASE   
Cláusula indicando que, se um esquema externo for removido, descarte o banco de dados externo associado ao esquema externo, se existir algum. Se não houver banco de dados externo, o comando retornará uma mensagem informando que não existe nenhum banco de dados externo. Se vários esquemas externos forem removidos, todos os bancos de dados associados aos esquemas especificados serão descartados.   
Se um banco de dados externo contiver objetos dependentes, como tabelas, inclua a opção CASCADE para descartar também os objetos dependentes.   
Quando você solta um banco de dados externo, o banco de dados também é descartado para qualquer outro esquema externo associado ao banco de dados. Tabelas definidas em outros esquemas externos usando o banco de dados também são descartadas.   
O DROP EXTERNAL DATABASE não é compatível com bancos de dados externos armazenados em um metastore do HIVE. 

CASCADE  
Palavra-chave indicando que todos os objetos no esquema devem ser removidos automaticamente. Se DROP EXTERNAL DATABASE for especificado, todos os objetos no banco de dados externo também serão removidos.

RESTRICT  
Palavra-chave indicando que um esquema ou banco de dados externo não deve ser removido se contiver algum objeto. Esta ação é o padrão.

## Exemplo
<a name="r_DROP_SCHEMA-example"></a>

O exemplo a seguir exclui um esquema denominado S\$1SALES. Este exemplo usa RESTRICT como mecanismo de segurança para que o esquema não seja excluído se contiver quaisquer objetos. Nesse caso, você precisa excluir objetos do esquema antes de excluir o esquema.

```
drop schema s_sales restrict;
```

O exemplo a seguir exclui um esquema chamado S\$1SALES e todos os objetos que dependem dele.

```
drop schema s_sales cascade;
```

O exemplo a seguir remove o esquema S\$1SALES se ele existir, ou não faz nada e retorna uma mensagem se o esquema não existir.

```
drop schema if exists s_sales;
```

O exemplo a seguir exclui um esquema externo denominado S\$1SPECTRUM e o banco de dados externo associado a ele. Esse exemplo usa RESTRICT para que o esquema e o banco de dados não sejam excluídos se contiverem objetos. Nesse caso, é preciso excluir os objetos dependentes antes de excluir o esquema e o banco de dados.

```
drop schema s_spectrum drop external database restrict;
```

O exemplo a seguir exclui vários esquemas e os bancos de dados externos associados a eles, juntamente com todos os objetos dependentes. 

```
drop schema s_sales, s_profit, s_revenue drop external database cascade;
```

# DESCARTAR TABELA
<a name="r_DROP_TABLE"></a>

Remove uma tabela de um banco de dados. 

Se você está tentando eliminar as linhas de uma tabela sem remover a tabela, use o comando DELETE ou TRUNCATE. 

DROP TABLE elimina restrições que existem na tabela de destino. Várias tabelas podem ser removidas com um único comando DROP TABLE. 

DROP TABLE com uma tabela externa não pode ser executado em uma transação (BEGIN … END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md).

Para encontrar um exemplo em que o privilégio DROP é concedido a um grupo, consulte GRANT [Exemplos](r_GRANT-examples.md).

## Privilégios obrigatórios
<a name="r_DROP_TABLE-privileges"></a>

A seguir estão os privilégios obrigatórios para DROP TABLE:
+ Superusuário
+ Usuários com o privilégio DROP TABLE
+ Proprietário da tabela com o privilégio USAGE no esquema

## Sintaxe
<a name="r_DROP_TABLE-synopsis"></a>

```
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
```

## Parâmetros
<a name="r_DROP_TABLE-parameters"></a>

IF EXISTS  
Cláusula que indica que, se a tabela especificada não existe, o comando não deve fazer alterações e deve retornar uma mensagem informando que a tabela não existe, em vez de encerrar com um erro.  
Esta cláusula é útil durante scripting para que o script não falhe se o comando DROP TABLE for executado em uma tabela não existente.

 *name*   
Nome da tabela a ser removida. 

CASCADE  
Cláusula que indica que para eliminar automaticamente os objetos que dependem da tabela, como exibições.  
Para criar uma exibição que não dependa de outros objetos de banco de dados, como exibições e tabelas, inclua a cláusula WITH NO SCHEMA BINDING na definição de exibição. Para obter mais informações, consulte [CREATE VIEW](r_CREATE_VIEW.md).

RESTRICT   
Cláusula que indica que a tabela não se deve ser removida se contiver objetos que dependam dela. Esta ação é o padrão.

## Exemplos
<a name="r_DROP_TABLE-examples"></a>

 **Remover uma tabela sem dependências** 

O exemplo a seguir cria e remove uma tabela chamada FEEDBACK que não tem dependências: 

```
create table feedback(a int);

drop table feedback;
```

 Se uma tabela contém as colunas que estão referidas por exibições ou por outras tabelas, o Amazon Redshift exibe uma mensagem como a seguir. 

```
Invalid operation: cannot drop table feedback because other objects depend on it
```

 **Remover duas tabelas simultaneamente** 

O conjunto de comandos a seguir criar uma tabela FEEDBACK e uma tabela BUYERS. Em seguida, remove ambas as tabelas com um único comando: 

```
create table feedback(a int);

create table buyers(a int);

drop table feedback, buyers;
```

 **Remover uma tabela com uma dependência** 

As etapas a seguir mostram como remover uma tabela chamada FEEDBACK usando a opção CASCADE. 

Primeiro, crie uma tabela simples chamada FEEDBACK usando o comando CREATE TABLE: 

```
create table feedback(a int);
```

 Em seguida, use o comando CREATE VIEW para criar uma exibição chamada FEEDBACK\$1VIEW dependente da tabela FEEDBACK: 

```
create view feedback_view as select * from feedback;
```

 O exemplo a seguir remove a tabela FEEDBACK e também a exibição FEEDBACK\$1VIEW, pois FEEDBACK\$1VIEW depende da tabela FEEDBACK: 

```
drop table feedback cascade;
```

 **Visualizar as dependências de uma tabela** 

Para retornar as dependências da tabela, use o exemplo a seguir. Substitua *my\$1schema* e *my\$1table* pelo esquema e tabela próprios. 

```
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* e as dependências, use o exemplo a seguir. O exemplo também retorna todas as dependências da tabela que foi descartada.

```
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 |
+------------------+----------------+---------------+--------------+-------------+
```

 **Remover uma tabela usando IF EXISTS** 

O exemplo a seguir remove a tabela FEEDBACK se ela existir, ou não faz nada e retorna uma mensagem se o esquema não existir: 

```
drop table if exists feedback;
```

# DROP
<a name="r_DROP_TEMPLATE"></a>

Elimina um modelo de um banco de dados.

## Privilégios obrigatórios
<a name="r_DROP_TEMPLATE-privileges"></a>

Para eliminar um modelo, é necessário ter uma das seguintes opções:
+ Privilégios de superusuário.
+ Privilégio DROP TEMPLATE e privilégio USAGE no esquema que contém o modelo.

## Sintaxe
<a name="r_DROP_TEMPLATE-synopsis"></a>

```
DROP TEMPLATE [database_name.][schema_name.]template_name;
```

## Parâmetros
<a name="r_DROP_TEMPLATE-parameters"></a>

 *database\$1name*   
(Opcional) O nome do banco de dados no qual o modelo é criado. Se não especificado, será usado o banco de dados atual. 

 *schema\$1name*   
(Opcional) O nome do esquema no qual o modelo é criado. Se não for especificado, o modelo será pesquisado no caminho de pesquisa atual. 

 *template\$1name*   
O nome do modelo a ser removido. No exemplo a seguir, o nome do banco de dados é `demo_database`, o nome do esquema é `demo_schema` e o nome do modelo é `test`.  

```
DROP TEMPLATE demo_database.demo_schema.test;
```

## Exemplos
<a name="r_DROP_TEMPLATE-examples"></a>

O seguinte exemplo remove o modelo test\$1template do esquema atual:

```
DROP TEMPLATE test_template;
```

O seguinte exemplo remove o modelo test\$1template do esquema test\$1schema:

```
DROP TEMPLATE test_schema.test_template;
```

# DROP USER
<a name="r_DROP_USER"></a>

Remove um usuário de um banco de dados. Vários usuários podem ser removidos com um único comando DROP USER. É necessário ser um superusuário do banco de dados ou ter a permissão DROP USER para executar esse comando.

## Sintaxe
<a name="r_DROP_USER-synopsis"></a>

```
DROP USER [ IF EXISTS ] name [, ... ]
```

## Parâmetros
<a name="r_DROP_USER-parameters"></a>

IF EXISTS  
Cláusula que indica que, se o usuário especificado não existe, o comando não deve fazer alterações e deve retornar uma mensagem informando que o usuário não existe, em vez de encerrar com um erro.  
Essa cláusula é útil durante o scripting para que o script não falhe se o comando DROP USER for executado em um usuário não existente.

 *name*   
Nome do usuário a ser removido. É possível especificar vários usuários, com uma vírgula separando cada nome de usuário do texto.

## Observações de uso
<a name="r_DROP_USER-notes"></a>

Não é possível descartar o usuário chamado `rdsdb` ou o usuário administrador do banco de dados, que normalmente é chamado de `awsuser` ou `admin`.

Você não pode remover um usuário se o usuário tem um objeto de banco de dados, como um esquema, um banco de dados, uma tabela ou uma exibição, ou se o usuário tem algum privilégio em um banco de dados, uma tabela ou grupo. Se você tentar remover esse usuário, receberá um dos erros abaixo.

```
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 obter instruções detalhadas sobre como encontrar os objetos pertencentes a um usuário do banco de dados, consulte [Como resolvo o erro “usuário não pode ser descartado” no Amazon Redshift?](https://repost.aws/knowledge-center/redshift-user-cannot-be-dropped) no *Centro de Conhecimentos*.

**nota**  
O Amazon Redshift verifica somente o banco de dados atual antes de descartar um usuário. DROP USER não retorna um erro se o usuário tiver objetos de banco de dados ou algum privilégio de objetos em outro banco de dados. Se você remover um usuário que tem objetos em outro banco de dados, o proprietário desses objetos será alterado para “unknown”. 

Se um usuário tiver um objeto, primeiro remova o objeto ou altere sua propriedade para outro usuário antes de remover o usuário original. Se o usuário tiver privilégios para um objeto, revogue os privilégios antes de remover o usuário. O exemplo a seguir mostra como remover um objeto, alterar a propriedade e revogar privilégios antes de remover o usuário.

```
drop database dwdatabase;
alter schema dw owner to dwadmin;
revoke all on table dwtable from dwuser;
drop user dwuser;
```

## Exemplos
<a name="r_DROP_USER-examples"></a>

O exemplo a seguir remove um usuário chamado paulo:

```
drop user paulo;
```

O exemplo a seguir exclui dois usuários, paulo e martha:

```
drop user paulo, martha;
```

O exemplo a seguir exclui o usuário paulo caso ele exista, ou não faz nada e retorna uma mensagem caso a conta não exista:

```
drop user if exists paulo;
```

# DROP VIEW
<a name="r_DROP_VIEW"></a>

Remove uma exibição do banco de dados. Várias exibições podem ser removidas com um único comando DROP VIEW. Esse comando é irreversível.

## Privilégios obrigatórios
<a name="r_DROP_VIEW-privileges"></a>

A seguir estão os privilégios obrigatórios para DROP VIEW:
+ Superusuário
+ Usuários com o privilégio DROP VIEW
+ Proprietário da exibição

## Sintaxe
<a name="r_DROP_VIEW-synopsis"></a>

```
DROP VIEW [ IF EXISTS ] name [, ... ] [ CASCADE | RESTRICT ] 
```

## Parâmetros
<a name="r_DROP_VIEW-parameters"></a>

IF EXISTS  
Cláusula que indica que, se a exibição especificada não existe, o comando não deve fazer alterações e deve retornar uma mensagem informando que a exibição não existe, em vez de encerrar com um erro.  
Esta cláusula é útil durante scripting para que o script não falhe se o comando DROP VIEW for executado em uma exibição não existente.

 *name*   
Nome da exibição a ser removida.

CASCADE  
Cláusula que indica que para remover automaticamente os objetos que dependem da exibição, como outras exibições.  
Para criar uma exibição que não dependa de outros objetos de banco de dados, como exibições e tabelas, inclua a cláusula WITH NO SCHEMA BINDING na definição de exibição. Para obter mais informações, consulte [CREATE VIEW](r_CREATE_VIEW.md).  
Observe que, se você incluir CASCADE e a contagem de objetos de banco de dados descartados for dez ou mais, é possível que o cliente do banco de dados não liste todos os objetos descartados nos resultados resumidos. Isso geralmente ocorre porque as ferramentas do cliente SQL têm limitações padrão nos resultados exibidos.

RESTRICT  
Cláusula que indica que a exibição não se deve ser removida se contiver objetos que dependam dela. Esta ação é o padrão.

## Exemplos
<a name="r_DROP_VIEW-examples"></a>

O exemplo a seguir remove a exibição chamada *event*:

```
drop view event;
```

Para remover uma exibição com dependências, use a opção CASCADE. Por exemplo, digamos que vamos começar com uma tabela chamada EVENT. Criamos a exibição eventview na tabela EVENT usando o comando CREATE VIEW, conforme mostrado no seguinte exemplo: 

```
create view eventview as
select dateid, eventname, catid
from event where catid = 1;
```

Agora, criamos uma segunda exibição chamada *myeventview*, que se baseia na primeira exibição *eventview*:

```
create view myeventview as
select eventname, catid
from eventview where eventname <> ' ';
```

Neste momento, duas exibições foram criadas: *eventview* e *myeventview*.

A exibição *myeventview* é dependente da*eventview*, que é a exibição principal.

Para excluir a exibição *eventview*, o comando óbvio a ser usado é o seguinte: 

```
drop view eventview;
```

Observe que se você executa o comando nesse caso, você recebe o seguinte erro:

```
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 resolver isso, execute o seguinte comando (como sugerido na mensagem de erro): 

```
drop view eventview cascade;
```

Agora as exibições *eventview* e *myeventview* foram removidas com êxito.

O exemplo a seguir remove a exibição *eventview* se existir, ou não faz nada e retorna uma mensagem se a exibição não existir:

```
drop view if exists eventview;
```

# END
<a name="r_END"></a>

Confirma a transação atual. Executa exatamente a mesma função que o comando COMMIT.

Consulte [COMMIT](r_COMMIT.md) para obter uma documentação mais detalhada.

## Sintaxe
<a name="r_END-synopsis"></a>

```
END [ WORK | TRANSACTION ]
```

## Parâmetros
<a name="r_END-parameters"></a>

WORK  
Palavra-chave opcional.

TRANSACTION  
Palavra-chave opcional; WORK e TRANSACTION são sinônimos.

## Exemplos
<a name="r_END-examples"></a>

Todos os exemplos a seguir encerram o bloco de transação e confirmam a transação:

```
end;
```

```
end work;
```

```
end transaction;
```

Depois de qualquer um desses comandos, o Amazon Redshift encerra o bloco de transação e confirma as alterações.

# EXECUTE
<a name="r_EXECUTE"></a>

Executa uma instrução preparada anteriormente. 

## Sintaxe
<a name="r_EXECUTE-synopsis"></a>

```
EXECUTE plan_name [ (parameter [, ...]) ]
```

## Parâmetros
<a name="r_EXECUTE-parameters"></a>

 *plan\$1name*   
O nome da instrução preparada para execução. 

 *Parâmetro*   
O valor real de um parâmetro da instrução preparada. Essa deve ser uma expressão que resulta em um valor de um tipo compatível com o tipo de dados especificado para a posição do parâmetro no comando PREPARE que criou a instrução preparada. 

## Observações de uso
<a name="r_EXECUTE_usage_notes"></a>

EXECUTE é usado para executar uma instrução preparada anteriormente. Como as instruções preparadas existem somente pela duração de uma sessão, a instrução preparada deve ter sido criada por uma instrução PREPARE executada anteriormente na sessão atual. 

Se a instrução PREPARE anterior especificou alguns parâmetros, um conjunto de parâmetros compatíveis deve ser passado para a instrução EXECUTE ou o Amazon Redshift retorna um erro. Ao contrário das funções, as instruções preparadas não são sobrecarregadas com base no tipo nem na quantidade de parâmetros especificados. O nome de uma instrução preparada deve ser exclusivo em uma sessão de banco de dados. 

Quando um comando EXECUTE é emitido para a instrução preparada, o Amazon Redshift pode optar por revisar o plano de execução da consulta (para melhorar a performance com base nos valores de parâmetro especificados) antes de executar a instrução preparada. Além disso, para cada nova execução de uma instrução preparada, o Amazon Redshift pode revisar o plano de execução da consulta novamente com base em valores de parâmetro diferentes especificados com a instrução EXECUTE. Para examinar o plano de execução da consulta escolhido pelo Amazon Redshift para qualquer comando EXECUTE, use o comando [EXPLAIN](r_EXPLAIN.md). 

Para mais exemplos e informações sobre a criação e o uso de instruções preparadas, consulte [PREPARE](r_PREPARE.md). 

## Consulte também
<a name="r_EXECUTE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [PREPARE](r_PREPARE.md) 

# EXPLAIN
<a name="r_EXPLAIN"></a>

Exibe o plano de execução para uma instrução de consulta sem executar a consulta. Para obter informações sobre o fluxo de trabalho de análise de consultas, consulte [Fluxo de trabalho da análise de consulta](c-query-analysis-process.md).

## Sintaxe
<a name="r_EXPLAIN-synopsis"></a>

```
EXPLAIN [ VERBOSE ] query
```

## Parâmetros
<a name="r_EXPLAIN-parameters"></a>

VERBOSE   
Exibe o plano completo da consulta em vez de apenas um resumo.

 *query*   
Instrução da consulta a ser explicada. A consulta pode ser uma instrução SELECT, INSERT, CREATE TABLE AS, UPDATE ou DELETE.

## Observações de uso
<a name="r_EXPLAIN-usage-notes"></a>

Às vezes, a performance do comando EXPLAIN é influenciado pelo tempo que ele leva para criar tabelas temporárias. Por exemplo, uma consulta que usa otimização comum de subexpressão requer tabelas temporárias para ser criada e analisada para retornar a saída EXPLAIN. O plano da consulta depende do esquema e das estatísticas das tabelas temporárias. Portanto, para esse tipo de consulta, o comando EXPLAIN pode levar mais tempo para ser executado que o esperado.

Você pode usar EXPLAIN somente com os seguintes comandos:
+ SELECT
+ SELECT INTO
+ CREATE TABLE AS
+ INSERT
+ UPDATE
+ DELETE

O comando EXPLAIN falhará se você o usar para outros comandos SQL, como data definition language (DDL) ou operações de banco de dados.

Os custos unitários relativos da saída EXPLAIN são usados pelo Amazon Redshift para escolher um plano de consulta. O Amazon Redshift compara os tamanhos de várias estimativas de recursos para determinar o plano.

## Planejamento de consulta e etapas de execução
<a name="r_EXPLAIN-query-planning-and-execution-steps"></a>

O plano de execução de uma instrução de consulta específica do Amazon Redshift divide a execução e o cálculo de uma consulta em uma sequência diferente de etapas e operações de tabela que, por fim, produz um conjunto de resultados finais para a consulta. Para obter informações sobre consulta paralela, consulte [Processamento de consulta](c-query-processing.md).

A tabela a seguir fornece um resumo de etapas que o Amazon Redshift pode usar para desenvolver um plano de execução para qualquer consulta enviada por um usuário para execução.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_EXPLAIN.html)

## Utilização de EXPLAIN para RLS
<a name="r_EXPLAIN-RLS"></a>

Se uma consulta contiver uma tabela sujeita às políticas de segurança no nível da linha (RLS), EXPLAIN exibirá um nó especial do RLS SecureScan. O Amazon Redshift também registra o mesmo tipo de nó na tabela do sistema STL\$1EXPLAIN. EXPLAIN não revela o predicado RLS que se aplica a dim\$1tbl. O tipo de nó RLS SecureScan serve como um indicador de que o plano de execução contém operações adicionais que são invisíveis para o usuário atual.

O exemplo a seguir mostra um nó RLS SecureScan.

```
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 permitir a investigação completa dos planos de consulta sujeitos ao RLS, o Amazon Redshift oferece as permissões do sistema EXPLAIN RLS. Os usuários que receberam essa permissão podem inspecionar planos de consulta completos que também incluem predicados RLS. 

O exemplo a seguir ilustra uma Seq Scan adicional abaixo do nó RLS SecureScan que também inclui o predicado da 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)
```

Embora a permissão EXPLAIN RLS seja concedida a um usuário, o Amazon Redshift registra o plano de consulta completo, incluindo predicados RLS na tabela do sistema STL\$1EXPLAIN. As consultas que forem executadas enquanto essa permissão não for concedida serão registradas sem os internos do RLS. Conceder ou remover a permissão EXPLAIN RLS não alterará o que o Amazon Redshift registrou em log no STL\$1EXPLAIN para consultas anteriores.

### Relações do Redshift protegidas entre AWS Lake Formation e RLS
<a name="r_EXPLAIN_RLS-LF"></a>

O exemplo a seguir ilustra um nó LF SecureScan, que você pode usar para visualizar relações entre Lake Formation e 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)
```

## Exemplos
<a name="r_EXPLAIN-examples"></a>

**nota**  
Para esses exemplos, o resultado da amostra pode variar dependendo da configuração do Amazon Redshift.

O exemplo a seguir retorna o plano de consulta para uma consulta que seleciona EVENTID, EVENTNAME, VENUEID e VENUENAME das tabelas EVENT e 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)
```

O exemplo a seguir retorna o plano de consulta para a mesma consulta com saída "verbose":

```
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)
```

O exemplo a seguir retorna o plano de consulta para uma instrução 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 linhas usando um cursor. Para obter informações sobre como declarar um cursor, consulte [DECLARE](declare.md).

FETCH recupera linhas com base na posição atual do cursor. Quando um cursor é criado, ele é posicionado antes da primeira linha. Depois de um comando FETCH, o cursor é posicionado na última linha recuperada. Se FETCH for executado até o final das linhas disponíveis, como um comando FETCH ALL, o cursor é posicionado depois da última linha. 

FORWARD 0 busca a linha atual sem mover o cursor, ou seja, procura a linha buscada mais recentemente. Se o cursor estiver posicionado antes da primeira linha ou depois da última linha, nenhuma linha será retornada. 

Quando a primeira linha do cursor é buscada, o conjunto inteiro de resultados é materializado no nó líder, na memória ou em disco, se necessário. Devido ao impacto da performance negativa potencial de usar cursores com grandes conjuntos de resultado, recomendamos abordagens alternativas sempre que possível. Para obter mais informações, consulte [Considerações sobre a performance ao usar cursores](declare.md#declare-performance).

Para obter mais informações, consulte [DECLARE](declare.md)[CLOSE](close.md). 

## Sintaxe
<a name="fetch-synopsis"></a>

```
FETCH [ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor
```

## Parâmetros
<a name="fetch-parameters"></a>

NEXT  
Busca a próxima linha. Esse é o padrão.

ALL  
Busca todas as linhas restantes. (Mesmo que FORWARD ALL.) ALL não é compatível para clusters de nó único.

FORWARD [ *contagem* \$1 ALL ]   
Busca a *contagem* das próximas linhas, ou todas as linhas restantes. `FORWARD 0` busca a linha atual. Para clusters de nó único, o valor máximo para a contagem é `1000`. FORWARD ALL não é compatível para clusters de nó único. 

*cursor*   
Nome do novo cursor. 

## Exemplo de FETCH
<a name="fetch-example"></a>

O exemplo a seguir declara um cursor denominado LOLLAPALOOZA para selecionar informações de vendas para o evento Lollapalooza e busca linhas do conjunto de resultados usando o 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 permissões de acesso para um usuário ou uma função.

As permissões incluem opções de acesso como leitura de dados em tabelas e visualizações, gravação de dados e criação de tabelas. Use este comando para fornecer permissões específicas para uma tabela, banco de dados, esquema, função, procedimento, linguagem ou coluna. Para revogar permissões de um objeto de banco de dados, use o comando [REVOKE](r_REVOKE.md). 

As permissões também incluem as seguintes opções de acesso do produtor da unidade de compartilhamento de dados:
+  Concessão de acesso à unidade de compartilhamento de dados para namespaces e contas de consumidores. 
+  Concessão de permissão para alterar uma unidade de compartilhamento de dados adicionando ou removendo objetos da unidade de compartilhamento de dados. 
+  Concessão de permissão para compartilhar uma unidade de compartilhamento de dados adicionando ou removendo namespaces de consumidores da unidade de compartilhamento de dados. 

As opções de acesso do consumidor à unidade de compartilhamento de dados são as seguintes:
+ Concessão a usuários de acesso total a bancos de dados criados a partir de uma unidade de compartilhamento de dados ou a esquemas externos que apontem para esses bancos de dados.
+ Concessão a usuários de permissões no nível do objeto em bancos de dados criados a partir de uma unidade de compartilhamento de dados como a que você pode para objetos de banco de dados. Para conceder esse nível de permissão, você deve usar a cláusula WITH PERMISSIONS ao criar um banco de dados a partir da unidade de compartilhamento de dados. Para obter mais informações, consulte [CREATE DATABASE](r_CREATE_DATABASE.md).

Para obter mais informações sobre permissões da unidade de compartilhamento de dados, consulte [Permissões que você pode conceder a unidades de compartilhamento de dados](permissions-datashares.md).

As permissões também incluem o seguinte Catálogo de Permissões Federadas do Amazon Redshift:
+ Conceder permissões em nível de tabela a usuários e perfis.
+ Conceder permissões refinadas em nível de coluna em tabelas, visualizações e visões materializadas.
+ Conceder permissões com escopo a usuários e perfis.
+ Conceder permissões em nível de banco de dados no Catálogo de Permissões Federadas do Amazon Redshift.

Para acessar mais informações sobre o gerenciamento de permissões no Catálogo de Permissões Federadas do Amazon Redshift, consulte [Gerenciar o controle de acesso no catálogo de permissões federadas do Amazon RedshiftConcessão/revogação](federated-permissions-managing-access.md). Para acessar mais informações sobre as sintaxes de concessão/revogação aceitas pelo Catálogo de Permissões Federadas do Amazon Redshift, consulte [Concessão/revogação](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html#federated-permissions-managing-access-grant-revoke).

As permissões também incluem o privilégio CONNECT para usuários federados do Centro de Identidade do AWS IAM. Esse privilégio permite que os administradores controlem o acesso do usuário por meio de permissões granulares em cada grupo de trabalho ou cluster do Amazon Redshift em que as permissões federadas do Amazon Redshift estão habilitadas. O administrador do Amazon Redshift pode especificar quais usuários ou grupos federados do Centro de Identidade do AWS IAM têm acesso para se conectar diretamente ao grupo de trabalho do Amazon Redshift, fornecendo controle refinado sobre o acesso do usuário em cada grupo de trabalho ou cluster do Centro de Identidade do AWS IAM.

Você também pode conceder perfis para gerenciar permissões de banco de dados e controlar o que os usuários podem fazer em relação aos seus dados. Ao definir perfis e atribuí-los aos usuários, você pode limitar as ações que esses usuários podem realizar, como limitar os usuários somente aos comandos CREATE TABLE e INSERT. Para obter mais informações sobre o comando CREATE ROLE, consulte [CREATE ROLE](r_CREATE_ROLE.md). O Amazon Redshift tem alguns perfis definidos pelo sistema que você também pode usar para conceder permissões específicas aos seus usuários. Para obter mais informações, consulte [Funções definidas pelo sistema do Amazon Redshift](r_roles-default.md).

Só é possível CONCEDER ou REVOGAR permissões de USO em um esquema externo para usuários de banco de dados e grupos de usuários que usam a sintaxe ON SCHEMA. Ao usar ON EXTERNAL SCHEMA com AWS Lake Formation, só é possível conceder (GRANT) e revogar (REVOKE) permissões para um perfil do AWS Identity and Access Management (IAM). Para obter a lista de permissões, consulte a sintaxe.

Para procedimentos armazenados, a única permissão que pode ser concedida é EXECUTE.

Não é possível executar GRANT (em um recurso externo) em um bloco de transação (BEGIN ... END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

Para ver quais permissões os usuários receberam para um banco de dados, use [HAS\$1DATABASE\$1PRIVILEGE](r_HAS_DATABASE_PRIVILEGE.md). Para ver quais permissões os usuários receberam para um esquema, use [HAS\$1SCHEMA\$1PRIVILEGE](r_HAS_SCHEMA_PRIVILEGE.md). Para ver quais permissões os usuários receberam para uma tabela, use [HAS\$1TABLE\$1PRIVILEGE](r_HAS_TABLE_PRIVILEGE.md). 

## Sintaxe
<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 } [, ...]
```

### Conceder permissões por coluna para tabelas
<a name="grant-column-level"></a>

A seguir está a sintaxe para permissões por coluna em tabelas e visualizações do Amazon Redshift.

```
GRANT { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }

     TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Conceder permissões ASSUMEROLE
<a name="grant-assumerole-permissions"></a>

A seguir está a sintaxe para as permissões ASSUMEROLE concedidas a usuários e grupos com um perfil especificado. Para começar a usar o privilégio ASSUMEROLE, consulte [Observações de uso para conceder a permissão 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 } [, ...]
```

### Conceder permissões para integração do Redshift Spectrum com o Lake Formation
<a name="grant-spectrum-integration-with-lf-syntax"></a>

A seguir está a sintaxe para integração do Redshift Spectrum com 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 ]
```

### Conceder permissões da unidade de compartilhamento de dados
<a name="grant-datashare-syntax"></a>

**Permissões da unidade de compartilhamento de dados no lado do produtor**  
Esta é a sintaxe para usar GRANT a fim de conceder permissões ALTER ou SHARE a um usuário ou perfil. O usuário pode alterar a unidade de compartilhamento de dados com a permissão ALTER ou conceder o uso a um consumidor com a permissão SHARE. ALTER e SHARE são as únicas permissões que você pode conceder em uma unidade de compartilhamento de dados a usuários e funções.

```
GRANT { ALTER | SHARE } ON DATASHARE datashare_name
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

A seguir está a sintaxe para usar GRANT para permissões de uso de unidade de compartilhamento de dados no Amazon Redshift. Você concede acesso de uma unidade de compartilhamento de dados a um consumidor usando a permissão USAGE. Você não pode conceder essa permissão a usuários ou grupos de usuários. Essa permissão também não é compatível com WITH GRANT OPTION para a instrução GRANT. Somente usuários ou grupos de usuários com a permissão SHARE concedida anteriormente a eles para (FOR) a unidade de compartilhamento de dados podem executar esse tipo de instrução GRANT.

```
GRANT USAGE
    ON DATASHARE datashare_name
    TO NAMESPACE 'namespaceGUID' | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]
```

Veja a seguir um exemplo de como conceder o uso de uma unidade de compartilhamento de dados a uma conta do Lake Formation.

```
GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '123456789012' VIA DATA CATALOG;
```

**Permissões da unidade de compartilhamento de dados no lado do consumidor**  
A seguir está a sintaxe para permissões de uso de compartilhamento de dados GRANT em um banco de dados específico ou esquema criado a partir de um datashare. 

Outras permissões necessárias para consumidores terem acesso a um banco de dados criado a partir de uma unidade de compartilhamento de dados variam dependendo do comando CREATE DATABASE usado para criar o banco de dados a partir da unidade de compartilhamento de dados ter usado ou não a cláusula WITH PERMISSIONS. Para obter mais informações sobre o comando CREATE DATABASE e a cláusula WITH PERMISSIONS, consulte [CREATE DATABASE](r_CREATE_DATABASE.md).

**Bancos de dados criados sem usar a cláusula WITH PERMISSIONS**  
Ao conceder USAGE em um banco de dados criado a partir de uma unidade de compartilhamento de dados sem a cláusula WITH PERMISSIONS, você não precisa conceder permissões separadamente nos objetos no banco de dados compartilhado. As entidades com uso concedido em bancos de dados criados a partir de unidades de compartilhamento de dados sem a cláusula WITH PERMISSIONS têm acesso automático a todos os objetos no banco de dados.

**Bancos de dados criados usando a cláusula WITH PERMISSIONS**  
Quando você concede USAGE em um banco de dados no qual o banco de dados compartilhado foi criado a partir de uma unidade de compartilhamento de dados com a cláusula WITH PERMISSIONS, as identidades no lado do consumidor ainda devem receber as permissões relevantes para objetos de banco de dados no banco de dados compartilhado para terem acesso a eles, assim como você concederia permissões para objetos de banco de dados locais. Para conceder permissões a objetos em um banco de dados criado a partir de uma unidade de compartilhamento de dados, use a sintaxe de três partes `database_name.schema_name.object_name`. Para conceder permissões a objetos em um esquema externo apontando para um esquema compartilhado no banco de dados compartilhado, use a sintaxe de duas partes `schema_name.object_name`.

```
GRANT USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
    TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Concessão de permissões em escopo
<a name="grant-scoped-syntax"></a>

Com as permissões em escopo, é possível conceder permissões a um usuário ou função em todos os objetos de um tipo em um banco de dados ou esquema. Usuários e funções com permissões em escopo têm as permissões especificadas em todos os objetos atuais e futuros no banco de dados ou esquema.

Você pode visualizar o escopo das permissões com escopo em nível de banco de dados em [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md). Você pode visualizar o escopo das permissões com escopo em nível de esquema em [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md).

Para ter mais informações sobre permissões com escopo definido, consulte [Permissões em escopo](t_scoped-permissions.md).

Esta é a sintaxe para concessão de permissões em escopo para usuários ou perfis.

```
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 } [, ...]
```

Observe que as permissões no escopo não fazem distinção entre permissões para funções e procedimentos. Por exemplo, a declaração a seguir concede a `bob` a permissão `EXECUTE` para funções e procedimentos no esquema `Sales_schema`.

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

### Conceder permissões de machine learning
<a name="grant-model-syntax"></a>

A seguir está a sintaxe para permissões de modelos de machine learning no 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 } [, ...]
```

### Conceder permissões de perfil
<a name="grant-roles"></a>

A sintaxe a seguir concede perfis no Amazon Redshift.

```
GRANT { ROLE role_name } [, ...] TO { { user_name [ WITH ADMIN OPTION ] } | ROLE role_name }[, ...]
```

A sintaxe a seguir concede permissões de sistema a perfis no Amazon Redshift. Observe que você só pode conceder permissões para perfis, não para usuários.

```
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 [, ...]
```

### Conceder permissões de explicação para políticas de segurança
<a name="grant-row-level-security"></a>

Veja a seguir a sintaxe para conceder permissões para explicar os filtros de política de segurança de uma consulta no plano EXPLAIN. As políticas de segurança possíveis incluem segurança por linha e políticas de mascaramento dinâmico de dados.

```
GRANT EXPLAIN { RLS | MASKING } TO ROLE rolename 
```

Veja a seguir a sintaxe para conceder permissões para ignorar políticas de segurança no nível da linha para uma consulta. Essa sintaxe não se aplica às políticas de mascaramento dinâmico de dados.

```
GRANT IGNORE RLS TO ROLE rolename 
```

Veja a seguir a sintaxe para conceder permissões de tabela de pesquisa à política de segurança especificada. As políticas de segurança possíveis incluem segurança por linha e políticas de mascaramento dinâmico de dados.

```
GRANT SELECT ON [ TABLE ] table_name [, ...]
TO { RLS | MASKING } POLICY policy_name [, ...]
```

### Conceder permissões de conexão
<a name="grant-connection-permissions"></a>

Veja a seguir a sintaxe para conceder permissões para usuários federados (ou grupos) do Centro de Identidade do AWS IAM se conectarem a um grupo de trabalho/cluster:

```
GRANT CONNECT [ON WORKGROUP]
TO [USER] <prefix>:<username> | ROLE <prefix>:<rolename> | PUBLIC;
```

## Parâmetros
<a name="r_GRANT-parameters"></a>

SELECT   <a name="grant-select"></a>
Concede permissão para selecionar dados de uma tabela ou visualização usando uma instrução SELECT. A permissão SELECT também é necessária para fazer referência a valores de coluna existentes para as operações UPDATE ou DELETE.

INSERT   <a name="grant-insert"></a>
Concede permissão para carregar dados em uma tabela usando uma instrução INSERT ou COPY. 

UPDATE   <a name="grant-update"></a>
Concede permissão para atualizar uma coluna de tabela usando a instrução UPDATE. As operações UPDATE também exigem a permissão SELECT, pois devem fazer referência a colunas da tabela para determinar que linhas atualizar ou computar novos valores para as colunas.

DELETE  <a name="grant-delete"></a>
Concede permissão para excluir uma linha de dados de uma tabela. As operações DELETE também necessitam do privilégio SELECT, pois devem fazer referência a colunas da tabela para determinar que linhas excluir.

DROP  <a name="grant-drop"></a>
Dependendo do objeto do banco de dados, concede as seguintes permissões ao usuário ou perfil:   
+  Para tabelas, DROP concede permissão para remover uma tabela ou visualização. Para obter mais informações, consulte [DESCARTAR TABELA](r_DROP_TABLE.md). 
+  Para bancos de dados, DROP concede permissão para remover um banco de dados. Para obter mais informações, consulte [DROP DATABASE](r_DROP_DATABASE.md). 
+  Para esquemas, DROP concede permissão para remover um esquema. Para obter mais informações, consulte [DROP SCHEMA](r_DROP_SCHEMA.md). 

REFERENCES   <a name="grant-references"></a>
Concede permissão para criar uma restrição de chave estrangeira. Você precisa conceder essa permissão na tabela referenciada e na tabela que faz a referência. Caso contrário, o usuário não poderá criar a restrição. 

ALTER  <a name="grant-alter"></a>
Dependendo do objeto do banco de dados, as seguintes permissões são concedidas ao usuário ou ao grupo de usuários:   
+ Para tabelas, ALTER concede permissão para alterar uma tabela ou visão. Para obter mais informações, consulte [ALTER TABLE](r_ALTER_TABLE.md).
+ Para bancos de dados, ALTER concede permissão para alterar um banco de dados. Para obter mais informações, consulte [ALTER DATABASE](r_ALTER_DATABASE.md).
+ Para esquemas, ALTER concede permissão para alterar um esquema. Para obter mais informações, consulte [ALTER SCHEMA](r_ALTER_SCHEMA.md).
+ Para tabelas externas, ALTER concede permissão para alterar uma tabela em um AWS Glue Data Catalog habilitado para o Lake Formation. Essa permissão só é aplicada ao usar o Lake Formation.

TRUNCATE  <a name="grant-truncate"></a>
Concede permissão para truncar uma tabela. Sem essa permissão, somente o proprietário de uma tabela ou um superusuário pode truncar uma tabela. Para obter mais informações sobre o comando TRUNCATE, consulte [TRUNCATE](r_TRUNCATE.md).

ALL [ PRIVILEGES ]   <a name="grant-all"></a>
Concede todas as permissões disponíveis de uma vez ao usuário ou ao perfil especificado. A palavra-chave PRIVILEGES é opcional.  
GRANT ALL ON SCHEMA não concede permissões CREATE para esquemas externos.  
É possível conceder a permissão ALL para uma tabela em um AWS Glue Data Catalog habilitado para o Lake Formation. Nesse caso, permissões individuais (como SELECT, ALTER e assim por diante) são registradas no catálogo de dados.   
 O Amazon Redshift não é compatível com as permissões RULE e TRIGGER. Para obter mais informações, acesse [Recursos incompatíveis do PostgreSQL](c_unsupported-postgresql-features.md). 

ASSUMEROLE  <a name="assumerole"></a>
Concede permissões para executar comandos COPY, UNLOAD, EXTERNAL FUNCTION e CREATE MODEL a usuários, perfis ou grupos com um perfil especificado. O usuário, perfil ou grupo assume esse perfil ao executar o comando especificado. Para começar a usar a permissão ASSUMEROLE, consulte [Observações de uso para conceder a permissão ASSUMEROLE](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole).

ON [ TABLE ] *table\$1name*   <a name="grant-on-table"></a>
Concede as permissões especificadas em uma tabela ou visualização. A palavra-chave TABLE é opcional. Você pode listar várias tabelas e exibições em uma instrução.

ON ALL TABLES IN SCHEMA *schema\$1name*   <a name="grant-all-tables"></a>
Concede as permissões especificadas em todas as tabelas e exibições no esquema de referência.

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="grant-column-level-privileges"></a>
Concede as permissões especificadas a usuários, grupos ou PUBLIC nas colunas especificadas da tabela ou visualização do Amazon Redshift.

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table-column"></a>
Concede as permissões especificadas para um perfil do IAM nas colunas especificadas da tabela do Lake Formation no esquema mencionado.

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table"></a>
Concede as permissões especificadas para um perfil do IAM nas tabelas especificadas do Lake Formation no esquema mencionado.

ON EXTERNAL SCHEMA *schema\$1name*   <a name="grant-external-schema"></a>
Concede as permissões especificadas para um perfil do IAM no esquema mencionado.

ON *iam\$1role*   <a name="grant-iam_role"></a>
Concede as permissões especificadas para um perfil do IAM.

TO *username*   <a name="grant-to"></a>
Indica o usuário que está recebendo as permissões.

TO IAM\$1ROLE *iam\$1role*   <a name="grant-to-iam-role"></a>
Indica o perfil do IAM que está recebendo as permissões.

WITH GRANT OPTION   <a name="grant-with-grant"></a>
Indica que o usuário que recebe as permissões pode, por sua vez, conceder as mesmas permissões a outros. WITH GRANT OPTION não pode ser concedido a um grupo ou a PUBLIC.

ROLE *role\$1name*   <a name="grant-role"></a>
Concede as permissões ao perfil.

GROUP *nome\$1grupo*   <a name="grant-group"></a>
Concede as permissões a um grupo de usuários. Pode ser uma lista separada por vírgulas para especificar vários grupos de usuários.

PUBLIC   <a name="grant-public"></a>
Concede as permissões especificadas a todos os usuários, incluindo os usuários criados posteriormente. PUBLIC representa um grupo que inclui sempre todos os usuários. As permissões de um usuário individual consistem na soma das permissões concedidas a PUBLIC, das permissões concedidas a todos os grupos aos quais o usuário pertence e de quaisquer permissões concedidas ao usuário individualmente.  
Conceder PUBLIC a um EXTERNAL TABLE do Lake Formation resulta em conceder a permissão para o grupo *todos* do Lake Formation.

CONNECT [ON WORKGROUP] TO \$1 [USER] <prefix>:<username> \$1 ROLE <prefix>:<rolename> \$1 PUBLIC \$1  
Concede a permissão para se conectar a um grupo de trabalho ou cluster a usuários ou grupos federados do Centro de Identidade do AWS IAM. O prefixo identifica o provedor de identidades. Quando concedida a PUBLIC, a permissão se aplica a todos os usuários federados do Centro de Identidade do AWS IAM, incluindo os usuários criados posteriormente. Essa permissão é aplicável somente quando as permissões federadas do Amazon Redshift estão habilitadas no grupo de trabalho ou cluster.

CREATE   <a name="grant-create"></a>
Dependendo do objeto do banco de dados, as seguintes permissões são concedidas ao usuário ou ao grupo de usuários:  
+ Para bancos de dados, CREATE permite que os usuários criem esquemas no banco de dados.
+ Para esquemas, CREATE permite que os usuários criem objetos em um esquema. Para renomear um objeto, o usuário deve ter a permissão CREATE e ser proprietário do objeto a ser renomeado.
+ Não há suporte para CREATE ON SCHEMA nos esquemas externos do Amazon Redshift Spectrum. Para conceder o uso de tabelas externas em um esquema externo, conceda USAGE ON SCHEMA a usuários que precisam de acesso. Somente o proprietário de um esquema externo ou um superusuário tem permissão para criar tabelas externas no esquema externo. Para transferir a propriedade de um esquema externo, use [ALTER SCHEMA](r_ALTER_SCHEMA.md) para alterar o proprietário. 

TEMPORARY \$1 TEMP   <a name="grant-temporary"></a>
Concede permissão para criar tabelas temporárias no banco de dados especificado. Para executar as consultas do Amazon Redshift Spectrum, o usuário do banco de dados precisa ter permissão para criar tabelas temporárias no banco de dados.   
Por padrão, os usuários recebem permissão para criar tabelas temporárias por associação automática ao grupo PUBLIC. Para remover a permissão para que qualquer usuário crie tabelas temporárias, revogue a permissão TEMP do grupo PUBLIC. Em seguida, conceda explicitamente a permissão para criar tabelas temporárias para usuários ou grupos de usuários específicos.

ON DATABASE *nome\$1bd*   <a name="grant-database"></a>
Concede as permissões especificadas em um banco de dados.

USAGE   <a name="grant-usage"></a>
Concede a permissão USAGE em um esquema específico, que torna objetos naquele esquema acessíveis aos usuários. As ações específicas nesses objetos devem ser concedidas separadamente (por exemplo, permissões SELECT ou UPDATE em tabelas) para esquemas locais do Amazon Redshift. Por padrão, todos os usuários têm permissões CREATE e USAGE no esquema PUBLIC.   
 Ao conceder USAGE a esquemas externos usando a sintaxe ON SCHEMA, você não precisa conceder ações separadamente nos objetos no esquema externo. As permissões de catálogo correspondentes controlam as permissões granulares nos objetos externos do esquema. 

ON SCHEMA *schema\$1name*   <a name="grant-schema"></a>
Concede as permissões especificadas em um esquema.  
GRANT CREATE ON SCHEMA e a permissão CREATE em GRANT ALL ON SCHEMA não são compatíveis com os esquemas externos do Amazon Redshift Spectrum. Para conceder o uso de tabelas externas em um esquema externo, conceda USAGE ON SCHEMA a usuários que precisam de acesso. Somente o proprietário de um esquema externo ou um superusuário tem permissão para criar tabelas externas no esquema externo. Para transferir a propriedade de um esquema externo, use [ALTER SCHEMA](r_ALTER_SCHEMA.md) para alterar o proprietário. 

EXECUTE ON ALL FUNCTIONS IN SCHEMA *schema\$1name*  <a name="grant-all-functions"></a>
Concede as permissões especificadas em todas as funções no esquema de referência.  
O Amazon Redshift não comporta instruções GRANT ou REVOKE para entradas pg\$1proc builtin definidas no namespace pg\$1catalog. 

EXECUTE ON PROCEDURE *procedure\$1name*   <a name="grant-procedure"></a>
Concede a permissão EXECUTE em um procedimento armazenado específico. Como os nomes de procedimento armazenado podem ser sobrecarregados, você deverá incluir a lista de argumentos para o procedimento. Para obter mais informações, consulte [Nomeação de procedimentos armazenados](stored-procedure-naming.md).

EXECUTE ON ALL PROCEDURES IN SCHEMA *schema\$1name*  <a name="grant-all-procedures"></a>
Concede as permissões especificadas em todos os procedimentos armazenados no esquema de referência.

USAGE ON LANGUAGE *nome\$1linguagem*   
Concede a permissão USAGE em um idioma.   
A partir de 1.º de novembro de 2025, o Amazon Redshift não permitirá mais a criação de UDFs do Python. As UDFs do Python existentes continuarão a funcionar normalmente até 30 de junho de 2026. A partir de 1.º de julho de 2026, o Amazon Redshift não permitirá mais a criação de UDFs do Python. Recomendamos enfaticamente que você migre as UDFs existentes do Python para as UDFs do Lambda antes de 1.º de novembro de 2025. Para ter mais informações sobre como criar e usar UDFs do Lambda, consulte [UDFs escalares do Lambda](udf-creating-a-lambda-sql-udf.md). Para ter informações sobre a conversão de UDFs do Python existentes em UDFs do Lambda, consulte a [publicação de blog ](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/).
A permissão USAGE ON LANGUAGE é necessária para criar funções definidas pelo usuário (UDFs) executando o comando [CREATE FUNCTION](r_CREATE_FUNCTION.md). Para obter mais informações, consulte [Segurança e permissões de UDFs](udf-security-and-privileges.md).   
A permissão USAGE ON LANGUAGE é necessária para criar procedimentos armazenados executando o comando [CREATE PROCEDURE](r_CREATE_PROCEDURE.md). Para obter mais informações, consulte [Segurança e privilégios para procedimentos armazenados](stored-procedure-security-and-privileges.md).  
Para UDFs Python, use `plpythonu`. Para UDFs SQL, use `sql`. Para procedimentos armazenados, use `plpgsql`.

ON COPY JOB *job\$1name*  <a name="on-copy-job"></a>
Concede as permissões especificadas em um esquema.

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]   <a name="grant-for"></a>
Especifica o comando SQL para o qual a permissão é concedida. Você pode especificar ALL para conceder a permissão nas instruções COPY, UNLOAD, EXTERN FUNCTION e CREATE MODEL. Esta cláusula aplica-se apenas à concessão da permissão ASSUMEROLE.

ALTER  
Concede a permissão ALTER aos usuários para adicionar ou remover objetos de uma unidade de compartilhamento de dados ou para definir a propriedade PUBLICACCESSIBLE. Para obter mais informações, consulte [ALTER DATASHARE](r_ALTER_DATASHARE.md).

SHARE  
Concede permissões a usuários e grupos de usuários para adicionar consumidores de dados a uma unidade de compartilhamento de dados. Essa permissão é necessária para permitir que o consumidor específico (conta ou namespace) acesse a unidade de compartilhamento de dados de seus clusters. O consumidor pode ser o mesmo ou de uma conta da AWS diferente, com o mesmo ou um namespace de cluster diferente, conforme especificado por um identificador globalmente exclusivo (GUID).

ON DATASHARE *datashare\$1name*   <a name="grant-datashare"></a>
Concede as permissões especificadas na unidade de compartilhamento de dados de referência. Para obter informações sobre granularidade de controle de acesso de consumidor, consulte [Compartilhamento de dados em diferentes níveis no Amazon Redshift](datashare-overview.md#granularity).

USAGE  
Quando USO é concedido a uma conta de consumidor ou namespace dentro da mesma conta, a conta de consumidor específica ou namespace dentro da conta pode acessar o datashare e os objetos do datashare de forma somente leitura. 

TO NAMESPACE 'clusternamespace GUID'  
Indica um namespace na mesma conta em que os consumidores podem receber as permissões especificadas para a unidade de compartilhamento de dados. Os namespaces usam um GUID alfanumérico de 128 bits.

TO ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
Indica o número de outra conta cujos consumidores podem receber as permissões especificadas para a unidade de compartilhamento de dados. Especificar “VIA DATA CATALOG” indica que você está concedendo o uso da unidade de compartilhamento de dados a uma conta do Lake Formation. Omitir esse parâmetro significa que você está concedendo uso a uma conta que possui o cluster.

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="grant-datashare"></a>
Concede as permissões de uso especificadas no banco de dados especificado que é criado na unidade de compartilhamento de dados especificada.

ON SCHEMA* shared\$1schema*   <a name="grant-datashare"></a>
Concede as permissões especificadas no esquema especificado que é criado na unidade de compartilhamento de dados especificada.

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
Especifica os objetos de banco de dados aos quais conceder permissão. Os parâmetros após IN definem o escopo da permissão concedida.

CREATE MODEL  
Concede a permissão CREATE MODEL a usuários ou grupos de usuários específicos.

ON MODEL *model\$1name*  
Concede a permissão EXECUTE em um modelo específico. 

ACCESS CATALOG  
Concede a permissão para exibir metadados relevantes de objetos aos quais a função tem acesso.

\$1 role \$1 [, ...]  
A função a ser concedida a outra função, um usuário ou PUBLIC.  
PUBLIC representa um grupo que inclui sempre todos os usuários. As permissões de um usuário individual consistem na soma das permissões concedidas a PUBLIC, das permissões concedidas a todos os grupos aos quais o usuário pertence e de quaisquer permissões concedidas ao usuário individualmente.

TO \$1 \$1 *user\$1name* [ WITH ADMIN OPTION ] \$1 \$1 role \$1[, ...]  
Concede a função especificada a um usuário especificado com a WITH ADMIN OPTION, outra função ou PUBLIC.  
A cláusula WITH ADMIN OPTION fornece as opções de administração para todas as funções concedidas a todos os beneficiários. 

EXPLAIN \$1 RLS \$1 MASKING \$1 TO ROLE *rolename*  
Concede permissão para explicar os filtros de política de segurança de uma consulta no plano EXPLAIN a um perfil. RLS concede permissão para explicar filtros de política de segurança por linha. MASKING concede permissão para explicar os filtros da política de mascaramento dinâmico de dados.

IGNORE RLS TO ROLE *rolename*   
Concede permissão para ignorar políticas de segurança por linha para uma consulta a um perfil.

TO \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
Indica a política de segurança que está recebendo as permissões. TO RLS POLICY indica uma política de segurança por linha. TO MASKING POLICY indica uma política de mascaramento dinâmico de dados.

## Observações de uso
<a name="r_GRANT-usage-notes-link"></a>

Para saber mais sobre as observações de uso de GRANT, consulte [Observações de uso](r_GRANT-usage-notes.md).

## Exemplos
<a name="r_GRANT-examples-link"></a>

Para conferir exemplos de como usar GRANT, consulte [Exemplos](r_GRANT-examples.md).

# Observações de uso
<a name="r_GRANT-usage-notes"></a>

Para conceder privilégios a um objeto, você deve atender a um dos seguintes critérios:
+ Ser o proprietário do objeto.
+ Ser um superusuário.
+ Ter um privilégio concedido para o objeto e privilégio.

Por exemplo, o comando a seguir fornece ao usuário HR a capacidade de executar comandos SELECT na tabela de funcionários e conceder e revogar o mesmo privilégio para outros usuários.

```
grant select on table employees to HR with grant option;
```

HR não pode conceder privilégios a nenhuma operação além de SELECT ou a qualquer outra tabela além da de funcionários. 

Por exemplo, o comando a seguir fornece ao usuário HR a capacidade de executar comandos ALTER na tabela de funcionários e conceder e revogar o mesmo privilégio para outros usuários.

```
grant ALTER on table employees to HR with grant option;
```

HR não pode conceder privilégios a nenhuma operação além de ALTER ou a qualquer outra tabela além da de funcionários. 

Ter os privilégios concedidos em uma exibição não significa ter privilégios nas tabelas subjacentes. Da mesma forma, ter os privilégios concedidos em um esquema não significa ter privilégios nas tabelas do esquema. Em vez disso, conceda acesso às tabelas subjacentes explicitamente.

Para conceder privilégios para uma tabela do AWS Lake Formation, a função do IAM associada ao esquema externo da tabela deve ter permissão para conceder privilégios para a tabela externa. O exemplo a seguir cria um esquema externo com uma função do IAM associada `myGrantor`. A função do IAM `myGrantor` tem permissão para conceder permissões a outros. O comando GRANT usa a permissão da função do IAM `myGrantor` que está associada ao esquema externo para conceder permissão para a função do 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';
```

Se você conceder todos os privilégios a uma função do IAM, privilégios individuais serão concedidos no catálogo de dados habilitado para o Lake Formation relacionado. Por exemplo, o comando GRANT ALL a seguir resulta na exibição dos privilégios individuais concedidos (SELECT, ALTER, DROP, DELETE e INSERT) no console do Lake Formation.

```
grant all
on external table mySchema.mytable
to iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

Superusuários podem acessar todos os objetos, independentemente de comandos GRANT e REVOKE que definem privilégios de objeto.

## Observações de uso para controle de acesso no nível da coluna
<a name="r_GRANT-usage-notes-clp"></a>

As observações de uso a seguir são aplicáveis a privilégios de nível de coluna em tabelas e visualizações do Amazon Redshift. Essas notas descrevem tabelas; as mesmas notas são aplicáveis a visualizações, a menos que observemos uma exceção explicitamente. 
+ Para uma tabela do Amazon Redshift, é possível conceder somente os privilégios SELECT e UPDATE em nível da coluna. Para uma exibição do Amazon Redshift, somente é possível conceder o privilégio SELECT em nível de coluna. 
+ A palavra-chave ALL é um sinônimo de privilégios SELECT e UPDATE combinados quando usada no contexto de um GRANT em nível de coluna em uma tabela. 
+ Se você não tiver o privilégio SELECT em todas as colunas de uma tabela, a execução de uma operação SELECT \$1 retornará somente as colunas às quais você tem acesso. Ao usar uma visualização, uma operação SELECT \$1 tenta acessar todas as colunas na visualização. Se você não tiver permissão para acessar todas as colunas, essas consultas apresentarão falha com um erro de permissão negada.
+ SELECT \$1 não se expande apenas a colunas acessíveis nos seguintes casos:
  + Não é possível criar uma visão normal com apenas colunas acessíveis usando SELECT \$1.
  + Não é possível criar uma visão materializada com apenas colunas acessíveis usando SELECT \$1.
+ Se tiver o privilégio SELECT ou UPDATE em uma tabela ou exibição, e adicionar uma coluna, você ainda terá os mesmos privilégios na tabela ou exibição e, portanto, todas as colunas dela. 
+ Somente o proprietário de uma tabela ou um superusuário pode conceder privilégios em nível de coluna. 
+ A cláusula WITH GRANT OPTION não é compatível com privilégios de nível de coluna.
+ Não é possível manter o mesmo privilégio em nível de tabela e em nível de coluna. Por exemplo, o usuário `data_scientist` não pode ter o privilégio SELECT na tabela `employee` e o privilégio SELECT na coluna `employee.department`. Ao conceder o mesmo privilégio a uma tabela e a uma coluna dentro da tabela, considere os seguintes resultados:
  + Se um usuário tiver um privilégio em nível de tabela em uma tabela, conceder o mesmo privilégio em nível de coluna não terá efeito. 
  + Se um usuário tiver um privilégio em nível de tabela em uma tabela, a revogação do mesmo privilégio para uma ou mais colunas da tabela retornará um erro. Em vez disso, revogue o privilégio em nível de tabela. 
  + Se um usuário tiver um privilégio em nível de coluna, conceder o mesmo privilégio em nível de tabela retornará um erro. 
  + Se um usuário tiver um privilégio em nível de coluna, a revogação do mesmo privilégio no nível da tabela revoga os privilégios de coluna e tabela para todas as colunas da tabela. 
+ Não é possível conceder privilégios em nível de coluna em exibições de vinculação tardia.
+ Você deve ter o privilégio SELECT no nível da tabela nas tabelas base para criar uma visão materializada. Mesmo que você tenha privilégios no nível da coluna para colunas específicas, não poderá criar uma visão materializada somente para essas colunas. No entanto, você poderá conceder o privilégio SELECT às colunas de uma visão materializada, semelhante às visualizações regulares. 
+ Para pesquisar concessões de privilégios de nível de coluna, use a exibição [PG\$1ATTRIBUTE\$1INFO](r_PG_ATTRIBUTE_INFO.md). 

## Observações de uso para conceder a permissão ASSUMEROLE
<a name="r_GRANT-usage-notes-assumerole"></a>

As observações de uso a seguir são aplicáveis à concessão da permissão ASSUMEROLE no Amazon Redshift. 

Use a permissão ASSUMEROLE para controlar as permissões de acesso ao perfil do IAM para usuários, perfis e grupos de banco de dados em comandos como COPY, UNLOAD, EXTERNAL FUNCTION ou CREATE MODEL. Depois de conceder a permissão ASSUMEROLE a um usuário, perfil ou grupo para um perfil do IAM, o usuário, perfil ou grupo poderá assumir esse perfil ao executar o comando. A permissão ASSUMEROLE permite que você conceda acesso aos comandos apropriados conforme necessário.

Somente um superusuário de banco de dados pode conceder ou revogar a permissão ASSUMEROLE para usuários, perfis e grupos. Um superusuário sempre mantém a permissão ASSUMEROLE.

Para habilitar o uso da permissão ASSUMEROLE para usuários, perfis e grupos, um superusuário executa estas duas ações:
+ Execute a seguinte instrução uma vez no cluster:

  ```
  revoke assumerole on all from public for all;
  ```
+ Conceda a permissão ASSUMEROLE aos usuários, perfis e grupos para os comandos apropriados.

Você pode especificar o encadeamento de perfis na cláusula ON ao conceder a permissão ASSUMEROLE. É usado vírgula para separar funções em uma cadeia de funções, por exemplo, `Role1,Role2,Role3`. Se o encadeamento de perfis tiver sido especificado ao conceder a permissão ASSUMEROLE, você deverá especificar a cadeia de perfis ao executar operações concedidas pela permissão ASSUMEROLE. Não é possível especificar perfis individuais dentro da cadeia de perfis ao executar operações concedidas pela permissão ASSUMEROLE. Por exemplo, se um usuário, perfil ou grupo receber a cadeia de perfis `Role1,Role2,Role3`, não é possível especificar apenas `Role1` para executar operações. 

Se um usuário tentar executar uma operação COPY, UNLOAD, EXTERNAL FUNCTION ou CREATE MODEL e não tiver recebido a permissão ASSUMEROLE, uma mensagem semelhante à seguinte será exibida.

```
ERROR:  User awsuser does not have ASSUMEROLE permission on IAM role "arn:aws:iam::123456789012:role/RoleA" for COPY 
```

Para listar usuários que receberam acesso a perfis do IAM e comandos por meio da permissão ASSUMEROLE, consulte [HAS\$1ASSUMEROLE\$1PRIVILEGE](r_HAS_ASSUMEROLE_PRIVILEGE.md). Para listar os perfis do IAM e as permissões comandos que foram concedidos a um usuário especificado, consulte [PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER](PG_GET_IAM_ROLE_BY_USER.md). Para listar usuários, perfis e grupos que receberam acesso a um perfil do IAM especificado por você, consulte [PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE](PG_GET_GRANTEE_BY_IAMROLE.md).

## Observações de uso para conceder permissões de machine learning
<a name="r_GRANT-usage-notes-create-model"></a>

Você não pode conceder ou revogar diretamente as permissões relacionadas a uma função de ML. Uma função de ML pertence a um modelo de ML, e as permissões são controladas por meio do modelo. Em vez disso, você pode conceder permissões relacionadas ao modelo de ML. O exemplo a seguir demonstra como conceder permissões a todos os usuários para executar a função de ML associada ao modelo `customer_churn`.

```
GRANT EXECUTE ON MODEL customer_churn TO PUBLIC;
```

Você também pode conceder todas as permissões a um usuário para o modelo de ML `customer_churn`.

```
GRANT ALL on MODEL customer_churn TO ml_user;
```

A concessão da permissão `EXECUTE` relacionada a uma função de ML falhará se houver uma função de ML no esquema, mesmo que essa função de ML já tenha a permissão `EXECUTE` por meio de `GRANT EXECUTE ON MODEL`. Recomendamos usar um esquema separado ao usar o comando `CREATE MODEL` para manter as funções de ML em um esquema separado. O exemplo a seguir demonstra como fazer isso.

```
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'
);
```

# Exemplos
<a name="r_GRANT-examples"></a>

 O exemplo a seguir concede o privilégio SELECT na tabela SALES ao usuário `fred`. 

```
grant select on table sales to fred;
```

O exemplo a seguir concede o privilégio SELECT em todas as tabelas no esquema QA\$1TICKIT ao usuário `fred`. 

```
grant select on all tables in schema qa_tickit to fred;
```

O exemplo a seguir concede todos os privilégios de esquema no esquema QA\$1TICKIT ao grupo de usuários QA\$1USERS. Os privilégios de esquema são CREATE e USAGE. USAGE permite que os usuários acessem os objetos no esquema, mas não concede privilégios como INSERT ou SELECT em tais objetos. Conceder privilégios em cada objeto separadamente.

```
create group qa_users;
grant all on schema qa_tickit to group qa_users;
```

O exemplo a seguir concede todos os privilégios na tabela SALES no esquema QA\$1TICKIT a todos os usuários do grupo QA\$1USERS.

```
grant all on table qa_tickit.sales to group qa_users;
```

O exemplo a seguir concede todos os privilégios na tabela SALES no esquema QA\$1TICKIT a todos os usuários dos grupos QA\$1USERS e RO\$1USERS.

```
grant all on table qa_tickit.sales to group qa_users, group ro_users;
```

O exemplo a seguir concede o privilégio DROP na tabela SALES no esquema QA\$1TICKIT a todos os usuários no grupo QA\$1USERS.

```
grant drop on table qa_tickit.sales to group qa_users;>
```

A sequência de comandos a seguir mostra como o acesso a um esquema não concede privilégios a uma tabela no 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)
```

A sequência de comandos a seguir mostra como o acesso a uma exibição não implica acesso às suas tabelas subjacentes. O usuário chamado VIEW\$1USER não pode selecionar da tabela DATE, embora todos os privilégios de VIEW\$1DATE tenham sido concedidos a ele. 

```
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
```

O exemplo a seguir concede o privilégio SELECT nas colunas `cust_name` e `cust_phone` da tabela `cust_profile` ao usuário `user1`. 

```
grant select(cust_name, cust_phone) on cust_profile to user1;
```

O exemplo a seguir concede o privilégio SELECT nas colunas `cust_name` e `cust_phone`, e o privilégio UPDATE na coluna `cust_contact_preference` da tabela `cust_profile` ao grupo `sales_group`. 

```
grant select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile to group sales_group;
```

O exemplo a seguir mostra o uso da palavra-chave ALL para conceder privilégios SELECT e UPDATE em três colunas da tabela `cust_profile` ao grupo `sales_admin`. 

```
grant ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile to group sales_admin;
```

O exemplo a seguir concede o privilégio SELECT na coluna `cust_name` da exibição `cust_profile_vw` ao usuário `user2`. 

```
grant select(cust_name) on cust_profile_vw to user2;
```

## Exemplos da concessão de acesso a unidades de compartilhamento de dados
<a name="r_GRANT-examples-datashare"></a>

Os exemplos a seguir mostram permissões de uso de datashare GRANT em um banco de dados específico ou esquema criado a partir de um datashare. 

No exemplo a seguir, um administrador no lado do produtor concede a permissão USAGE na unidade de compartilhamento de dados `salesshare` ao namespace especificado. 

```
GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

No exemplo a seguir, um administrador no lado do consumidor concede a permissão USAGE no `sales_db` a `Bob`.

```
GRANT USAGE ON DATABASE sales_db TO Bob;
```

No exemplo a seguir, um administrador no lado do consumidor concede a permissão GRANT USAGE no esquema `sales_schema` à função `Analyst_role`. `sales_schema` é um esquema externo que aponta para sales\$1db.

```
GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
```

Neste ponto, `Bob` e `Analyst_role` podem ter acesso a todos os objetos do banco de dados em `sales_schema` e `sales_db`.

O exemplo a seguir mostra a concessão de permissão adicional no nível do objeto para objetos em um banco de dados compartilhado. Essas permissões extras só serão necessárias se o comando CREATE DATABASE usado para criar o banco de dados compartilhado usar a cláusula WITH PERMISSIONS. Se o comando CREATE DATABASE não usou WITH PERMISSIONS, a concessão de USAGE no banco de dados compartilhado concede acesso total a todos os objetos nesse banco de dados.

```
GRANT SELECT ON sales_db.sales_schema.tickit_sales_redshift to Bob;
```

## Exemplos de concessão de permissões em escopo definido
<a name="r_GRANT-examples-scoped"></a>

O exemplo a seguir concede uso para todos os esquemas atuais e futuros no banco de dados `Sales_db` à função `Sales`.

```
GRANT USAGE FOR SCHEMAS IN DATABASE Sales_db TO ROLE Sales;
```

O exemplo a seguir concede a permissão SELECT para todas as tabelas atuais e futuras no banco de dados `Sales_db` ao usuário `alice` e também dá a `alice` a permissão para conceder permissões em escopo em tabelas em `Sales_db` a outros usuários.

```
GRANT SELECT FOR TABLES IN DATABASE Sales_db TO alice WITH GRANT OPTION;
```

O exemplo a seguir concede a permissão EXECUTE para funções no esquema `Sales_schema` ao usuário `bob`.

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

O exemplo a seguir concede todas as permissões para todas as tabelas no esquema do `ShareSchema` do banco de dados `ShareDb` à função `Sales`. Ao especificar o esquema, você pode especificar o banco de dados do esquema usando o formato de duas partes `database.schema`.

```
GRANT ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema TO ROLE Sales;
```

O exemplo a seguir é o mesmo do anterior. Você pode especificar o banco de dados usando a palavra-chave `DATABASE`, em vez de usar um formato de duas partes.

```
GRANT ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb TO ROLE Sales;
```

## Exemplos de concessão do privilégio ASSUMEROLE
<a name="r_GRANT-examples-assumerole"></a>

Veja a seguir exemplos de concessão do privilégio ASSUMEROLE.

O exemplo a seguir mostra a instrução REVOKE que um superusuário executa uma vez no cluster para habilitar o uso do privilégio ASSUMEROLE para usuários e grupos. Em seguida, o superusuário concede o privilégio ASSUMEROLE aos usuários e grupos para os comandos apropriados. Para obter informações sobre como habilitar o uso do privilégio ASSUMEROLE para usuários e grupos, consulte [Observações de uso para conceder a permissão ASSUMEROLE](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole).

```
revoke assumerole on all from public for all;
```

O exemplo a seguir concede o privilégio ASSUMEROLE ao usuário `reg_user1` para a função do IAM `Redshift-S3-Read` para executar operações COPY. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-S3-Read'
to reg_user1 for copy;
```

O exemplo a seguir concede o privilégio ASSUMEROLE ao usuário `reg_user1` para a cadeia de função do IAM `RoleA` e `RoleB` para executar operações COPY. 

```
grant assumerole
on 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB'
to reg_user1
for unload;
```

Veja a seguir um exemplo do comando UNLOAD usando a cadeia de função do IAM `RoleA` e `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';
```

O exemplo a seguir concede o privilégio ASSUMEROLE ao usuário `reg_user1` para a função do IAM `Redshift-Exfunc` para criar funções externas. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-Exfunc'
to reg_user1 for external function;
```

O exemplo a seguir concede o privilégio ASSUMEROLE ao usuário `reg_user1` para a função do IAM `Redshift-model` para criar modelos de Machine Learning. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-ML'
to reg_user1 for create model;
```

## Exemplos de concessão do privilégio ROLE
<a name="r_GRANT-examples-role"></a>

O exemplo a seguir concede a função sample\$1role1 ao usuário user1.

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
```

O exemplo a seguir concede sample\$1role1 ao user1 com a WITH ADMIN OPTION, define a sessão atual para user1 e user1 concede sample\$1role1 ao user2.

```
GRANT ROLE sample_role1 TO user1 WITH ADMIN OPTION;
SET SESSION AUTHORIZATION user1;
GRANT ROLE sample_role1 TO user2;
```

O exemplo a seguir concede a função sample\$1role1 a sample\$1role2.

```
GRANT ROLE sample_role1 TO ROLE sample_role2;
```

O exemplo a seguir concede a função sample\$1role2 a sample\$1role3 e sample\$1role4. Em seguida, ele tenta 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
```

O exemplo a seguir concede privilégios de sistema CREATE USER a sample\$1role1.

```
GRANT CREATE USER TO ROLE sample_role1;
```

O exemplo a seguir concede a função definida pelo sistema `sys:dba` a user1.

```
GRANT ROLE sys:dba TO user1;
```

O exemplo a seguir tenta conceder sample\$1role3 em uma dependência 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**
+ [Sintaxe](#r_INSERT_30-synopsis)
+ [Parâmetros](#r_INSERT_30-parameters)
+ [Observações de uso](#r_INSERT_30_usage_notes)
+ [Exemplos de INSERT](c_Examples_of_INSERT_30.md)

Insere novas linhas em uma tabela, Você pode inserir uma única linha com a sintaxe VALUES, várias linhas com a sintaxe VALUES, ou uma ou mais linhas definidas pelos resultados de uma consulta (INSERT INTO...SELECT).

**nota**  
Recomendamos veementemente o uso do comando [COPY](r_COPY.md) para carregar grandes quantidades de dados. O uso de instruções INSERT individuais para povoar uma tabela pode ser proibitivamente lento. Como alternativa, se seus dados já existirem em outras tabelas de banco de dados do Amazon Redshift, use INSERT INTO SELECT ou [CREATE TABLE AS](r_CREATE_TABLE_AS.md) para melhorar a performance. Para obter mais informações sobre o uso do comando COPY para carregar tabelas, consulte [Carregar dados no Amazon Redshift](t_Loading_data.md).

**nota**  
O tamanho máximo de uma única instrução SQL é 16 MB.

## Sintaxe
<a name="r_INSERT_30-synopsis"></a>

```
INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
```

## Parâmetros
<a name="r_INSERT_30-parameters"></a>

 *table\$1name*   
Uma tabela temporária ou persistente. Somente o proprietário da tabela ou um usuário com o privilégio INSERT na tabela pode inserir linhas. Se usar a cláusula de *consulta* para inserir linhas, você deve ter o privilégio SELECT nas tabelas mencionadas na consulta.   
Use INSERT (tabela externa) para inserir resultados de uma consulta SELECT em tabelas existentes no catálogo externo. Para obter mais informações, consulte [INSERT (tabela externa)](r_INSERT_external_table.md).

 *column*   
Você pode inserir valores em uma ou mais colunas da tabela. Você pode listar os nomes de colunas de destino em qualquer ordem. Se você não especificar uma lista de colunas, os valores a serem inseridos deverão corresponder a colunas de tabela na ordem em que foram declaradas na instrução CREATE TABLE. Se o número de valores a serem inseridos for menor do que o número de colunas na tabela, as primeiras *n* colunas serão carregadas.   
O valor padrão declarado ou um valor nulo é carregado em qualquer coluna que não esteja listada (implícita ou explicitamente) na instrução INSERT. 

DEFAULT VALUES   
Se, durante a criação da tabela, tiverem sido atribuídos valores padrão às colunas na tabela, use essas palavras-chave para inserir uma linha que consista totalmente em valores padrão. Se alguma coluna não tiver valores padrão, valores nulos serão inseridos nela. Se qualquer uma das colunas for declarada NOT NULL, a instrução INSERT retornará um erro. 

VALUES   
Use esta palavra-chave para inserir uma ou mais linhas, cada linha consistindo em um ou mais valores. A lista VALUES de cada linha deve estar alinhada com a lista de colunas. Para inserir várias linhas, use um delimitador de vírgula entre cada lista de expressões. Não repita a palavra-chave VALUES. Todas as listas VALUES para uma instrução INSERT de várias linhas devem conter o mesmo número de valores. 

 *expressão*   
Um único valor ou uma expressão que avalia um único valor. Cada valor deve ser compatível com o tipo de dados da coluna em que está sendo inserido. Se possível, um valor cujo tipo de dados não corresponde ao tipo de dados declarado da coluna será convertido automaticamente em um tipo de dados compatível. Por exemplo:   
+ Um valor decimal `1.1` é inserido em uma coluna INT como `1`. 
+ Um valor decimal `100.8976` é inserido em uma coluna DEC(5,2) como `100.90`. 
Você pode converter explicitamente um valor em um tipo de dados compatível incluindo o tipo de sintaxe cast na expressão. Por exemplo, se a coluna COL1 na tabela T1 for uma coluna CHAR(3):   

```
insert into t1(col1) values('Incomplete'::char(3));
```
Esta instrução insere o valor `Inc` na coluna.   
Para uma instrução INSERT VALUES de linha única, você pode usar uma subconsulta escalar como uma expressão. O resultado da subconsulta é inserido na coluna apropriada.   
Subconsultas não são compatíveis como expressões para instruções INSERT VALUES de várias linhas. 

DEFAULT   
Use esta palavra-chave para inserir o valor padrão de uma coluna, como definido quando a tabela foi criada. Se não existir um valor padrão para uma coluna, um valor "null" será inserido. Você não poderá inserir um valor padrão em uma coluna com restrição NOT NULL se a coluna não tiver um valor padrão explícito atribuído a ela na instrução CREATE TABLE. 

 *query*   
Insira uma ou mais linhas na tabela definindo qualquer consulta. Todas as linhas que a consulta produz são inseridas na tabela. A consulta deve retornar uma lista de colunas compatíveis com as colunas na tabela, mas os nomes das colunas não precisam obrigatoriamente corresponder. 

## Observações de uso
<a name="r_INSERT_30_usage_notes"></a>

**nota**  
Recomendamos veementemente o uso do comando [COPY](r_COPY.md) para carregar grandes quantidades de dados. O uso de instruções INSERT individuais para povoar uma tabela pode ser proibitivamente lento. Como alternativa, se seus dados já existirem em outras tabelas de banco de dados do Amazon Redshift, use INSERT INTO SELECT ou [CREATE TABLE AS](r_CREATE_TABLE_AS.md) para melhorar a performance. Para obter mais informações sobre o uso do comando COPY para carregar tabelas, consulte [Carregar dados no Amazon Redshift](t_Loading_data.md).

O formato de dados dos valores inseridos deve corresponder ao formato de dados especificado pela definição de CREATE TABLE. 

 Depois de inserir um grande número de linhas novas em uma tabela: 
+ Limpe a tabela para recuperar espaço e reclassificar as linhas. 
+ Analise a tabela para atualizar as estatísticas do planejador de consulta. 

Quando os valores são inseridos em colunas DECIMAIS e ultrapassam a escala especificada, os valores carregados são arredondados para cima, conforme apropriado. Por exemplo, quando um valor `20.259` é inserido em uma coluna DECIMAL(8,2), o valor armazenado é `20.26`. 

É possível inserir uma coluna GENERATED BY DEFAULT AS IDENTITY. Você pode atualizar as colunas definidas como GENERATED BY DEFAULT AS IDENTITY com os valores fornecidos. Para obter mais informações, consulte [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

# Exemplos de INSERT
<a name="c_Examples_of_INSERT_30"></a>

A tabela CATEGORY no banco de dados TICKIT contém as seguintes linhas: 

```
 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)
```

 Crie uma tabela CATEGORY\$1STAGE com um esquema semelhante ao da tabela CATEGORY, mas defina os valores padrão para as colunas: 

```
create table category_stage
(catid smallint default 0,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');
```

A instrução INSERT a seguir seleciona todas as linhas da tabela CATEGORY e as insere na tabela CATEGORY\$1STAGE. 

```
insert into category_stage
(select * from category);
```

Os parênteses em volta da consulta são opcionais.

Este comando insere uma nova linha na tabela CATEGORY\$1STAGE com um valor especificado para cada coluna em ordem: 

```
insert into category_stage values
(12, 'Concerts', 'Comedy', 'All stand-up comedy performances');
```

Você também pode inserir uma nova linha que combina valores específicos e valores padrão: 

```
insert into category_stage values
(13, 'Concerts', 'Other', default);
```

Execute a consulta a seguir para obter as linhas inseridas: 

```
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)
```

Os exemplos a seguir mostram algumas instruções INSERT VALUES de várias linhas. O primeiro exemplo insere valores CATID específicos para duas linhas e valores padrão para outras colunas em ambas as linhas. 

```
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)
```

O próximo exemplo insere três linhas com várias combinações de valores específicos e valores padrão: 

```
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)
```

Neste exemplo, o primeiro conjunto de VALUES produz os mesmos resultados que especificar DEFAULT VALUES para uma instrução INSERT de linha única.

Os exemplos a seguir mostram o comportamento de INSERT quando uma tabela tem uma coluna IDENTITY. Primeiro, crie uma nova versão de tabela CATEGORY, depois insira linhas de CATEGORY nela: 

```
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;
```

Observe que você não pode inserir valores inteiros específicos na coluna CATID IDENTITY. Os valores da coluna IDENTITY são gerados automaticamente.

O exemplo a seguir demonstra que subconsultas não podem ser usadas como expressões em instruções INSERT VALUES de várias linhas: 

```
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
```

O exemplo a seguir mostra uma inserção em uma tabela temporária preenchida com dados da tabela `venue` usando a cláusula `WITH SELECT`. Para obter mais informações sobre a tabela `venue`, consulte [Banco de dados de exemplo](c_sampledb.md).

Primeiro, crie a tabela temporária `#venuetemp`.

```
CREATE TABLE #venuetemp AS SELECT * FROM venue;
```

Liste as linhas na tabela `#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	
...
```

Insira dez linhas duplicadas na tabela `#venuetemp` usando a cláusula `WITH SELECT`.

```
INSERT INTO #venuetemp (WITH venuecopy AS (SELECT * FROM venue) SELECT * FROM venuecopy ORDER BY 1 LIMIT 10);
```

Liste as linhas na tabela `#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 (tabela externa)
<a name="r_INSERT_external_table"></a>

Insere o resultado de uma consulta SELECT em tabelas externas ou catálogos externos existentes, como o AWS Glue, o AWS Lake Formation ou um metastore do Apache Hive. Use a mesma função do AWS Identity and Access Management (IAM) usada para o comando CREATE EXTERNAL SCHEMA para interagir com catálogos externos e com o Amazon S3.

Para tabelas não particionadas, o comando INSERT (tabela externa) grava dados no local do Amazon S3 definido na tabela, com base nas propriedades de tabela e no formato de arquivo especificados.

Para tabelas particionadas, INSERT (tabela externa) grava dados no local do Amazon S3 de acordo com a chave de partição especificada na tabela. Ele também registra novas partições no catálogo externo após a operação INSERT ser concluída.

Não é possível executar INSERT (tabela externa) em um bloco de transação (BEGIN ... END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 

## Sintaxe
<a name="r_INSERT_external_table-synopsis"></a>

```
INSERT INTO external_schema.table_name
{ select_statement }
```

## Parâmetros
<a name="r_INSERT_external_table-parameters"></a>

 *external\$1schema.table\$1name*   
O nome de um esquema externo existente e uma tabela externa de destino na qual será inserido.

 *select\$1statement*   
Uma instrução que insere uma ou mais linhas na tabela externa ao definir qualquer consulta. Todas as linhas que a consulta gera são gravadas no Amazon S3 no formato de texto ou Parquet com base na definição da tabela. A consulta deve retornar uma lista de colunas que seja compatível com os tipos de dados da coluna na tabela externa. No entanto, os nomes das colunas não precisam corresponder.

## Observações de uso
<a name="r_INSERT_external_table_usage_notes"></a>

O número de colunas na consulta SELECT deve ser igual à soma de colunas de dados e de colunas de partição. O local e o tipo de dados de cada coluna de dados deve corresponder àqueles da tabela externa. O local das colunas de partição devem estar no final da consulta SELECT, na mesma ordem definida no comando CREATE EXTERNAL TABLE. Os nomes das colunas não precisam corresponder.

Em alguns casos, talvez você queira executar o comando INSERT (tabela externa) em um catálogo de dados do AWS Glue ou um metastore do Hive. No caso do AWS Glue, a função do IAM usada para criar o esquema externo deve ter as permissões de leitura e gravação no Amazon S3 e no AWS Glue. Se você usar um catálogo do AWS Lake Formation, essa função do IAM se tornará a proprietária da nova tabela do Lake Formation. Essa função do IAM deve ter pelo menos as seguintes permissões: 
+ Permissão SELECT, INSERT, UPDATE na tabela externa
+ Permissão do local dos dados no caminho do Amazon S3 da tabela externa

Para garantir que os nomes dos arquivos sejam únicos, o Amazon Redshift usa o seguinte formato para o nome de cada arquivo carregado no Amazon S3 por padrão. 

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

Um exemplo é `20200303_004509_810669_1007_0001_part_00.parquet`.

Considere o seguinte ao executar o comando INSERT (tabela externa):
+ Não há suporte para tabelas externas com formato diferente de PARQUET ou TEXTFILE.
+ Este comando oferece suporte às propriedades de tabela existentes, como 'write.parallel', 'write.maxfilesize.mb', 'compression\$1type’ e 'serialization.null.format'. Para atualizar esses valores, execute o comando ALTER TABLE SET TABLE PROPERTIES.
+ A propriedade de tabela 'numRows’ é automaticamente atualizada no final da operação INSERT. A propriedade da tabela deve estar definida ou ter sido adicionada à tabela, caso ela não tenha sido criada pela operação CREATE EXTERNAL TABLE AS.
+ Não há suporte para a cláusula LIMIT na consulta SELECT externa. Em vez disso, use uma cláusula LIMIT aninhada.
+ É possível usar a tabela [STL\$1UNLOAD\$1LOG](r_STL_UNLOAD_LOG.md) para rastrear os arquivos que foram gravados no Amazon S3 por cada operação INSERT (tabela externa).
+ O Amazon Redshift suporta somente a criptografia padrão do Amazon S3 para INSERT (tabela externa).

## Exemplos de INSERT (tabela externa)
<a name="c_Examples_of_INSERT_external_table"></a>

O exemplo a seguir insere os resultados da instrução SELECT na tabela externa.

```
INSERT INTO spectrum.lineitem
SELECT * FROM local_lineitem;
```

O exemplo a seguir insere os resultados da instrução SELECT em uma tabela externa particionada usando o particionamento estático. As colunas de partição são codificadas na instrução SELECT. As colunas de partição devem estar no final da consulta.

```
INSERT INTO spectrum.customer
SELECT name, age, gender, 'May', 28 FROM local_customer;
```

O exemplo a seguir insere os resultados da instrução SELECT em uma tabela externa particionada usando o particionamento dinâmico. As colunas de partição não são codificadas. Os dados são adicionados automaticamente às pastas de partição existentes ou a novas pastas se uma nova partição for adicionada.

```
INSERT INTO spectrum.customer
SELECT name, age, gender, month, day FROM local_customer;
```

# LOCK
<a name="r_LOCK"></a>

Restringe acesso a uma tabela de banco de dados. Este comando só é significativo quando executado em um bloco de transação.

O comando LOCK gera um bloqueio de tabela no modo "ACCESS EXCLUSIVE", aguardando, caso necessário, qualquer conflito de bloqueio ser liberado. Com esse tipo de bloqueio explícito, as leituras e gravações na tabela esperam ao receber tentativas de outras transações e sessões. Um bloqueio de tabela explícito criado por um usuário impede temporariamente que outro usuário selecione dados dessa tabela ou carregue dados nela. O bloqueio é liberado quando a transação que contém o comando LOCK é concluída.

Os bloqueios menos restritivos de tabela são adquiridos implicitamente por comandos que mencionam as tabelas, como operações de gravação. Por exemplo, se um usuário tentar ler os dados de uma tabela enquanto outro usuário atualiza a tabela, os dados lidos serão um snapshot dos dados que já estiverem confirmados. (Em alguns casos, as consultas serão interrompidas se violarem regras de isolamento serializável.) Consulte [Gerenciamento de operações de gravação simultâneas](c_Concurrent_writes.md).

Algumas operações DDL, como DROP TABLE e TRUNCATE, criam bloqueios exclusivos. Essas operações impedem a leitura de dados.

Se ocorrer um conflito de bloqueio, o Amazon Redshift exibirá uma mensagem de erro para alertar o usuário que começou a transação conflitante. A transação que recebeu o conflito de bloqueio é interrompida. Toda vez que um conflito de bloqueio ocorre, o Amazon Redshift grava uma entrada na tabela [STL\$1TR\$1CONFLICT](r_STL_TR_CONFLICT.md).

## Sintaxe
<a name="section_r_LOCK-synopsis"></a>

```
LOCK [ TABLE ] table_name [, ...]
```

## Parâmetros
<a name="parameters"></a>

TABLE   
Palavra-chave opcional.

 *table\$1name*   
Nome da tabela a ser bloqueada. Você pode bloquear mais de uma tabela usando uma lista de nomes de tabelas separados por vírgulas. Você não pode bloquear visualizações. 

## Exemplo
<a name="example2"></a>

```
begin;

lock event, sales;

...
```

# MERGE
<a name="r_MERGE"></a>

Mescla condicionalmente as linhas de uma tabela de origem em uma tabela de destino. Tradicionalmente, isso só pode ser feito usando várias instruções insert, update ou delete separadamente. Para obter mais informações sobre as operações que MERGE 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).

## Sintaxe
<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 ]
```

## Parâmetros
<a name="r_MERGE-parameters"></a>

 *target\$1table*  
A tabela temporária ou permanente de destino da instrução MERGE.

 *source\$1table*  
A tabela temporária ou permanente que fornece as linhas a serem mescladas em *target\$1table*. *source\$1table* também pode ser uma tabela do Spectrum. 

 *alias*  
O nome alternativo temporário para *source\$1table*.  
Esse parâmetro é opcional. O *alias* precedente com AS também é opcional.

 *match\$1condition*  
Especifica predicados iguais entre a coluna da tabela de origem e a coluna da tabela de destino que são usados para determinar se as linhas em *source\$1table* podem ser combinadas com as linhas em *target\$1table*. Se a condição for atendida, MERGE executará *matched\$1clause* para essa linha. Caso contrário, MERGE executará *not\$1matched\$1clause* para essa linha.

WHEN MATCHED  
 Especifica a ação a ser executada quando a condição de correspondência entre uma linha de origem e uma linha de destino é avaliada como True. Você pode especificar uma ação UPDATE ou uma ação DELETE. 

UPDATE  
 Atualiza a linha correspondente em *target\$1table*. Somente os valores no *col\$1name* que você especificar serão atualizados. 

DELETE  
 Exclui a linha correspondente em *target\$1table*. 

WHEN NOT MATCHED  
 Especifica a ação a ser executada quando a condição de correspondência é avaliada como False ou Unknown. Você só pode especificar a ação de inserção INSERT para essa cláusula. 

INSERT  
 Insere linhas de *source\$1table* em *target\$1table* que não correspondem a nenhuma linha em *target\$1table*, de acordo com *match\$1condition*. O *col\$1name* de destino pode ser listado em qualquer ordem. Se você não fornecer nenhum valor de *col\$1name*, a ordem padrão será todas as colunas da tabela na ordem declarada. 

 *col\$1name*  
Um ou mais nomes de coluna que você deseja modificar. Não inclui o nome da tabela ao especificar a coluna de destino.

 *expr*  
A expressão que define o novo valor para *col\$1name*.

 REMOVE DUPLICATES  
Especifica que o comando MERGE é executado no modo simplificado. O modo simplificado tem os seguintes requisitos:  
+  *target\$1table* e *source\$1table* devem ter o mesmo número de colunas, tipos de coluna compatíveis e a mesma ordem de coluna. 
+  A cláusula WHEN e as cláusulas UPDATE e INSERT devem ser omitidas do comando MERGE. 
+  A cláusula REMOVE DUPLICATES deve ser usada no comando MERGE. 
No modo simplificado, o MERGE faz o seguinte:  
+  As linhas em *target\$1table* que têm uma correspondência em *source\$1table* são atualizadas para corresponder aos valores em *source\$1table*. 
+  As linhas em *source\$1table* que não têm uma correspondência em *target\$1table* são inseridas em *target\$1table*. 
+  Quando várias linhas em *target\$1table* correspondem à mesma linha em *source\$1table*, as linhas duplicadas são removidas. O Amazon Redshift mantém uma única linha e a atualiza. As linhas duplicadas que não correspondem a uma linha em *source\$1table* permanecem inalteradas. 
REMOVE DUPLICATES oferece melhor performance do que WHEN MATCHED e WHEN NOT MATCHED. Recomendamos usar REMOVE DUPLICATES se *target\$1table* e *source\$1table* forem compatíveis e você não precisar preservar linhas duplicadas em *target\$1table*.

## Observações de uso
<a name="r_MERGE_usage_notes"></a>
+ Para executar instruções MERGE, você deve ser o proprietário das tabelas *source\$1table* e *target\$1table* ou ter a permissão SELECT para essas tabelas. Além disso, você deve ter as permissões UPDATE, DELETE e INSERT para *target\$1table*, dependendo das operações incluídas em sua instrução MERGE.
+  *target\$1table* não pode ser uma tabela do sistema, tabela de catálogo ou tabela externa. 
+  *source\$1table* e *target\$1table* não podem ser a mesma tabela. 
+  Não é possível usar a cláusula WITH em uma instrução MERGE. 
+  As linhas em *target\$1table* não podem estabelecer correspondência com várias linhas em *source\$1table*. 

  Considere o seguinte exemplo:

  ```
  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.
  ```

  Nas duas instruções MERGE, a operação falha porque há várias linhas na tabela `source` com um valor de ID de `1`.
+  *match\$1condition* e *expr* não podem fazer referência parcial a colunas do tipo SUPER. Por exemplo, se seu objeto do tipo SUPER for uma matriz ou uma estrutura, você não poderá usar elementos individuais dessa coluna para *match\$1condition* ou *expr*, mas poderá usar a coluna inteira. 

  Considere o seguinte exemplo:

  ```
  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 obter mais informações sobre o tipo SUPER, consulte [Tipo SUPER](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html).
+ Se *source\$1table* for grande, definir as colunas de junção de *target\$1table* e *source\$1table* como chaves de distribuição poderá melhorar a performance.
+ Para usar a cláusula REMOVE DUPLICATES, você precisa das permissões SELECT, INSERT e DELETE para *target\$1table*.
+  *source\$1table* pode ser uma visualização ou subconsulta. Veja a seguir um exemplo de uma instrução MERGE em que *source\$1table* é uma subconsulta que remove linhas 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);
  ```
+ O destino não pode ser uma fonte de dados de nenhuma subconsulta da mesma instrução MERGE. Por exemplo, o comando SQL a seguir retorna um erro como ERRO: a visualização/subconsulta de origem na instrução MERGE não pode fazer referência à tabela de destino. porque a subconsulta faz referência a `target` em vez de `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);
  ```

## Exemplos
<a name="sub-examples-merge"></a>

O exemplo a seguir cria duas tabelas e executa uma operação MERGE nelas, atualizando as linhas correspondentes na tabela de destino e inserindo linhas que não correspondem. Depois, ele insere outro valor na tabela de origem e executa outra operação MERGE, desta vez excluindo as linhas correspondentes e inserindo a nova linha da tabela de origem.

Primeiro, crie e preencha as tabelas de origem e de 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)
```

Depois, mescle a tabela de origem com a tabela de destino, atualizando a tabela de destino com linhas correspondentes e insira linhas da tabela de origem que não tenham correspondência.

```
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)
```

Observe que as linhas com valores de id 102 e 103 são atualizadas para corresponder aos valores dos nomes da tabela de destino. Além disso, uma nova linha com um valor de id 104 e o valor de nome Bill é inserida na tabela de destino.

Depois, insira uma nova linha na tabela de origem.

```
INSERT INTO source VALUES (105, 'David');

SELECT * FROM source;
 id  |    name
-----+------------
 102 | Tony
 103 | Alice
 104 | Bill
 105 | David
(4 rows)
```

Por fim, execute uma operação de mesclagem excluindo linhas correspondentes na tabela de destino e inserindo linhas que não correspondem.

```
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)
```

As linhas com valores de id 102, 103 e 104 são excluídas da tabela de destino, e uma nova linha com um valor de id 105 e valor de nome David é inserida na tabela de destino.

O exemplo a seguir mostra a sintaxe simplificada de um comando MERGE que usa a 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)
```

O exemplo a seguir mostra a sintaxe simplificada de um comando MERGE que usa a cláusula REMOVE DUPLICATES, que remove linhas duplicadas de *target\$1table* quando elas têm linhas correspondentes em *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)
```

Depois que MERGE é executado, há apenas uma linha com um valor de ID de 23 em *target\$1table*. Como não havia nenhuma linha em *source\$1table* com o valor de ID 30, as duas linhas duplicadas com valores de ID de 30 permanecem em *target\$1table*.

## Consulte também
<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 uma instrução para execução. 

PREPARE cria uma instrução preparada. Quando a instrução PREPARE é executada, a instrução especificada (SELECT, INSERT, UPDATE ou DELETE) é analisada, reescrita e planejada. Quando um comando EXECUTE é emitido para a instrução preparada, o Amazon Redshift pode optar por revisar o plano de execução da consulta (para melhorar a performance com base nos valores de parâmetro especificados) antes de executar a instrução preparada. 

## Sintaxe
<a name="r_PREPARE-synopsis"></a>

```
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
```

## Parâmetros
<a name="r_PREPARE-parameters"></a>

 *plan\$1name*   
Nome arbitrário dado a esta instrução preparada em particular. Deve ser exclusivo em uma única sessão e é usado subsequentemente para executar ou liberar uma instrução preparada anteriormente.

 *tipodedados*   
Tipo de dados de um parâmetro da instrução preparada. Para consultar os parâmetros na própria instrução preparada, use \$11, \$12 e assim por diante, até no máximo \$132767.

 *instrução *   
Qualquer instrução SELECT, INSERT, UPDATE ou DELETE.

## Observações de uso
<a name="r_PREPARE_usage_notes"></a>

Instruções preparadas podem ter parâmetros: valores que são substituídos quando a instrução é executada. Para incluir parâmetros em uma instrução preparada, forneça uma lista de tipos de dados na instrução PREPARE e, na própria instrução a ser preparada, procure os parâmetros por posição usando a anotação \$11, \$12, ... O número máximo de parâmetros é 32.767. Ao executar a instrução, especifique os valores reais para esses parâmetros da instrução EXECUTE. Para obter mais detalhes, consulte [EXECUTE](r_EXECUTE.md). 

Instruções preparadas duram somente a sessão atual. Quando a sessão termina, a instrução preparada é descartada e deve ser recriada antes de ser usada novamente. Isso também significa que uma única instrução preparada não pode ser usada por vários clientes de banco de dados ao mesmo tempo. No entanto, cada cliente pode criar sua própria instrução preparada para usar. A instrução preparada pode ser removida manualmente usando o comando DEALLOCATE. 

Instruções preparadas têm a maior vantagem de performance quando uma única sessão está sendo usada para executar um grande número de instruções semelhantes. Como mencionado, para cada nova execução de instrução preparada, o Amazon Redshift pode revisar o plano de execução da consulta para melhorar a performance com base nos valores de parâmetro especificados. Para examinar o plano de execução de consulta escolhido pelo Amazon Redshift para qualquer comando EXECUTE específico, use o comando [EXPLAIN](r_EXPLAIN.md). 

Para obter mais informações sobre o planejamento de consultas e as estatísticas coletadas pelo Amazon Redshift para otimização de consulta, consulte o comando [ANALYZE](r_ANALYZE.md). 

## Exemplos
<a name="sub-examples-prepare"></a>

Crie uma tabela temporária, prepare a instrução INSERT e execute-a:

```
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 uma instrução SELECT e execute-a:

```
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;
```

## Consulte também
<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>

Atualiza uma visualização materializada.

Quando você cria uma visão materializada, seu conteúdo reflete o estado da tabela ou das tabelas do banco de dados subjacente na ocasião. Os dados na visão materializada permanecem inalterados, mesmo quando aplicações fazem alterações nos dados nas tabelas subjacentes.

Para atualizar os dados na visão materializada, você pode usar a instrução `REFRESH MATERIALIZED VIEW` a qualquer momento. Ao usar essa instrução, o Amazon Redshift identifica as alterações que ocorreram na tabela ou tabelas base e aplica essas alterações à visão materializada.

Para obter mais informações sobre visões materializadas, consulte [Visões materializadas no Amazon Redshift](materialized-view-overview.md).

## Sintaxe
<a name="mv_REFRESH_MATERIALIZED_VIEW-synopsis"></a>

```
REFRESH MATERIALIZED VIEW mv_name [ RESTRICT | CASCADE ]
```

## Parâmetros
<a name="mv_REFRESH_MATERIALIZED_VIEW-parameters"></a>

*mv\$1name*  
O nome da visão materializada a ser atualizada.

RESTRICT  
Palavra-chave opcional. Atualiza a visão materializada especificada, mas não as respectivas visões materializadas dependentes. O padrão se nem RESTRICT nem CASCADE forem especificadas.

CASCADE  
Palavra-chave opcional. Atualiza a visão materializada especificada e todas as respectivas visões materializadas dependentes.

## Observações de uso
<a name="mv_REFRESH_MARTERIALIZED_VIEW_usage"></a>

Somente o proprietário de uma visão materializada pode executar uma operação `REFRESH MATERIALIZED VIEW` nela. Além disso, o proprietário deve ter o privilégio SELECT nas tabelas base subjacentes para executar com êxito `REFRESH MATERIALIZED VIEW`. 

O comando `REFRESH MATERIALIZED VIEW` é executado como uma transação própria. A semântica de transação do Amazon Redshift é seguida para determinar quais dados das tabelas base são visíveis para o comando `REFRESH`, ou quando as alterações feitas pelo comando `REFRESH` são tornadas visíveis para outras transações em execução no Amazon Redshift.
+ Para visões materializadas incrementais, o `REFRESH MATERIALIZED VIEW` usa apenas as linhas da tabela base que já estão confirmadas. Portanto, se a operação de atualização for executada após uma instrução DML (Data Manipulation Language) na mesma transação, as alterações dessa instrução DML não serão visíveis para serem atualizadas. 
+ Para uma atualização completa de uma visão materializada, o `REFRESH MATERIALIZED VIEW` vê todas as linhas da tabela base visíveis para a transação de atualização, de acordo com a semântica de transação usual do Amazon Redshift. 
+ Dependendo do tipo de argumento de entrada, o Amazon Redshift ainda oferece suporte à atualização incremental de visões materializadas para as seguintes funções com tipos específicos de argumentos de entrada: DATE (timestamp), DATE\$1PART (date, time, interval, time-tz), DATE\$1TRUNC (timestamp, interval).
+ A atualização incremental é compatível em uma visão materializada na qual a tabela base está e uma unidade de compartilhamento de dados.
+ Não é possível atualizar visões materializadas compartilhadas de clusters remotos de unidades de compartilhamento de dados quando as visões materializadas contêm referências a outras visões materializadas, tabelas do Spectrum, tabelas definidas em um cluster diferente do Redshift ou UDFs. Essas visões materializadas podem ser atualizadas no cluster local (produtor).

Algumas operações no Amazon Redshift interagem com visões materializadas. Algumas dessas operações podem forçar uma operação `REFRESH MATERIALIZED VIEW` a recalcular totalmente a visão materializada, mesmo que a consulta que define a visão materializada use apenas os recursos SQL qualificados para atualização incremental. Por exemplo:
+ Se as visões materializadas não forem atualizadas, as operações de limpeza em segundo plano podem ser bloqueadas. Depois de um período limite definido internamente, será permitido executar uma operação de vácuo. Quando essa operação de vácuo acontece, todas as visões materializadas dependentes são marcadas para recomputação na próxima atualização (mesmo que elas sejam incrementais). Para obter informações sobre VACUUM, consulte [VACUUM](r_VACUUM_command.md). Para obter mais informações sobre eventos e alterações de estado, consulte [STL\$1MV\$1STATE](r_STL_MV_STATE.md).
+ Algumas operações iniciadas pelo usuário nas tabelas base forçam a recomputação total das visões materializadas na próxima vez que uma operação de REFRESH seja executada. Exemplos de tais operações são um VACUUM chamado manualmente, um redimensionamento clássico, uma operação ALTER DISTKEY, uma operação ALTER SORTKEY e uma operação truncada. Em alguns casos, as operações automáticas também podem resultar em uma visão materializada sendo totalmente recalculada na próxima vez que uma operação REFRESH for executada. Por exemplo, uma operação de exclusão automática por autovacuum pode causar uma recalculação completa. Para obter mais informações sobre eventos e alterações de estado, consulte [STL\$1MV\$1STATE](r_STL_MV_STATE.md). 

## Atualização em cascata
<a name="mv_REFRESH_MATERIALIZED_VIEW_cascading"></a>

A opção CASCADE atualiza a visão materializada especificada e todas as respectivas visões materializadas dependentes, em ordem de dependência: as MVs básicas são ATUALIZADAS antes das MVs na parte superior (ordem topológica). Isso permite que você atualize um conjunto aninhado de visões materializadas com um único comando.

A opção RESTRICT (o padrão se nem RESTRICT nem CASCADE forem especificadas) atualiza somente a visão materializada especificada.

Ao usar a opção CASCADE, as seguintes regras se aplicam:
+ Somente o proprietário da visão materializada ou um superusuário pode executar o comando `REFRESH MATERIALIZED VIEW ... CASCADE`.
+ Se alguma das visões materializadas em cascata não puder ser atualizada, toda a operação em cascata será interrompida.

A funcionalidade de atualização em cascata só pode ser usada em MVs aninhadas acima das visões materializadas locais e de streaming. Visões materializadas com outros tipos de origem, como Spectrum ou compartilhamento de dados, não são permitidas no modo cascata. CASCADE executa a atualização em uma única transação para todos as MVs aninhadas.

## Atualização incremental para visões materializadas em uma unidade de compartilhamento de dados
<a name="mv_REFRESH_MATERIALIZED_VIEW_datashare"></a>

 O Amazon Redshift oferece suporte à atualização automática e incremental de visões materializadas em uma unidade de compartilhamento de dados do consumidor quando as tabelas base são compartilhadas. A atualização incremental é uma operação em que o Amazon Redshift identifica alterações em uma ou mais tabelas base que ocorreram após a atualização anterior e atualiza somente os registros correspondentes na visão materializada. Para obter mais informações sobre este comportamento, consulte [CREATE MATERIALIZED VIEW](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html#mv_CREATE_MARTERIALIZED_VIEW_datashare). 

## Limitações para atualização incremental
<a name="mv_REFRESH_MARTERIALIZED_VIEW_limitations"></a>

Atualmente, o Amazon Redshift não oferece suporte à atualização incremental para visões materializadas definidas com uma consulta usando qualquer um dos seguintes elementos SQL:
+ OUTER JOIN (RIGHT, LEFT ou FULL).
+ Operações de conjuntos: (UNION, INTERSECT, EXCEPT, MINUS)
+ UNION ALL quando ocorre em uma subconsulta e uma função agregada ou uma cláusula GROUP BY está presente na consulta ou a visão materializada de destino contém uma chave de classificação.
+ Funções agregadas MEDIAN, PERCENTILE\$1CONT, LISTAGG, STDDEV\$1SAMP, STDDEV\$1POP, APPROXIMATE COUNT, APPROXIMATE PERCENTILE e funções agregadas bit a bit.
**nota**  
A funções agregadas COUNT, SUM, MIN, MAX e AVG não são comportadas.
+ Funções agregadas DISTINCT, como DISTINCT COUNT, DISTINCT SUM e assim por diante.
+ Funções de janela.
+ Uma consulta que usa tabelas temporárias para otimização de consultas, como para otimizar subexpressões comuns.
+ Subconsultas
+ Tabelas externas referenciando os formatos a seguir na consulta que define a visão materializada. 
  +  Delta Lake 
  +  Hudi 

  Há suporte para a atualização incremental para visões materializadas definidas usando formatos diferentes dos listados acima. Para obter mais informações, consulte [Visões materializadas em tabelas externas de data lake no Amazon Redshift SpectrumVisões materializadas em tabelas externas de data lake](materialized-view-external-table.md). 
+ Funções mutáveis, como funções de data-hora, funções aleatórias e não-estáveis definidas pelo usuário.
+ Com relação a limitações relacionadas à atualização incremental para integrações ETL zero, consulte [Considerações ao usar integrações ETL zero com o Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl.reqs-lims.html).
+ Acesso a tabelas de mais de um banco de dados.

Para obter mais informações sobre as limitações das visões materializadas, incluindo o efeito de operações em segundo plano, como VACUUM, nas operações de atualização de visões materializadas, consulte [Observações de uso](#mv_REFRESH_MARTERIALIZED_VIEW_usage).

## Exemplos
<a name="mv_REFRESH_MARTERIALIZED_VIEW_examples"></a>

O exemplo a seguir atualiza a visão materializada `tickets_mv`.

```
REFRESH MATERIALIZED VIEW tickets_mv;
```

O seguinte exemplo atualiza a visão materializada `products_mv` e todas as respectivas visões materializadas dependentes:

```
REFRESH MATERIALIZED VIEW products_mv CASCADE; 
```

# RESET
<a name="r_RESET"></a>

Restaura o valor de um parâmetro de configuração para seu valor padrão.

Você pode redefinir um único parâmetro especificado ou todos os parâmetros de uma vez. Para configurar um parâmetro para um valor específico, use o comando [SET](r_SET.md). Para exibir o valor atual de um parâmetro, use o comando [SHOW](r_SHOW.md).

## Sintaxe
<a name="r_RESET-synopsis"></a>

```
RESET { parameter_name | ALL }
```

A instrução a seguir define o valor de uma variável de contexto de sessão como NULL.

```
RESET { variable_name | ALL }
```

## Parâmetros
<a name="r_RESET-parameters"></a>

 *parameter\$1name*   
Nome do parâmetro a ser redefinido. Consulte [Modificar a configuração do servidor](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings) para obter mais documentos sobre parâmetros.

ALL   
Redefine todos os parâmetros de tempo de execução, incluindo todas as variáveis de contexto da sessão.

*variável*   
O nome da variável a ser redefinida. Se o valor a ser redefinido for uma variável de contexto de sessão, o Amazon Redshift o definirá como NULL.

## Exemplos
<a name="r_RESET-examples"></a>

O exemplo a seguir redefine o parâmetro `query_group` para seu valor padrão: 

```
reset query_group;
```

O exemplo a seguir redefine todos os parâmetros de tempo de execução para seus valores padrão. 

```
reset all;
```

O exemplo a seguir redefine as variáveis de contexto.

```
RESET app_context.user_id;
```

# REVOKE
<a name="r_REVOKE"></a>

Remove permissões de acesso, como permissões para criar, descartar ou atualizar tabelas, de um usuário ou uma função.

Você só pode CONCEDER ou REVOGAR permissões de USO em um esquema externo para usuários de banco de dados e funções que usem a sintaxe ON SCHEMA. Ao usar ON EXTERNAL SCHEMA com AWS Lake Formation, só é possível conceder (GRANT) e revogar (REVOKE) permissões para um perfil do AWS Identity and Access Management (IAM). Para obter a lista de permissões, consulte a sintaxe.

Para procedimentos armazenados, USAGE ON LANGUAGE `plpgsql` é concedido para PUBLIC, por padrão. A permissão EXECUTE ON PROCEDURE é concedida somente ao proprietário e aos superusuários, por padrão.

Especifique as permissões que deseja remover no comando REVOKE. Para conceder permissões, use o comando [GRANT](r_GRANT.md). 

## Sintaxe
<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 } [, ...]
```

### Revogar permissões por coluna para tabelas
<a name="revoke-column-level"></a>

A seguir está a sintaxe para permissões por coluna em tabelas e visualizações do 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 ]
```

### Revogar permissões ASSUMEROLE
<a name="revoke-assumerole-permissions"></a>

A seguir está a sintaxe para revogar a permissão ASSUMEROLE de usuários e grupos com um perfil 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 }
```

### Revogar permissões do Redshift Spectrum para Lake Formation
<a name="revoke-spectrum-integration-with-lf-permissions"></a>

A seguir está a sintaxe para integração do Redshift Spectrum com 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 } [, ...]
```

### Revogar permissões de unidade de compartilhamento de dados
<a name="revoke-datashare-permissions"></a>

**Permissões da unidade de compartilhamento de dados no lado do produtor**  
Esta é a sintaxe para usar REVOKE a fim de remover permissões ALTER ou SHARE de um usuário ou uma função. O usuário cujas permissões foram revogadas não pode mais alterar a unidade de compartilhamento de dados nem conceder o uso a um consumidor. 

```
REVOKE { ALTER | SHARE } ON DATASHARE datashare_name
 FROM { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

Esta é a sintaxe para usar REVOKE a fim de remover o acesso do consumidor a uma unidade de compartilhamento de dados.

```
REVOKE USAGE
 ON DATASHARE datashare_name
 FROM NAMESPACE 'namespaceGUID' [, ...] | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ] [, ...]
```

Este é um exemplo de como revogar o uso de uma unidade de compartilhamento de dados de uma conta do Lake Formation.

```
REVOKE USAGE ON DATASHARE salesshare FROM ACCOUNT '123456789012' VIA DATA CATALOG;
```

**Permissões da unidade de compartilhamento de dados no lado do consumidor**  
A seguir está a sintaxe REVOKE para permissões de uso de compartilhamento de dados em um banco de dados ou esquema específico criado a partir de um datashare. A revogação da permissão de uso de um banco de dados criado com a cláusula WITH PERMISSIONS não revoga nenhuma permissão adicional concedida a um usuário ou a uma função, inclusive permissões no nível de objeto concedidas para objetos subjacentes. Se você conceder novamente a permissão de uso a esse usuário ou função, eles manterão todas as permissões adicionais que tinham antes de você ter revogado o uso.

```
REVOKE USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
 FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Revogação de permissões em escopo
<a name="revoke-scoped-permissions"></a>

Com as permissões em escopo, é possível conceder permissões a um usuário ou função em todos os objetos de um tipo em um banco de dados ou esquema. Usuários e funções com permissões em escopo têm as permissões especificadas em todos os objetos atuais e futuros no banco de dados ou esquema.

Você pode visualizar o escopo das permissões com escopo em nível de banco de dados em [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md). Você pode visualizar o escopo das permissões com escopo em nível de esquema em [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md).

Para ter mais informações sobre permissões com escopo definido, consulte [Permissões em escopo](t_scoped-permissions.md).

Esta é a sintaxe para revogação de permissões em escopo de usuários ou perfis. 

```
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 } [, ...]
```

Observe que as permissões no escopo não fazem distinção entre permissões para funções e procedimentos. Por exemplo, a declaração a seguir revoga as permissões `EXECUTE` para funções e procedimentos de `bob` no esquema `Sales_schema`. 

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

### Revogar permissões de machine learning
<a name="revoke-model-permissions"></a>

A seguir está a sintaxe para permissões de modelos de machine learning no 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 ]
```

### Revogar permissões de perfil
<a name="revoke-roles"></a>

A sintaxe a seguir revoga permissões de perfil no Amazon Redshift.

```
REVOKE [ ADMIN OPTION FOR ] { ROLE role_name } [, ...] FROM { user_name } [, ...]
```

```
REVOKE { ROLE role_name } [, ...] FROM { ROLE role_name } [, ...]
```

A sintaxe a seguir revoga permissões de sistema a perfis no 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 } [, ...]
```

### Revogar permissões para políticas de segurança
<a name="revoke-role-level"></a>

Veja a seguir a sintaxe para revogar permissões para explicar os filtros de política de segurança no nível da linha de uma consulta no plano EXPLAIN. As políticas de segurança possíveis incluem segurança por linha e políticas de mascaramento dinâmico de dados.

```
REVOKE EXPLAIN { RLS | MASKING } FROM ROLE rolename 
```

Veja a seguir a sintaxe para revogar permissões para ignorar políticas de segurança por linha para uma consulta. 

```
REVOKE IGNORE RLS FROM ROLE rolename 
```

A sintaxe a seguir revoga permissões SELECT da política de segurança especificada. As políticas de segurança possíveis incluem segurança por linha e políticas de mascaramento dinâmico de dados.

```
REVOKE SELECT ON [ TABLE ] table_name [, ...]
            FROM { RLS | MASKING } POLICY policy_name [, ...]
```

## Parâmetros
<a name="r_REVOKE-parameters"></a>

GRANT OPTION FOR   
Revoga somente a opção de conceder uma permissão especificada a outros usuários e não revoga a própria permissão. Não é possível revogar GRANT OPTION de um grupo ou de PUBLIC.

SELECT   
Revoga a permissão de selecionar dados de uma tabela ou visualização usando uma instrução SELECT.

INSERT   
Revoga a permissão de carregar dados em uma tabela usando uma instrução INSERT ou COPY. 

UPDATE   
Revoga a permissão de atualizar uma coluna de tabela usando a instrução UPDATE. 

DELETE   
Revoga a permissão de excluir uma linha de dados de uma tabela.

REFERENCES   
Revoga a permissão de criar uma restrição de chave externa. Você deve revogar essa permissão tanto na tabela referenciada quanto na tabela de referência.

TRUNCATE  
Revoga a permissão para truncar uma tabela. Sem essa permissão, somente o proprietário de uma tabela ou um superusuário pode truncar uma tabela. Para obter mais informações sobre o comando TRUNCATE, consulte [TRUNCATE](r_TRUNCATE.md).

ALL [ PRIVILEGES ]   
Revoga de um vez todas as permissões disponíveis do usuário ou grupo especificado. A palavra-chave PRIVILEGES é opcional.  
 O Amazon Redshift não é compatível com as permissões RULE e TRIGGER. Para obter mais informações, acesse [Recursos incompatíveis do PostgreSQL](c_unsupported-postgresql-features.md). 

ALTER  
Dependendo do objeto do banco de dados, as seguintes permissões são revogadas do usuário ou grupo de usuários:   
+ Para tabelas, ALTER revoga a permissão para alterar uma tabela ou visão. Para obter mais informações, consulte [ALTER TABLE](r_ALTER_TABLE.md).
+ Para bancos de dados, ALTER revoga a permissão para alterar um banco de dados. Para obter mais informações, consulte [ALTER DATABASE](r_ALTER_DATABASE.md).
+ Para esquemas, ALTER revoga a permissão para alterar um esquema. Para obter mais informações, consulte [ALTER SCHEMA](r_ALTER_SCHEMA.md).
+ Para tabelas externas, ALTER revoga a permissão para alterar uma tabela em um AWS Glue Data Catalog habilitado para o Lake Formation. Essa permissão só é aplicada ao usar o Lake Formation.

DROP  
Dependendo do objeto do banco de dados, revoga as seguintes permissões do usuário ou perfil:  
+  Para tabelas, DROP revoga a permissão para remover uma tabela ou visualização. Para obter mais informações, consulte [DESCARTAR TABELA](r_DROP_TABLE.md). 
+  Para bancos de dados, DROP revoga a permissão para remover um banco de dados. Para obter mais informações, consulte [DROP DATABASE](r_DROP_DATABASE.md). 
+  Para esquemas, DROP revoga a permissão para remover um esquema. Para obter mais informações, consulte [DROP SCHEMA](r_DROP_SCHEMA.md). 

ASSUMEROLE  <a name="assumerole"></a>
Revoga a permissão de executar os comandos COPY, UNLOAD, EXTERNAL FUNCTION ou CREATE MODEL de usuários, perfis ou grupos com um perfil especificado. 

ON [ TABLE ] *table\$1name*   
Revoga as permissões especificadas em uma tabela ou visualização. A palavra-chave TABLE é opcional.

ON ALL TABLES IN SCHEMA *schema\$1name*   
Revoga as permissões especificadas em todas as tabelas no esquema referenciado.

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="revoke-column-level-privileges"></a>
Revoga as permissões especificadas de usuários, grupos ou PUBLIC nas colunas especificadas da tabela ou visualização do Amazon Redshift.

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table-column"></a>
Revoga as permissões especificadas de um perfil do IAM nas colunas especificadas da tabela do Lake Formation no esquema referenciado.

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table"></a>
Revoga as permissões especificadas de um perfil do IAM nas tabelas especificadas do Lake Formation no esquema referenciado.

ON EXTERNAL SCHEMA *schema\$1name*   <a name="revoke-external-schema"></a>
Revoga as permissões especificadas de um perfil do IAM no esquema referenciado.

FROM IAM\$1ROLE *iam\$1role*   <a name="revoke-from-iam-role"></a>
Indica o perfil do IAM que perde as permissões.

ROLE *role\$1name*   
Revoga as permissões do perfil especificado.

GROUP *nome\$1grupo*   
Revoga as permissões do grupo de usuários especificado.

PUBLIC   
Revoga as permissões de todos os usuários. PUBLIC representa um grupo que inclui sempre todos os usuários. As permissões de um usuário individual consistem na soma das permissões concedidas a PUBLIC, das permissões concedidas a todos os grupos aos quais o usuário pertence e de quaisquer permissões concedidas ao usuário individualmente.  
A revogação de PUBLIC para uma tabela externa do Lake Formation resulta na revogação da permissão para o grupo *todos* do Lake Formation.

CREATE   
Dependendo do objeto do banco de dados, as seguintes permissões são revogadas do usuário ou grupo de usuários:  
+ Para bancos de dados, usar a cláusula CREATE para revogar impede que os usuários criem esquemas no banco de dados.
+ Para esquemas, usar a cláusula CREATE para revogar impede que os usuários criem objetos em um esquema. Para renomear um objeto, o usuário deve ter a permissão CREATE e ser proprietário do objeto a ser renomeado. 
Por padrão, todos os usuários têm permissões CREATE e USAGE no esquema PUBLIC.

TEMPORARY \$1 TEMP   
Revoga a permissão para criar tabelas temporárias no banco de dados especificado.  
Por padrão, os usuários recebem permissão para criar tabelas temporárias por associação automática ao grupo PUBLIC. Para remover a permissão para todos os usuários criarem tabelas temporárias, revogue a permissão TEMP do grupo PUBLIC. Depois, conceda explicitamente a permissão para criar tabelas temporárias a usuários ou grupos de usuários específicos.

ON DATABASE *nome\$1bd*   
Revoga as permissões no banco de dados especificado.

USAGE   
Revoga as permissões USAGE em objetos de um esquema específico, que torna esses objetos inacessíveis aos usuários. Ações específicas nesses objetos devem ser revogadas separadamente (como a permissão EXECUTE em funções).  
Por padrão, todos os usuários têm permissões CREATE e USAGE no esquema PUBLIC.

ON SCHEMA *schema\$1name*   
Revoga as permissões no esquema especificado. Você pode usar permissões de esquema para gerenciar a criação de tabelas. A permissão CREATE para um banco de dados controla somente a criação de esquemas.

RESTRICT   
Revoga somente as permissões que o usuário concedeu diretamente. Esse comportamento é a configuração padrão.

EXECUTE ON PROCEDURE *procedure\$1name*   
Revoga a permissão EXECUTE em um procedimento armazenado específico. Como os nomes de procedimento armazenado podem ser sobrecarregados, você deverá incluir a lista de argumentos para o procedimento. Para obter mais informações, consulte [Nomeação de procedimentos armazenados](stored-procedure-naming.md).

EXECUTE ON ALL PROCEDURES IN SCHEMA *procedure\$1name*   
Revoga as permissões especificadas em todos os procedimentos no esquema referenciado.

USAGE ON LANGUAGE *nome\$1linguagem*   
Revoga a permissão USAGE em um idioma. Para funções definidas pelo usuário (UDFs) em Python, use `plpythonu`. Para UDFs SQL, use `sql`. Para procedimentos armazenados, use `plpgsql`.   
Para criar uma UDF, é necessário ter permissão de uso na linguagem para SQL ou `plpythonu` (Python). Por padrão, USAGE ON LANGUAGE SQL é concedido para PUBLIC. No entanto, é necessário conceder explicitamente USAGE ON LANGUAGE PLPYTHONU a usuários ou grupos específicos.   
Para revogar o uso na SQL, revogue primeiro o uso em PUBLIC. Depois, conceda o uso na SQL somente a usuários ou grupos específicos que tenham permissão para criar UDFs SQL. O exemplo a seguir revoga o uso na SQL em PUBLIC e concede o uso ao grupo de usuários `udf_devs`.   

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```
Para obter mais informações, consulte [Segurança e permissões de UDFs](udf-security-and-privileges.md).   
Para revogar o uso para procedimentos armazenados, primeiro revogue o uso em PUBLIC. Depois, conceda o uso na `plpgsql` somente a usuários ou grupos específicos que tenham permissão para criar procedimentos armazenados. Para obter mais informações, consulte [Segurança e privilégios para procedimentos armazenados](stored-procedure-security-and-privileges.md). 

ON COPY JOB *job\$1name*  <a name="on-copy-job-revoke"></a>
Revoga as permissões especificadas em um trabalho de cópia.

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]  <a name="revoke-for"></a>
Especifica o comando SQL para o qual a permissão é revogada. Você pode especificar ALL para revogar a permissão nas instruções COPY, UNLOAD, EXTERN FUNCTION e CREATE MODEL. Esta cláusula aplica-se apenas à revogação da permissão ASSUMEROLE.

ALTER  
Revoga a permissão ALTER para usuários ou grupos de usuários que permite que aqueles que não possuem uma unidade de compartilhamento de dados alterem a unidade de compartilhamento de dados. Esta permissão é necessária para adicionar ou remover objetos de uma unidade de compartilhamento de dados ou para definir a propriedade PUBLICACCESSIBLE. Para obter mais informações, consulte [ALTER DATASHARE](r_ALTER_DATASHARE.md).

SHARE  
Revoga as permissões para que usuários e grupos de usuários adicionem consumidores a uma unidade de compartilhamento de dados. A revogação dessas permissões é necessária para impedir que o consumidor específico acesse a unidade de compartilhamento de dados de seus clusters. 

ON DATASHARE *datashare\$1name *  
Concede as permissões especificadas na unidade de compartilhamento de dados de referência.

FROM username  
Indica o usuário que perde as permissões.

FROM GROUP *group\$1name*  
Indica o grupo de usuários que perde as permissões.

WITH GRANT OPTION  
Indica que o usuário que perde as permissões pode, por sua vez, revogar as mesmas permissões para outros. Não é possível revogar WITH GRANT OPTION de um grupo ou de PUBLIC. 

USAGE  
Quando USAGE é revogado para uma conta de consumidor ou namespace dentro da mesma conta, a conta de consumidor especificada ou namespace dentro de uma conta não pode acessar o datashare e os objetos do datashare de forma somente leitura.   
Revogar a permissão USAGE revoga o acesso a uma unidade de compartilhamento de dados para os consumidores. 

FROM NAMESPACE 'clusternamespace GUID'   
Indica o namespace na mesma conta que faz com que os consumidores percam as permissões para a unidade de compartilhamento de dados. Os namespaces usam um identificador exclusivo global (GUID) alfanumérico de 128 bits.

FROM ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
Indica o número de outra conta que remove as permissões dos consumidores para a unidade de compartilhamento de dados. Especificar “VIA DATA CATALOG” indica que você está revogando o uso da unidade de compartilhamento de dados para uma conta do Lake Formation. Omitir o número da conta significa que você está revogando da conta que detém o cluster.

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="revoke-datashare"></a>
Revoga as permissões de uso especificadas no banco de dados especificado que foi criado na unidade de compartilhamento de dados especificada. 

ON SCHEMA* shared\$1schema*   <a name="revoke-datashare"></a>
Revoga as permissões especificadas no esquema especificado que foi criado na unidade de compartilhamento de dados especificada.

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
Especifica os objetos de banco de dados dos quais revogar permissão. Os parâmetros após IN definem o escopo da permissão revogada.

CREATE MODEL  
Revoga a permissão CREATE MODEL para criar modelos de machine learning no banco de dados especificado.

ON MODEL *model\$1name*  
Revoga a permissão EXECUTE em um modelo específico. 

ACCESS CATALOG  
Revoga a permissão para exibir metadados relevantes de objetos aos quais a função tem acesso.

[ ADMIN OPTION FOR ] \$1 role \$1 [, ...]  
A função que você revoga de um usuário especificado que tem a WITH ADMIN OPTION.

FROM \$1 role \$1 [, ...]  
A função da qual você revoga a função especificada.

EXPLAIN \$1 RLS \$1 MASKING \$1 FROM ROLE *rolename*  
Revoga a permissão para explicar os filtros de política de segurança de uma consulta no plano EXPLAIN de um perfil. RLS revoga a permissão para explicar filtros de política de segurança por linha. MASKING revoga permissão a permissão para explicar os filtros da política de mascaramento dinâmico de dados.

IGNORE RLS FROM ROLE *rolename*   
Revoga a permissão para ignorar políticas de segurança por linha para uma consulta de um perfil.

FROM \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
Indica a política de segurança que está perdendo as permissões. TO RLS POLICY indica uma política de segurança por linha. TO MASKING POLICY indica uma política de mascaramento dinâmico de dados.

## Observações de uso
<a name="r_REVOKE-usage-notes-link"></a>

Para saber mais sobre as observações de uso de REVOKE, consulte [Observações de uso](r_REVOKE-usage-notes.md).

## Exemplos
<a name="r_REVOKE-examples-link"></a>

Para conferir exemplos de como usar REVOKE, consulte [Exemplos](r_REVOKE-examples.md).

# Observações de uso
<a name="r_REVOKE-usage-notes"></a>

Para revogar privilégios de um objeto, você deve atender a um dos seguintes critérios:
+ Ser o proprietário do objeto.
+ Ser um superusuário.
+ Ter um privilégio concedido para o objeto e privilégio.

  Por exemplo, o comando a seguir fornece ao usuário HR a capacidade de executar comandos SELECT na tabela de funcionários e conceder e revogar o mesmo privilégio para outros usuários.

  ```
  grant select on table employees to HR with grant option;
  ```

  HR não pode revogar privilégios para qualquer operação além de SELECT ou em qualquer outra tabela que não seja de funcionários. 

Superusuários podem acessar todos os objetos, independentemente de comandos GRANT e REVOKE que definem privilégios de objeto.

PUBLIC representa um grupo que inclui sempre todos os usuários. Por padrão, todos os membros de PUBLIC têm privilégios CREATE e USAGE no esquema PUBLIC. Para restringir as permissões de qualquer usuário no esquema PUBLIC, você deve primeiro revogar todas as permissões em PUBLIC no esquema PUBLIC e, depois, conceder privilégios a usuários ou grupos específicos. O exemplo a seguir controla os privilégios de criação de tabela no esquema PUBLIC.

```
revoke create on schema public from public;
```

Para revogar privilégios de uma tabela do Lake Formation, a função do IAM associada ao esquema externo da tabela deve ter permissão para revogar privilégios para a tabela externa. O exemplo a seguir cria um esquema externo com uma função do IAM associada `myGrantor`. A função do IAM `myGrantor` tem permissão para revogar permissões de outros. O comando REVOKE usa a permissão da função do IAM `myGrantor` que está associada ao esquema externo para revogar permissão para a função do 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**  
Se a função do IAM também tiver a permissão `ALL` em um AWS Glue Data Catalog habilitado para o Lake Formation, a permissão `ALL` não será revogada. Somente a permissão `SELECT` é revogada. Você pode exibir as permissões do Lake Formation no console do Lake Formation.

## Observações de uso para revogar a permissão ASSUMEROLE
<a name="r_REVOKE-usage-notes-assumerole"></a>

As observações de uso a seguir são aplicáveis à revogação do privilégio ASSUMEROLE no Amazon Redshift. 

Somente um superusuário de banco de dados pode revogar o privilégio ASSUMEROLE para usuários e grupos. Um superusuário sempre mantém o privilégio ASSUMEROLE. 

Para habilitar o uso do privilégio ASSUMEROLE para usuários e grupos, um superusuário executa a instrução a seguir uma vez no cluster. Antes de conceder o privilégio ASSUMEROLE a usuários e grupos, um superusuário deve executar a instrução a seguir uma vez no cluster. 

```
revoke assumerole on all from public for all;
```

## Observações de uso para revogar permissões de machine learning
<a name="r_REVOKE-usage-notes-create-model"></a>

Você não pode conceder ou revogar diretamente as permissões relacionadas a uma função de ML. Uma função de ML pertence a um modelo de ML e as permissões são controladas por meio do modelo. Em vez disso, você pode revogar permissões relacionadas ao modelo de ML. O exemplo a seguir demonstra como revogar a permissão de execução para todos os usuários associados ao modelo `customer_churn`.

```
REVOKE EXECUTE ON MODEL customer_churn FROM PUBLIC;
```

Você também pode revogar todas as permissões de um usuário para o modelo de ML `customer_churn`.

```
REVOKE ALL on MODEL customer_churn FROM ml_user;
```

A concessão ou revogação da permissão `EXECUTE` relacionada a uma função de ML falhará se houver uma função de ML no esquema, mesmo que essa função de ML já tenha a permissão `EXECUTE` por meio de `GRANT EXECUTE ON MODEL`. Recomendamos usar um esquema separado ao usar o comando `CREATE MODEL` para manter as funções de ML em um esquema separado. O exemplo a seguir demonstra como fazer isso.

```
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'
);
```

# Exemplos
<a name="r_REVOKE-examples"></a>

O exemplo a seguir revoga os privilégios INSERT em uma tabela SALES do grupo de usuários GUESTS. Esse comando impede que os membros de GUESTS carreguem dados na tabela SALES usando o comando INSERT. 

```
revoke insert on table sales from group guests;
```

O exemplo a seguir revoga o privilégio SELECT em todas as tabelas no esquema QA\$1TICKIT do usuário `fred`.

```
revoke select on all tables in schema qa_tickit from fred;
```

O exemplo revoga o privilégio de selecionar de uma exibição para o usuário `bobr`.

```
revoke select on table eventview from bobr;
```

O exemplo a seguir revoga o privilégio de criar tabelas temporárias no banco de dados TICKIT de todos os usuários.

```
revoke temporary on database tickit from public;
```

O exemplo a seguir revoga o privilégio SELECT nas colunas `cust_name` `cust_phone` e da tabela `cust_profile` do usuário `user1`. 

```
revoke select(cust_name, cust_phone) on cust_profile from user1;
```

O exemplo a seguir revoga o privilégio SELECT nas colunas `cust_name` e `cust_phone`, e o privilégio UPDATE na coluna `cust_contact_preference`, da tabela `cust_profile` do grupo `sales_group`. 

```
revoke select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile from group sales_group;
```

O exemplo a seguir mostra o uso da palavra-chave ALL para revogar privilégios SELECT e UPDATE em três colunas da tabela `cust_profile` do grupo `sales_admin`. 

```
revoke ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile from group sales_admin;
```

O exemplo a seguir revoga o privilégio SELECT na coluna `cust_name` da exibição `cust_profile_vw` do usuário `user2`. 

```
revoke select(cust_name) on cust_profile_vw from user2;
```

## Exemplos de revogação da permissão USAGE de bancos de dados criados a partir de unidades de compartilhamento de dados
<a name="r_REVOKE-examples-datashare"></a>

O exemplo a seguir revoga o acesso à unidade de compartilhamento de dados `salesshare` do namespace `13b8833d-17c6-4f16-8fe4-1a018f5ed00d`.

```
REVOKE USAGE ON DATASHARE salesshare FROM NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

O exemplo a seguir revoga a permissão USAGE no `sales_db` de `Bob`.

```
REVOKE USAGE ON DATABASE sales_db FROM Bob;
```

O exemplo a seguir REVOGA a permissão USAGE no `sales_schema` de `Analyst_role`.

```
REVOKE USAGE ON SCHEMA sales_schema FROM ROLE Analyst_role;
```

## Exemplos de revogação de permissões em escopo
<a name="r_REVOKE-examples-scoped"></a>

O exemplo a seguir revoga uso para todos os esquemas atuais e futuros no banco de dados `Sales_db` da função `Sales`.

```
REVOKE USAGE FOR SCHEMAS IN DATABASE Sales_db FROM ROLE Sales;
```

O exemplo a seguir revoga a capacidade de conceder a permissão SELECT para todas as tabelas atuais e futuras no banco de dados `Sales_db` do usuário `alice`. `alice` mantém acesso a todas as tabelas em `Sales_db`.

```
REVOKE GRANT OPTION SELECT FOR TABLES IN DATABASE Sales_db FROM alice;
```

O exemplo a seguir revoga a permissão EXECUTE para funções no esquema `Sales_schema` do usuário `bob`.

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

O exemplo a seguir revoga todas as permissões para todas as tabelas no esquema do `ShareSchema` do banco de dados `ShareDb` da função `Sales`. Ao especificar o esquema, você também pode especificar o banco de dados do esquema usando o formato de duas partes `database.schema`.

```
REVOKE ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema FROM ROLE Sales;
```

O exemplo a seguir é o mesmo do anterior. Você pode especificar o banco de dados do esquema usando a palavra-chave `DATABASE`, em vez de usar um formato de duas partes.

```
REVOKE ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb FROM ROLE Sales;
```

## Exemplos de revogação do privilégio ASSUMEROLE
<a name="r_REVOKE-examples-assumerole"></a>

Veja a seguir exemplos de revogação do privilégio ASSUMEROLE. 

Um superusuário deve habilitar o uso do privilégio ASSUMEROLE para usuários e grupos executando a seguinte instrução uma vez no cluster: 

```
revoke assumerole on all from public for all;
```

A instrução a seguir revoga o privilégio ASSUMEROLE do usuário reg\$1user1 em todas as funções para todas as operações. 

```
revoke assumerole on all from reg_user1 for all;
```

## Exemplos de revogação do privilégio ROLE
<a name="r_REVOKE-examples-role"></a>

O exemplo a seguir revoga a função sample\$1role1 de sample\$1role2.

```
CREATE ROLE sample_role2;
GRANT ROLE sample_role1 TO ROLE sample_role2;
REVOKE ROLE sample_role1 FROM ROLE sample_role2;
```

O exemplo a seguir revoga os privilégios do sistema do user1.

```
GRANT ROLE sys:DBA TO user1;
REVOKE ROLE sys:DBA FROM user1;
```

O exemplo a seguir revoga sample\$1role1 e sample\$1role2 do 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;
```

O exemplo a seguir revoga sample\$1role2 com a ADMIN OPTION do 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;
```

O exemplo a seguir revoga sample\$1role1 e sample\$1role2 de 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;
```

O exemplo a seguir revoga os privilégios do sistema CREATE SCHEMA e DROP SCHEMA de 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>

Interrompe a transação atual e descarta todas as atualizações feitas por essa transação.

Este comando executa a mesma função que o comando [ABORT](r_ABORT.md).

## Sintaxe
<a name="r_ROLLBACK-synopsis"></a>

```
ROLLBACK [ WORK | TRANSACTION ]
```

## Parâmetros
<a name="r_ROLLBACK-parameters"></a>

WORK  
Palavra-chave opcional. Essa palavra-chave não é permitida em um procedimento armazenado. 

TRANSACTION  
Palavra-chave opcional. WORK e TRANSACTION são sinônimos. Nenhuma delas é permitida em um procedimento armazenado. 

Para obter informações sobre como usar ROLLBACK em um procedimento armazenado, consulte [Gerenciamento de transações](stored-procedure-transaction-management.md). 

## Exemplo
<a name="r_ROLLBACK-example"></a>

O exemplo a seguir cria uma tabela, depois inicia uma transação com a inserção de dados na tabela. O comando ROLLBACK então reverte a inserção de dados para deixar a tabela vazia.

O comando a seguir cria uma tabela de exemplo denominada MOVIE\$1GROSS:

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

O próximo conjunto de comandos inicia uma transação que insere duas linhas de dados na tabela:

```
begin;

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

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

Depois, o comando seleciona os dados da tabela para mostrar que eles foram inseridos com êxito:

```
select * from movie_gross;
```

A saída do comando mostra que ambas as linhas foram inseridas com êxito:

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

Agora este comando reverte as alterações de dados para onde a transação foi iniciada:

```
rollback;
```

Selecionar dados na tabela agora exibe uma tabela vazia:

```
select * from movie_gross;

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

# SELECT
<a name="r_SELECT_synopsis"></a>

Retorna linhas de tabelas, exibições e funções definidas pelo usuário. 

**nota**  
O tamanho máximo de uma única instrução SQL é 16 MB.

## Sintaxe
<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**
+ [Sintaxe](#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 e EXCEPT](r_UNION.md)
+ [Cláusula ORDER BY](r_ORDER_BY_clause.md)
+ [Cláusula CONNECT BY](r_CONNECT_BY_clause.md)
+ [Exemplos de subconsulta](r_Subquery_examples.md)
+ [Subconsultas correlacionadas](r_correlated_subqueries.md)

# Cláusula WITH
<a name="r_WITH_clause"></a>

Uma cláusula WITH é uma cláusula opcional que precede a lista SELECT em uma consulta. A cláusula WITH define um ou mais *common\$1table\$1expressions*. Cada expressão de tabela comum (CTE) define uma tabela temporária, que é semelhante à definição de visualização. Você pode fazer referência a essas tabelas temporárias na cláusula FROM. Eles são usados apenas enquanto a consulta a que pertencem é executada. Cada CTE na cláusula WITH especifica um nome de tabela, uma lista opcional de nomes de coluna e uma expressão de consulta que é avaliada como uma tabela (uma instrução SELECT). Quando você faz referência ao nome da tabela temporária na cláusula FROM da mesma expressão de consulta que a define, o CTE é recursivo. 

Subconsultas da cláusula WITH são uma forma eficiente de definir tabelas que podem ser usadas ao longo da execução de uma consulta. Em todos os casos, os mesmos resultados podem ser obtidos usando subconsultas no corpo principal da instrução SELECT, mas pode ser mais simples fazer leituras ou gravações de subconsultas da cláusula WITH. Sempre que possível, subconsultas da cláusula WITH por várias vezes referidas são aperfeiçoadas como subexpressões comuns, ou seja, é possível avaliar uma subconsulta WITH uma vez e reutilizar seus resultados. (Observe que subexpressões comuns não estão limitadas àquelas definidas na cláusula WITH.)

## Sintaxe
<a name="r_WITH_clause-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
```

Onde *common\$1table\$1expression* pode ser não recursivo ou recursivo. Segue-se a forma não recursiva: 

```
CTE_table_name [ ( column_name [, ...] ) ] AS ( query )
```

Segue-se a forma recursiva de *common\$1table\$1expression*:

```
CTE_table_name (column_name [, ...] ) AS ( recursive_query )
```

## Parâmetros
<a name="r_WITH_clause-parameters"></a>

 RECURSIVE   
Palavra-chave que identifica a consulta como um CTE recursivo. Esta palavra-chave é necessária se qualquer *common\$1table\$1expression* definido na cláusula WITH for recursivo. Você só pode especificar a palavra-chave RECURSIVE uma vez, imediatamente após a palavra-chave WITH, mesmo quando a cláusula WITH contém várias CTEs recursivas. Em geral, um CTE recursivo é uma subconsulta UNION ALL com duas partes. 

 *common\$1table\$1expression*   
Define uma tabela temporária que você pode fazer referência no [Cláusula FROM](r_FROM_clause30.md) e é usado somente durante a execução da consulta a qual pertence. 

 *CTE\$1table\$1name*   
Um nome exclusivo para uma tabela temporária que define os resultados da subconsulta de cláusula WITH. Você não pode usar nomes duplicados em uma única cláusula WITH. Cada subconsulta deve ter um nome de tabela que pode mencionado em [Cláusula FROM](r_FROM_clause30.md).

 *column\$1name*   
 Uma lista de nomes de colunas de saída para a subconsulta da cláusula WITH, separados por vírgulas. O número de nomes de coluna especificados deve ser igual ou menor que o número de colunas definido pela subconsulta. Para um CTE que não é recursivo, a cláusula *column\$1name* é opcional. Para um CTE recursivo, a lista *column\$1name* é necessária.

 *query*   
 Qualquer consulta SELECT compatível com o Amazon Redshift. Consulte [SELECT](r_SELECT_synopsis.md). 

 *recursive\$1query*   
Uma consulta UNION ALL que consiste em duas subconsultas SELECT:  
+ A primeira subconsulta SELECT não tem uma referência recursiva para o mesmo *CTE\$1table\$1name*. Ele retorna um conjunto de resultados que é a semente inicial da recursão. Esta parte é chamada de membro inicial ou membro semente.
+ A segunda subconsulta SELECT faz referência ao mesmo *CTE\$1table\$1name* em sua cláusula FROM. Isso é chamado de membro recursivo. A *recursive\$1query* contém uma condição WHERE para finalizar a *recursive\$1query*. 

## Observações de uso
<a name="r_WITH_clause-usage-notes"></a>

Você pode usar a cláusula WITH nas seguintes instruções SQL: 
+ SELECT 
+ SELECT INTO
+ CREATE TABLE AS
+ CREATE VIEW
+ DECLARE
+ EXPLAIN
+ INSERT INTO...SELECT 
+ PREPARE
+ UPDATE (em uma subconsulta cláusula WHERE não é possível definir um CTE recursivo na subconsulta. O CTE recursivo deve preceder a cláusula UPDATE.)
+ DELETE

Se a cláusula FROM de uma consulta que contém a cláusula WITH não fizer referência a qualquer das tabelas definidas pela cláusula WITH, a cláusula WITH será ignorada e a consulta será executada como normal.

Uma tabela definida por uma subconsulta de cláusula WITH somente pode ser referida no escopo da consulta SELECT iniciada pela cláusula WITH. Por exemplo, você pode fazer referência a essa tabela na cláusula FROM da subconsulta na lista SELECT, na cláusula WHERE ou na cláusula HAVING. Você não pode usar a cláusula WITH em uma subconsulta e fazer referência à sua tabela na cláusula FROM da consulta principal ou de outra subconsulta. Este padrão de consulta resulta em uma mensagem de erro do formulário `relation table_name doesn't exist` para a tabela da cláusula WITH.

Você não pode especificar outra cláusula WITH em uma subconsulta de cláusula WITH.

Você não pode fazer referência antecipada a tabelas definidas por subconsultas da cláusula WITH. Por exemplo, a consulta a seguir retorna um erro devido à referência antecipada para a tabela W2 na definição da tabela W1: 

```
with w1 as (select * from w2), w2 as (select * from w1)
select * from sales;
ERROR:  relation "w2" does not exist
```

A subconsulta de cláusula WITH pode não consistir em uma instrução SELECT INTO. No entanto, você pode usar uma cláusula WITH em uma instrução SELECT INTO.

## Expressões de tabela comuns recursivas
<a name="r_WITH_clause-recursive-cte"></a>

Uma *expressão de tabela comum (CTE)* recursiva é um CTE que faz referência a si próprio. Um CTE recursivo é útil na consulta de dados hierárquicos, como organogramas que mostram relações de relatório entre funcionários e gerentes. Consulte [Exemplo: CTE recursivo](#r_WITH_clause-recursive-cte-example).

Outro uso comum é uma lista de materiais multinível, quando um produto consiste em muitos componentes e cada componente também consiste em outros componentes ou submontagens.

Certifique-se de limitar a profundidade da recursão incluindo uma cláusula WHERE na segunda subconsulta SELECT da consulta recursiva. Para ver um exemplo, consulte [Exemplo: CTE recursivo](#r_WITH_clause-recursive-cte-example). Caso contrário, um erro pode ocorrer semelhante ao seguinte:
+ `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` é um parâmetro que define o número máximo de linhas que um CTE recursivo pode retornar para evitar loops de recursão infinita. Não recomendamos alterar esse parâmetro para um valor maior do que o padrão. Isso impede que problemas de recursão infinita em suas consultas ocupem espaço excessivo em seu cluster.

 Você pode especificar uma ordem de classificação e limitar o resultado do CTE recursivo. Você pode incluir opções de grupo por e distintas no resultado final do CTE recursivo.

Você não pode especificar outra cláusula WITH em uma subconsulta de cláusula WITH. A *recursive\$1query* não pode incluir uma cláusula de ordem por ou limite. 

## Exemplos
<a name="r_WITH_clause-examples"></a>

O exemplo a seguir mostra o caso mais simples possível de uma consulta que contém uma cláusula WITH. A consulta WITH com o nome VENUECOPY seleciona todas as linhas da tabela VENUE. Por sua vez, a consulta principal seleciona todas as linhas de VENUECOPY. A tabela VENUECOPY existe somente durante a 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)
```

O exemplo a seguir mostra uma cláusula WITH que produz duas tabelas, chamadas VENUE\$1SALES e TOP\$1VENUES. A segunda tabela de consulta WITH seleciona a partir da primeira. Por sua vez, a cláusula WHERE do bloco principal de consulta contém um subconsulta que restringe a tabela 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)
```

Os dois exemplos a seguir demonstram as regras para o escopo de referências de tabela com base subconsultas da cláusula WITH. A primeira consulta é executada, mas a segunda falha com um erro esperado. A primeira consulta tem a subconsulta de cláusula WITH na lista SELECT da consulta principal. A tabela definida pela cláusula WITH (HOLIDAYS) é referida na cláusula FROM da subconsulta na 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)
```

A segunda consulta falha porque tenta fazer referência à tabela HOLIDAYS na consulta principal, assim como na subconsulta da lista SELECT. As referências principais da consulta estão fora do escopo. 

```
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
```

## Exemplo: CTE recursivo
<a name="r_WITH_clause-recursive-cte-example"></a>

Veja a seguir um exemplo de um CTE recursivo que retorna os funcionários que respondem direta ou indiretamente a John. A consulta recursiva contém uma cláusula WHERE para limitar a profundidade da recursão a menos de 4 níveis.

```
--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 seguir é o resultado da 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 seguir está um organograma para o departamento de John.

![\[Um organograma do departamento de John.\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/images/org-chart.png)


# Lista SELECT
<a name="r_SELECT_list"></a>

**Topics**
+ [Sintaxe](#r_SELECT_list-synopsis)
+ [Parâmetros](#r_SELECT_list-parameters)
+ [Observações de uso](#r_SELECT_list_usage_notes)
+ [Exemplos](#r_SELECT_list-examples)

A lista SELECT nomeia as colunas, funções e expressões que você deseja que a consulta retorne. A lista representa o resultado da consulta. 

Para obter mais informações sobre funções SQL, consulte [Referência de funções SQL](c_SQL_functions.md). Para obter mais informações sobre expressões, consulte [Expressões condicionais](c_conditional_expressions.md).

## Sintaxe
<a name="r_SELECT_list-synopsis"></a>

```
SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
```

## Parâmetros
<a name="r_SELECT_list-parameters"></a>

TOP *número*   
TOP pega um inteiro positivo como argumento, que define o número de linhas retornadas para o cliente. O comportamento da cláusula TOP é o mesmo da cláusula LIMIT. O número de linhas retornado é fixo, mas o conjunto de linhas não. Para retornar um conjunto consistente de linhas, use TOP ou LIMIT em conjunto com uma cláusula ORDER BY. 

ALL   
Palavra-chave redundante que define o comportamento padrão se você não especificar DISTINCT. `SELECT ALL *` é o mesmo que `SELECT *` (seleciona todas as linhas para todas as colunas e retém duplicações). 

DISTINCT   
Opção que elimina linhas duplicadas do conjunto de resultados, com base em valores correspondentes em uma ou mais colunas.   
Se sua aplicação permitir chaves primárias ou chaves estrangeiras inválidas, isso pode fazer com que algumas consultas retornem resultados incorretos. Por exemplo, uma consulta SELECT DISTINCT pode retornar linhas duplicadas se a coluna chave primária não contiver todos os valores exclusivos. Para obter mais informações, consulte [Definir restrições de tabela](https://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html).

\$1 (asterisco)   
Retorna o conteúdo total da tabela (todas as colunas e todas as linhas). 

 *expressão*   
Expressão formada por uma ou mais colunas que existem em tabelas referidas pela consulta. Uma expressão pode conter funções SQL. Por exemplo:   

```
avg(datediff(day, listtime, saletime))
```

AS *alias\$1coluna*   
Nome temporário da coluna que é usada no conjunto de resultados finais. A palavra-chave AS é opcional. Por exemplo:   

```
avg(datediff(day, listtime, saletime)) as avgwait
```
Se você não especificar um alias para uma expressão que não for um nome de coluna simples, o resultado definido aplicará um nome padrão à coluna.   
O alias é reconhecido logo após ser definido na lista de destino. É possível usar um alias em outras expressões definidas depois dele na mesma lista de destino. Isso é ilustrado no exemplo a seguir.   

```
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
```
O benefício da referência do alias lateral é que você não precisa repetir a expressão usada como alias ao criar expressões mais complexas na mesma lista de destino. Quando o Amazon Redshift analisa esse tipo de referência, ele apenas alinha os aliases definidos anteriormente. Se houver uma coluna com o mesmo nome definido na cláusula `FROM` como a expressão usada como alias anteriormente, a coluna na cláusula `FROM` terá prioridade. Por exemplo, se na consulta acima houver uma coluna chamada “probabilidade” na tabela raw\$1data, a “probabilidade” na segunda expressão da lista de destino faz referência àquela coluna, em vez do nome do alias “probabilidade”. 

## Observações de uso
<a name="r_SELECT_list_usage_notes"></a>

TOP é uma extensão SQL que fornece uma alternativa ao comportamento de LIMIT. Você não pode usar TOP e LIMIT na mesma consulta.

## Exemplos
<a name="r_SELECT_list-examples"></a>

O exemplo a seguir retorna dez linhas da tabela SALES. Embora a consulta use a cláusula TOP, ela ainda retorna um conjunto imprevisível de linhas porque nenhuma cláusula ORDER BY foi especificada,

```
select top 10 *
from sales;
```

A consulta a seguir é funcionalmente equivalente, mas usa uma cláusula LIMIT em vez de uma cláusula TOP:

```
select *
from sales
limit 10;
```

O exemplo a seguir retorna as dez primeiras linhas da tabela SALES usando a cláusula TOP, classificadas pela coluna QTYSOLD em ordem decrescente.

```
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)
```

O exemplo a seguir retorna os dois primeiros valores de QTYSOLD e SELLERID da tabela SALES, classificados pela coluna QTYSOLD:

```
select top 2 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
(2 rows)
```

O exemplo a seguir mostra a lista de grupos de categorias distintos da tabela 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)
```

O exemplo a seguir retorna o conjunto distinto de números da semana de dezembro de 2008. Sem a cláusula DISTINCT, a declaração retornaria 31 linhas, ou uma para cada dia do mês.

```
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>

O EXCLUDE column\$1list nomeia as colunas excluídas dos resultados da consulta. Usar a opção EXCLUDE é útil quando somente um subconjunto de colunas precisa ser excluído de uma tabela *ampla*, que é uma tabela que contém muitas colunas. 

**Topics**
+ [Sintaxe](#r_EXCLUDE_list-synopsis)
+ [Parâmetros](#r_EXCLUDE_list-parameters)
+ [Exemplos](#r_EXCLUDE_list-examples)

## Sintaxe
<a name="r_EXCLUDE_list-synopsis"></a>

```
EXCLUDE column_list
```

## Parâmetros
<a name="r_EXCLUDE_list-parameters"></a>

 *column\$1list*   
Uma lista separada por vírgulas de um ou mais nomes de coluna que existem nas tabelas usadas como referência pela consulta. A *column\$1list* pode ser colocada entre parênteses. Somente nomes de coluna são aceitos na lista de exclusão de nomes de coluna, não expressões, como `upper(col1)`, ou asterisco (\$1).  

```
column-name, ... | ( column-name, ... )
```
Por exemplo:   

```
SELECT * EXCLUDE col1, col2 FROM tablea;
```

```
SELECT * EXCLUDE (col1, col2) FROM tablea;
```

## Exemplos
<a name="r_EXCLUDE_list-examples"></a>

Os exemplos a seguir usam a tabela SALES que contém as colunas: salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission e saletime. Para ter mais informações sobre a tabela SALES, consulte [Banco de dados de exemplo](c_sampledb.md).

O exemplo a seguir exibe linhas da tabela SALES, mas exclui a coluna 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	
...
```

O exemplo a seguir exibe linhas da tabela SALES, mas exclui as colunas QTYSOLD e 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	
...
```

O exemplo a seguir cria uma visão que exibe linhas da tabela SALES, mas exclui a coluna 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	
...
```

O exemplo a seguir seleciona somente as colunas não excluídas em uma tabela temporária.

```
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>

A cláusula FROM em uma consulta lista as referências de tabela (tabelas, exibições e subconsultas) de onde os dados são selecionados. Se as referências de várias tabelas estiverem listadas, as tabelas devem ser juntadas, usando a sintaxe apropriada na cláusula FROM ou WHERE. Se nenhum critério de junção for especificado, o sistema processará a consulta como uma junção cruzada (produto cartesiano). 

**Topics**
+ [Sintaxe](#r_FROM_clause30-synopsis)
+ [Parâmetros](#r_FROM_clause30-parameters)
+ [Observações de uso](#r_FROM_clause_usage_notes)
+ [Exemplos de PIVOT e UNPIVOT](r_FROM_clause-pivot-unpivot-examples.md)
+ [Exemplos de JOIN](r_Join_examples.md)
+ [Exemplos de UNNEST](r_FROM_clause-unnest-examples.md)

## Sintaxe
<a name="r_FROM_clause30-synopsis"></a>

```
FROM table_reference [, ...]
```

onde *referência\$1tabela* é uma das seguintes: 

```
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] )
```

O *table\$1alias* opcional pode ser usado para fornecer nomes temporários a tabelas e referências de tabelas complexas e, se desejado, também às respectivas colunas, da forma a seguir: 

```
[ AS ] alias [ ( column_alias [, ...] ) ]
```

## Parâmetros
<a name="r_FROM_clause30-parameters"></a>

 *com\$1subconsulta\$1nome\$1tabela*   
Tabela definida por uma subconsulta em [Cláusula WITH](r_WITH_clause.md). 

 *table\$1name*   
Nome de uma tabela ou exibição. 

 *alias*   
Nome alternativo temporário para uma tabela ou exibição. Um alias deve ser fornecido para uma tabela derivada de uma subconsulta. Em outras referências de tabela, os alias são opcionais. A palavra-chave AS é sempre opcional. Os alias de tabela oferecem um atalho conveniente para tabelas de identificação em outras partes de uma consulta, como a cláusula WHERE. Por exemplo:   

```
select * from sales s, listing l
where s.listid=l.listid
```

 *column\$1alias*   
Nome alternativo temporário para uma coluna em uma tabela ou exibição. 

 *subconsulta*   
Uma expressão de consulta que avalia para uma tabela. A tabela existe somente pela duração da consulta e geralmente recebe um nome ou *alias*. No entanto, um alias não é necessário. Você também pode definir nomes de colunas para tabelas que derivam de subconsultas. Nomear aliases de coluna é importante quando você deseja participar dos resultados de subconsultas a outras tabelas e quando você deseja selecionar ou restringir essas colunas em outro lugar da consulta.   
Uma subconsulta pode conter uma cláusula ORDER BY, mas essa cláusula poderá não ter qualquer efeito se uma cláusula LIMIT ou OFFSET também não estiver especificada. 

NATURAL   
Define um junção que usa automaticamente todos os pares de colunas com nomes idênticos em duas tabelas como colunas de junção. Nenhuma condição explícita de junção é necessária. Por exemplo, se as tabelas CATEGORY e EVENT apresentam colunas com nome CATID, um junção natural dessas tabelas é um junção pelas colunas CATID.   
Se uma junção NATURAL for especificada mas não existirem pares de colunas com o mesmo nome nas tabelas a serem juntadas, a junção padrão da consulta usada será a junção cruzada. 

 *join\$1type*   
Especifique um dos seguintes tipos de junção:   
+ [INNER] JOIN 
+ LEFT [OUTER] JOIN 
+ RIGHT [OUTER] JOIN 
+ FULL [OUTER] JOIN 
+ CROSS JOIN 
As junções cruzadas são junções não qualificadas; elas retornam o produto cartesiano das duas tabelas.   
As junções internas e externas são junções qualificadas. Elas podem ser qualificadas implicitamente (em junções naturais); com a sintaxe ON ou USING na cláusula FROM; ou com a condição de cláusula WHERE.   
Uma junção interna retorna somente linhas correspondentes, com base na condição de junção ou na lista de colunas de junção. Uma junção externa retorna todas as linhas que a junção interna equivalente deve retornar e linhas não correspondentes da tabela "esquerda", da tabela "direita" ou de ambas. A tabela esquerda é a primeira tabela listada, e a tabela direita é a segunda tabela listada. As linhas não correspondentes contêm valores NULL para preencher lacunas entre as colunas resultantes. 

ON *condição\$1junção*   
Tipo de especificação de junção em que as colunas a serem juntadas são exibidas como uma condição que acompanha a palavra-chave ON. Por exemplo:   

```
sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
```

USING ( *coluna\$1junção* [, ...] )   
Tipo de especificação de junção em que as colunas a serem juntadas estão listadas entre parênteses. Se várias colunas a serem juntadas forem especificadas, elas serão separadas por vírgulas. A palavra-chave USING deve preceder a lista. Por exemplo:   

```
sales join listing
using (listid,eventid)
```

PIVOT  
Alterna a saída de linhas para colunas, com a finalidade de representar dados tabulares em um formato de fácil leitura. A saída é representada horizontalmente em várias colunas. PIVOT é semelhante a uma consulta GROUP BY com uma agregação, usando uma expressão agregada para especificar um formato de saída. Porém, diferente de GROUP BY, os resultados são retornados em colunas em vez de linhas.  
Para obter exemplos que mostrem como consultar com PIVOT e UNPIVOT, consulte [Exemplos de PIVOT e UNPIVOT](r_FROM_clause-pivot-unpivot-examples.md).

UNPIVOT  
*Transformar colunas em linhas com UNPIVOT*: o operador transforma as colunas de resultados de uma tabela de entrada ou os resultados de uma consulta em linhas, para facilitar a leitura da saída. UNPIVOT combina os dados das colunas de entrada em duas colunas de resultado: uma coluna de nome e uma coluna de valor. A coluna name contém nomes de coluna da entrada, como entradas de linha. A coluna value contém valores das colunas de entrada, como resultados de uma agregação. Por exemplo, as contagens de itens em várias categorias.  
*Desagregar objetos com UNPIVOT (SUPER)*: é possível desagregar objetos; nesse caso, a *expressão* é uma expressão SUPER referente a outro item da cláusula FROM. Para obter mais informações, consulte [Transformar colunas em linhas de objetos](query-super.md#unpivoting). Também há exemplos que mostram como consultar dados semiestruturados, como dados formatados em JSON.

*super\$1expression*  
Uma expressão SUPER válida. O Amazon Redshift exibe uma linha para cada valor no atributo especificado. Para ter mais informações sobre o tipo de dado SUPER, consulte [Tipo SUPER](r_SUPER_type.md). Para ter mais informações sobre valores SUPER desaninhados, consulte [Desaninhar consultas](query-super.md#unnest).

*attribute\$1name*  
O nome de um atributo na expressão SUPER.

*index\$1alias*  
Alias para o índice que significa a posição do valor na expressão SUPER.

UNNEST  
Expande uma estrutura aninhada, normalmente uma matriz SUPER, em colunas que contêm os elementos não aninhados. Para ter mais informações sobre desagrupamento de dados SUPER, consulte [Consultar dados semiestruturados](query-super.md). Para obter exemplos, consulte [Exemplos de UNNEST](r_FROM_clause-unnest-examples.md). 

*unnested\$1column\$1name*  
O nome da coluna que contém os elementos não aninhados. 

UNNEST ... WITH OFFSET  
Adiciona uma coluna de deslocamento à saída não aninhada, e o deslocamento representa o índice baseado em zero de cada elemento na matriz. Essa variante é útil quando você deseja ver a posição dos elementos em uma matriz. Para ter mais informações sobre desagrupamento de dados SUPER, consulte [Consultar dados semiestruturados](query-super.md). Para obter exemplos, consulte [Exemplos de UNNEST](r_FROM_clause-unnest-examples.md). 

*offset\$1column\$1name*  
Um nome personalizado para a coluna de deslocamento que permite definir explicitamente como a coluna de índice aparecerá na saída. Esse parâmetro é opcional. Por padrão, o nome da coluna de deslocamento é `offset_col`. 

## Observações de uso
<a name="r_FROM_clause_usage_notes"></a>

Colunas de junção devem ter tipos de dados comparáveis. 

Uma junção NATURAL ou USING retém somente um de cada par de colunas de junção no conjunto de resultados intermediário. 

Uma junção com a sintaxe ON retém ambas as colunas de junção em seu conjunto de resultados intermediário. 

Consulte também [Cláusula WITH](r_WITH_clause.md). 

# Exemplos de PIVOT e UNPIVOT
<a name="r_FROM_clause-pivot-unpivot-examples"></a>

PIVOT e UNPIVOT são parâmetros na cláusula FROM que trocam a saída da consulta de linhas para colunas e colunas para linhas, respectivamente. Eles representam resultados de consultas tabulares em um formato fácil de ler. Os exemplos a seguir usam consultas e dados de teste para mostrar como usá-los.

Para obter mais informações sobre esses parâmetros, consulte [FROM clause](https://docs.aws.amazon.com/redshift/latest/dg/r_FROM_clause30.html).

## Exemplos de PIVOT
<a name="r_FROM_clause-pivot-examples"></a>

Configure a tabela e os dados de exemplo e use-os para executar as consultas de exemplo subsequentes.

```
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 em `partname` com um agregação de `AVG` em `price`.

```
SELECT *
FROM (SELECT partname, price FROM part) PIVOT (
    AVG(price) FOR partname IN ('prop', 'rudder', 'wing')
);
```

A consulta resulta na saída a seguir.

```
  prop   |  rudder  |  wing
---------+----------+---------
 10.33   | 2.71     | 11.50
```

No exemplo anterior, os resultados são transformados em colunas. O exemplo a seguir mostra uma consulta `GROUP BY` que retorna os preços médios em linhas, em vez de em colunas.

```
SELECT partname, avg(price)
FROM (SELECT partname, price FROM part)
WHERE partname IN ('prop', 'rudder', 'wing')
GROUP BY partname;
```

A consulta resulta na saída a seguir.

```
 partname |  avg
----------+-------
 prop     | 10.33
 rudder   |  2.71
 wing     | 11.50
```

Um exemplo de `PIVOT` com `manufacturer` como uma coluna implícita.

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) FOR quality IN (1, 2, NULL)
);
```

A consulta resulta na saída a seguir.

```
 manufacturer      | 1  | 2  | null
-------------------+----+----+------
 local parts co    | 1  | 1  |  1
 big parts co      | 1  | 1  |  1
 small parts co    | 1  | 0  |  2
```

 Colunas da tabela de entrada que não são referenciadas na definição `PIVOT` são adicionadas implicitamente à tabela de resultados. Este é o caso da coluna `manufacturer` no exemplo anterior. O exemplo também mostra que `NULL` é um valor válido para o operador `IN`. 

`PIVOT` no exemplo acima retorna informações semelhantes à consulta a seguir, que inclui `GROUP BY`. A diferença é que `PIVOT` retorna o valor `0` para a coluna `2` e o fabricante `small parts co`. A consulta `GROUP BY` não contém uma linha correspondente. Na maioria dos casos, `PIVOT` insere `NULL` se uma linha não tem dados de entrada para determinada coluna. Porém, o agregado de contagem não retorna `NULL` e `0` é o valor padrão.

```
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;
```

A consulta resulta na saída a seguir.

```
 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
```

 O operador PIVOT aceita aliases opcionais na expressão agregada e em cada valor para o operador `IN`. Use aliases para personalizar os nomes das colunas. Se não houver um alias agregado, somente os aliases da lista `IN` serão usados. Caso contrário, o alias agregado será anexado ao nome da coluna com um sublinhado para separar os nomes. 

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) AS count FOR quality IN (1 AS high, 2 AS low, NULL AS na)
);
```

A consulta resulta na saída a seguir.

```
 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 a tabela e os dados de exemplo a seguir e use-os para executar as consultas de exemplo subsequentes. Os dados representam datas de reserva para um grupo de hotéis.

```
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);
```

 Nesse exemplo de consulta, os registros de reservas são calculados para fornecer um total de cada semana. A data de término de cada semana se torna um nome de coluna.

```
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') 
);
```

A consulta resulta na saída a seguir.

```
 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
```

 O Amazon Redshift não é compatível com CROSSTAB para girar em várias colunas. No entanto, é possível alterar dados de linha em colunas, de forma semelhante a uma agregação com PIVOT, com uma consulta como a seguinte. Isso usa os mesmos dados de exemplo de reserva como no exemplo 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;
```

O exemplo de consulta resulta em datas de reserva listadas ao lado de frases curtas que indicam quais hotéis estão 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 |
```

Veja a seguir as observações de uso do `PIVOT`:
+ `PIVOT` pode ser aplicado a tabelas, subconsultas e expressões de tabela comuns (CTEs). `PIVOT` não pode ser aplicado a expressões `JOIN`, CTEs recursivos, `PIVOT` ou expressões `UNPIVOT`. Também não são compatíveis expressões `SUPER` não aninhadas e tabelas aninhadas do Redshift Spectrum.
+  `PIVOT` é compatível com funções agregadas `COUNT`, `SUM`, `MIN`, `MAX` e `AVG`. 
+ A expressão agregada `PIVOT` deve ser uma chamada de uma função agregada compatível. Expressões complexas na parte superior do agregado não são compatíveis. Os argumentos agregados não podem conter referências a tabelas diferentes da tabela de entrada do `PIVOT`. Referências correlacionadas a uma consulta principal também não são compatíveis. O argumento agregado pode conter subconsultas. Elas podem ser correlacionadas internamente ou na tabela de entrada `PIVOT`.
+  Os valores da lista `PIVOT IN` não podem ser referências de coluna ou subconsultas. Cada valor deve ser compatível com a referência de coluna `FOR`. 
+  Se os valores de lista `IN` não tiverem aliases, `PIVOT` gerará nomes de coluna padrão. Por valores `IN` constantes, como 'abc' ou 5, o nome da coluna padrão é a constante em si. Para qualquer expressão complexa, o nome da coluna é um nome padrão do Amazon Redshift, como `?column?`. 

## Exemplos de UNPIVOT
<a name="r_FROM_clause-unpivot-examples"></a>

Configure os dados de exemplo e use-os para executar os exemplos subsequentes.

```
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` nas colunas de entrada vermelho, verde e azul.

```
SELECT *
FROM (SELECT red, green, blue FROM count_by_color) UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

A consulta resulta na saída a seguir.

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |  23
 blue  |   7
 blue  |  40
```

Por padrão, os valores `NULL` na coluna de entrada são ignorados e não produzem uma linha de resultado. 

O exemplo a seguir mostra `UNPIVOT` com `INCLUDE NULLS`.

```
SELECT *
FROM (
    SELECT red, green, blue
    FROM count_by_color
) UNPIVOT INCLUDE NULLS (
    cnt FOR color IN (red, green, blue)
);
```

A seguir está a saída resultante.

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |
 green |  23
 blue  |   7
 blue  |  40
 blue  |
```

Se o parâmetro `INCLUDING NULLS` estiver definido, os valores de entrada `NULL` geram linhas de resultados.

`The following query shows UNPIVOT` com `quality` como uma coluna implícita.

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

A consulta resulta na saída a seguir.

```
 quality | color | cnt
---------+-------+-----
 high    | red   |  15
 normal  | red   |  35
 low     | red   |  10
 high    | green |  20
 low     | green |  23
 high    | blue  |   7
 normal  | blue  |  40
```

Colunas da tabela de entrada que não são referenciadas na definição `UNPIVOT` são adicionadas implicitamente à tabela de resultados. No exemplo, este é o caso da coluna `quality`.

O exemplo a seguir mostra `UNPIVOT` com aliases para valores na lista `IN`.

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red AS r, green AS g, blue AS b)
);
```

A consulta anterior resulta na saída a seguir.

```
 quality | color | cnt
---------+-------+-----
 high    | r     |  15
 normal  | r     |  35
 low     | r     |  10
 high    | g     |  20
 low     | g     |  23
 high    | b     |   7
 normal  | b     |  40
```

O operador `UNPIVOT` aceita aliases opcionais em cada valor de lista `IN`. Cada alias fornece personalização dos dados em cada coluna `value`.

Veja a seguir as observações de uso do `UNPIVOT`.
+ `UNPIVOT` pode ser aplicado a tabelas, subconsultas e expressões de tabela comuns (CTEs). `UNPIVOT` não pode ser aplicado a expressões `JOIN`, CTEs recursivos, `PIVOT` ou expressões `UNPIVOT`. Também não são compatíveis expressões `SUPER` não aninhadas e tabelas aninhadas do Redshift Spectrum.
+ A lista `UNPIVOT IN` deve conter apenas referências de coluna da tabela de entrada. As colunas da lista `IN` devem ter um tipo comum com o qual todas sejam compatíveis. A coluna de valor `UNPIVOT` tem esse tipo comum. A coluna de nome `UNPIVOT` é do tipo `VARCHAR`.
+ Se um valor de lista `IN` não tiver um alias, `UNPIVOT` usará o nome da coluna como valor padrão.

# Exemplos de JOIN
<a name="r_Join_examples"></a>

Uma cláusula SQL JOIN é usada para combinar os dados de duas ou mais tabelas com base em campos comuns. Os resultados podem ou não mudar dependendo do método de junção especificado. Para obter mais informações sobre a sintaxe da cláusula JOIN, consulte [Parâmetros](r_FROM_clause30.md#r_FROM_clause30-parameters). 

O exemplo a seguir usa dados dos dados de amostra `TICKIT`. Para obter mais informações sobre o esquema de banco de dados, consulte [Banco de dados de exemplo](c_sampledb.md). Para saber como carregar dados de exemplo, consulte [Carregamento de dados](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html) no *Guia de conceitos básicos do Amazon Redshift*.

A consulta a seguir é uma junção interna (sem a palavra-chave JOIN) entre a tabela LISTING e a tabela SALES, onde o LISTID da tabela LISTING está entre 1 e 5. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Os resultados mostram que LISTID 1, 4 e 5 correspondem aos critérios.

```
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
```

A consulta a seguir é uma junção externa à esquerda. Junções externas esquerdas e direitas retêm valores de uma das tabelas de junção quando nenhuma correspondência é encontrada na outra tabela. As tabelas esquerdas e direitas são a primeiras e a segunda listadas na sintaxe. Os valores NULL são usados para preencher "lacunas" no conjunto de resultados. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Os resultados mostram que LISTIDs 2 e 3 não resultaram em nenhuma venda.

```
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
```

A consulta a seguir é uma junção externa à direita. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Os resultados mostram que LISTIDs 1, 4 e 5 correspondem aos critérios.

```
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
```

A consulta a seguir é uma junção completa. As junções completas retêm valores das tabelas unidas quando nenhuma correspondência é encontrada na outra tabela. As tabelas esquerdas e direitas são a primeiras e a segunda listadas na sintaxe. Os valores NULL são usados para preencher "lacunas" no conjunto de resultados. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Os resultados mostram que LISTIDs 2 e 3 não resultaram em nenhuma venda.

```
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
```

A consulta a seguir é uma junção completa. Essa consulta corresponde aos valores da coluna LISTID na tabela LISTING (a tabela à esquerda) e na tabela SALES (tabela à direita). Somente linhas que não resultam em vendas (LISTIDs 2 e 3) estão nos resultados.

```
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
```

O exemplo a seguir é uma junção interna com a cláusula ON. Nesse caso, as linhas NULL não são retornadas.

```
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
```

A consulta a seguir é uma junção cruzada ou junção cartesiana da tabela LISTING e da tabela SALES com um predicado para limitar os resultados. Essa consulta corresponde aos valores da coluna LISTID na tabela SALES e na tabela LISTING para LISTIDs 1, 2, 3, 4 e 5 em ambas as tabelas. Os resultados mostram que 20 linhas correspondem aos critérios.

```
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
```

O exemplo a seguir é uma junção natural entre duas tabelas. Nesse caso, as colunas listid, sellerid, eventid e dateid têm nomes e tipos de dados idênticos em ambas as tabelas e, portanto, são usadas como colunas de junção. Os resultados são limitados a cinco linhas.

```
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
```

O exemplo a seguir é uma junção entre duas tabelas com a cláusula USING. Nesse caso, as colunas listid e eventid são usadas como colunas de junção. Os resultados são limitados a cinco linhas.

```
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
```

A consulta a seguir é uma junção interna de duas subconsultas na cláusula FROM. A consulta encontra o número de ingressos vendidos e não vendidos para categorias diferentes de eventos (shows e apresentações). As subconsultas da cláusula FROM são subconsultas da *tabela*. Elas podem retornar várias colunas e linhas.

```
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
```

# Exemplos de UNNEST
<a name="r_FROM_clause-unnest-examples"></a>

UNNEST é um parâmetro na cláusula FROM que expande os dados aninhados em colunas que contêm os elementos não aninhados dos dados. Para ter informações sobre como desagrupar dados, consulte [Consultar dados semiestruturados](query-super.md).

A instrução a seguir cria e preenche a tabela `orders`, que contém uma coluna `products` com matrizes de IDs de produto. Os exemplos desta seção utilizam os dados de amostra nessa tabela. 

```
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"
            }
        }
    ]
'));
```

Veja a seguir alguns exemplos de consulta desaninhada com os dados de amostra usando a sintaxe partiQL.

## Desagrupar uma matriz sem uma coluna OFFSET
<a name="r_FROM_clause-unnest-examples-no-offset"></a>

A consulta a seguir desagrupa as matrizes SUPER na coluna de produtos, e cada linha representa um item do pedido em `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)
```

A consulta a seguir localiza o produto mais caro em 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)
```

## Desagrupar uma matriz com uma coluna OFFSET implícita
<a name="r_FROM_clause-unnest-examples-implicit-offset"></a>

A consulta a seguir usa o parâmetro `UNNEST ... WITH OFFSET` para mostrar a posição com base em zero de cada produto na respectiva 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)
```

Como a declaração não especifica um alias para a coluna de deslocamento, o Amazon Redshift a denomina `offset_col` por padrão.

## Desagrupar uma matriz com uma coluna OFFSET explícita
<a name="r_FROM_clause-unnest-examples-explicit-offset"></a>

A consulta a seguir também usa o parâmetro `UNNEST ... WITH OFFSET` para mostrar os produtos nas respectivas matrizes de pedidos. A diferença nessa consulta em comparação com a consulta no exemplo anterior é que ela nomeia explicitamente a coluna de deslocamento com o 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>

A cláusula WHERE contém as condições que juntam as tabelas ou aplicam predicados às colunas nas tabelas. Tabelas internas que foram juntadas usando a sintaxe apropriada, seja com a cláusula WHERE ou com a cláusula FROM. Os critérios de junção externa devem ser especificados na cláusula FROM. 

## Sintaxe
<a name="r_WHERE_clause-synopsis"></a>

```
[ WHERE condition ]
```

## *condição*
<a name="r_WHERE_clause-synopsis-condition"></a>

Qualquer condição de pesquisa com um resultado booleano, como uma condição de junção ou um predicado em uma coluna de tabela. Os exemplos a seguir são condições de junção válidas: 

```
sales.listid=listing.listid
sales.listid<>listing.listid
```

Os exemplos a seguir são condições válidas nas colunas em tabelas: 

```
catgroup like 'S%'
venueseats between 20000 and 50000
eventname in('Jersey Boys','Spamalot')
year=2008
length(catdesc)>25
date_part(month, caldate)=6
```

As condições podem ser simples ou complexas; para condições complexas, você pode usar parênteses para isolar unidades lógicas. No exemplo a seguir, a condição de junção está entre parênteses. 

```
where (category.catid=event.catid) and category.catid in(6,7,8)
```

## Observações de uso
<a name="r_WHERE_clause_usage_notes"></a>

É possível usar aliases na cláusula WHERE para fazer referência a expressões da lista de seleção. 

Não é possível restringir os resultados de funções agregadas na cláusula WHERE; use a cláusula HAVING para essa finalidade. 

Colunas restringidas na cláusula WHERE devem ser derivadas de referências da tabela na cláusula FROM. 

## Exemplo
<a name="r_SELECT_synopsis-example"></a>

A consulta a seguir usa uma combinação de diferentes restrições da cláusula WHERE, incluindo uma condição de junção para as tabelas SALES e EVENT, um predicado na coluna EVENTNAME e dois predicados na coluna 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)
```

# Junções externas do estilo Oracle na cláusula WHERE
<a name="r_WHERE_oracle_outer"></a>

Para compatibilidade com a Oracle, o Amazon Redshift oferece suporte ao operador de junção externa da Oracle (\$1) nas condições de junção da cláusula WHERE. Esse operador deve ser usado apenas para definir condições de junção externas; não tente usar em outros contextos. Outros usos para este operador são ignorados silenciosamente na maioria dos casos. 

Uma junção externa retorna todas as linhas que a junção interna equivalente deve retornar e linhas não correspondentes de uma ou de ambas as tabelas. Na cláusula FROM, você pode especificar junções esquerdas, direitas e externas. Na cláusula WHERE, você pode especificar somente junções externas esquerdas e direitas. 

Para juntar as tabelas externas TABLE1 e TABLE2 e retornar linhas não correspondentes da TABLE1 (junção externa esquerda), especifique `TABLE1 LEFT OUTER JOIN TABLE2` na cláusula ou aplique o operador (\$1) a todas as colunas de junção de TABLE2 na cláusula WHERE. Para todas as linhas na TABLE1 que não têm linhas correspondentes na TABLE2, o resultado da consulta contém nulos para quaisquer expressões de lista de seleção contendo colunas da TABLE2. 

Para produzir o mesmo comportamento em todas as linhas na TABLE2 que não têm linhas correspondentes na TABLE1, especifique `TABLE1 RIGHT OUTER JOIN TABLE2` na cláusula FROM ou aplique o operador (\$1) a todas as colunas de junção da TABLE1 na cláusula WHERE. 

## Sintaxe básica
<a name="r_WHERE_oracle_outer-basic-syntax"></a>

```
[ WHERE {
[ table1.column1 = table2.column1(+) ]
[ table1.column1(+) = table2.column1 ]
}
```

A primeira condição equivale a: 

```
from table1 left outer join table2
on table1.column1=table2.column1
```

A segunda condição equivale a: 

```
from table1 right outer join table2
on table1.column1=table2.column1
```

**nota**  
A sintaxe mostrada aqui abrange o caso simples de uma junção equivalente em um par de colunas de junção. Porém, outros tipos de condições de comparação e diversos pares de colunas de junção também são válidos. 

Por exemplo, a cláusula WHERE a seguir define um junção externa em relação a dois pares de colunas. O operador (\$1) deve ser vinculado à mesma tabela em ambas as condições: 

```
where table1.col1 > table2.col1(+)
and table1.col2 = table2.col2(+)
```

## Observações de uso
<a name="r_WHERE_oracle_outer_usage_notes"></a>

Sempre que possível, use a sintaxe OUTER JOIN da cláusula FROM padrão em vez do operador (\$1) na cláusula WHERE. Consultas contendo o operador (\$1) estão sujeitas às seguintes regras: 
+ Você só pode usar o operador (\$1) na cláusula WHERE, e somente em referência a colunas de tabelas ou exibições. 
+ Você não pode aplicar o operador (\$1) a expressões. No entanto, uma expressão pode conter colunas que usam o operador (\$1). Por exemplo, a condição de junção a seguir retorna um erro de sintaxe: 

  ```
  event.eventid*10(+)=category.catid
  ```

  No entanto, a seguinte condição de junção é válida: 

  ```
  event.eventid(+)*10=category.catid
  ```
+ Você não pode usar o operador (\$1) em um bloco de consulta que também contenha a sintaxe de junção da cláusula FROM. 
+ Se duas tabelas são adicionadas em diversas condições de junção, você deve usar o operador (\$1) em todas ou em nenhuma dessas condições. Uma junção com estilos mistos de sintaxe é executada como uma junção interna, sem aviso. 
+ O operador (\$1) não produzirá um uma junção externa se você juntar uma tabela na consulta externa com uma tabela que resulte de uma consulta interna. 
+ Para usar o operador (\$1) para juntar uma tabela externa na própria tabela, você deve definir aliases da tabela na cláusula FROM e fazer referência a eles na condição de junção: 

  ```
  select count(*)
  from event a, event b
  where a.eventid(+)=b.catid;
  
  count
  -------
  8798
  (1 row)
  ```
+ Você não pode combinar uma condição de junção que contenha o operador (\$1) com uma condição OR ou IN. Por exemplo: 

  ```
  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.
  ```
+  Em uma cláusula WHERE faz junções externas de mais de duas tabelas, o operador (\$1) pode ser aplicado somente uma vez a uma tabela específica. No exemplo a seguir, não é possível fazer referência à tabela SALES com o operador (\$1) em duas junções sucessivas. 

  ```
  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.
  ```
+  Se a condição de junção externa da cláusula WHERE se comparar a uma coluna da TABLE2 com uma constante, aplique o operador (\$1) à coluna. Se você não incluir o operador, as linhas de junções externas da TABLE1 que contêm nulos para a coluna restringida serão eliminadas. Consulte a seção de Exemplos abaixo. 

## Exemplos
<a name="r_WHERE_oracle_outer-examples"></a>

A seguinte consulta de junção especifica uma junção esquerda externa das tabelas SALES e LISTING em suas colunas LISTID: 

```
select count(*)
from sales, listing
where sales.listid = listing.listid(+);

count
--------
172456
(1 row)
```

A seguinte consulta equivalente produz o mesmo resultado, mas usa a sintaxe de junção da cláusula FROM: 

```
select count(*)
from sales left outer join listing on sales.listid = listing.listid;

count
--------
172456
(1 row)
```

A tabela SALES não contém registros de todas as listagens na tabela LISTING, pois nem todas as listagens resultam em vendas. A consulta a seguir junta externamente as tabelas SALES e LISTING e retorna linhas da tabela LISTING mesmo quando a tabela SALES não retorna vendas para determinado ID de lista. As colunas PRICE e COMM, derivadas da tabela SALES, contêm nulos no conjunto de resultados para linhas não correspondentes. 

```
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)
```

Observe que quando o operador de junção da cláusula WHERE é usado, a ordem das tabelas na cláusula FROM não importa. 

Um exemplo de uma condição de junção externa mais complexa na cláusula WHERE é o caso em que a condição consiste em uma comparação entre duas tabelas comuns *e* uma comparação com uma constante: 

```
where category.catid=event.catid(+) and eventid(+)=796;
```

Observe que o operador (\$1) é usado em dois lugares: primeiro na comparação de correspondência entre as tabelas e depois na condição de comparação para a coluna EVENTID. O resultado da sintaxe é a preservação das linhas de junção externa quando a restrição em EVENTID é avaliada. Se você remover o operador (\$1) da restrição EVENTID, a consulta trata a restrição como um filtro, não como parte da condição de junção externa. Por sua vez, as colunas de junção externa que contêm nulos para EVENTID são eliminadas do conjunto de resultados. 

Veja aqui uma consulta completa que ilustra esse comportamento: 

```
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)
```

A consulta equivalente usando a sintaxe de cláusula FROM é: 

```
select catname, catgroup, eventid
from category left join event
on category.catid=event.catid and eventid=796;
```

Se você remover o segundo operador (\$1) da versão da cláusula WHERE desta consulta, ela retornará somente 1 linha (a linha de `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>

A cláusula GROUP BY identifica as colunas de agrupamento para a consulta. É usada para agrupar as linhas em uma tabela que têm os mesmos valores em todas as colunas listadas. A ordem em que as colunas são listadas não importa. O resultado é a combinação de cada conjunto de linhas com valores comuns em uma linha que representa todas as linhas do grupo. Use GROUP BY para eliminar a redundância na saída e calcular agregados que se aplicam aos grupos. As colunas de agrupamento devem ser declaradas quando a consulta computa agregadas com funções padrão como SUM, AVG e COUNT. Para obter mais informações, consulte [Funções agregadas](c_Aggregate_Functions.md).

## Sintaxe
<a name="r_GROUP_BY_clause-syntax"></a>

```
[ GROUP BY  expression [, ...] | ALL | aggregation_extension  ]
```

em que *aggregation\$1extension* é uma das seguintes:

```
GROUPING SETS ( () | aggregation_extension [, ...] ) |
ROLLUP ( expr [, ...] ) |
CUBE ( expr [, ...] )
```

## Parâmetros
<a name="r_GROUP_BY_clause-parameters"></a>

 *expressão*  
A lista de colunas ou de expressões deve corresponder à lista de expressões não agregadas na lista de seleção da consulta. Por exemplo, considere a seguinte consulta simples.  

```
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)
```
Nesta consulta, a lista de seleção consiste em duas expressões agregadas. A primeira usa a função SUM e a segunda usa a função COUNT. As duas colunas restantes, LISTID e EVENTID, devem ser declaradas como colunas de agrupamento.  
As expressões na cláusula GROUP BY também podem fazer referência à lista de seleção usando números ordinais. O exemplo anterior poderia ser abreviado da seguinte forma.  

```
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 agrupar por todas as colunas especificadas na lista SELECT, exceto as agregadas. Por exemplo, pense na consulta a seguir, que agrupa por `col1` e `col2` sem precisar especificá-las individualmente na cláusula GROUP BY. A coluna `col3` é o argumento da função `SUM` e, portanto, não está agrupada.  

```
SELECT col1, col2 sum(col3) FROM testtable GROUP BY ALL
```
Se você excluir uma coluna na lista SELECT, a cláusula GROUP BY ALL não agrupará os resultados com base nessa coluna específica.  

```
SELECT * EXCLUDE col3 FROM testtable GROUP BY ALL
```

 * *aggregation\$1extension* *   
Você pode usar as extensões de agregação GROUPING SETS, ROLLUP e CUBE para realizar o trabalho de várias operações GROUP BY em uma única instrução. Para obter mais informações sobre extensões de agregação e funções relacionadas, consulte [Extensões de agregação](r_GROUP_BY_aggregation-extensions.md). 

## Exemplos
<a name="r_GROUP_BY_clause-examples"></a>

Os exemplos a seguir usam a tabela SALES que contém as colunas: salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission e saletime. Para ter mais informações sobre a tabela SALES, consulte [Banco de dados de exemplo](c_sampledb.md).

O exemplo de consulta a seguir agrupa por `salesid` e `listid` sem precisar especificá-las individualmente na cláusula GROUP BY. A coluna `qtysold` é o argumento da função `SUM` e, portanto, não está agrupada.

```
SELECT salesid, listid, sum(qtysold) FROM sales GROUP BY ALL;

salesid | listid  | sum
--------+---------+------
33095   | 36572   | 2	
88268   | 100813  | 4	
110917  | 127048  | 1	
...
```

O exemplo de consulta a seguir exclui várias colunas na lista SELECT, então GROUP BY ALL agrupa somente salesid e listid.

```
SELECT * EXCLUDE sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime 
FROM sales GROUP BY ALL;

salesid | listid 
--------+---------
33095   | 36572   	
88268   | 100813 	
110917  | 127048 	
...
```

# Extensões de agregação
<a name="r_GROUP_BY_aggregation-extensions"></a>

O Amazon Redshift oferece suporte a extensões de agregação para realizar o trabalho de várias operações GROUP BY em uma única instrução.

 Os exemplos de extensões de agregação usam a tabela `orders`, que contém dados de vendas de uma empresa de dispositivos eletrônicos. Você pode criar `orders` com o seguinte.

```
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 um ou mais conjuntos de agrupamento em uma única instrução. Um conjunto de agrupamento é o conjunto de uma única cláusula GROUP BY, um conjunto de 0 ou mais colunas pelo qual você pode agrupar o conjunto de resultados de uma consulta. GROUP BY GROUPING SETS é equivalente a executar uma consulta UNION ALL em um conjunto de resultados agrupado por colunas diferentes. Por exemplo, GROUP BY GROUPING SETS((a), (b)) é equivalente a GROUP BY a UNION ALL GROUP BY b. 

 O exemplo a seguir retorna o custo dos produtos da tabela de pedidos agrupados de acordo com as categorias de produtos e o tipo de produto vendido. 

```
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>

 Assume uma hierarquia em que as colunas anteriores são consideradas pais das colunas subsequentes. ROLLUP agrupa os dados pelas colunas fornecidas, retornando linhas de subtotal extras representando os totais em todos os níveis de colunas de agrupamento, além das linhas agrupadas. Por exemplo, você pode usar GROUP BY ROLLUP((a), (b)) para retornar um conjunto de resultados agrupado primeiro por a, depois por b, assumindo que b é uma subseção de a. ROLLUP também retorna uma linha com todo o conjunto de resultados sem colunas de agrupamento. 

GROUP BY ROLLUP((a), (b)) é equivalente a GROUP BY GROUPING SETS((a,b), (a), ()). 

O exemplo a seguir retorna o custo dos produtos da tabela de pedidos agrupados primeiro por categoria, depois por produto, com o produto como uma subdivisão da categoria.

```
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 os dados pelas colunas fornecidas, retornando linhas de subtotal extras representando os totais em todos os níveis de colunas de agrupamento, além das linhas agrupadas. CUBE retorna as mesmas linhas que ROLLUP, enquanto inclui linhas de subtotal adicionais para cada combinação de coluna de agrupamento não contemplada por ROLLUP. Por exemplo, você pode usar GROUP BY CUBE((a), (b)) para retornar um conjunto de resultados agrupado primeiro por a, depois por b, assumindo que b é uma subseção de a, depois apenas por b. CUBE também retorna uma linha com todo o conjunto de resultados sem colunas de agrupamento.

GROUP BY CUBE((a), (b)) é equivalente a GROUP BY GROUPING SETS((a,b), (a), (b), ()). 

O exemplo a seguir retorna o custo dos produtos da tabela de pedidos agrupados primeiro por categoria, depois por produto, com o produto como uma subdivisão da categoria. Ao contrário do exemplo anterior para ROLLUP, a instrução retorna resultados para cada combinação de coluna de agrupamento. 

```
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)
```

## *Funções GROUPING/GROUPING\$1ID*
<a name="r_GROUP_BY_aggregation-extentions-grouping"></a>

 ROLLUP e CUBE adicionam valores NULL ao conjunto de resultados para indicar linhas de subtotal. Por exemplo, GROUP BY ROLLUP((a), (b)) retorna uma ou mais linhas que têm um valor NULL na coluna de agrupamento b para indicar que são subtotais de campos na coluna de agrupamento a. Esses valores NULL servem apenas para satisfazer o formato das tuplas de retorno.

 Quando você executa operações GROUP BY com ROLLUP e CUBE em relações que armazenam valores NULL em si, isso pode produzir conjuntos de resultados com linhas que parecem ter colunas de agrupamento idênticas. Voltando ao exemplo anterior, se a coluna de agrupamento b contiver um valor NULL armazenado, GROUP BY ROLLUP((a), (b)) retornará uma linha com um valor NULL na coluna de agrupamento b que não é um subtotal. 

 Para distinguir entre valores NULL criados por ROLLUP e CUBE e os valores NULL armazenados nas próprias tabelas, você pode usar a função GROUPING ou seu alias GROUPING\$1ID. GROUPING usa um único conjunto de agrupamento como argumento e, para cada linha no conjunto de resultados, retorna um valor de bit 0 ou 1 correspondente à coluna de agrupamento nessa posição, depois converte esse valor em um inteiro. Se o valor nessa posição for um valor NULL criado por uma extensão de agregação, GROUPING retornará 1. Retornará 0 para todos os outros valores, incluindo valores NULL armazenados.

 Por exemplo, GROUPING(category, product) pode retornar os seguintes valores para determinada linha, dependendo dos valores da coluna de agrupamento dessa linha. Neste exemplo, todos os valores NULL na tabela são valores NULL criados por uma extensão de agregação.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_GROUP_BY_aggregation-extensions.html)

As funções GROUPING aparecem na parte da lista SELECT da consulta no formato a seguir.

```
SELECT ... [GROUPING( expr )...] ...
  GROUP BY ... {CUBE | ROLLUP| GROUPING SETS} ( expr ) ...
```

O exemplo a seguir é igual ao exemplo anterior para CUBE, mas com a adição de funções GROUPING para seus conjuntos de agrupamento.

```
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 e CUBE parciais*
<a name="r_GROUP_BY_aggregation-extentions-partial"></a>

 Você pode executar operações ROLLUP e CUBE com apenas uma parte dos subtotais. 

 A sintaxe para operações parciais de ROLLUP e CUBE é a seguinte.

```
GROUP BY expr1, { ROLLUP | CUBE }(expr2, [, ...])
```

Aqui, a cláusula GROUP BY cria apenas linhas de subtotal no nível de *expr2* e em diante.

Os exemplos a seguir mostram operações parciais de ROLLUP e CUBE na tabela de pedidos, primeiro agrupando os produtos seminovos, depois executando ROLLUP e CUBE nas colunas category e 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 a coluna pre-owned não está incluída nas operações ROLLUP e CUBE, não há uma linha de total geral que inclua todas as outras linhas. 

## *Agrupamento concatenado*
<a name="r_GROUP_BY_aggregation-extentions-concat"></a>

 Você pode concatenar várias cláusulas GROUPING SETS/ROLLUP/CUBE para calcular diferentes níveis de subtotal. Os agrupamentos concatenados retornam o produto cartesiano dos conjuntos de agrupamento fornecidos. 

 A sintaxe para concatenar as cláusulas GROUPING SETS/ROLLUP/CUBE é a seguinte.

```
GROUP BY {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...]),
         {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...])[, ...]
```

Considere o exemplo a seguir para ver como um pequeno agrupamento concatenado pode produzir um grande conjunto de resultados finais.

```
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)
```

## *Agrupamento aninhado*
<a name="r_GROUP_BY_aggregation-extentions-nested"></a>

 Você pode usar as operações GROUPING SETS/ROLLUP/CUBE como *expr* de seu GROUPING SETS para formar um agrupamento aninhado. O subagrupamento dentro da GROUPING SETS aninhada é nivelado. 

 A sintaxe para agrupamento aninhado é a seguinte.

```
GROUP BY GROUPING SETS({ROLLUP|CUBE|GROUPING SETS}(expr[, ...])[, ...])
```

Considere o exemplo a seguir.

```
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)
```

Observe que, como ROLLUP(category) e CUBE(product, pre\$1owned) contêm o conjunto de agrupamento (), a linha que representa o total geral é duplicada.

## *Observações de uso*
<a name="r_GROUP_BY_aggregation-extensions-usage-notes"></a>
+ A cláusula GROUP BY é compatível com até 64 conjuntos de agrupamento. No caso de ROLLUP e CUBE, ou alguma combinação de GROUPING SETS, ROLLUP e CUBE, essa limitação se aplica ao número implícito de conjuntos de agrupamento. Por exemplo, GROUP BY CUBE((a), (b)) conta como 4 conjuntos de agrupamento, não 2.
+ Não é possível usar constantes como colunas de agrupamento ao usar extensões de agregação.
+ Não é possível fazer um conjunto de agrupamento que contém colunas duplicadas.

# Cláusula HAVING
<a name="r_HAVING_clause"></a>

A cláusula HAVING aplica uma condição a um conjunto de resultados agrupados intermediários retornados por uma consulta.

## Sintaxe
<a name="r_HAVING_clause-synopsis"></a>

```
[ HAVING condition ]
```

Por exemplo, você pode restringir os resultados de uma função SUM:

```
having sum(pricepaid) >10000
```

A condição HAVING é aplicada depois que todas as condições da cláusula WHERE forem aplicadas e as operações GROUP BY concluídas.

A própria condição leva a mesma forma que qualquer condição da cláusula WHERE.

## Observações de uso
<a name="r_HAVING_clause_usage_notes"></a>
+ Qualquer coluna referida na condição da cláusula HAVING deve ser uma coluna de agrupamento ou uma coluna que faz referência ao resultado de uma função agregada.
+ Em uma cláusula HAVING, você não pode especificar:
  + Número ordinal que se refere a um item na lista de seleção. Somente as cláusulas GROUP BY e ORDER BY aceitam números ordinais.

## Exemplos
<a name="r_HAVING_clause-examples"></a>

A consulta a seguir calcula as vendas de ingressos globais para todos os eventos por nome e depois elimina eventos em que as vendas globais tenham sido menos de \$1 800.000. A condição HAVING é aplicada aos resultados da função agregada na lista de seleção: `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
```

A consulta a seguir calcula um conjunto de resultados semelhante. Nesse caso, no entanto, a condição HAVING é aplicada a um valor agregado não especificado na lista de seleção: `sum(qtysold)`. Os eventos que não tenham vendido mais de 2.000 ingressos são eliminados dos resultados finais.

```
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
```

A consulta a seguir calcula as vendas de ingressos globais para todos os eventos por nome e depois elimina eventos em que as vendas globais tenham sido menos de \$1 800.000. A condição HAVING é aplicada aos resultados da função agregada na lista de seleção usando o 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>

A cláusula QUALIFY filtra os resultados de uma função de janela previamente calculada de acordo com as condições de pesquisa especificadas pelo usuário. Você pode usar a cláusula para aplicar condições de filtragem ao resultado de uma função de janela sem usar uma subconsulta.

É semelhante à [cláusula HAVING](https://docs.aws.amazon.com/redshift/latest/dg/r_HAVING_clause.html), que aplica uma condição para filtrar ainda mais as linhas de uma cláusula WHERE. A diferença entre QUALIFY e HAVING é que os resultados filtrados da cláusula QUALIFY podem ser baseados no resultado da execução de funções de janela nos dados. Você pode usar as cláusulas QUALIFY e HAVING na mesma consulta.

## Sintaxe
<a name="r_QUALIFY-synopsis"></a>

```
QUALIFY condition
```

**nota**  
Se você estiver usando a cláusula QUALIFY diretamente após a cláusula FROM, o nome da relação FROM deverá ter um alias especificado antes da cláusula QUALIFY.

## Exemplos
<a name="r_QUALIFY-examples"></a>

Os exemplos desta seção utilizam os dados de amostra a seguir.

```
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);
```

O exemplo a seguir demonstra como encontrar os dois itens mais caros vendidos após as 12h de cada dia.

```
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
```

Depois, você pode encontrar o último item vendido em cada dia.

```
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
```

O exemplo a seguir retorna os mesmos registros que a consulta anterior, do último item vendido em cada dia, mas não usa a 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 e EXCEPT
<a name="r_UNION"></a>

**Topics**
+ [Sintaxe](#r_UNION-synopsis)
+ [Parâmetros](#r_UNION-parameters)
+ [Ordem de avaliação para operadores de conjunto](#r_UNION-order-of-evaluation-for-set-operators)
+ [Observações de uso](#r_UNION-usage-notes)
+ [Exemplos de consultas UNION](c_example_union_query.md)
+ [Exemplos de consultas UNION ALL](c_example_unionall_query.md)
+ [Exemplos de consultas INTERSECT](c_example_intersect_query.md)
+ [Exemplos de consultas EXCEPT](c_Example_MINUS_query.md)

Os *operadores de conjunto* UNION, INTERSECT e EXCEPT são usados para comparar e mesclar os resultados de duas expressões de consulta separadas. Por exemplo, se você quiser saber quais usuários de um site compram e vendem, mas os nomes de usuários estiverem armazenados em colunas ou tabelas separadas, você pode encontrar a *interseção* desses dois tipos de usuários. Se você quiser saber quais usuários do site compram, mas não vendem, você pode usar o operador EXCEPT para encontrar a *diferença* entre as duas listas de usuários. Se quiser criar uma lista com todos os usuários, independentemente da função, use o operador UNION.

## Sintaxe
<a name="r_UNION-synopsis"></a>

```
query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query
```

## Parâmetros
<a name="r_UNION-parameters"></a>

 *query*   
Uma expressão de consulta que corresponde, na forma de sua lista de seleção, a uma segunda expressão de consulta que segue o operador UNION, INTERSECT ou EXCEPT. As duas expressões devem conter o mesmo número de colunas de saída com tipos de dados compatíveis. Caso contrário, os dois conjuntos de resultados não poderão ser comparados e mesclados. Operações de conjunto não permitem a conversão implícita entre categorias diferentes de tipos de dados. Para obter mais informações, consulte [Compatibilidade e conversão dos tipos](c_Supported_data_types.md#r_Type_conversion).  
Você pode criar consultas contendo um número ilimitado de expressões de consulta e conectá-las aos operadores UNION, INTERSECT e EXCEPT em qualquer combinação. Por exemplo, a estrutura de consulta a seguir é válida, pressupondo que as tabelas T1, T2 e T3 contenham conjuntos compatíveis de colunas:   

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

UNION   
Operação de conjunto que retorna linhas de duas expressões de consulta, independentemente das linhas se derivarem de uma ou ambas as expressões.

INTERSECT   
Operação de conjunto que retorna linhas derivadas de duas expressões de consulta. As linhas que não forem retornadas por ambas as expressões serão descartadas.

EXCEPT \$1 MINUS   
Operação de conjunto que retorna linhas derivadas de uma das duas expressões de consulta. Para se qualificar para o resultado, as linhas precisam existir na primeira tabela de resultados, mas não na segunda. MINUS e EXCEPT são sinônimos. 

ALL   
A palavra-chave ALL retém todas as linhas duplicadas produzidas por UNION. O comportamento padrão quando a palavra-chave ALL não é utilizada é descartar essas linhas duplicadas. INTERSECT ALL, EXCEPT ALL e MINUS ALL não são compatíveis.

## Ordem de avaliação para operadores de conjunto
<a name="r_UNION-order-of-evaluation-for-set-operators"></a>

Os operadores de conjunto UNION e EXCEPT se associam à esquerda. Se não houver parênteses especificados para influenciar a ordem de precedência, uma combinação desses operadores de conjunto será avaliada da esquerda para a direita. Por exemplo, na consulta a seguir, o operador UNION de T1 e T2 é avaliado primeiro, seguido pela operação EXCEPT, que é executada no resultado de UNION: 

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

O operador INTERSECT tem precedência sobre os operadores UNION e EXCEPT quando uma combinação de operadores for usada na mesma consulta. Por exemplo, a consulta a seguir avalia a interseção de T2 e T3, e depois une o resultado com T1: 

```
select * from t1
union
select * from t2
intersect
select * from t3
order by c1;
```

Adicionando parênteses, você pode aplicar uma ordem diferente de avaliação. No caso a seguir, o resultado da união de T1 e T2 é cruzado com T3, e a consulta provavelmente produzirá um resultado diferente. 

```
(select * from t1
union
select * from t2)
intersect
(select * from t3)
order by c1;
```

## Observações de uso
<a name="r_UNION-usage-notes"></a>
+ Os nomes de colunas obtidos no resultado de uma consulta de operação de conjunto são os nomes de colunas (ou aliases) das tabelas na primeira expressão de consulta. Como esses nomes de coluna podem induzir a erros, os valores na coluna derivam de tabelas em ambos os lados do operador de conjunto, você pode querer fornecer aliases significativos para o conjunto de resultados.
+ Uma expressão de consulta que preceda um operador de conjunto não deve conter uma cláusula ORDER BY. Uma cláusula ORDER BY produz resultados significativos classificados somente quando é usada no final de uma consulta que contenha operadores de conjunto. Nesse caso, a cláusula ORDER BY se aplica a resultados finais de todas as operações de conjunto. A consulta mais externa também pode conter as cláusulas LIMIT e OFFSET padrão. 
+ Quando as consultas do operador de conjunto retornam resultados decimais, as colunas de resultados correspondentes são promovidas para retornar a mesma precisão e escala. Por exemplo, na consulta a seguir, em que T1.REVENUE é uma coluna DECIMAL(10,2) e T2.REVENUE é uma coluna DECIMAL(8,4), o resultado decimal é atualizado para DECIMAL(12,4): 

  ```
  select t1.revenue union select t2.revenue;
  ```

  A escala é `4` porque é a escala máxima das duas colunas. A precisão é `12` porque T1.REVENUE requer 8 dígitos à esquerda do ponto decimal (12 - 4 = 8). Essa promoção de tipo garante que todos os valores de ambos os lados de UNION se encaixem no resultado. Para valores de 64 bits, a precisão máxima de resultado é 19 e a escala máxima de resultado é 18. Para valores de 128-bits, a precisão máxima de resultado é 38 e a escala máxima de resultado é 37.

  Se o tipo de dados resultante ultrapassar os limites de precisão e escala do Amazon Redshift, a consulta retornará um erro.
+ Para operações de conjunto, duas linhas são tratadas como idênticas se, para cada par de colunas correspondente, os dois valores de dados forem *iguais* ou *ambos NULL*. Por exemplo, se as tabelas T1 e T2 contiverem uma coluna e uma linha, e a linha for NULL em ambas as tabelas, uma operação INTERSECT sobre essas tabelas retornará essa linha.

# Exemplos de consultas UNION
<a name="c_example_union_query"></a>

Na consulta UNION a seguir, as linhas na tabela SALES são mescladas com as linhas na tabela LISTING. Três colunas compatíveis de cada tabela são selecionadas. Nesse caso, as colunas correspondentes têm os mesmos nomes e tipos de dados. 

O conjunto de resultados finais é classificado pela primeira coluna na tabela LISTING e limitado a 5 linhas com o valor de LISTID mais alto. 

```
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)
```

O exemplo a seguir mostra como você pode adicionar um valor literal de saída de uma consulta UNION para ver qual expressão de consulta produziu cada linha no conjunto de resultados. A consulta identifica linhas da primeira expressão de consulta como “B” (para compradores) e linhas da segunda expressão de consulta como “S” (para vendedores). 

A consulta identifica compradores e vendedores para as transações de ingressos que custem \$110.000 ou mais. A única diferença entre as duas expressões de consulta em ambos os lados do operador UNION é a coluna de junção para a tabela 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)
```

O exemplo a seguir usa um operador UNION ALL porque se forem encontradas linhas duplicadas, elas devem ser mantidas no resultado. Para uma série específica de IDs de evento, a consulta retorna 0 ou mais linhas para cada venda associada a cada evento, e 0 ou 1 linha para cada lista desse evento. Os IDs de evento são exclusivos para cada linha nas tabelas LISTING e EVENT, mas pode haver várias vendas para a mesma combinação de IDs de evento e de lista na tabela SALES. 

A terceira coluna no conjunto de resultados identifica a origem da linha. Se vier da tabela SALES, “Yes” é marcado na coluna SALESROW. (SALESROW é um alias para SALES.LISTID.) Se a linha vier da tabela LISTING, “No” é marcado na coluna SALESROW. 

Nesse caso, o conjunto de resultados consiste em três linhas de vendas para a lista 500, evento 7787. Em outras palavras, três transações diferentes ocorreram para essa combinação de lista e evento. Outras duas listas, 501 e 502, não produziram vendas. Dessa forma, a única linha que a consulta produz para esses IDs de lista vem de tabela 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)
```

Se você executar a mesma consulta sem a palavra-chave ALL, o resultado manterá somente uma das transações de vendas. 

```
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)
```

# Exemplos de consultas UNION ALL
<a name="c_example_unionall_query"></a>

O exemplo a seguir usa um operador UNION ALL porque se forem encontradas linhas duplicadas, elas devem ser mantidas no resultado. Para uma série específica de IDs de evento, a consulta retorna 0 ou mais linhas para cada venda associada a cada evento, e 0 ou 1 linha para cada lista desse evento. Os IDs de evento são exclusivos para cada linha nas tabelas LISTING e EVENT, mas pode haver várias vendas para a mesma combinação de IDs de evento e de lista na tabela SALES.

A terceira coluna no conjunto de resultados identifica a origem da linha. Se vier da tabela SALES, “Yes” é marcado na coluna SALESROW. (SALESROW é um alias para SALES.LISTID.) Se a linha vier da tabela LISTING, “No” é marcado na coluna SALESROW.

Nesse caso, o conjunto de resultados consiste em três linhas de vendas para a lista 500, evento 7787. Em outras palavras, três transações diferentes ocorreram para essa combinação de lista e evento. Outras duas listas, 501 e 502, não produziram vendas. Dessa forma, a única linha que a consulta produz para esses IDs de lista vem de tabela 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)
```

Se você executar a mesma consulta sem a palavra-chave ALL, o resultado manterá somente uma das transações de vendas. 

```
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)
```

# Exemplos de consultas INTERSECT
<a name="c_example_intersect_query"></a>

Compare o exemplo a seguir com o primeiro exemplo de UNION. A única diferença entre os dois exemplos é o operador de conjunto usado, mas os resultados são muito diferentes. Somente uma das linhas é a mesma: 

```
235494 |    23875 |    8771
```

 Essa é a única linha no resultado limitado de 5 linhas encontrada em ambas as tabelas.

```
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)
```

A consulta a seguir encontra eventos (em que foram vendidos ingressos) que ocorreram em locais em Nova York e Los Angeles em março. A diferença entre as duas expressões de consulta é a restrição na coluna 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)
```

# Exemplos de consultas EXCEPT
<a name="c_Example_MINUS_query"></a>

A tabela CATEGORY no banco de dados TICKIT contém as seguintes 11 linhas: 

```
 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)
```

Pressuponha que uma tabela CATEGORY\$1STAGE (tabela de preparação) contém uma linha 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)
```

Retorne a diferença entre as duas tabelas. Em outras palavras, retorne as linhas que estão na tabela CATEGORY\$1STAGE, mas não na tabela CATEGORY: 

```
select * from category_stage
except
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

A consulta equivalente a seguir usa o 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)
```

Se você reverter a ordem das expressões SELECT, a consulta não retornará qualquer linha. 

# Cláusula ORDER BY
<a name="r_ORDER_BY_clause"></a>

**Topics**
+ [Sintaxe](#r_ORDER_BY_clause-synopsis)
+ [Parâmetros](#r_ORDER_BY_clause-parameters)
+ [Observações de uso](#r_ORDER_BY_usage_notes)
+ [Exemplos com ORDER BY](r_Examples_with_ORDER_BY.md)

A cláusula ORDER BY classifica o conjunto de resultados de uma consulta.

## Sintaxe
<a name="r_ORDER_BY_clause-synopsis"></a>

```
[ ORDER BY expression [ ASC | DESC ] ]
[ NULLS FIRST | NULLS LAST ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
```

## Parâmetros
<a name="r_ORDER_BY_clause-parameters"></a>

 *expressão*   
Expressão que define a ordem de classificação do conjunto de resultados da consulta, geralmente especificando uma ou mais colunas na lista de seleção. Os resultados são obtidos com base na ordem binária UTF-8. Também é possível especificar o seguinte:  
+ Colunas que não estiverem na lista de seleção
+ Expressões formadas por uma ou mais colunas que existem em tabelas referidas pela consulta
+ Números ordinais que representam a posição de entradas da lista de seleção (ou a posição das colunas na tabela se não houver lista de seleção)
+ Aliases que definem entradas da lista de seleção
Quando a cláusula ORDER BY tiver várias expressões, o conjunto de resultados será classificado de acordo com a primeira expressão, e a segunda expressão será aplicada a linhas que tenham valores correspondentes com os da primeira expressão, e assim por diante.

ASC \$1 DESC   
Opção que define a ordem de classificação para a expressão, da seguinte forma:   
+ ASC: ascendente (por exemplo, de valores numéricos menores para maiores e de "A" a "Z" para strings de caracteres). Se nenhuma opção é especificada, os dados são classificados na ordem ascendente por padrão. 
+ DESC: descendente (de valores numéricos maiores para menores; de "Z" a "A" para strings). 

NULLS FIRST \$1 NULLS LAST  
Opção que especifica se valores NULL devem ser classificados primeiro, antes de valores não nulos, ou por último, depois de valores não nulos. Por padrão, os valores NULL são ordenados e classificados por último na ordem ASC e são ordenados e classificados primeiro na ordem DESC.

LIMIT *number* \$1 ALL   <a name="order-by-clause-limit"></a>
Opção que controla o número de linhas classificadas que a consulta retorna. O número LIMIT deve ser um inteiro positivo. O valor máximo é `2147483647`.   
LIMIT 0 não retorna linhas. Você pode usar essa sintaxe para fins de teste: para garantir que uma consulta seja executada (sem exibir qualquer linha) ou obter uma lista de colunas de uma tabela. Uma cláusula ORDER BY é redundante se você estiver usando LIMIT 0 para obter uma lista de colunas. O valor padrão é LIMIT ALL. 

OFFSET *start*   <a name="order-by-clause-offset"></a>
Opção que especifica para ignorar o número de linhas antes de *start* antes de começar a retornar linhas. O número OFFSET deve ser um inteiro positivo. O valor máximo é `2147483647`. Quando usadas com a opção de LIMIT, as linhas OFFSET são ignoradas antes de iniciar a contagem de linhas LIMIT que são retornadas. Se a opção LIMIT não for usada, o número de linhas no conjunto de resultados será reduzido para o número de linhas ignoradas. As linhas ignoradas por uma cláusula OFFSET ainda precisam passar por varredura, e pode não ser eficiente usar um valor OFFSET grande.

## Observações de uso
<a name="r_ORDER_BY_usage_notes"></a>

 Observe o seguinte comportamento esperado com cláusulas ORDER BY: 
+ Os valores NULL são considerados "mais altos" que todos os demais valores. Com a ordem de classificação crescente padrão, os valores NULL são classificados no final. Para alterar esse comportamento, use a opção NULLS FIRST.
+ Quando uma consulta não tiver uma cláusula ORDER BY, o sistema retornará conjuntos de resultados sem uma classificação previsível das linhas. A mesma consulta executada duas vezes pode retornar o conjunto de resultados em uma ordem diferente. 
+ As opções LIMIT e OFFSET podem ser usadas sem uma cláusula ORDER BY. No entanto, para obter um conjunto consistente de linhas, use essas opções em conjunto com ORDER BY. 
+ Em qualquer sistema paralelo como o Amazon Redshift, quando uma cláusula ORDER BY não produz uma classificação exclusiva dos dados, a ordem das linhas não é determinística. Portanto, se a expressão ORDER BY produz valores duplicados, a ordem de retorno dessas linhas pode variar de outros sistemas ou de uma execução do Amazon Redshift para outra. 
+ O Amazon Redshift não oferece suporte a literais de string nas cláusulas ORDER BY.

# Exemplos com ORDER BY
<a name="r_Examples_with_ORDER_BY"></a>

Retorne todas as 11 linhas da tabela CATEGORY, classificada pela segunda coluna, CATGROUP. Para os resultados que têm o mesmo valor de CATGROUP, classifique os valores da coluna CATDESC pelo tamanho da string. Depois, organize pelas colunas CATID e 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)
```

Retorne colunas selecionadas da tabela SALES, classificada pelos valores mais altos de QTYSOLD. Limite o resultado às 10 primeiras linhas: 

```
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)
```

Retorne uma lista de colunas e nenhuma linha usando a sintaxe 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>

A cláusula CONNECT BY especifica a relação entre as linhas em uma hierarquia. Você pode usar CONNECT BY para selecionar linhas em uma ordem hierárquica unindo a tabela a ela mesma e processando os dados hierárquicos. Por exemplo, você pode usá-la para percorrer recursivamente um organograma e listar dados.

As consultas hierárquicas são processadas na seguinte ordem:

1. Se a cláusula FROM tiver uma união, ela será processada primeiro.

1. A cláusula CONNECT BY é avaliada.

1. A cláusula WHERE é avaliada.

## Sintaxe
<a name="r_CONNECT_BY_clause-synopsis"></a>

```
[START WITH start_with_conditions]
CONNECT BY connect_by_conditions
```

**nota**  
Embora START e CONNECT não sejam palavras reservadas, use identificadores delimitados (aspas duplas) ou AS se estiver usando START e CONNECT como aliases de tabela em sua consulta para evitar falhas no runtime.

```
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'
```

## Parâmetros
<a name="r_CONNECT_BY_parameters"></a>

 *start\$1with\$1conditions*   
Condições que especificam a(s) linha(s) raiz da hierarquia

 *connect\$1by\$1conditions*   
Condições que especificam a relação entre as linhas pais e as linhas filhas da hierarquia. Pelo menos uma condição deve ser qualificada com o operador unário ` ` usado para se referir à linha pai.  

```
PRIOR column = expression
-- or
expression > PRIOR column
```

## Operadores
<a name="r_CONNECT_BY_operators"></a>

É possível usar os seguintes operadores na consulta CONNECT BY.

 *LEVEL*   
Pseudocoluna que retorna o nível da linha atual na hierarquia. Retorna 1 para a linha raiz, 2 para a filha da linha raiz e assim por diante.

 *PRIOR*   
Operador unário que avalia a expressão da linha pai da linha atual na hierarquia.

## Exemplos
<a name="r_CONNECT_BY_example"></a>

O exemplo a seguir é uma consulta CONNECT BY que retorna o número de funcionários subordinados direta ou indiretamente a John, até o máximo de 4 níveis. 

```
SELECT id, name, manager_id
FROM employee
WHERE LEVEL < 4
START WITH name = 'John'
CONNECT BY PRIOR id = manager_id;
```

A seguir é o resultado da 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
```

 Definição da tabela para esse exemplo: 

```
CREATE TABLE employee (
   id INT,
   name VARCHAR(20),
   manager_id INT
   );
```

 A seguir estão as linhas inseridas na tabela. 

```
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 seguir está um organograma para o departamento de John.

![\[Um organograma do departamento de John.\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/images/org-chart.png)


# Exemplos de subconsulta
<a name="r_Subquery_examples"></a>

Os exemplos a seguir mostram diferentes maneiras em que subconsultas se encaixam em consultas SELECT. Consulte [Exemplos de JOIN](r_Join_examples.md) para obter outros exemplos de uso de subconsultas. 

## Subconsulta da lista SELECT
<a name="r_Subquery_examples-select-list-subquery"></a>

O exemplo a seguir contém um subconsulta na lista SELECT. Esta subconsulta é *escalar*: retorna somente uma coluna e um valor, que é repetido nos resultados para cada linha retornada da consulta exterior. A consulta compara o valor Q1SALES que a subconsulta computa com valores de vendas de outros dois trimestres (2 e 3) em 2008, como definido pela consulta externa. 

```
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 da cláusula WHERE
<a name="r_Subquery_examples-where-clause-subquery"></a>

O exemplo a seguir contém um subconsulta de tabela na cláusula WHERE. Essa subconsulta produz várias linhas. Nesse caso, as linhas contêm apenas uma coluna, mas as subconsultas da tabela podem conter várias colunas e linhas, assim como qualquer outra tabela. 

A consulta encontra os 10 principais vendedores em termos quantidade máxima de ingressos vendidos. A lista dos 10 principais é restringida pela subconsulta, que remove usuários que vivem em cidades onde há locais de venda de ingressos. Essa consulta pode ser gravada de diferentes maneiras. Por exemplo, a subconsulta pode ser regravada como uma junção na 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 da 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>

O exemplo a seguir contém uma *subconsulta correlacionada* na cláusula WHERE. Esse tipo de subconsulta contém uma ou mais correlações entre as colunas e as colunas produzidas pela consulta externa. Nesse caso, a correlação é `where s.listid=l.listid`. Para cada linha que a consulta externa produz, a subconsulta é executada para qualificar ou desqualificar a linha. 

```
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)
```

## Padrões de subconsultas correlacionadas não compatíveis
<a name="r_correlated_subqueries-correlated-subquery-patterns-that-are-not-supported"></a>

O planejador de consultas usa um método de regravação de consulta chamado decorrelação de subconsultas para otimizar vários padrões de subconsultas correlacionadas para execução em um ambiente de processamento paralelo massivo (MPP). Alguns tipos de subconsultas correlacionadas seguem padrões cuja correlação o Amazon Redshift não pode anular e aos quais ele não oferece suporte. Consultas que contenham erros de retorno das seguintes referências de correlação: 
+  Referências de correlação que ignoram um bloco de consultas, também conhecidas como "referências de correlação para ignorar consultas". Por exemplo, na consulta a seguir, o bloco contendo a referência de correlação e o bloco ignorado estão conectados por um 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));
  ```

  O bloco ignorado nesse caso é a subconsulta na tabela LISTING. A referência de correlação correlaciona as tabelas EVENT e SALES. 
+  Referências de correlação de uma subconsulta que é parte de uma cláusula ON em uma 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);
  ```

  A cláusula ON contém uma referência de correlação de SALES na subconsulta de EVENT na consulta externa. 
+ Referências de correlação nulo-sensíveis a uma tabela do sistema Amazon Redshift. Por exemplo: 

  ```
  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);
  ```
+ Referências de correlação de dentro de uma subconsulta que contém uma função de janela. 

  ```
  select listid, qtysold
  from sales s
  where qtysold not in
  (select sum(numtickets) over() from listing l where s.listid=l.listid);
  ```
+ Referências em uma coluna GROUP BY para os resultados de um subconsulta correlacionada. Por exemplo: 

  ```
  select listing.listid,
  (select count (sales.listid) from sales where sales.listid=listing.listid) as list
  from listing
  group by list, listing.listid;
  ```
+ Referências de correlação de uma subconsulta com uma função agregada e uma cláusula GROUP BY, conectada à consulta externa por um predicado IN. (Essa restrição não se aplica a funções agregadas MIN e MAX.) Por exemplo: 

  ```
  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>

Seleciona as linhas definidas por qualquer consulta e as introduz em uma nova tabela. Você pode especificar se deseja criar uma tabela temporário ou persistente. 

## Sintaxe
<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 obter detalhes sobre os parâmetros deste comando, consulte [SELECT](r_SELECT_synopsis.md). 

## Exemplos
<a name="r_SELECT_INTO-examples"></a>

Selecione todas as linhas da tabela EVENT e crie uma tabela NEWEVENT: 

```
select * into newevent from event;
```

Selecione o resultado de uma consulta agregada em uma tabela temporária chamada 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>

Define o valor de um parâmetro de configuração de servidor. Use o comando SET para substituir uma configuração para a duração da sessão ou transação atual somente.

Usa o comando [RESET](r_RESET.md) para que um parâmetro volte ao seu valor padrão. 

É possível alterar os parâmetros de configuração do servidor de várias maneiras. Para obter mais informações, consulte [Modificar a configuração do servidor](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings). 

## Sintaxe
<a name="r_SET-synopsis"></a>

```
SET { [ SESSION | LOCAL ]
{ SEED | parameter_name } { TO | = }
{ value | 'value' | DEFAULT } |
SEED TO value }
```

A instrução a seguir define o valor de uma variável de contexto de sessão.

```
SET { [ SESSION | LOCAL ]
variable_name { TO | = }
{ value | 'value'  }
```

## Parâmetros
<a name="r_SET-parameters"></a>

SESSION   
Especifica que a configuração é válida para a sessão atual. Valor padrão.

*variable\$1name*   
Especifica o nome da variável de contexto definida para a sessão.  
A convenção de nomenclatura é um nome de duas partes separado por um ponto; por exemplo *identificador.identificador*. Só é permitido um separador de ponto. Use um *identificador* que siga as regras de identificador padrão do Amazon Redshift. Para obter mais informações, consulte [Nomes e identificadores](r_names.md). Não são permitidos identificadores delimitados.

LOCAL   
Especifica que a configuração é válida para a transação atual. 

SEED TO *valor*   
Define uma propagação interna a ser usada pela função RANDOM para a geração de números aleatórios.  
SET SEED escolhe um *valor* numérico entre 0 e 1 e multiplica esse número por (231-1) para uso com a função [Função RANDOM](r_RANDOM.md). Se você usar SET SEED antes de fazer diversas chamadas RANDOM, RANDOM gerará números em uma sequência previsível.

 *parameter\$1name*   
Nome do parâmetro a ser definido. Consulte [Modificar a configuração do servidor](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings) para obter informações sobre parâmetros.

 *valor*   
Novo valor do parâmetro. Use aspas simples para definir o valor de uma string específica. Se estiver usando SET SEED, esse parâmetro contém o valor SEED. 

DEFAULT   
Define o parâmetro para o valor padrão.

## Exemplos
<a name="r_SET-examples"></a>

 **Alterar um parâmetro para a sessão atual** 

O exemplo a seguir define datestyle:

```
set datestyle to 'SQL,DMY';
```

 **Configurar um grupo de consultas para gerenciamento de workload** 

Se grupos de consulta estiverem listados em uma definição de fila como parte da configuração de WLM do cluster, configure o parâmetro QUERY\$1GROUP para um nome de grupo de consultas listado. Consultas subsequentes são atribuídas à fila de consultas associada. A configuração de QUERY\$1GROUP permanece em vigor pela duração da sessão ou até que o comando RESET QUERY\$1GROUP seja encontrado.

Este exemplo executa duas consultas como parte de 'priority' do grupo de consultas e, depois, redefine o 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 obter mais informações, consulte [Gerenciamento do workload](cm-c-implementing-workload-management.md). 

 **Alterar o namespace de identidade padrão para a sessão** 

Um usuário do banco de dados pode definir `default_identity_namespace`. Este exemplo mostra como usar `SET SESSION` para substituir a configuração durante a sessão atual e, depois, mostrar o novo valor do provedor de identidades. Isso é usado com maior frequência quando você utiliza um provedor de identidades com o Redshift e o Centro de Identidade do IAM. Para ter mais informações sobre como usar um provedor de identidades com o Redshift, consulte [Conectar o Redshift ao IAM Identity Center para proporcionar aos usuários uma experiência de logon ú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;
```

Após a execução do comando, é possível executar uma declaração GRANT ou CREATE como a seguinte:

```
GRANT SELECT ON TABLE mytable TO alice;

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

Nesse caso, o efeito de definir o namespace de identidade padrão é equivalente a prefixar cada identidade com o namespace. Neste exemplo, `alice` é substituído por `MYCO:alice`. Para ter mais informações sobre definições relativas à configuração do Centro de Identidade do IAM, consulte [ALTER SYSTEM](r_ALTER_SYSTEM.md) e [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md).

 **Configurar uma identificação para um grupo de consultas** 

O parâmetro QUERY\$1GROUP define um rótulo para uma ou mais consultas que são executadas na mesma sessão após um comando SET. Por sua vez, esse rótulo é registrado quando as consultas são executadas e pode ser usado para restringir os resultados retornados das tabelas de sistema STL\$1QUERY e STV\$1INFLIGHT e da visualização 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)
```

As identificações de grupo de consulta são um mecanismo útil para isolar consultas individuais ou grupos de consultas executadas como parte de scripts. Você não precisa identificar e monitorar consultas pelos IDs; você pode acompanhá-las por suas identificações.

 **Configurar um valor de seed para a geração de números aleatórios** 

O exemplo a seguir usa a opção SEED com SET para que a função RANDOM gere números em uma sequência previsível.

Primeiro, retorne três inteiros RANDOM sem definir o valor de SEED primeiro: 

```
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)
```

Agora, defina o valor de SEED como `.25` e retorne mais três números RANDOM: 

```
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)
```

Por fim, redefina o valor de SEED como `.25` e verifique se RANDOM retorna os mesmos resultados que as três chamadas 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)
```

O exemplo a seguir define uma variável 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>

Define o nome do usuário da sessão atual.

Você pode usar o comando SET SESSION AUTHORIZATION, por exemplo, para testar o acesso ao banco de dados temporariamente executando uma sessão ou uma transação como um usuário sem privilégios. Você deve ser um superusuário do banco de dados para executar este comando.

## Sintaxe
<a name="r_SET_SESSION_AUTHORIZATION-synopsis"></a>

```
SET [ LOCAL ] SESSION AUTHORIZATION { user_name | DEFAULT }
```

## Parâmetros
<a name="r_SET_SESSION_AUTHORIZATION-parameters"></a>

LOCAL  
Especifica que a configuração é válida para a transação atual. Omitir esse parâmetro especifica que a configuração é válida para a sessão atual.

 *user\$1name*   
Nome do usuário a ser definido. O nome de usuário pode ser gravado como um identificador ou uma string literal.

DEFAULT  
Define o nome de usuário da sessão como o valor padrão.

## Exemplos
<a name="r_SET_SESSION_AUTHORIZATION-examples"></a>

O exemplo a seguir define o nome do usuário da sessão atual como `dwuser`:

```
SET SESSION AUTHORIZATION 'dwuser';
```

O exemplo a seguir define o nome do usuário da transação atual como `dwuser`:

```
SET LOCAL SESSION AUTHORIZATION 'dwuser';
```

Este exemplo define o nome do usuário da sessão atual como o nome de usuário padrão:

```
SET SESSION AUTHORIZATION DEFAULT;
```

# SET SESSION CHARACTERISTICS
<a name="r_SET_SESSION_CHARACTERISTICS"></a>

Este comando está obsoleto.

# SHOW
<a name="r_SHOW"></a>

Exibe o valor atual de um parâmetro de configuração de servidor. Esse valor pode ser específico de uma sessão atual se o comando SET estiver em vigor. Para obter uma lista dos parâmetros de configuração, consulte [Referência da configuração](cm_chap_ConfigurationRef.md).

## Sintaxe
<a name="r_SHOW-synopsis"></a>

```
SHOW { parameter_name | ALL }
```

A instrução a seguir exibe o valor atual de uma variável de contexto de sessão. Se a variável não existir, o Amazon Redshift lançará um erro.

```
SHOW variable_name
```

## Parâmetros
<a name="r_SHOW-parameters"></a>

 *parameter\$1name*   
Exibe o valor atual do parâmetro especificado.

ALL   
Exibe os valores atuais de todos os parâmetros.

*variable\$1name*   
Exibe o valor atual da variável especificada.

## Exemplos
<a name="r_SHOW-examples"></a>

O exemplo a seguir exibe o valor para o parâmetro de query\$1group: 

```
show query_group;

query_group

unset
(1 row)
```

O exemplo a seguir exibe uma lista de todos os parâmetros e seus valores: 

```
show all;
name        |   setting
--------------------+--------------
datestyle          | ISO, MDY
extra_float_digits | 0
query_group        | unset
search_path        | $user,public
statement_timeout  | 0
```

O exemplo a seguir exibe o valor atual da variável especificada.

```
SHOW app_context.user_id;
```

# SHOW COLUMN GRANTS
<a name="r_SHOW_COLUMN_GRANTS"></a>

Exibe concessões em uma coluna dentro de uma tabela.

## Permissões obrigatórias
<a name="r_SHOW_COLUMN_GRANTS-required-permissions"></a>

SHOW GRANTS para um objeto de destino exibirá somente concessões visíveis para o usuário atual. Uma concessão ficará visível para o usuário atual se o usuário atual atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o usuário que recebeu a concessão.
+ Receber o título de proprietário do perfil concedido.
+ Receber o perfil pretendido pela concessão do objeto.

## Sintaxe
<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]
```

## Parâmetros
<a name="r_SHOW_COLUMN_GRANTS-parameters"></a>

database\$1name  
O nome do banco de dados que contém a tabela de destino.

schema\$1name  
O nome do esquema que contém a tabela de destino.

table\$1name  
O nome da tabela de destino.

username  
Inclua apenas concessões ao nome de usuário na saída.

role\$1name  
Inclua apenas concessões a role\$1name na saída.

PUBLIC  
Inclua apenas concessões a PUBLIC na saída.

row\$1limit  
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000.

## Exemplos
<a name="r_SHOW_COLUMN_GRANTS-examples"></a>

O exemplo a seguir mostra as concessões de colunas na tabela 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
```

O exemplo a seguir mostra as concessões de colunas na tabela demo\$1schema.t100 para o bob do usuário:

```
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>

Mostra uma lista de colunas em uma tabela, bem como alguns atributos da coluna.

Cada linha de saída é composta dos seguintes elementos: lista separada por vírgula do nome do banco de dados, nome do esquema, nome da tabela, nome da coluna, posição ordinal, padrão da coluna, se anulável, tipo de dados, extensão máxima de caracteres, precisão numérica, comentários, tipo dechave de classificação, ordem de chave de classificação, chave de distribuição, codificação e agrupamento. Para obter mais informações sobre esses atributos, consulte [SVV\$1ALL\$1COLUMNS](r_SVV_ALL_COLUMNS.md).

Se mais de 10.000 colunas resultarem do comando SHOW COLUMNS, será retornado um erro.

## Permissões obrigatórias
<a name="r_SHOW_COLUMNS-privileges"></a>

Para visualizar uma coluna em uma tabela do Amazon Redshift, o usuário atual deve atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o proprietário da tabela.
+ Ter recebido o privilégio USAGE no esquema principal e o privilégio SELECT na tabela ou ter recebido o privilégio SELECT na coluna.

## Sintaxe
<a name="r_SHOW_COLUMNS-synopsis"></a>

```
SHOW COLUMNS FROM TABLE database_name.schema_name.table_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parâmetros
<a name="r_SHOW_COLUMNS-parameters"></a>

 *database\$1name*   
O nome do banco de dados que contém as tabelas a serem listadas.   
Para mostrar tabelas em um AWS Glue Data Catalog, especifique (`awsdatacatalog`) como o nome do banco de dados e assegure que a configuração do sistema `data_catalog_auto_mount` esteja definida como `true`. Para obter mais informações, consulte [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *schema\$1name*   
O nome do esquema que contém as tabelas a serem listadas.   
Para mostrar tabelas do AWS Glue Data Catalog, forneça o nome do banco de dados do AWS Glue como nome do esquema.

 *table\$1name*   
O nome da tabela que contém as colunas a listar. 

 *filter\$1pattern*   
Uma expressão de caractere UTF-8 válida com o padrão para estabelecer correspondência com os nomes da tabela. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_SHOW_COLUMNS.html)
Se *filter\$1pattern* não contiver metacaracteres, o padrão representará somente a própria string. Nesse caso, LIKE age da mesma forma que o operador de igualdade. 

 *row\$1limit*   
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000. 

## Exemplos
<a name="r_SHOW_COLUMNS-examples"></a>

O exemplo a seguir mostra as colunas no banco de dados do Amazon Redshift chamado `sample_data_dev` que estão no esquema `tickit` e na tabela `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 |
```

O exemplo a seguir mostra as tabelas no banco de dados do AWS Glue Data Catalog chamado `awsdatacatalog` que estão no esquema `batman` e na tabela `nation`. A saída é limitada a `2` linhas.

```
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>

Mostra uma lista de restrições da chave primária e da chave externa em uma tabela.

## Permissões obrigatórias
<a name="r_SHOW_CONSTRAINTS-required-permissions"></a>

Para executar SHOW CONSTRAINTS em uma tabela, o usuário atual deve atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o proprietário da tabela.
+ Ter recebido o privilégio USAGE no esquema principal e o privilégio USAGE na tabela.

## Sintaxe
<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]
```

## Parâmetros
<a name="r_SHOW_CONSTRAINTS-parameters"></a>

*database\$1name*  
O nome do banco de dados que contém a tabela de destino.

*schema\$1name*  
O nome do esquema que contém a tabela de destino.

*table\$1name*  
O nome da tabela de destino.

EXPORTED  
Quando EXPORTED for especificado, liste todas as chaves externas de outras tabelas que fazem referência à tabela de destino.

*row\$1limit*  
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000.

## Exemplos
<a name="r_SHOW_CONSTRAINTS-examples"></a>

O exemplo a seguir mostra as restrições da chave primária da tabela 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
```

O exemplo a seguir mostra as restrições da chave externa da tabela 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 |             |             |
```

O exemplo a seguir mostra as restrições da chave externa exportada da tabela 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>

Exibe a definição de uma tabela externa, incluindo atributos de tabela e atributos de coluna. Use a saída da instrução SHOW EXTERNAL TABLE para recriar a tabela. 

Para obter mais informações sobre a criação de tabelas externas, consulte [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). 

## Sintaxe
<a name="r_SHOW_EXTERNAL_TABLE-synopsis"></a>

```
SHOW EXTERNAL TABLE [external_database].external_schema.table_name [ PARTITION ]
```

## Parâmetros
<a name="r_SHOW_EXTERNAL_TABLE-parameters"></a>

 *external\$1database*   
O nome do banco de dados externo associado. Esse parâmetro é opcional.

 *external\$1schema*   
Nome do novo esquema externo associado. 

 *table\$1name*   
O nome da tabela a ser exibida. 

PARTITION   
Exibe instruções ALTER TABLE para adicionar partições à definição de tabela. 

## Exemplos
<a name="r_SHOW_EXTERNAL_TABLE-examples"></a>

Os exemplos a seguir são baseados em uma tabela externa definida da seguinte forma:

```
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';
```

Segue-se um exemplo do comando e saída SHOW EXTERNAL TABLE para a tabela `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';"
```

Veja um exemplo do comando SHOW EXTERNAL TABLE e a saída para a mesma tabela definida, mas com o banco de dados também especificado no 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';"
```

Segue-se um exemplo do comando e saída SHOW EXTERNAL TABLE ao usar o parâmetro `PARTITION`. A saída contém instruções ALTER TABLE para adicionar partições à definição de tabela.

```
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>

Exibe bancos de dados de um catálogo de dados ou de um data warehouse do Amazon Redshift. SHOW DATABASES mostra todos os bancos de dados acessíveis; por exemplo, dentro do data warehouse, bancos de dados do AWS Glue Data Catalog (awsdatacatalog), bancos de dados de compartilhamento de dados e bancos de dados do Lake Formation.

## Permissões obrigatórias
<a name="r_SHOW_DATABASES-privileges"></a>

Todos os bancos de dados ficam visíveis para os usuários, mas há uma exceção:
+ Nos bancos de dados criados por meio de uma unidade de compartilhamento de dados com permissão para ficarem visíveis, o usuário atual deve receber a permissão USAGE no banco de dados.

## Sintaxe
<a name="r_SHOW_DATABASES-syntax"></a>

Para mostrar os bancos de dados de um data warehouse do Amazon Redshift:

```
SHOW DATABASES 
[ LIKE '<expression>' ]
[ LIMIT row_limit ]
```

Para mostrar os bancos de dados de um catálogo de dados:

```
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 ]
```

## Parâmetros
<a name="r_SHOW_DATABASES-parameters"></a>

ACCOUNT '<id1>', '<id2>', ...   
As contas AWS Glue Data Catalog das quais deseja listar bancos de dados. Omitir esse parâmetro indica que o Amazon Redshift deve mostrar os bancos de dados da conta que detém o cluster.

LIKE '<expression>'  
Filtra a lista de bancos de dados aos correspondentes à expressão especificada por você. Esse parâmetro é compatível com padrões que usam os caracteres curinga % (porcentagem) e \$1 (sublinhado).

IAM\$1ROLE default \$1 'SESSION' \$1 'arn:aws:iam::<account-id>:role/<role-name>'  
Se você especificar um perfil do IAM associado ao cluster ao executar o comando SHOW DATABASES, o Amazon Redshift usará as credenciais do perfil ao executar consultas no banco de dados.  
Especificar a palavra-chave `default` significa usar o perfil do IAM que está definido como padrão e associado ao cluster.  
Use `'SESSION'` se você se conectar ao cluster do Amazon Redshift usando uma identidade federada e acesse as tabelas do banco de dados externo criado usando o comando [CREATE DATABASE](r_CREATE_DATABASE.md). Para obter um exemplo do uso de uma identidade federada, consulte [Usar uma identidade federada para gerenciar o acesso do Amazon Redshift aos recursos locais e a tabelas externas do Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html), que explica como configurar uma identidade federada.   
Use o nome do recurso da Amazon (ARN) de uma função do IAM que seu cluster usa para autenticação e autorização. No mínimo, a função do IAM deve ter permissão para executar uma operação LIST no bucket do Amazon S3 a ser acessado e uma operação GET nos objetos do Amazon S3 que constam no bucket. Para saber mais sobre bancos de dados criados por meio do AWS Glue Data Catalog para unidades de compartilhamento de dados e usando IAM\$1ROLE, consulte [Trabalhar com unidades de compartilhamento de dados gerenciadas pelo Lake Formation como consumidor](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html).  
O exemplo a seguir mostra a sintaxe da string do parâmetro IAM\$1ROLE para um único ARN.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
Você pode encadear funções para que seu cluster possa assumir outra função do IAM, possivelmente pertencente a outra conta. Você pode encadear até 10 funções. Para obter mais informações, consulte [Encadeamento de funções do IAM no Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 Anexe a essa função do IAM uma política de permissões do IAM semelhante à política descrita a seguir.    
****  

```
{
    "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 obter as etapas para criar uma função do IAM a ser usada com consulta federada, consulte [Criar um segredo e uma função do IAM para usar consultas federadas](federated-create-secret-iam-role.md).   
Não inclua espaços na lista de funções encadeadas.
O seguinte mostra a sintaxe do encadeamento de três funções.  

```
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 o número de linhas geradas. Em que *row\$1limit* é o número máximo de linhas a serem geradas. O *row\$1limit* pode ser de 0 a 10.000.

## Exemplos
<a name="r_SHOW_DATABASES-examples"></a>

O exemplo a seguir exibe todos os bancos de dados do Catálogo de Dados do ID de conta 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 |          |
```

Veja a seguir exemplos que demonstram como exibir todos os bancos de dados do catálogo de dados do ID de conta 123456789012 usando credenciais de um perfil do IAM.

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE default;
```

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE <iam-role-arn>;
```

O exemplo a seguir exibe todos os bancos de dados no data warehouse do 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>

Mostra uma lista de funções em um esquema, bem como informações sobre os objetos listados.

Cada linha de saída tem as colunas database\$1name, schema\$1name, function\$1name, number\$1of\$1arguments, argument\$1list, return\$1type, remarks.

Se SHOW FUNCTIONS produzir mais de 10 mil linhas, o comando vai gerar um erro.

## Permissões obrigatórias
<a name="r_SHOW_FUNCTIONS-required-permissions"></a>

Para visualizar uma função em um esquema do Redshift, o usuário atual deve atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o proprietário da função.
+ Ter recebido o privilégio USAGE no esquema principal e o privilégio EXECUTE na função.

## Sintaxe
<a name="r_SHOW_FUNCTIONS-synopsis"></a>

```
SHOW FUNCTIONS FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

## Parâmetros
<a name="r_SHOW_FUNCTIONS-parameters"></a>

*database\$1name*  
O nome do banco de dados que contém as funções a serem listadas.

*schema\$1name*  
O nome do esquema que contém as funções a serem listadas.

*filter\$1pattern*  
Uma expressão de caractere UTF-8 válida com um padrão para estabelecer correspondência com os nomes de função. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_SHOW_FUNCTIONS.html)
Observe que o filter\$1pattern corresponde apenas ao nome da função.

*row\$1limit*  
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000.

## Exemplos
<a name="r_SHOW_FUNCTIONS-examples"></a>

O seguinte exemplo mostra funções do 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           |
```

O seguinte exemplo mostra funções do esquema demo\$1schema com nomes que terminam em “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>

Exibe concessões para um usuário, perfil ou objeto. O objeto pode ser um banco de dados, um esquema, uma tabela, uma função ou um modelo. Ao especificar um objeto, como uma tabela ou função, é necessário qualificá-lo com a notação de duas ou três partes. Por exemplo, o `schema_name.table_name` ou o `database_name.schema_name.table_name`.

Se SHOW GRANTS produzir mais de 10 mil linhas, o comando vai gerar um erro.

## Permissões obrigatórias
<a name="r_SHOW_GRANTS-permissions"></a>

Para executar SHOW GRANTS para um usuário ou perfil de destino, o usuário atual deve atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o usuário de destino.
+ Ser o proprietário do perfil de destino.
+ Receber o perfil.

SHOW GRANTS para um objeto de destino exibirá somente concessões visíveis para o usuário atual. Uma concessão ficará visível para o usuário atual se o usuário atual atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o usuário de destino.
+ Receber o título de proprietário do perfil concedido.
+ Receber o perfil pretendido pela concessão do objeto.

## Sintaxe
<a name="r_SHOW_GRANTS-syntax"></a>

Veja a seguir a sintaxe para mostrar concessões em um objeto. Observe que a segunda forma de especificar uma função só é válida para esquemas externos e bancos de dados criados de uma unidade de compartilhamento de dados.

```
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]
```

Veja a seguir a sintaxe para mostrar concessões para um usuário ou perfil. 

```
SHOW GRANTS FOR
{username | ROLE role_name}
[FROM DATABASE database_name]
[LIMIT row_limit]
```

## Parâmetros
<a name="r_SHOW_GRANTS-parameters"></a>

 *database\$1name*   
O nome do banco de dados no qual serão mostradas as concessões.

 *function\$1name*   
O nome do perfil para mostrar as concessões.

template\$1name  
O nome do modelo no qual serão mostradas as concessões.

 *schema\$1name*   
O nome do esquema no qual serão mostradas as concessões.

 *table\$1name*   
O nome da tabela na qual serão mostradas as concessões.

FOR *username*   
Indica a exibição de concessões para um usuário.

FOR ROLE *role\$1name*   
Indica a exibição de subsídios para um perfil.

FOR PUBLIC  
Indica a exibição de concessões para PUBLIC.

 *row\$1limit*   
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000. 

## Exemplos
<a name="r_SHOW_GRANTS-examples"></a>

O exemplo a seguir mostra todas as concessões em um banco de dados chamado `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
```

O comando a seguir mostra todas as concessões em um esquema chamado `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
```

O comando a seguir mostra todas as concessões para um usuário chamado `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
```

O comando a seguir mostra todas as concessões em uma tabela denominada `t3` para um usuário chamado `alice`. Observe que é possível usar a notação de duas ou três partes para especificar o nome da tabela.

```
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
```

O exemplo a seguir mostra todas as concessões em uma tabela denominada `t4`. Observe as diferentes formas de especificar o nome da tabela.

```
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>

Mostra informações úteis sobre um modelo de Machine Learning, incluindo seu status, os parâmetros usados para criá-lo e a função de previsão com seus tipos de argumento de entrada. Você pode usar as informações do SHOW MODEL para recriar o modelo. Se as tabelas base tiverem sido alteradas, executar CREATE MODEL com a mesma instrução SQL resultará em um modelo diferente. As informações retornadas pelo SHOW MODEL são diferentes para o proprietário do modelo e um usuário com o privilégio EXECUTE. SHOW MODEL mostra diferentes saídas quando um modelo é treinado a partir do Amazon Redshift ou quando o modelo é um modelo BYOM.

## Sintaxe
<a name="r_SHOW_MODEL-synopsis"></a>

```
SHOW MODEL ( ALL | model_name )
```

## Parâmetros
<a name="r_SHOW_MODEL-parameters"></a>

ALL   
Retorna todos os modelos que o usuário pode usar e seus esquemas.

 *model\$1name*   
O nome do modelo. O nome do modelo em um esquema deve ser exclusivo.

## Observações de uso
<a name="r_SHOW_MODEL_usage_notes"></a>

O comando SHOW MODEL retorna o seguinte: 
+ O nome do modelo.
+ O esquema em que o modelo foi criado.
+ O proprietário do modelo.
+ A hora de criação do modelo.
+ O status do modelo, como READY, TRAINING ou FAILED.
+ A mensagem do motivo para um modelo com falha.
+ O erro de validação se o modelo tiver terminado o treinamento.
+ O custo estimado necessário para derivar o modelo para uma abordagem não-BYOM. Somente o proprietário do modelo pode visualizar essas informações.
+ Uma lista de parâmetros especificados pelo usuário e seus valores, especificamente o seguinte:
  + A coluna TARGET especificada.
  + O tipo de modelo, AUTO ou XGBoost.
  + O tipo de problema, como REGRESSION, BINARY\$1CLASSIFICATION e MULTICLASS\$1CLASSIFICATION. Este parâmetro é específico para AUTO.
  + O nome do trabalho de treinamento do Amazon SageMaker AI ou do trabalho do Amazon SageMaker AI Autopilot que criou o modelo. Você pode usar esse nome de trabalho para encontrar mais informações sobre o modelo no Amazon SageMaker AI.
  + O objetivo, como MSE, F1, Precisão. Este parâmetro é específico para AUTO.
  + O nome da função criada.
  + O tipo de inferência, local ou remota.
  + Os argumentos de entrada da função de previsão.
  + Os tipos de argumento de entrada da função de previsão para modelos que não são BYOM (traga seu próprio modelo).
  + O tipo de retorno da função de previsão. Esse parâmetro é específico para BYOM.
  + O nome do endpoint do Amazon SageMaker AI para um modelo BYOM com inferência remota.
  + A função do IAM. Somente o proprietário do modelo pode ver isso.
  + O nome de um bucket do S3. Somente o proprietário do modelo pode ver isso.
  + A chave AWS KMS, caso uma tenha sido fornecida. Somente o proprietário do modelo pode ver isso.
  + O tempo máximo que o modelo pode ser executado.
+ Se o tipo de modelo não for AUTO, o Amazon Redshift também mostrará a lista de hiperparâmetros fornecidos e seus valores.

Você também pode exibir algumas das informações fornecidas pelo SHOW MODEL em outras tabelas de catálogo, como pg\$1proc. O Amazon Redshift retorna informações sobre a função de previsão registrada na tabela de catálogo pg\$1proc. Essas informações incluem os nomes dos argumentos de entrada e seus tipos para a função de previsão. O Amazon Redshift retorna as mesmas informações no comando SHOW MODEL.

```
SELECT * FROM pg_proc WHERE proname ILIKE '%<function_name>%';
```

## Exemplos
<a name="r_SHOW_MODEL-examples"></a>

O exemplo a seguir mostra a saída do show model.

```
SHOW MODEL ALL;

Schema Name |  Model Name
------------+---------------
 public     | customer_churn
```

O proprietário do customer\$1churn pode ver a saída a seguir. Um usuário com apenas o privilégio EXECUTE não pode ver a função do IAM, o bucket do Amazon S3 e o custo estimado do 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>

Exibe os compartilhamentos de entrada e saída em um cluster da mesma conta ou entre contas. Se você não especificar um nome de datashare, o Amazon Redshift exibirá todos os datashares em todos os bancos de dados no cluster. Os usuários que têm os privilégios ALTER e SHARE podem ver os compartilhamentos para os quais eles têm privilégios. 

## Sintaxe
<a name="r_SHOW_DATASHARES-synopsis"></a>

```
SHOW DATASHARES [ LIKE 'namepattern' ] 
```

## Parâmetros
<a name="r_SHOW_DATASHARES-parameters"></a>

LIKE  
Uma cláusula opcional que compara o padrão de nome especificado com a descrição do datashare. Quando essa cláusula é usada, o Amazon Redshift exibe apenas os datashares com nomes que correspondem ao padrão de nome especificado.

*namepattern*  
O nome do datashare solicitado ou parte do nome a ser correspondido usando caracteres curinga.

## Exemplos
<a name="r_SHOW_DATASHARES-examples"></a>

O exemplo a seguir exibe os compartilhamentos de entrada e saída em um cluster. 

```
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>

Mostra uma lista de parâmetros para uma função/procedimento, junto com algumas informações sobre os parâmetros.

Cada linha de saída tem colunas database\$1name, schema\$1name, procedure name ou function\$1name, parameter\$1name, ordinal\$1position, parameter\$1type (IN/OUT), data\$1type, character\$1maximum\$1length, numeric\$1precision, numeric\$1scale e remarks.

## Permissões obrigatórias
<a name="r_SHOW_PARAMETERS-required-permissions"></a>

Para visualizar uma função/procedimento em um esquema do Redshift, o usuário atual deve atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o proprietário da função.
+ Ter recebido o privilégio USAGE no esquema principal e o privilégio EXECUTE na função.

## Sintaxe
<a name="r_SHOW_PARAMETERS-synopsis"></a>

```
SHOW PARAMETERS OF {FUNCTION| PROCEDURE}
[database_name.]schema_name.function_name(argtype [, ...] )
[LIKE 'filter_pattern'];
```

## Parâmetros
<a name="r_SHOW_PARAMETERS-parameters"></a>

*database\$1name*  
O nome do banco de dados que contém a função a ser listada.

*schema\$1name*  
O nome do esquema que contém a função a ser listada.

*filter\$1pattern*  
Uma expressão de caractere UTF-8 válida com o padrão para estabelecer correspondência com os nomes da tabela. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_SHOW_PARAMETERS.html)

## Exemplos
<a name="r_SHOW_PARAMETERS-examples"></a>

O seguinte exemplo mostra os parâmetros do procedimento 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                     |                          |                   |
```

O seguinte exemplo mostra os parâmetros do procedimento demo\$1schema.f1 com nomes começando com '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
```

O seguinte exemplo mostra os parâmetros da função 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>

Exibe as políticas de segurança por linha (RLS) e de mascaramento dinâmico de dados (DDM) definidas em um banco de dados, bem como as políticas de RLS e DDM aplicadas a relações específicas. Somente um superusuário ou usuário com o perfil `sys:secadmin` no banco de dados pode visualizar os resultados dessas políticas.

## Sintaxe
<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 ];
```

## Parâmetros
<a name="r_SHOW_POLICIES-parameters"></a>

*database\$1name*  
O nome do banco de dados do qual serão mostradas as políticas.

*schema\$1name*  
Nome do esquema da relação na qual serão mostradas as políticas anexadas.

*relation\$1name*  
O nome da relação na qual serão mostradas as políticas anexadas.

*user\$1name*  
O nome do usuário ao qual a política está anexada na relação.

*role\$1name*  
O nome do perfil ao qual a política está anexada na relação.

*row\$1limit*  
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000.

**nota**  
Mostrar políticas de um banco de dados diferente do banco de dados conectado é aceito no Catálogo de Permissões Federadas do Amazon Redshift. O comando SHOW POLICIES aceita consultas entre bancos de dados para todos os bancos de dados em warehouses com permissões federadas do Amazon Redshift

## Exemplos
<a name="r_SHOW_POLICIES-examples"></a>

O comando a seguir mostra as políticas de RLS do banco de dados conectado.

```
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
```

O comando a seguir mostra as políticas de mascaramento do banco de dados “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)
```

O comando a seguir mostra as políticas de RLS anexadas à relação 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
```

O comando a seguir mostra as políticas de mascaramento anexadas à relação transaction\$1table do banco de dados “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"]
```

O comando a seguir mostra as políticas de RLS anexadas à relação sales\$1table do banco de dados “sales\$1db.finance-catalog” para o usuário “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
```

O comando a seguir mostra as políticas de RLS anexadas à relação transaction\$1table do banco de dados “sales\$1db.finance-catalog” para o perfil 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>

Mostra a definição de um procedimento armazenado específico, incluindo sua assinatura. Use a saída de um SHOW PROCEDURE para recriar o procedimento armazenado. 

## Sintaxe
<a name="r_SHOW_PROCEDURE-synopsis"></a>

```
SHOW PROCEDURE sp_name [( [ [ argname ] [ argmode ] argtype [, ...] ] )]
```

## Parâmetros
<a name="r_SHOW_PROCEDURE-parameters"></a>

 *sp\$1name*   
O nome do procedimento a ser exibido. 

*[argname] [ argmode] argtype*   
Tipos de argumento de entrada para identificar o procedimento armazenado. Opcionalmente, você pode incluir todos os tipos de dados de argumentos, incluindo argumentos OUT. Essa parte é opcional se o nome do procedimento armazenado for único (isto é, não sobrecarregado).

## Exemplos
<a name="r_SHOW_PROCEDURE-examples"></a>

O exemplo a seguir mostra a definição do procedimento `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>

Mostra uma lista de procedimentos em um esquema, bem como informações sobre os objetos listados.

Cada linha de saída tem as colunas `database_name`, `schema_name`, `procedure_name`, `number_of_arguments`, `argument_list`, `return_type`, remarks.

Se SHOW PROCEDURES produzir mais de 10 mil linhas, o comando vai gerar um erro.

## Permissões obrigatórias
<a name="r_SHOW_PROCEDURES-required-permissions"></a>

Para visualizar um procedimento em um esquema do Redshift, o usuário atual deve atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o proprietário do procedimento.
+ Ter recebido o privilégio USAGE no esquema principal e o privilégio EXECUTE no procedimento.

## Sintaxe
<a name="r_SHOW_PROCEDURES-synopsis"></a>

```
SHOW PROCEDURES FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

## Parâmetros
<a name="r_SHOW_PROCEDURES-parameters"></a>

database\$1name  
O nome do banco de dados que contém os procedimentos a serem listados.

schema\$1name  
O nome do esquema que contém os procedimentos a serem listados.

filter\$1pattern  
Uma expressão de caractere UTF-8 válida com o padrão para estabelecer correspondência com os nomes de procedimento. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_SHOW_PROCEDURES.html)
Observe que o filter\$1pattern corresponde apenas ao nome do procedimento.

row\$1limit  
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000.

## Exemplos
<a name="r_SHOW_PROCEDURES-examples"></a>

O seguinte exemplo mostra procedimentos do 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                                       |
```

O seguinte exemplo mostra procedimentos do esquema demo\$1schema com nomes que terminam com “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 |
```

# SHOW SCHEMAS
<a name="r_SHOW_SCHEMAS"></a>

Mostra uma lista de esquemas em um banco de dados, bem como alguns atributos do esquema.

Cada linha de saída é composta dos seguintes elementos: nome do banco de dados, nome do esquema, proprietário do esquema, tipo de esquema, ACL do esquema, banco de dados de origem e opção de esquema. Para obter mais informações sobre esses atributos, consulte [SVV\$1ALL\$1SCHEMAS](r_SVV_ALL_SCHEMAS.md).

Se mais de 10.000 esquemas puderem resultar do comando SHOW SCHEMAS, será retornado um erro.

## Permissões obrigatórias
<a name="r_SHOW_SCHEMAS-privileges"></a>

Para visualizar um esquema em uma tabela do Amazon Redshift, o usuário atual deve atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o proprietário do esquema.
+ Ter recebido o privilégio USAGE no esquema.

## Sintaxe
<a name="r_SHOW_SCHEMAS-synopsis"></a>

```
SHOW SCHEMAS FROM DATABASE database_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parâmetros
<a name="r_SHOW_SCHEMAS-parameters"></a>

 *database\$1name*   
O nome do banco de dados que contém as tabelas a serem listadas.   
Para mostrar tabelas em um AWS Glue Data Catalog, especifique (`awsdatacatalog`) como o nome do banco de dados e assegure que a configuração do sistema `data_catalog_auto_mount` esteja definida como `true`. Para obter mais informações, consulte [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *filter\$1pattern*   
Uma expressão de caractere UTF-8 válida com o padrão para estabelecer correspondência com os nomes do esquema. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_SHOW_SCHEMAS.html)
Se *filter\$1pattern* não contiver metacaracteres, o padrão representará somente a própria string. Nesse caso, LIKE age da mesma forma que o operador de igualdade. 

 *row\$1limit*   
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000. 

## Exemplos
<a name="r_SHOW_SCHEMAS-examples"></a>

O exemplo a seguir mostra os esquemas do banco de dados do Amazon Redshift chamado `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       |                             |                 |
```

O exemplo a seguir mostra os esquemas no banco de dados do AWS Glue Data Catalog chamado `awsdatacatalog`. O número máximo de linhas de saída é `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>

Exibe a definição de uma tabela, incluindo atributos e restrições de tabela, atributos e agrupamento de colunas, bem como restrições de coluna. Use a saída da instrução SHOW TABLE para recriar a tabela. 

Para obter mais informações sobre criação de tabelas, consulte [CRIAR TABELA](r_CREATE_TABLE_NEW.md). 

## Sintaxe
<a name="r_SHOW_TABLE-synopsis"></a>

```
SHOW TABLE [schema_name.]table_name 
```

## Parâmetros
<a name="r_SHOW_TABLE-parameters"></a>

 *schema\$1name*   
(Opcional) O nome do esquema relacionado. 

 *table\$1name*   
O nome da tabela a ser exibida. 

## Exemplos
<a name="r_SHOW_TABLE-examples"></a>

Segue-se um exemplo do comando e saída SHOW TABLE para a tabela `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 );
```

Segue-se um exemplo da saída SHOW TABLE para a tabela `category` no esquema `public`. O agrupamento do banco de dados é 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 );
```

O exemplo a seguir cria a tabela `foo` com uma chave primária.

```
create table foo(a int PRIMARY KEY, b int);
```

Os resultados SHOW TABLE exibem a instrução create com todas as propriedades da tabela `foo`.

```
show table foo;
```

```
CREATE TABLE public.foo ( 
a integer NOT NULL ENCODE az64, 
b integer ENCODE az64, PRIMARY KEY (a) 
) 
DISTSTYLE AUTO;
```

Neste exemplo, criamos uma tabela em que a coluna `a` herda o agrupamento CASE\$1SENSITIVE padrão do banco de dados, enquanto `b` e `c` são explicitamente definidos como agrupamento CASE\$1INSENSITIVE.

```
CREATE TABLE public.foo (
a CHAR, 
b VARCHAR(10) COLLATE CASE_INSENSITIVE, 
c SUPER COLLATE CASE_INSENSITIVE
);
```

Os resultados SHOW TABLE exibem a instrução create com todas as propriedades da tabela `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>

Mostra uma lista de tabelas em um esquema, bem como alguns atributos da tabela.

Cada linha de saída é composta dos seguintes elementos: nome do banco de dados, nome do esquema, nome da tabela, tipo de tabela, ACL da tabela, comentários, proprietário da tabela, hora da última alteração, hora da última modificação, dist\$1style e subtipo da tabela. Para obter mais informações sobre esses atributos, consulte [SVV\$1ALL\$1TABLES](r_SVV_ALL_TABLES.md).

Os carimbos de data/hora de modificação e alteração podem ficar atrasados em relação às atualizações da tabela em aproximadamente 20 minutos.

Se mais de 10.000 tabelas resultarem do comando SHOW TABLES, será retornado um erro.

## Permissões obrigatórias
<a name="r_SHOW_TABLES-privileges"></a>

Para visualizar uma tabela em um esquema do Amazon Redshift, o usuário atual deve atender a um dos seguintes critérios:
+ Ser um superusuário.
+ Ser o proprietário da tabela.
+ Ter recebido o privilégio USAGE no esquema principal e o privilégio SELECT na tabela ou ter recebido o privilégio SELECT em qualquer coluna da tabela.

## Sintaxe
<a name="r_SHOW_TABLES-synopsis"></a>

```
SHOW TABLES FROM SCHEMA database_name.schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parâmetros
<a name="r_SHOW_TABLES-parameters"></a>

 *database\$1name*   
O nome do banco de dados que contém as tabelas a serem listadas.   
Para mostrar tabelas em um AWS Glue Data Catalog, especifique (`awsdatacatalog`) como o nome do banco de dados e assegure que a configuração do sistema `data_catalog_auto_mount` esteja definida como `true`. Para obter mais informações, consulte [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *schema\$1name*   
O nome do esquema que contém as tabelas a serem listadas.   
Para mostrar tabelas do AWS Glue Data Catalog, forneça o nome do banco de dados do AWS Glue como nome do esquema.

 *filter\$1pattern*   
Uma expressão de caractere UTF-8 válida com o padrão para estabelecer correspondência com os nomes da tabela. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_SHOW_TABLES.html)
Se *filter\$1pattern* não contiver metacaracteres, o padrão representará somente a própria string. Nesse caso, LIKE age da mesma forma que o operador de igualdade. 

 *row\$1limit*   
O número máximo de linhas a serem retornadas. O *row\$1limit* pode ser de 0 a 10.000. 

## Exemplos
<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>

Exibe a definição completa de um modelo, como o nome totalmente qualificado (banco de dados, esquema e nome do modelo) e todos os parâmetros. A saída é uma instrução CREATE TEMPLATE válida que pode ser usada para recriar o modelo ou criar um modelo similar com modificações. 

Para ter mais informações sobre como criar um modelo, consulte [CREATE TEMPLATE](r_CREATE_TEMPLATE.md). 

## Permissões obrigatórias
<a name="r_SHOW_TEMPLATE-privileges"></a>

Para visualizar a definição de um modelo, é necessário ter uma das seguintes opções:
+ Privilégios de superusuário.
+ Privilégio USAGE no modelo e privilégio USAGE no esquema que contém o modelo.

## Sintaxe
<a name="r_SHOW_TEMPLATE-synopsis"></a>

```
SHOW TEMPLATE [database_name.][schema_name.]template_name;
```

## Parâmetros
<a name="r_SHOW_TEMPLATE-parameters"></a>

 *database\$1name*   
(Opcional) O nome do banco de dados no qual o modelo é criado. Se não especificado, será usado o banco de dados atual. 

 *schema\$1name*   
(Opcional) O nome do esquema no qual o modelo é criado. Se não for especificado, o modelo será pesquisado no caminho de pesquisa atual. 

 *template\$1name*   
O nome do modelo. 

## Exemplos
<a name="r_SHOW_TEMPLATE-examples"></a>

Veja abaixo um exemplo da saída SHOW TEMPLATE para o modelo`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 ',';
```

O exemplo a seguir cria um modelo `demo_template` no 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>

Mostra uma lista de modelos em um esquema, bem como os respectivos atributos.

Cada linha de saída é composta dos seguintes elementos: nome do modelo, ID do modelo, tipo de modelo, proprietário do modelo, nome do banco de dados, hora de criação, hora da última modificação e nome de quem o modificou pela última vez. 

Para ver detalhes completos do modelo, inclusive parâmetros do modelo, consulte [SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md).

## Permissões obrigatórias
<a name="r_SHOW_TEMPLATES-privileges"></a>

Para visualizar modelos em um esquema do Amazon Redshift, é necessário ter uma das seguintes opções:
+ Privilégios de superusuário.
+ Privilégio USAGE no esquema que contém os modelos.

## Sintaxe
<a name="r_SHOW_TEMPLATES-synopsis"></a>

```
SHOW TEMPLATES FROM SCHEMA [database_name.]schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ];
```

## Parâmetros
<a name="r_SHOW_TEMPLATES-parameters"></a>

 *database\$1name*   
(Opcional) O nome do banco de dados que contém os modelos a serem listados. Se não for informado, será usado o banco de dados atual.

 *schema\$1name*   
O nome do esquema que contém os modelos a serem listados. 

 *filter\$1pattern*   
(Opcional) Uma expressão de caractere UTF-8 válida com o padrão para estabelecer correspondência com os nomes de modelo. A opção LIKE executa uma correspondência com distinção entre letras maiúsculas e minúsculas compatível com os seguintes metacaracteres de correspondência de padrões:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/redshift/latest/dg/r_SHOW_TEMPLATES.html)
Se *filter\$1pattern* não contiver metacaracteres, o padrão representará somente a própria string. Nesse caso, LIKE age da mesma forma que o operador de igualdade. 

 *row\$1limit*   
O número máximo de linhas a serem retornadas. O intervalo válido é 0 até o limite do modelo no cluster (o padrão é 1.000).

## Exemplos
<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>

Exibe a definição de uma visualização, inclusive para visões materializadas e visualizações de vinculação tardia. Use a saída da instrução SHOW VIEW para recriar a visualização. 

## Sintaxe
<a name="r_SHOW_VIEW-synopsis"></a>

```
SHOW VIEW [schema_name.]view_name 
```

## Parâmetros
<a name="r_SHOW_VIEW-parameters"></a>

 *schema\$1name*   
(Opcional) O nome do esquema relacionado. 

 *view\$1name*   
O nome da visualização a ser exibida. 

## Exemplos
<a name="r_SHOW_VIEW-examples"></a>

 Segue-se a definição de visualização para a visualização `LA_Venues_v`.

```
create view LA_Venues_v as select * from venue where venuecity='Los Angeles';
```

Segue-se um exemplo do comando e saída SHOW VIEW para a visualização 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);
```

Segue-se a definição de visualização para a visualização `public.Sports_v` no esquema `public`.

```
create view public.Sports_v as select * from category where catgroup='Sports';
```

Segue-se um exemplo do comando e saída SHOW VIEW para a visualização 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 da função BEGIN. 

Consulte [BEGIN](r_BEGIN.md). 

# TRUNCATE
<a name="r_TRUNCATE"></a>

Exclui todas as linhas de uma tabela sem fazer uma varredura de lista: esta operação é uma alternativa mais rápida a uma operação DELETE não qualificada. Para executar um comando TRUNCATE, é necessário ter a permissão TRUNCATE e ser o proprietário da tabela ou um superusuário. Para conceder permissões para truncar uma tabela, use o comando [GRANT](r_GRANT.md).

TRUNCATE é muito mais eficiente do que DELETE e não requer VACUUM nem ANALYZE. No entanto, esteja ciente de que TRUNCATE confirma a transação em que é executado.

## Sintaxe
<a name="r_TRUNCATE-synopsis"></a>

```
TRUNCATE [ TABLE ] table_name
```

O comando também funciona em uma visão materializada.

```
TRUNCATE materialized_view_name
```

## Parâmetros
<a name="r_TRUNCATE-parameters"></a>

TABLE   
Palavra-chave opcional. 

 *table\$1name*   
Uma tabela temporária ou persistente. Somente o proprietário da tabela ou um superusuário pode truncá-la.   
Você pode truncar qualquer tabela, incluindo tabelas com referência em limitações de chave externa.   
Você não precisa limpar uma tabela depois de truncá-la. 

 *materialized\$1view\$1name*   
Uma visão materializada.  
Você pode truncar uma visão materializada que é usada para [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md). 

## Observações de uso
<a name="r_TRUNCATE_usage_notes"></a>
+  O comando TRUNCATE confirma a transação em que é executado. Portanto, você não pode reverter uma operação TRUNCATE, e um comando TRUNCATE pode confirmar outras operações quando confirma a si mesmo. 
+ As operações TRUNCATE mantêm bloqueios exclusivos quando executadas em visões materializadas de streaming do Amazon Redshift conectadas a qualquer um dos seguintes:
  +  Um Amazon Kinesis data stream 
  +  Um tópico Amazon Managed Streaming for Apache Kafka 
  +  Um stream externo compatível, como um tópico do Confluent Cloud Kafka 

  Para obter mais informações, consulte [Ingestão de streaming para uma visão materializada](materialized-view-streaming-ingestion.md).

## Exemplos
<a name="r_TRUNCATE-examples"></a>

Use o comando TRUNCATE para excluir todas as linhas da tabela CATEGORY: 

```
truncate category;
```

Tente reverter uma operação TRUNCATE: 

```
begin;

truncate date;

rollback;

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

A tabela DATE permanece vazia após o comando ROLLBACK porque o comando TRUNCATE foi confirmado automaticamente. 

O exemplo a seguir usa o comando TRUNCATE para excluir todas as linhas de uma visão materializada. 

```
truncate my_materialized_view;
```

Ele exclui todos os registros da visão materializada, deixando a visão materializada e o respectivo esquema intactos. Na consulta, o nome da visão materializada é apenas um exemplo.

# UNLOAD
<a name="r_UNLOAD"></a>


|  | 
| --- |
| A criptografia do lado do cliente para os comandos COPY e UNLOAD não estará mais disponível para novos clientes a partir de 30 de abril de 2025. Se você usou a criptografia do lado do cliente com os comandos COPY e UNLOAD nos 12 meses anteriores a 30 de abril de 2025, poderá continuar usando a criptografia do lado do cliente com os comandos COPY ou UNLOAD até 30 de abril de 2026. Após 30 de abril de 2026, você não poderá usar a criptografia do lado do cliente para COPY e UNLOAD. Recomendamos que você passe a usar a criptografia do lado do servidor para COPY e UNLOAD o mais rápido possível. Se você já usa a criptografia do lado do servidor para COPY e UNLOAD, não há nenhuma alteração a fazer e você pode continuar a usá-la sem alterar suas consultas. Para ter mais informações sobre criptografia para COPY e UNLOAD, consulte o parâmetro ENCRYPTED abaixo.  | 

Descarrega o resultado de uma consulta em um ou mais arquivos de texto JSON ou Apache Parquet no Amazon S3, usando a criptografia no servidor Amazon S3 (SSE-S3). Você também pode especificar a criptografia do lado do servidor com uma chave do AWS Key Management Service (SSE-KMS).

Por padrão, o formato do arquivo descarregado é texto delimitado por barra vertical (`|`).

Você pode gerenciar o tamanho de arquivos no Amazon S3, e, por extensão, o número de arquivos, configurando o parâmetro MAXFILESIZE. Certifique-se de que os intervalos de IP do S3 sejam adicionados à sua lista de permissões. Para saber mais sobre os intervalos de IP do S3 necessários, consulte [ Isolamento de rede](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation).

Você pode descarregar o resultado de uma consulta do Amazon Redshift no data lake do Amazon S3 no Apache Parquet, um formato de armazenamento colunar aberto e eficiente para análise. O formato Parquet é até duas vezes mais rápido de descarregar e consome até seis vezes menos armazenamento no Amazon S3 em comparação com os formatos de texto. Isso permite que você salve a transformação e o enriquecimento de dados que você fez no Amazon S3 no data lake do Amazon S3 em um formato aberto. Depois, você pode analisar os dados com o Redshift Spectrum e outros serviços da AWS, como Amazon Athena, Amazon EMR e Amazon SageMaker AI. 

Para obter mais informações e exemplos de cenários sobre o uso do comando UNLOAD, consulte [Descarregar dados no Amazon Redshift](c_unloading_data.md).

## Permissões e privilégios necessários
<a name="r_UNLOAD-permissions"></a>

Para que o comando UNLOAD seja bem-sucedido, é necessário pelo menos o privilégio SELECT nos dados no banco de dados, com a permissão para gravar no local do Amazon S3. Para obter informações sobre permissões para acessar recursos da AWS para o comando UNLOAD, consulte [Permissões para acessar outros recursos da AWS](copy-usage_notes-access-permissions.md).

Para aplicar permissões com privilégio mínimo, siga estas recomendações para conceder permissões somente ao usuário que está executando o comando, conforme necessário.
+ O usuário deve ter o privilégio SELECT nos dados. Para obter informações sobre como limitar privilégios do banco de dados, consulte [GRANT](r_GRANT.md).
+ O usuário precisa de permissão para assumir o perfil do IAM e gravar no bucket do Amazon S3 na Conta da AWS. Para restringir o acesso de um usuário do banco de dados para assumir um perfil, consulte [Restringir acesso a funções do IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service-database-users.html) no *Guia de gerenciamento do Amazon Redshift*.
+ O usuário precisa acessar o bucket do Amazon S3. Para restringir a permissão usando uma política de bucket do Amazon S3, consulte [Políticas de bucket para o Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html) no *Guia do usuário do Amazon Simple Storage Service*.

## Sintaxe
<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::<Conta da AWS-id-1>:role/<role-name>[,arn:aws:iam::<Conta da 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'
```

## Parâmetros
<a name="unload-parameters"></a>

('*select-instrução*')   
Uma consulta SELECT. Os resultados da consulta são descarregados. Na maioria dos casos, vale descarregar dados em ordem de classificação especificando uma cláusula ORDER BY na consulta. Essa abordagem economiza tempo necessário para classificar os dados ao carregar novamente.   
A consulta deve estar entre aspas simples como mostrado a seguir:   

```
('select * from venue order by venueid')
```
Se sua consulta contiver aspas (por exemplo, para incluir valores literais), coloque o literal entre dois conjuntos de aspas simples — você também deve colocar a consulta entre aspas simples:   

```
('select * from venue where venuestate=''NV''')
```

TO 's3://*object-path/name-prefix*'   
Caminho completo, incluindo o nome do bucket, para o local no Amazon S3 onde o Amazon Redshift gravará os objetos do arquivo de saída, incluindo o arquivo manifesto se MANIFEST estiver especificado. Os nomes de objetos devem ter o prefixo *nome-prefixo*. Se você usar `PARTITION BY`, uma barra (/) será automaticamente adicionada ao final do valor *name-prefix*, se necessário. Para maior segurança, UNLOAD se conecta ao Amazon S3 usando uma conexão HTTPS. Por padrão, UNLOAD grava um ou mais arquivos por fatia. UNLOAD adiciona um número de fatia e um número de peça para o prefixo especificado da seguinte forma:  
`<object-path>/<name-prefix><slice-number>_part_<part-number>`.   
Se MANIFEST for especificado, o arquivo manifesto será redigido conforme o seguinte:  
`<object_path>/<name_prefix>manifest`.   
Se PARALLEL for especificado como OFF, os arquivos de dados serão gravados da seguinte forma:  
`<object_path>/<name_prefix><part-number>`.   
UNLOAD cria automaticamente arquivos criptografados usando a criptografia no lado do servidor (SSE) do Amazon S3, incluindo o arquivo manifesto se MANIFEST for usado. O comando COPY lê automaticamente os arquivos criptografados no lado do servidor durante a operação de carregamento. Você pode baixar arquivos criptografados do lado do servidor de forma transparente de seu bucket usando o console do Amazon S3 ou API. Para obter mais informações, consulte [Proteção de dados usando criptografia no lado do servidor](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html).   
REGION é necessário quando o bucket do Amazon S3 não está na mesma Região da AWS que o banco de dados do Amazon Redshift. 

*authorization*  
O comando UNLOAD requer autorização para gravar dados no Amazon S3. O comando UNLOAD usa os mesmos parâmetros do comando COPY para autorização. Para obter mais informações, consulte [Parâmetros de autorização](copy-parameters-authorization.md) na referência de sintaxe do comando COPY.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::*<Conta da AWS-id-1>*:role/*<role-name>*'   <a name="unload-iam"></a>
Use a palavra-chave padrão para que o Amazon Redshift use a função do IAM definida como padrão e associada ao cluster quando o comando UNLOAD for executado.  
Use o nome do recurso da Amazon (ARN) de uma função do IAM que seu cluster usa para autenticação e autorização. Se especificar IAM\$1ROLE, você não poderá usar ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN ou CREDENTIALS. O IAM\$1ROLE pode ser conectado. Para obter mais informações, consulte [Encadeamento de funções do IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles) no *Guia de gerenciamento do Amazon Redshift*.

[ FORMAT [AS] ] CSV \$1 PARQUET \$1 JSON  <a name="unload-csv"></a>
Palavras-chave para especificar o formato de descarregamento para substituir o formato padrão.   
No caso de CSV, descarregue para um arquivo de texto no formato CSV usando um caractere de vírgula ( , ) como delimitador padrão. Se um campo contiver delimitadores, aspas duplas, caracteres de nova linha ou retornos de carro, o campo no arquivo descarregado será colocado entre aspas duplas. Uma aspas duplas dentro de um campo de dados é recuada por aspas duplas adicionais. Quando nenhuma linha é descarregada, o Amazon Redshift pode gravar objetos vazios do Amazon S3.  
No caso de PARQUET, descarregue para um arquivo no formato Apache Parquet versão 1.0. Por padrão, cada grupo de linhas é compactado usando a compactação SNAPPY. Para obter mais informações sobre o formato Apache Parquet, consulte [Parquet](https://parquet.apache.org/).   
Quando JSON, descarrega para um arquivo JSON com todas as linhas que contêm um objeto JSON, representando um registro completo no resultado da consulta. O Amazon Redshift é compatível com a gravação de JSON aninhado quando o resultado da consulta contém colunas SUPER. Para criar um objeto JSON válido, o nome de toda coluna da consulta deve ser exclusivo. No arquivo JSON, os valores booleanos são descarregados como `t` ou `f`, e os valores NULL são descarregados como `null`. Quando nenhuma linha é descarregada, o Amazon Redshift não grava objetos do Amazon S3.  
As palavras-chave FORMAT e AS são opcionais. Não é possível usar CSV com ESCAPE, FIXEDWIDTH ou ADDQUOTES. Não é possível usar PARQUET com DELIMITER, FIXEDWIDTH, ADDQUOTES, ESCAPE, NULL AS, HEADER, GZIP, BZIP2 ou ZSTD. O comando PARQUET com ENCRYPTED só é compatível com criptografia do lado do servidor com uma chave do AWS Key Management Service (SSE-KMS). Não é possível usar JSON com EADER, FIXEDWIDTH, ADDQUOTES, ESCAPE nem NULL AS.

PARTITION BY ( *column\$1name* [, ... ] ) [INCLUDE]  <a name="unload-partitionby"></a>
Especifica as chaves de partição para a operação de descarregamento. O comando UNLOAD particiona automaticamente arquivos de saída em pastas de partição com base nos valores de chave de partição, seguindo a convenção Apache Hive. Por exemplo, um arquivo Parquet que pertence à partição setembro de 2019 tem o seguinte prefixo: `s3://amzn-s3-demo-bucket/my_prefix/year=2019/month=September/000.parquet`.   
O valor para *column\$1name* deve ser uma coluna nos resultados da consulta que está sendo descarregado.   
Se você especificar PARTITION BY com a opção INCLUDE, as colunas de partição não serão removidas dos arquivos descarregados.   
O Amazon Redshift não oferece suporte a literais de string em cláusulas PARTITION BY.

MANIFEST [ VERBOSE ]  
Cria um arquivo manifesto que lista explicitamente detalhes dos arquivos de dados criados por processo UNLOAD. O manifesto é um arquivo de texto em formato JSON que lista o URL de cada arquivo gravado no Amazon S3.   
Se MANIFEST for especificado com a opção VERBOSE, o manifesto incluirá os seguintes detalhes:   
+ Os nomes das colunas e os tipos de dados, e, para os tipos de dados CHAR, VARCHAR ou NUMERIC, dimensões para cada coluna. Para os tipos de dados CHAR e VARCHAR, a dimensão é o comprimento. Para um tipo de dados DECIMAL ou NUMERIC, as dimensões são precisão e escala. 
+ A contagem de linhas descarregada para cada arquivo. Se a opção HEADER for especificada, a contagem de linhas incluirá a linha de cabeçalho. 
+ O tamanho total do arquivo de todos os arquivos descarregados e a contagem total de linhas descarregada para todos os arquivos. Se a opção HEADER for especificada, a contagem de linhas incluirá as linhas de cabeçalho. 
+ O autor. Autor é sempre "Amazon Redshift".
Você pode especificar VERBOSE somente após MANIFEST.   
O arquivo manifesto é gravado no mesmo prefixo de caminho do Amazon S3 que os arquivos descarregados no formato `<object_path_prefix>manifest`. Por exemplo, se UNLOAD especificar o prefixo “`s3://amzn-s3-demo-bucket/venue_`“ do caminho do Amazon S3, a localização do arquivo manifesto será “`s3://amzn-s3-demo-bucket/venue_manifest`“.

CABEÇALHO  
Adiciona uma linha de cabeçalho que contém os nomes de coluna no topo de cada arquivo de saída. Opções de transformação de texto, como CSV, DELIMITER, ADDQUOTES e ESCAPE, também se aplicam à linha de cabeçalho. Não é possível usar HEADER com FIXEDWIDTH.

DELIMITER AS '*delimiter\$1character*'   
Especifica o único caractere ASCII usado para separar campos no arquivo de saída, como um caractere de barra vertical ( \$1 ), uma vírgula ( , ) ou uma tabulação ( \$1t ). O delimitador padrão para arquivos de texto é um caractere de barra. O delimitador padrão para arquivos CSV é uma vírgula. A palavra-chave AS é opcional. Não é possível usar DELIMITER com FIXEDWIDTH. Se os dados contiverem o caractere delimitador, será necessário especificar a opção ESCAPE para ignorar o delimitador, ou usar ADDQUOTES para colocar os dados entre aspas duplas. Como alternativa, especifique um delimitador que não esteja contido nos dados.

FIXEDWIDTH '*fixedwidth\$1spec*'   
Descarrega os dados em um arquivo em que a largura de cada coluna tem um tamanho fixo, em vez separadas por um delimitador. A *fixedwidth\$1spec* é uma string que especifica o número de colunas e a largura das coluna. A palavra-chave AS é opcional. Como FIXEDWIDTH não trunca dados, a especificação para cada coluna na instrução UNLOAD precisa ser pelo menos do tamanho de entrada mais longa para aquela coluna. O formato de *fixedwidth\$1spec* é mostrado a abaixo:   

```
'colID1:colWidth1,colID2:colWidth2, ...'
```
Não é possível usar FIXEDWIDTH com DELIMITER ou HEADER.

ENCRYPTED [AUTO]  <a name="unload-parameters-encrypted"></a>
Especifica que os arquivos de saída no Amazon S3 são criptografados usando a criptografia do lado do servidor do Amazon S3. Se MANIFEST for especificado, o arquivo manifesto também será criptografado. Para obter mais informações, consulte [Descarregamento de arquivos de dados criptografados](t_unloading_encrypted_files.md). Se você não especificar o parâmetro ENCRYPTED, UNLOAD criará automaticamente arquivos criptografados usando a criptografia do servidor Amazon S3 com chaves de criptografia gerenciadas (SSE-S3) da AWS.   
Para ENCRYPTED, você pode querer descarregar no Amazon S3 usando criptografia do lado do servidor com uma chave do AWS KMS (SSE-KMS). Em caso afirmativo, use o parâmetro [KMS_KEY_ID](#unload-parameters-kms-key-id) para fornecer o ID da chave. Você não pode usar o parâmetro [Usar o parâmetro CREDENTIALS](copy-parameters-authorization.md#copy-credentials) com parâmetro KMS\$1KEY\$1ID. Se você executar um comando UNLOAD para dados usando KMS\$1KEY\$1ID, poderá fazer uma operação COPY para os mesmos dados sem especificar uma chave.   
Se ENCRYPTED AUTO for usado, o comando UNLOAD busca a chave de criptografia padrão do AWS KMS na propriedade de bucket do Amazon S3 de destino e criptografa os arquivos gravados no Amazon S3 com a chave do AWS KMS. Se o bucket não tiver a chave de criptografia padrão do AWS KMS, UNLOAD criará automaticamente arquivos criptografados usando a criptografia do lado do servidor Amazon Redshift com chaves de criptografia gerenciadas (SSE-S3) da AWS. Não é possível usar essa opção com KMS\$1KEY\$1ID, MASTER\$1SYMMETRIC\$1KEY ou CREDENTIALS que contém master\$1symmetric\$1key. 

KMS\$1KEY\$1ID '*key-id*'  <a name="unload-parameters-kms-key-id"></a>
Especifica o ID de chave para uma chave do AWS Key Management Service (AWS KMS) a ser usada para criptografar arquivos de dados no Amazon S3. Para ter mais informações, consulte [O que é o AWS Key Management Service?](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) Se você especificar KMS\$1KEY\$1ID, você deve especificar o parâmetro [ENCRYPTED](#unload-parameters-encrypted) também. Se você especificar KMS\$1KEY\$1ID, não autentique usando o parâmetro CREDENTIALS. Em vez disso, use [Usar o parâmetro IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role) ou [Usar os parâmetros ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id). 

BZIP2   
Descarrega dados em um ou mais arquivos compactados bzip2 por fatia. Cada arquivo resultante recebe uma extensão `.bz2`. 

GZIP   
Descarrega dados em um ou mais arquivos compactados gzip por fatia. Cada arquivo resultante recebe uma extensão `.gz`. 

ZSTD   
Descarrega dados em um ou mais arquivos compactados Zstandard por fatia. Cada arquivo resultante recebe uma extensão `.zst`. 

ADDQUOTES   
Coloca aspas em cada campo de dados descarregado para que o Amazon Redshift possa descarregar os valores de dados que contêm o próprio delimitador. Por exemplo, se o delimitador for uma vírgula, você pode descarregar e recarregar os seguintes dados com êxito:   

```
 "1","Hello, World" 
```
Se as aspas não forem adicionadas, a string `Hello, World` será analisada como dois campos separados.  
Alguns formatos de saída não são compatíveis com ADDQUOTES.  
Se você usar ADDQUOTES, deve especificar REMOVEQUOTES em COPY se recarregar dados.

NULL AS '*string-nula*'   
Especifica uma string que representa um valor nulo em arquivos de descarregamento. Se essa opção for usada, todos os arquivos de saída contêm a string especificada em vez de todos os valores nulos encontrados nos dados selecionados. Se essa opção não for especificada, os valores nulos serão descarregados como:   
+ String de tamanho zero para saída delimitada 
+ String de espaço em branco para saída de largura fixa
Se uma string nula é específica para um tamanho fixo de descarregamento e o tamanho de uma coluna de saída é inferior ao tamanho de string nulo, o seguinte comportamento ocorre:   
+ Um campo vazio é a saída para colunas sem caracteres 
+ Um erro é relatado para colunas com caracteres 
Ao contrário de outros tipos de dados em que uma string definida pelo usuário representa um valor nulo, o Amazon Redshift exporta as colunas de dados SUPER usando o formato JSON e a representa como nula, conforme determinado pelo formato JSON. Como resultado, as colunas de dados SUPER ignoram a opção NULL [AS] usada nos comandos UNLOAD.

ESCAPE   
Para colunas CHAR e VARCHAR em arquivos de descarregamento delimitados, um caractere de escape (`\`) é posicionado antes de cada ocorrência dos seguintes caracteres:  
+ Linefeed: `\n`
+ Retorno de carro: `\r`
+ O caractere delimitador especificado para dados descarregados. 
+ Caractere de escape: `\`
+ Um caractere de aspas: `"` ou `'` (se ambos ESCAPE e ADDQUOTES estiverem especificados no comando UNLOAD).
Se você carregou os dados usando COPY com a opção ESCAPE, também deverá especificar a opção ESCAPE com o comando UNLOAD para gerar o arquivo de saída recíproco. Da mesma maneira, se usar UNLOAD com a opção ESCAPE, você precisará usar ESCAPE quando usar o comando COPY nos mesmos dados.

ALLOWOVERWRITE   <a name="allowoverwrite"></a>
Como padrão, UNLOAD apresenta falha se localizar arquivos que possivelmente substituiria. Se ALLOWOVERWRITE for especificado, UNLOAD substituirá arquivos existentes, incluindo o arquivo manifesto. 

CLEANPATH  <a name="cleanpath"></a>
A opção CLEANPATH remove arquivos existentes localizados no caminho do Amazon S3 especificado na cláusula TO antes de descarregar arquivos para o local especificado.   
Se você incluir a cláusula PARTITION BY, os arquivos existentes serão removidos somente das pastas de partição para receber novos arquivos gerados pela operação UNLOAD.  
Você deve ter a permissão `s3:DeleteObject` no bucket do Amazon S3. Para obter mais informações, consulte [Políticas e permissões no Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html) no *Guia do usuário do Amazon Simple Storage Service*. Os arquivos removidos usando a opção CLEANPATH serão excluídos permanentemente e não podem ser recuperados. Se o bucket de destino do Amazon S3 tiver o versionamento habilitado, UNLOAD com a opção CLEANPATH não removerá as versões anteriores dos arquivos.  
Você não pode especificar a opção CLEANPATH se especificar a opção ALLOWOVERWRITE.

PARALLEL   <a name="unload-parallel"></a>
Por padrão, UNLOAD grava dados em paralelo a vários arquivos, de acordo com o número de fatias no cluster. A opção padrão é ON ou TRUE. Se PARALLEL estiver configurado como OFF ou FALSE, UNLOAD gravará um ou mais arquivos de dados em série, classificado(s) absolutamente de acordo com a cláusula ORDER BY, se houver. O tamanho máximo de um arquivo de dados é 6,2 GB. Dessa forma, por exemplo, se você descarrega 13,4 GB de dados, a opção UNLOAD cria os seguintes três arquivos.  

```
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
```
O comando UNLOAD é projetado para usar processamento paralelo. Recomendamos deixar PARALLEL habilitado na maioria dos casos, especialmente se os arquivos são usados para carregar tabelas usando um comando COPY.

MAXFILESIZE [AS] max-size [ MB \$1 GB ]   <a name="unload-maxfilesize"></a>
Especifica o tamanho máximo de arquivos criados por UNLOAD no Amazon S3. Especifique um valor decimal entre 5 MB e 6,2 GB. A palavra-chave AS é opcional. A unidade padrão é MB. Se MAXFILESIZE não for especificado, o tamanho de arquivo máximo padrão será 6,2 GB. O tamanho do arquivo de manifesto, se houver, não é afetado por MAXFILESIZE.

ROWGROUPSIZE [AS] size [ MB \$1 GB ]   <a name="unload-rowgroupsize"></a>
Especifica o tamanho dos grupos de linhas. Escolher um tamanho maior pode reduzir o número de grupos de linhas, reduzindo a quantidade de comunicação de rede. Especifique um valor inteiro entre 32 MB e 128 MB. A palavra-chave AS é opcional. A unidade padrão é MB.  
Se ROWGROUPSIZE não for especificado, o tamanho padrão será 32 MB. Para usar esse parâmetro, o formato de armazenamento deve ser Parquet e o tipo de nó deve ser ra3.4xlarge, ra3.16xlarge ou dc2.8xlarge.

REGION [AS] '*aws-region*'  <a name="unload-region"></a>
Especifica a Região da AWS onde está localizado o bucket do Amazon S3 de destino. O parâmetro REGION é necessário para a operação UNLOAD em um bucket do Amazon S3 que não esteja na mesma Região da AWS que o banco de dados do Amazon Redshift.   
O valor de *aws\$1region* deve corresponder a uma região da AWS listada na tabela de [Regiões e endpoints do Amazon Redshift](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region) na *Referência geral da AWS*.  
Por padrão, UNLOAD assume que o bucket do Amazon S3 de destino está localizado na mesma Região da AWS que o banco de dados do Amazon Redshift.

EXTENSÃO “*extension-name*”  <a name="unload-extension"></a>
Especifica a extensão do arquivo a ser anexada aos nomes dos arquivos descarregados. O Amazon Redshift não executa nenhuma validação, então você deve verificar se a extensão de arquivo especificada está correta. Se você especificar um método de compactação sem fornecer uma extensão, o Amazon Redshift só adicionará a extensão do método de compactação ao nome do arquivo. Se você não fornecer nenhuma extensão e não especificar um método de compactação, o Amazon Redshift não adicionará nada ao nome do arquivo. 

## Observações de uso
<a name="unload-usage-notes"></a>

### Usar ESCAPE para todas as operações UNLOAD de texto delimitadas
<a name="unload-usage-escape"></a>

Quando você usa UNLOAD com um delimitador, seus dados podem incluir esse delimitador ou qualquer um dos caracteres listados na descrição da opção ESCAPE. Nesse caso, você deve usar a opção ESCAPE com o comando UNLOAD. Se você não usar a opção ESCAPE com UNLOAD, poderá ocorrer uma falha nas operações COPY subsequentes que usem os dados descarregados.

**Importante**  
É altamente recomendável que você sempre use ESCAPE com os comandos UNLOAD e COPY. A exceção será se você tiver certeza de que seus dados não contêm nenhum delimitador nem outros caracteres que talvez precisem ser ignorados. 

### Perda de precisão de ponto flutuante
<a name="unload-usage-floating-point-precision"></a>

Você pode se deparar com perda de precisão para dados flutuantes sucessivamente descarregados e recarregados. 

### Cláusula de limitação
<a name="unload-usage-limit-clause"></a>

A consulta SELECT não pode usar uma cláusula LIMIT na SELECT externa. Por exemplo, o seguinte comando UNLOAD retorna uma falha:

```
unload ('select * from venue limit 10')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Em vez disso, use uma cláusula LIMIT aninhada, como no exemplo a seguir.

```
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';
```

Você também pode preencher uma tabela usando SELECT…INTO ou CREATE TABLE AS com uma cláusula LIMIT e descarregar da tabela.

### Descarregar uma coluna do tipo de dados GEOMETRY
<a name="unload-usage-geometry"></a>

Só é possível descarregar colunas GEOMETRY para texto ou formato CSV. Não é possível descarregar dados GEOMETRY com a opção `FIXEDWIDTH`. Os dados são descarregados na forma hexadecimal do binário bem-conhecido estendido (EWKB). Se o tamanho dos dados EWKB for maior que 4 MB, ocorrerá um aviso porque os dados não poderão ser carregados em uma tabela mais tarde. 

### Descarregar o tipo de dados HLLSKETCH
<a name="unload-usage-hll"></a>

Só é possível descarregar colunas HLLSKETCH para texto ou formato CSV. Não é possível descarregar dados HLLSKETCH com a opção `FIXEDWIDTH`. Os dados são descarregados no formato Base64 para esboços de HyperLogLog densos ou no formato JSON para esboços de HyperLogLog esparsos. Para obter mais informações, consulte [Funções HyperLogLog](hyperloglog-functions.md).

O exemplo a seguir exporta uma tabela contendo colunas HLLSKETCH para um arquivo.

```
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;
```

### Descarregar uma coluna do tipo de dados VARBYTE
<a name="unload-usage-varbyte"></a>

Só é possível descarregar colunas VARBYTE para texto ou formato CSV. Os dados são descarregados em forma hexadecimal. Não é possível descarregar dados VARBYTE com a opção `FIXEDWIDTH`. Não há suporte para a opção `ADDQUOTES` de UNLOAD para um CSV. Uma coluna VARBYTE não pode ser usada como coluna PARTITIONED BY. 

### Cláusula FORMAT AS PARQUET
<a name="unload-parquet-usage"></a>

Esteja ciente destas considerações ao usar o FORMAT AS PARQUET:
+ O descarregamento para Parquet não usa compactação no nível de arquivo. Cada grupo de linhas é compactado com SNAPPY.
+ Se MAXFILESIZE não for especificado, o tamanho de arquivo máximo padrão será 6,2 GB. Você pode usar MAXFILESIZE para especificar um tamanho de arquivo de 5 MB a 6,2 GB. O tamanho real do arquivo é aproximado quando o arquivo está sendo gravado, então ele pode não ser exatamente igual ao número especificado.

  Para maximizar a performance da verificação, o Amazon Redshift tenta criar arquivos Parquet que contenham grupos de linhas de 32 MB igualmente dimensionados. O valor MAXFILESIZE especificado é automaticamente arredondado para baixo para o múltiplo mais próximo de 32 MB. Por exemplo, se você especificar MAXFILESIZE 200 MB, cada arquivo Parquet descarregado será de aproximadamente 192 MB (grupo de linhas de 32 MB x 6 = 192 MB).
+ Se uma coluna usar o formato de dados TIMESTAMPTZ, somente os valores de timestamp serão descarregados. As informações de fuso horário não são descarregadas.
+ Não especifique prefixos de nome de arquivo que começam com caracteres de sublinhado (\$1) ou ponto final (.). O Redshift Spectrum trata os arquivos que começam com esses caracteres como arquivos ocultos e os ignora.

### Cláusula PARTITION BY
<a name="unload-partitionby-usage"></a>

Esteja ciente destas considerações ao usar o PARTITION BY:
+ As colunas de partição não são incluídas no arquivo de saída.
+ Certifique-se de incluir colunas de partição na consulta SELECT usada na instrução UNLOAD. Você pode especificar qualquer número de colunas de partição no comando UNLOAD. No entanto, há uma limitação de que deve haver pelo menos uma coluna sem partição para fazer parte do arquivo.
+ Se a chave-valor de partição for nulo, o Amazon Redshift descarregará automaticamente esses dados em uma partição padrão chamada `partition_column=__HIVE_DEFAULT_PARTITION__`. 
+ O comando UNLOAD não faz nenhuma chamada para um catálogo externo. Para registrar suas novas partições para fazer parte da tabela externa existente, use um ALTER TABLE ... separado. Comando ADD PARTITION ... Como alternativa, você pode executar um comando CREATE EXTERNAL TABLE para registrar os dados descarregados como uma nova tabela externa. Você também pode usar um crawler do AWS Glue para preencher o catálogo de dados. Para obter mais informações, consulte [Definição de crawlers](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) no *Guia do desenvolvedor do AWS Glue*. 
+ Se você usar a opção MANIFEST, o Amazon Redshift gerará somente um arquivo manifesto na pasta raiz do Amazon S3.
+ Os tipos de dados da coluna que você pode usar como chave de partição são SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, BOOLEAN, CHAR, VARCHAR, DATE e TIMESTAMP. 

### Usar o privilégio ASSUMEROLE para conceder acesso a uma função do IAM para operações UNLOAD
<a name="unload-assumerole-privilege-usage"></a>

Para fornecer acesso a usuários e grupos específicos a uma função do IAM para operações UNLOAD, um superusuário pode conceder o privilégio ASSUMEROLE em uma função do IAM a usuários e grupos. Para mais informações, consulte [GRANT](r_GRANT.md). 

### UNLOAD não é compatível com aliases de ponto de acesso do Amazon S3
<a name="unload-usage-s3-access-point-alias"></a>

Não é possível usar os aliases de ponto de acesso do Amazon S3 com comandos UNLOAD. 

## Exemplos
<a name="r_UNLOAD-examples"></a>

Para ver exemplos que mostram como usar o comando UNLOAD, consulte [Exemplos de UNLOAD](r_UNLOAD_command_examples.md).

# Exemplos de UNLOAD
<a name="r_UNLOAD_command_examples"></a>

Esses exemplos demonstram vários parâmetros do comando UNLOAD. Os dados de amostra de TICKIT são usados em muitos dos exemplos. Para obter mais informações, consulte [Banco de dados de exemplo](c_sampledb.md).

**nota**  
Estes exemplos contêm quebras de linha para garantir legibilidade. Não inclua quebras de linha nem espaços na string *credentials-args*.

## Descarregar VENUE para um arquivo delimitado por barras (delimitador padrão)
<a name="unload-examples-venue"></a>

O exemplo a seguir descarrega a tabela VENUE e grava os dados em `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 padrão, UNLOAD grava um ou mais arquivos por fatia. Pressupondo um cluster de dois nós com duas fatias por nó, o exemplo anterior cria estes arquivos em `amzn-s3-demo-bucket`:

```
unload/0000_part_00
unload/0001_part_00
unload/0002_part_00
unload/0003_part_00
```

Para melhor diferenciar os arquivos de saída, você pode incluir um prefixo no local. O exemplo a seguir descarrega a tabela VENUE e grava os dados em `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';
```

Como resultado, temos os quatro arquivos na pasta `unload`, mais uma vez pressupondo quatro fatias.

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## Descarregar tabela LINEITEM para arquivos Parquet particionados
<a name="unload-examples-partitioned-parquet"></a>

O exemplo a seguir descarrega a tabela LINEITEM no formato Parquet, particionada pela coluna `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);
```

Assumindo que há quatro fatias, os arquivos Parquet resultantes são particionados dinamicamente em várias pastas. 

```
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**  
Em alguns casos, o comando UNLOAD usou a opção INCLUDE, conforme mostrado na instrução SQL a seguir.   

```
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;
```
Nesses casos, a coluna `l_shipdate` também está nos dados nos arquivos Parquet. Caso contrário, os dados da coluna `l_shipdate` não estão nos arquivos Parquet.

## Descarregue a tabela VENUE para um arquivo JSON
<a name="unload-examples-json"></a>

O exemplo a seguir descarrega a tabela VENUE e grava os dados no formato JSON em `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;
```

As linhas de exemplo são exemplos da tabela 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
```

Após o descarregamento para JSON, o formato do arquivo é semelhante ao seguinte.

```
{"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}
```

## Descarregar VENUE para um arquivo CSV
<a name="unload-examples-csv"></a>

O exemplo a seguir descarrega a tabela VENUE e grava os dados no formato CSV em `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;
```

Suponha que a tabela VENUE contenha as linhas a seguir.

```
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
```

O arquivo de descarregamento é semelhante ao seguinte.

```
1,Pinewood Racetrack,Akron,OH,0
2,"Columbus ""Crew"" Stadium",Columbus,OH,0
4,"Community, Ballpark, Arena",Kansas City,KS,0
```

## Descarregar VENUE para um arquivo CSV usando um delimitador
<a name="unload-examples-csv-delimiter"></a>

O exemplo a seguir descarrega a tabela VENUE e grava os dados no formato CSV usando o caractere de barra vertical (\$1) como delimitador. O arquivo descarregado é gravado em `s3://amzn-s3-demo-bucket/unload/`. Neste exemplo, a tabela VENUE contém o caractere de barra vertical no valor da primeira linha (`Pinewood Race|track`). Isso é feito para mostrar que o valor no resultado está entre aspas duplas. Aspas duplas são recuadas por aspas duplas e todo o campo é colocado entre aspas duplas. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
CSV DELIMITER AS '|';
```

Suponha que a tabela VENUE contenha as linhas a seguir.

```
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
```

O arquivo de descarregamento é semelhante ao seguinte.

```
1|"Pinewood Race|track"|Akron|OH|0
2|"Columbus ""Crew"" Stadium"|Columbus|OH|0
4|Community, Ballpark, Arena|Kansas City|KS|0
```

## Descarregar VENUE com um arquivo manifesto
<a name="unload-examples-manifest"></a>

Para criar um arquivo de manifesto, inclua a opção MANIFEST. O exemplo a seguir descarrega a tabela VENUE e grava um arquivo manifesto com arquivos de dados em s3://amzn-s3-demo-bucket/venue\$1pipe\$1: 

**Importante**  
Ao descarregar arquivos com a opção MANIFEST, você deve usar a opção MANIFEST com o comando COPY para carregar os arquivos. Se você usar o mesmo prefixo para carregar os arquivos e não especificar a opção MANIFEST, ocorrerá uma falha na opção COPY porque ela pressupõe que o arquivo de manifesto é um arquivo de dados.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

O resultado são estes cinco arquivos:

```
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 seguir, você verá o conteúdo do arquivo manifesto. 

```
{
  "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"}
  ]
}
```

## Descarregar VENUE com MANIFEST VERBOSE
<a name="unload-examples-manifest-verbose"></a>

Quando você especifica a opção MANIFEST VERBOSE, o arquivo manifesto inclui as seguintes seções: 
+ A seção `entries` lista o caminho, o tamanho e a contagem de linhas do Amazon S3 para cada arquivo. 
+ A seção `schema` lista os nomes das colunas, os tipos de dados e a dimensão de cada coluna. 
+ A seção `meta` mostra o tamanho total do arquivo e a contagem de linhas para todos os arquivos. 

O exemplo a seguir descarrega a tabela VENUE usando a opção 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 seguir, você verá o conteúdo do arquivo manifesto.

```
{
  "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"
  }
}
```

## Descarregar VENUE com um cabeçalho
<a name="unload-examples-header"></a>

O exemplo a seguir descarrega VENUE com uma linha de cabeçalho.

```
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;
```

O seguinte mostra o conteúdo do arquivo de saída com uma linha de cabeçalho.

```
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
```

## Descarregar VENUE em arquivos menores
<a name="unload-examples-maxfilesize"></a>

Por padrão, o tamanho máximo de arquivo é 6,2 GB. Se os dados do descarregamento forem maiores de 6,2 GB, UNLOAD criará um novo arquivo para cada segmento de dados de 6,2 GB. Para criar arquivos menores, inclua o parâmetro MAXFILESIZE. Pressupondo que o tamanho dos dados no exemplo anterior foi 20 GB, o seguinte comando UNLOAD cria 20 arquivos, cada um com 1 GB.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
maxfilesize 1 gb;
```

## Descarregar VENUE em série
<a name="unload-examples-serial"></a>

Para descarregar em série, especifique PARALLEL OFF. UNLOAD gravará um arquivo por vez, com no máximo 6,2 GB por arquivo. 

O exemplo a seguir descarrega a tabela VENUE e grava os dados em série em `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;
```

O resultado é um arquivo chamado venue\$1serial\$1000. 

Se os dados do descarregamento forem maiores de 6,2 GB, UNLOAD criará um novo arquivo para cada segmento de dados de 6,2 GB. O exemplo a seguir descarrega a tabela LINEORDER e grava os dados em série em `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;
```

O resultado é a seguinte série de arquivos.

```
lineorder_serial_0000.gz
lineorder_serial_0001.gz
lineorder_serial_0002.gz
lineorder_serial_0003.gz
```

Para melhor diferenciar os arquivos de saída, você pode incluir um prefixo no local. O exemplo a seguir descarrega a tabela VENUE e grava os dados em `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';
```

Como resultado, temos os quatro arquivos na pasta `unload`, mais uma vez pressupondo quatro fatias.

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## Carregar VENUE dos arquivos de descarregamento
<a name="unload-examples-load"></a>

Para carregar uma tabela de um conjunto de arquivos de descarga, simplesmente inverta o processo usando um comando COPY. O exemplo a seguir cria uma nova tabela, LOADVENUE, e carrega a tabela dos arquivos de dados criados no exemplo anterior.

```
create table loadvenue (like venue);

copy loadvenue from 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Se tiver usado a opção MANIFEST para criar um arquivo manifesto com seus arquivos de descarga, você poderá carregar os dados usando o mesmo arquivo manifesto. Você faz isso com um comando COPY com a opção MANIFEST. O exemplo a seguir carrega dados usando um arquivo manifesto.

```
copy loadvenue
from 's3://amzn-s3-demo-bucket/venue_pipe_manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

## Descarregar VENUE em arquivos criptografados
<a name="unload-examples-unload-encrypted"></a>

O exemplo a seguir descarrega a tabela VENUE para um conjunto de arquivos criptografados usando uma chave do AWS KMS. Se você especificar um arquivo manifesto com a opção ENCRYPTED, o arquivo manifesto também será criptografado. Para obter mais informações, consulte [Descarregamento de arquivos de dados criptografados](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;
```

O exemplo a seguir descarrega a tabela VENUE para um conjunto de arquivos criptografados usando uma chave simétrica raiz. 

```
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;
```

## Carregar VENUE dos arquivos criptografados
<a name="unload-examples-load-encrypted"></a>

Para carregar tabelas de um conjunto de arquivos que foram criados usando UNLOAD com a opção ENCRYPT, inverta o processo usando um comando COPY. Com esse comando, use a opção ENCRYPTED e especifique a mesma chave simétrica raiz que foi usada no comando UNLOAD. O exemplo a seguir carrega a tabela LOADVENUE a partir dos arquivos de dados criptografados criados no exemplo 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;
```

## Descarregar dados de VENUE para um arquivo delimitado por tabulação
<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';
```

Os arquivos de dados de saída são semelhantes a: 

```
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
...
```

## Descarregar VENUE para um arquivo de dados de largura fixa
<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';
```

Os arquivos de dados de saída serão semelhantes a: 

```
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
...
```

## Descarregar VENUE para um conjunto de arquivos GZIP compactados delimitados por tabulação
<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;
```

## Descarregue VENUE em um arquivo de texto compactado com 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;
```

## Descarregar dados que contêm um delimitador
<a name="unload-examples-delimiter"></a>

Este exemplo usa a opção ADDQUOTES para descarregar dados delimitados por vírgula onde alguns dos campos de dados reais contêm uma vírgula.

Primeiramente, crie uma tabela que contenha aspas.

```
create table location (id int, location char(64));

insert into location values (1,'Phoenix, AZ'),(2,'San Diego, CA'),(3,'Chicago, IL');
```

Em seguida, descarregue os dados usando a opção ADDQUOTES.

```
unload ('select id, location from location')
to 's3://amzn-s3-demo-bucket/location_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter ',' addquotes;
```

Os arquivos de dados descarregados são semelhantes a: 

```
1,"Phoenix, AZ"
2,"San Diego, CA"
3,"Chicago, IL"
...
```

## Descarregar os resultados de uma consulta de junção
<a name="unload-examples-join"></a>

O exemplo a seguir descarrega os resultados de uma consulta de junção que contém uma função de janela. 

```
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';
```

Os arquivos de saída são semelhantes a: 

```
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
...
```

## Descarregar usando NULL AS
<a name="unload-examples-null-as"></a>

UNLOAD apresenta valores nulos de saída como strings vazias por padrão. Os exemplos a seguir mostram como usar NULL AS para substituir valores nulos por uma string de texto.

Para esses exemplos, vamos adicionar alguns valores nulos à tabela VENUE.

```
update venue set venuestate = NULL
where venuecity = 'Cleveland';
```

Selecione de VENUE onde VENUESTATE for nulo para confirmar que as colunas contêm valores 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
```

Agora, use UNLOAD para descarregar a tabela VENUE usando a opção NULL AS para substituir valores nulos pela string de caractere '`fred`'. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
null as 'fred';
```

O exemplo a seguir do arquivo de descarregamento mostra que os valores nulos foram substituídos por `fred`. Na realidade, os valores para VENUESEATS também eram nulos e foram substituídos por `fred`. Apesar de o tipo de dados para VENUESEATS ser 'inteiro', a opção UNLOAD converte os valores em texto nos arquivos do descarregamento, e a opção COPY os converte de volta em inteiro. Se você está descarregando para um arquivo de largura fixa, a string NULL AS não deve ser superior à largura do 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 carregar uma tabela de arquivos de descarregamento, use um comando COPY com a mesma opção NULL AS. 

**nota**  
Se você tentar carregar nulos em uma coluna definida como NOT NULL, o comando COPY falhará.

```
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 confirmar que as colunas contêm nulos, e não apenas strings vazias, selecione a opção LOADVENUENULLS e filtre por 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         |

...
```

Você pode usar a opção UNLOAD em uma tabela que contenha nulos usando o comportamento padrão NULL AS e depois COPY para copiar os dados de volta para uma tabela usando o comportamento NULL AS. No entanto, todos os campos não numéricos na tabela de destino contêm strings vazias, não nulas. Por padrão, UNLOAD converte nulos em strings vazias (espaços em branco ou de tamanho zero). Uma opção COPY converte strings vazias em NULL para colunas numéricas, mas insere strings vazias em colunas não numéricas. O exemplo a seguir mostra como executar a opção UNLOAD seguida por uma opção COPY usando o comportamento padrão NULL AS. 

```
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';
```

Nesse caso, quando você filtra por nulos, somente as linhas em que VENUESEATS continha nulos. Nas linhas em que VENUESTATE continha nulos na tabela (VENUE), VENUESTATE contém strings vazias na tabela de destino (LOADVENUENULLS).

```
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 carregar strings vazias em colunas não numéricas como NULL, inclua a opção EMPTYASNULL ou BLANKSASNULL. É possível usar 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 confirmar que as colunas contêm NULL, e não apenas os espaços em branco ou vazios, selecione a opção LOADVENUENULLS e filtre por 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         |
     ...
```

## Descarregar usando o parâmetro ALLOWOVERWRITE
<a name="unload-examples-allowoverwrite"></a>

Por padrão, UNLOAD não substitui arquivos existentes no bucket de destino. Por exemplo, se você executar a mesma instrução UNLOAD duas vezes sem modificar os arquivos no bucket de destino, a segunda ocorrência de UNLOAD falha. Para substituir arquivos existentes, incluindo o arquivo manifesto, especifique a opção ALLOWOVERWRITE.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest allowoverwrite;
```

## Descarregue a tabela EVENT usando os parâmetros PARALLEL e MANIFEST
<a name="unload-examples-manifest-parallel"></a>

Você pode usar o parâmetro UNLOAD em uma tabela em paralelo e gerar um arquivo de manifesto. Os arquivos de dados do Amazon S3 são todos criados no mesmo nível e os nomes têm como sufixo o padrão `0000_part_00`. O arquivo de manifesto está no mesmo nível de pasta dos arquivos de dados e tem como sufixo o texto `manifest`. O SQL a seguir descarrega a tabela EVENT e cria arquivos com o nome 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;
```

A lista de arquivos do Amazon S3 é semelhante à seguinte:

```
 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
```

O conteúdo do arquivo `parallelmanifest` é semelhante ao seguinte:

```
{
  "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 }}
  ]
}
```

## Descarregue a tabela EVENT usando os parâmetros PARALLEL OFF e MANIFEST
<a name="unload-examples-manifest-serial"></a>

Você pode usar o parâmetro UNLOAD em uma tabela em série (PARALLEL OFF) e gerar um arquivo de manifesto. Os arquivos de dados do Amazon S3 são todos criados no mesmo nível e os nomes têm como sufixo o padrão `0000`. O arquivo de manifesto está no mesmo nível de pasta dos arquivos de dados e tem como sufixo o 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;
```

A lista de arquivos do Amazon S3 é semelhante à seguinte:

```
 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
```

O conteúdo do arquivo `serialmanifest` é semelhante ao seguinte:

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/serial000", "meta": { "content_length": 436991 }}
  ]
}
```

## Descarregue a tabela EVENT usando os parâmetros PARTITION BY e MANIFEST
<a name="unload-examples-manifest-partition"></a>

Você pode usar o parâmetro UNLOAD em uma tabela por partição e gerar um arquivo de manifesto. Uma nova pasta é criada no Amazon S3 com pastas de partição secundárias e os arquivos de dados nas pastas secundárias com um padrão de nome semelhante a `0000_par_00`. O arquivo de manifesto está no mesmo nível de pasta que as pastas secundárias com o nome `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;
```

A lista de arquivos do Amazon S3 é semelhante à seguinte:

```
 Name                   Type     Last modified                        Size                  
 partition           	Folder
```

Na pasta `partition` encontram-se pastas secundárias com o nome da partição e o arquivo de manifesto. Veja a seguir a parte inferior da lista de pastas na pasta `partition`, semelhante à seguinte:

```
 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
```

Na pasta `eventname=Zucchero/` estão os arquivos de dados semelhantes aos seguintes:

```
 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
```

A parte inferior do conteúdo do arquivo `manifest` é semelhante ao seguinte:

```
{
  "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 }}
  ]
}
```

## Descarregue a tabela EVENT usando os parâmetros MAXFILESIZE, ROWGROUPSIZE e MANIFEST
<a name="unload-examples-manifest-maxsize"></a>

Você pode usar o parâmetro UNLOAD em uma tabela em paralelo e gerar um arquivo de manifesto. Os arquivos de dados do Amazon S3 são todos criados no mesmo nível e os nomes têm como sufixo o padrão `0000_part_00`. Os arquivos de dados do Parquet gerados são limitados a 256 MB e o tamanho do grupo de linhas a 128 MB. O arquivo de manifesto está no mesmo nível de pasta dos arquivos de dados e tem como sufixo `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;
```

A lista de arquivos do Amazon S3 é semelhante à seguinte:

```
 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
```

O conteúdo do arquivo `eventsizemanifest` é semelhante ao seguinte:

```
{
  "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**
+ [Sintaxe](#r_UPDATE-synopsis)
+ [Parâmetros](#r_UPDATE-parameters)
+ [Observações de uso](#r_UPDATE_usage_notes)
+ [Exemplos da instrução UPDATE](c_Examples_of_UPDATE_statements.md)

Atualiza valores em uma ou mais colunas de tabela quando uma condição é atendida. 

**nota**  
O tamanho máximo de uma única instrução SQL é 16 MB.

## Sintaxe
<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 ]
```

## Parâmetros
<a name="r_UPDATE-parameters"></a>

Cláusula WITH  
Cláusula opcional que especifica uma ou mais *expressões de tabela-comum*. Consulte [Cláusula WITH](r_WITH_clause.md). 

 *table\$1name*   
Uma tabela temporária ou persistente. Somente o proprietário da tabela ou um usuário com o privilégio UPDATE na tabela pode atualizar linhas. Se usar a cláusula FROM ou selecionar das tabelas em uma expressão ou condição, você deve ter o privilégio SELECT nessas tabelas. Você não pode fornecer um alias à tabela aqui. No entanto, você pode especificar um alias na cláusula FROM.   
As tabelas externas do Amazon Redshift Spectrum são de somente leitura. Não é possível usar UPDATE uma tabela externa.

alias  
Nome alternativo temporário para uma tabela de destino. Os aliases são opcionais. A palavra-chave AS é sempre opcional. 

SET *coluna* =   
Uma ou mais colunas que você deseja modificar. As colunas que não estão listadas mantêm seus valores atuais. Não inclui o nome da tabela na especificação de uma coluna de destino. Por exemplo, `UPDATE tab SET tab.col = 1` é inválido.

 *expressão*   
Uma expressão que define o novo valor para a coluna especificada. 

DEFAULT   
Atualiza a coluna com o valor padrão atribuído à coluna na instrução CREATE TABLE. 

FROM *listadetabelas*   
Você pode atualizar uma tabela fazendo referência às informações em outras tabelas. Liste essas outras tabelas na cláusula FROM ou use uma subconsulta como parte da condição WHERE. As tabelas listadas na cláusula FROM podem ter aliases. Se você precisar incluir a tabela de destino da instrução UPDATE na lista, use um alias. 

WHERE *condição*   
Cláusula opcional que restringe atualizações em linhas que correspondem a uma condição. Quando a condição retorna como `true`, as colunas SET especificadas são atualizadas. A condição pode ser um predicado simples em uma coluna ou uma condição baseada no resultado de uma subconsulta.   
Você pode nomear qualquer tabela na subconsulta, incluindo a tabela de destino para UPDATE. 

## Observações de uso
<a name="r_UPDATE_usage_notes"></a>

Depois de atualizar um grande número de linhas em uma tabela: 
+ Limpe a tabela para recuperar espaço e reclassificar as linhas. 
+ Analise a tabela para atualizar as estatísticas do planejador de consulta. 

As junções esquerda, direita e externa completa não são compatíveis com a cláusula FROM de uma instrução UPDATE; elas retornam o seguinte erro: 

```
ERROR: Target table must be part of an equijoin predicate
```

 Se você precisar especificar uma junção externa, use uma subconsulta na cláusula WHERE da instrução UPDATE. 

Se sua instrução UPDATE exigir uma junção automática à tabela de destino, você precisa especificar a condição de junção, além dos critérios da cláusula WHERE que qualificam as linhas à operação de atualização. Geralmente, quando ocorre uma junção dos próprios dados da tabela de destino ou com outra tabela, uma prática recomendada é usar uma subconsulta que separe claramente as condições de junção dos critérios que qualifiquem linhas para atualização. 

Consultas UPDATE com várias correspondências por linha lançam um erro quando o parâmetro de configuração `error_on_nondeterministic_update` é definido como *true*. Para obter mais informações, consulte [error\$1on\$1nondeterministic\$1update](r_error_on_nondeterministic_update.md).

É possível atualizar uma coluna GENERATED BY DEFAULT AS IDENTITY. As colunas definidas como GENERATED BY DEFAULT AS IDENTITY podem ser atualizadas com os valores fornecidos. Para obter mais informações, consulte [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

# Exemplos da instrução UPDATE
<a name="c_Examples_of_UPDATE_statements"></a>

Para obter mais informações sobre as tabelas usadas nos exemplos a seguir, consulte [Banco de dados de exemplo](c_sampledb.md).

A tabela CATEGORY no banco de dados TICKIT contém as seguintes linhas: 

```
+-------+----------+-----------+--------------------------------------------+
| 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                 |
+-------+----------+-----------+--------------------------------------------+
```

 **Atualizar uma tabela com base em um intervalo de valores** 

Atualize a coluna de CATGROUP com base em um intervalo de valores na coluna de 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 |
+-------+----------+----------+---------------------------+
```

 **Atualizar uma tabela com base em um valor atual** 

Atualize as colunas CATNAME e CATDESC com base em seu valor CATGROUP atual: 

```
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    |
+-------+----------+---------+---------+)
```

Nesse caso, a coluna CATDESC foi definida como nula, pois nenhum valor padrão foi definido quando a tabela foi criada.

Execute os seguintes comandos para configurar os dados da tabela CATEGORY de volta para os valores originais:

```
TRUNCATE category;

COPY category
FROM 's3://redshift-downloads/tickit/category_pipe.txt' 
DELIMITER '|' 
IGNOREHEADER 1 
REGION 'us-east-1'
IAM_ROLE default;
```

 **Atualizar uma tabela com base no resultado de uma subconsulta da cláusula WHERE** 

Atualize a tabela CATEGORY com base no resultado de uma subconsulta na 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');
```

Veja a tabela atualizada: 

```
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 |
+-------+----------+-----------+--------------------------------------------+
```

 **Atualizar uma tabela com base no resultado de uma subconsulta da cláusula WITH** 

Para atualizar a tabela CATEGORY com base no resultado de uma subconsulta usando a cláusula WITH, use o exemplo a seguir.

```
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 |
+-------+----------+---------+---------------------------------+
```

## Atualizar uma tabela com base no resultado de uma condição de junção
<a name="c_Examples_of_UPDATE_statements-updating-a-table-based-on-the-result-of-a-join-condition"></a>

Atualize as 11 linhas originais na tabela CATEGORY com base na correspondência das linhas CATID na tabela 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                           |
+-------+----------+-----------+--------------------------------------------+
```

 Observe que a tabela EVENT está listada na cláusula FROM e a condição de junção à tabela de destino é definida na cláusula WHERE. Somente quatro linhas qualificadas para a atualização. Essas quatro linhas são as linhas cujos os valores CATID eram originalmente 6, 7, 8 e 9; somente essas quatro categorias são representadas na tabela EVENT: 

```
SELECT DISTINCT catid FROM event;

+-------+
| catid |
+-------+
| 6     |
| 7     |
| 8     |
| 9     |
+-------+
```

Atualize as 11 linhas originais na tabela CATEGORY, estendendo o exemplo anterior e adicionando outra condição à cláusula WHERE. Devido à restrição na coluna CATGROUP, somente uma linha se qualifica para atualização (embora quatro linhas se qualifiquem para junção). 

```
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 |
+-------+----------+---------+---------------------------------+
```

Uma forma alternativa de gravar este exemplo é: 

```
UPDATE category SET catid=100
FROM event JOIN category cat ON event.catid=cat.catid
WHERE cat.catgroup='Concerts';
```

A vantagem desta abordagem é que os critérios de junção são separados claramente de quaisquer outros critérios que qualifiquem linhas para atualização. Observe o uso do alias CAT para a tabela CATEGORY na cláusula FROM.

## Atualizações com junções externas na cláusula FROM
<a name="c_Examples_of_UPDATE_statements-updates-with-outer-joins-in-the-from-clause"></a>

O exemplo anterior mostrou uma junção interna especificada na cláusula FROM de uma instrução UPDATE. O exemplo a seguir retorna um erro porque a cláusula FROM não é compatível com junções externas à tabela 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
```

Se junções externas forem necessárias para a instrução UPDATE, você pode mover a sintaxe de junção externa para uma 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';
```

## Atualizações com colunas de outra tabela na cláusula SET
<a name="c_Examples_of_UPDATE_statements-set-with-column-from-another-table"></a>

Para atualizar a tabela listing no banco de dados de amostra TICKIT com valores da tabela sales, use o exemplo a seguir.

```
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>

Altera o banco de dados no qual as consultas são executadas. SHOW USE aponta para o banco de dados usado mais recentemente com o comando USE. RESET USE redefine o banco de dados usado. Isso significa que, se o banco de dados não for especificado no SQL, os objetos serão pesquisados no banco de dados atual.

## Sintaxe
<a name="r_USE-synopsis"></a>

```
USE database
```

## Exemplos
<a name="r_USE_command-examples"></a>

Suponha que haja dois bancos de dados, `dev` e `pdb`, e `pdb2`. Considere que haja duas tabelas `t` nos esquemas públicos de cada um dos bancos de dados. Primeiro, insira os dados em tabelas de diferentes bancos de dados:

```
dev=# insert into dev.public.t values (1);
INSERT 0 1
dev=# insert into pdb.public.t values (2);
INSERT 0 1
```

Se você não definir um banco de dados explicitamente, o sistema usará seu banco de dados conectado. Verifique o contexto atual do banco de dados:

```
dev=# show use;
Use Database

(1 row)
dev=> show search_path;
search_path
$user, public
(1 row)
```

Se, ao consultar a tabela `t`, não for especificado um banco de dados, o sistema usará a tabela em seu banco de dados atual:

```
dev=# select * from t;
c
----
1
(1 row)
```

Use o comando `use` para alternar bancos de dados sem alterar sua conexão:

```
dev=# use pdb;
USE
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# select * from t;
id
----
2
(1 row)
```

Também é possível especificar explicitamente o esquema.

```
dev=# select * from public.t;
id
----
2
(1 row)
```

Agora você pode criar tabelas em esquemas diferentes no banco de dados atual:

```
dev=# create table s1.t(id int);
CREATE TABLE
dev=# insert into pdb.s1.t values (3);
INSERT 0 1
```

O caminho de pesquisa determina quais objetos do esquema são acessados quando você não especifica um esquema:

```
dev=# set search_path to public, s1;
SET
dev=# select * from t;
 id
----
  2
(1 row)
```

Altere a ordem dos esquemas para acessar tabelas diferentes:

```
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)
```

Mude para outro banco de dados enquanto mantém sua conexão original:

```
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# use pdb2;
USE
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)
```

Ao alternar bancos de dados, o caminho de pesquisa é redefinido para o padrão:

```
dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

Crie uma tabela e insira dados no banco de dados atual:

```
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)
```

Nas transações, você pode gravar no banco de dados atual e ler de qualquer banco de dados usando a notação de três partes. Isso também inclui o banco de dados conectado:

```
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)
```

Redefina para seu banco de dados conectado. Observe que isso não só reverte para o banco de dados `pdb` usado anteriormente, mas redefine para o banco de dados conectado. O caminho de pesquisa também muda para o padrão: 

```
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)
```

Você pode alterar os bancos de dados no início de uma transação, mas não depois de executar 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)
```

### ARNs do Catálogo de Dados
<a name="use-redlake-example"></a>

Primeiro, crie tabelas em esquemas e catálogos diferentes para demonstrar consultas entre catálogos. Primeiro, crie tabelas no banco de dados conectado.

```
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');
```

Depois, crie tabelas semelhantes em um catálogo diferente. Isso demonstra como trabalhar com bancos de dados de consulta 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');
```

Verifique o contexto atual do banco de dados. Se você não definir um banco de dados explicitamente, o sistema usará o banco de dados conectado.

```
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)
```

Defina o banco de dados USEd para consultar tabelas em um 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)
```

Ao consultar a tabela t, os resultados virão do banco de dados de consulta 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)
```

Altere o caminho de pesquisa para acessar tabelas em diferentes esquemas dentro do banco de dados 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)
```

Embora USE esteja definido como um banco de dados de consulta entre catálogos, ainda é possível consultar explicitamente o banco de dados original.

```
dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

Redefina o banco de dados USEd para que consulte novamente os objetos no banco de dados conectado.

```
dev=# RESET USE;

dev=# SHOW USE;
 Use Database
--------------

(1 row)
```

Observe que o search\$1path é redefinido quando USE é redefinido.

```
dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

Após a redefinição, as consultas são direcionadas ao banco de dados conectado 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)
```

Você pode modificar o caminho de pesquisa no banco de dados original para acessar esquemas diferentes.

```
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>

Reclassifica linhas e recupera espaço em qualquer tabela especificada ou em todas as tabelas no banco de dados atual.

**nota**  
Somente usuários com as permissões de tabela necessárias podem efetivamente limpar uma tabela. Se VACUUM for executado sem as permissões necessárias de tabela, a operação será concluída com êxito, mas sem efeito. Para obter uma lista de permissões de tabela válidas para executar efetivamente VACUUM, consulte a seção Privilégios obrigatórios a seguir.

O Amazon Redshift classifica os dados automaticamente e executa VACUUM DELETE em segundo plano. Isso reduz a necessidade de executar o comando VACUUM. Para obter mais informações, consulte [Vacuum de tabelas](t_Reclaiming_storage_space202.md). 

Por padrão, VACUUM ignora a fase de classificação para qualquer tabela em que mais de 95 por cento das linhas da tabela já estejam classificadas. Ignorar a fase de classificação pode melhorar significativamente a performance de VACUUM. Para alterar ou excluir o limite de classificação padrão para uma única tabela, inclua o nome da tabela e o parâmetro TO *limite* PERCENT ao executar o comando VACUUM. 

Os usuários podem acessar tabelas enquanto elas estão sendo limpas. É possível executar consultas e operações de gravação enquanto uma tabela está sendo limpa, mas quando comandos de linguagem de manipulação de dados (DML) e uma limpeza são executados simultaneamente, ambos podem levar mais tempo. Se você executar instruções UPDATE e DELETE durante uma limpeza, a performance do sistema pode ser reduzida. VACUUM DELETE bloqueia temporariamente operações de atualização e exclusão. 

O Amazon Redshift executa automaticamente uma limpeza DELETE ONLY em segundo plano. A operação de limpeza automática é pausada quando os usuários executam operações de linguagem de definição de dados (DDL), como ALTER TABLE.

**nota**  
A sintaxe e o comportamento do comando VACUUM no Amazon Redshift são substancialmente diferentes da operação VACUUM do PostgreSQL. Por exemplo, a operação VACUUM padrão no Amazon Redshift é VACUUM FULL. Ela recupera o espaço em disco e reclassifica todas as linhas. Por outro lado, a operação padrão VACUUM no PostgreSQL recupera somente o espaço e o disponibiliza para reutilização.

Para obter mais informações, consulte [Vacuum de tabelas](t_Reclaiming_storage_space202.md).

## Privilégios obrigatórios
<a name="r_VACUUM_command-privileges"></a>

A seguir estão os privilégios obrigatórios para VACUUM:
+ Superusuário
+ Usuários com privilégio VACUUM
+ Proprietário da tabela
+ Proprietário do banco de dados com o qual a tabela é compartilhada

## Sintaxe
<a name="r_VACUUM_command-synopsis"></a>

```
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ]
[ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
```

## Parâmetros
<a name="r_VACUUM_command-parameters"></a>

FULL   <a name="vacuum-full"></a>
Classifica a tabela especificada (ou todas as tabelas no banco de dados atual) e recupera o espaço em disco ocupado por linhas que foram marcadas para exclusão pelas operações UPDATE e DELETE anteriores. VACUUM FULL é o valor padrão.  
Uma limpeza total não executa uma reindexação de tabelas intercaladas. Para reindexar tabelas intercaladas acompanhadas por uma limpeza completa, use a opção [VACUUM REINDEX](#vacuum-reindex).   
Por padrão, VACUUM FULL ignora a fase de classificação de qualquer tabela que já esteja pelo menos 95% classificada. Se VACUUM puder ignorar a fase de classificação, o comando executará DELETE ONLY e recuperará o espaço na fase de exclusão para que pelo menos 95% das linhas restantes não sejam marcadas para exclusão.    
Se o limite de classificação não for alcançado (por exemplo, se 90% das linhas forem classificadas) e VACUUM executar uma classificação completa, o comando também executará uma operação de exclusão completa, recuperando espaço de 100% das linhas excluídas.   
Você pode alterar o limite de limpeza padrão apenas para uma única tabela. Para alterar o limite de limpeza padrão para uma única tabela, inclua o nome da tabela e o parâmetro TO *limite* PERCENT. 

SORT ONLY   <a name="vacuum-sort-only"></a>
Classifica a tabela especificada (ou todas as tabelas no banco de dados atual) sem retomar espaço liberado pelas linhas excluídas. Essa opção é útil quando a recuperação de espaço em disco não é importante, mas sim a reclassificação de novas linhas. Uma limpeza do tipo SORT ONLY reduz o tempo decorrido para operações de limpeza quando a região não classificada não contém um grande número de linhas excluídas e não se estende por toda a região classificada. Aplicativos que não têm restrições de espaço em disco mas dependem de otimizações de consulta associadas à manutenção de linhas classificadas na tabela podem se beneficiar desse tipo de limpeza.  
Por padrão, VACUUM SORT ONLY ignora qualquer tabela que esteja pelo menos 95% classificada. Para alterar o limite de classificação padrão para uma única tabela, inclua o nome da tabela e o parâmetro TO *limite* PERCENT ao executar o comando VACUUM. 

DELETE ONLY   <a name="vacuum-delete-only"></a>
O Amazon Redshift executa automaticamente uma limpeza DELETE ONLY em segundo plano. Assim, você dificilmente precisará executar uma limpeza DELETE ONLY.  
VACUUM DELETE solicita de volta o espaço em disco ocupado por linhas que foram marcadas para exclusão pelas operações UPDATE e DELETE anteriores, e compacta a tabela para liberar o espaço ocupado. Uma operação de limpeza DELETE ONLY não classifica dados da tabela.   
Essa opção reduz o tempo decorrido para operações de vacuum quando é importante recuperar espaço em disco, mas reclassificar novas linhas não é. Essa opção também pode ser útil quando a performance da sua consulta já é ótimo, e reclassificar linhas para otimizar a performance da consulta não é uma necessidade.  
Por padrão, VACUUM DELETE ONLY recupera o espaço, de maneira que pelo menos 95% das linhas restantes não sejam marcadas para exclusão. Para alterar o limite de exclusão padrão para uma única tabela, inclua o nome da tabela e o parâmetro TO *limite* PERCENT ao executar o comando VACUUM.    
Algumas operações, como `ALTER TABLE APPEND`, podem fazer com que as tabelas sejam fragmentadas. Ao usar a cláusula `DELETE ONLY`, a operação de limpeza solicitará de volta o espaço das tabelas fragmentadas. O mesmo valor limite de 95% se aplica à operação de desfragmentação. 

REINDEX  <a name="vacuum-reindex"></a>
Analisa a distribuição dos valores nas colunas de chave de classificação intercaladas e executa uma operação VACUUM completa. Se REINDEX é usado, um nome de tabela é necessário.  
VACUUM REINDEX é bem mais demorado do que VACUUM FULL porque inclui uma etapa adicional para analisar as chaves de classificação intercaladas. As operações de classificação e mesclagem podem levar mais tempo para tabelas intercaladas porque a classificação intercalada pode precisar reorganizar mais linhas do que uma classificação composta.  
Se uma operação VACUUM REINDEX encerrar antes da conclusão, a próxima operação VACUUM retomará a reindexação antes de executar a operação de limpeza completa.  
VACUUM REINDEX não é compatível com TO *threshold* PERCENT.  

RECLUSTER  <a name="vacuum-recluster"></a>
Classifica as partes da tabela que não são classificadas. Partes da tabela que já estão classificadas por classificação automática de tabela são deixadas intactas. Esse comando não mescla os dados recém-classificados com a região classificada. Ele também não recupera todo o espaço marcado para exclusão. Quando esse comando for concluído, a tabela pode não aparecer totalmente classificada, conforme indicado pelo campo `unsorted` em SVV\$1TABLE\$1INFO.   
 Recomendamos que você use VACUUM RECLUSTER para tabelas grandes com ingestão frequente e consultas que acessam apenas os dados mais recentes.   
 VACUUM RECLUSTER não é compatível com o limite TO PERCENT. Se RECLUSTER for usado, um nome de tabela será necessário.  
O VACUUM RECLUSTER não é compatível com tabelas com chaves de classificação intercaladas e tabelas com estilo de distribuição ALL.

 *table\$1name*   
Nome de uma tabela a ser limpa. Se você não especificar um nome para a tabela, a operação de limpeza se aplicará a todas as tabelas no banco de dados atual. Você pode especificar qualquer tabela permanente ou temporária criada por usuário. O comando não é significativo para outros objetos, como exibições e tabelas de sistema.  
 Se você incluir o parâmetro TO *limite* PERCENT, será necessário um nome para a tabela.

 TO *limite* PERCENT   
Cláusula que especifica o limite acima do qual VACUUM ignora a fase de classificação e o limite de destino para recuperar espaço na fase de exclusão. O *limite de classificação* é a porcentagem de linhas do total que já está classificada para a tabela especificada antes da limpeza.  O *delete threshold* é a porcentagem mínima do total de linhas não marcadas para exclusão após a limpeza.   
Como o VACUUM reclassifica as linhas apenas quando a porcentagem de linhas classificadas em uma tabela é menor que o limite de classificação, o Amazon Redshift geralmente pode reduzir significativamente os tempos de VACUUM. De modo semelhante, quando VACUUM não é restrito a recuperar o espaço de 100% das linhas marcadas para exclusão, muitas vezes é capaz de regravar blocos que contêm somente algumas linhas excluídas.  
Por exemplo, se você especificar 75 para o *limite*, VACUUM ignorará a fase de classificação se 75% ou mais das linhas da tabela já estiverem classificadas. Para a fase de exclusão, VACUUMS define um objetivo de recuperação de espaço em disco de forma que 75% das linhas da tabela não sejam marcadas para exclusão após a limpeza. O valor do *limite* deve ser um número inteiro entre 0 e 100. O padrão é 95. Se você especificar um valor de 100, VACUUM sempre classificará a tabela a menos que ela já esteja totalmente classificada e recuperará o espaço de todas as linhas marcadas para exclusão. Se você especificar um valor de 0, VACUUM nunca classificará a tabela e nunca recuperará espaço.  
Se você incluir o parâmetro TO *limite* PERCENT, também deverá especificar um nome para a tabela. Se um nome para a tabela for omitido, VACUUM retorna uma falha.   
Não é possível usar o parâmetro TO *threshold* PERCENT com REINDEX. 

BOOST  
Executa o comando VACUUM com recursos adicionais, como memória e espaço em disco, conforme estiverem disponíveis. Com a opção BOOST, VACUUM opera em uma janela e bloqueia exclusões e atualizações simultâneas durante a operação VACUUM. A execução com a opção BOOST compete com recursos do sistema, o que pode afetar a performance da consulta. Execute o VACUUM BOOST quando a carga no sistema for leve, como durante operações de manutenção.   
Considere o seguinte ao usar a opção BOOST.  
+ Quando BOOST é especificado, o valor de *table-name* é necessário. 
+ BOOST não é compatível com REINDEX. 
+ BOOST é ignorado com DELETE ONLY. 

## Observações de uso
<a name="r_VACUUM_usage_notes"></a>

Para a maioria das aplicações do Amazon Redshift, uma limpeza completa é recomendada. Para obter mais informações, consulte [Vacuum de tabelas](t_Reclaiming_storage_space202.md).

Para executar uma operação de limpeza, observe o seguinte comportamento: 
+ Não é possível executar o comando VACUUM em um bloco de transação (BEGIN ... END). Para obter mais informações sobre transações, consulte [Níveis de isolamento no Amazon Redshift](c_serial_isolation.md). 
+ As tabelas podem crescer quando são limpas. Esse comportamento é esperado quando não há linhas excluídas a serem recuperadas ou quando a nova ordem de classificação da tabela resulta em uma taxa mais baixa de compactação de dados.
+ Durante operações de limpeza, qualquer grau de degradação de performance de consulta é esperado. A performance normal é retomada assim que a operação de limpeza é concluída.
+ As operações de gravação simultâneas continuam durante as operações de limpeza, mas não recomendamos realizar operações de gravação durante a limpeza. É mais eficiente concluir operações de gravação antes de executar a limpeza. Além disso, todos os dados gravados após o início de uma operação de limpeza não podem ser eliminados por essa operação. Nesse caso, uma segunda operação de limpeza é necessária.
+ Uma operação de limpeza pode não começar se uma operação de carregamento ou inserção já estiver em andamento. As operações de limpeza exigem temporariamente acesso exclusivo às tabelas para iniciar. Esse acesso exclusivo é necessário por pouco tempo para que as operações de limpeza não obstruam cargas e inserções simultâneas por qualquer período significativo.
+ As operações de limpeza são ignoradas quando não há trabalho a fazer para uma tabela específica. No entanto, há algumas sobrecargas associadas à descoberta de que a operação pode ser ignorada. Se você sabe que uma tabela é limpa ou não atende ao limite de limpeza, não execute uma operação de limpeza nela.
+ Uma operação de limpeza DELETE ONLY em uma tabela pequena pode não reduzir o número de blocos usados para armazenar dados, especialmente quando a tabela tem um grande número colunas ou o cluster usa um grande número fatias por nó. Essas operações de limpeza adicionam um bloco por coluna por fatia para contabilizar inserções simultâneas na tabela, e essa sobrecarga pode exceder a redução da contagem de blocos do espaço em disco recuperado. Por exemplo, se uma tabela de 10 colunas em um cluster de 8 nós ocupar 1000 blocos antes de uma limpeza, a limpeza não reduzirá a contagem de blocos real a não ser que mais de 80 blocos de espaço em disco sejam recuperados devido às linhas excluídas. (Cada bloco de dados usa 1 MB.)

As operações de limpeza automáticas pausarão caso alguma destas condições não forem atendidas: 
+ Um usuário executa uma operação de linguagem de definição de dados (DDL), como ALTER TABLE, que precisa de um bloqueio exclusivo na tabela em que a limpeza automática está atuando. 
+ Um período de carga elevada no cluster.

### Compatibilidade com VACUUM simultâneo
<a name="r_VACUUM_usage_notes_concurrent"></a>

O Amazon Redshift comporta a execução simultânea de várias transações de vacuum em diferentes sessões em um cluster ou um grupo de trabalho. Isso significa que é possível emitir instâncias diferentes e múltiplas de todos os modos de vacuum de uma só vez, com cada transação de vacuum em uma tabela exclusiva. Duas operações de vacuum não podem trabalhar em uma única tabela ao mesmo tempo.

**Diretrizes para execução simultânea de vacuum**
+ Ao executar transações de vacuum simultâneas em sessões diferentes, você deve monitorar os recursos do sistema e evitar executar muitas operações de vacuum simultaneamente.
+ O nível de simultaneidade recomendado depende da quantidade de espaço a ser recuperado, do número e da largura das linhas a serem classificadas, do tamanho do data warehouse e do tamanho da workload executada com as operações VACUUM.
+ Dependendo do modo da transação de vacuum, comece com duas operações de vacuum simultâneas e adicione mais, dependendo do tempo de execução e da carga do sistema. Assim como outras consultas pesadas emitidas por usuários, as operações de vacuum poderão começar a ser enfileiradas se você executar muitas simultaneamente quando o Amazon Redshift atingir os limites de recurso do sistema. 
+ Execute várias operações de BOOST Vacuum com cuidado. A execução de Vacuum com a opção BOOST compete com recursos do sistema, o que pode afetar a performance da consulta. Execute o VACUUM BOOST quando a carga no sistema for leve, como durante operações de manutenção.
+ Se você não especificar um nome para a tabela, a operação de limpeza se aplicará a todas as tabelas no banco de dados atual. Essas operações de vacuum ainda são executadas sequencialmente.

## Exemplos
<a name="r_VACUUM_command-examples"></a>

Recupere o espaço e o banco de dados e reclassifique as linhas em todas as tabelas com base no limite padrão de 95% de vacuum.

```
vacuum;
```

Recupere espaço e reclassifique as linhas na tabela SALES com base no limite padrão de 95%. 

```
vacuum sales;
```

Sempre recupere espaço e reclassifique as linhas na tabela SALES. 

```
vacuum sales to 100 percent;
```

Reclassifique as linhas na tabela SALES somente se menos que 75% das linhas já estiverem organizadas. 

```
 vacuum sort only sales to 75 percent;
```

Recupere espaço na tabela SALES de maneira que pelo menos 75% das linhas restantes não sejam marcadas para exclusão depois da limpeza. 

```
vacuum delete only sales to 75 percent;
```

Reindexe e limpe a tabela LISTING. 

```
vacuum reindex listing;
```

O comando a seguir retorna um erro. 

```
vacuum reindex listing to 75 percent;
```

Reagrupe e limpe a tabela LISTING. 

```
vacuum recluster listing;
```

Reagrupe e limpe a tabela LISTING com a opção BOOST. 

```
vacuum recluster listing boost;
```