

 Amazon Redshift non supporterà più la creazione di nuovi Python UDFs a partire dalla Patch 198. Python esistente UDFs continuerà a funzionare fino al 30 giugno 2026. Per ulteriori informazioni, consulta il [post del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

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

Il linguaggio SQL è composto da comandi che usi per creare e manipolare oggetti di database, eseguire query, caricare tabelle e modificare i dati nelle tabelle.

Amazon Redshift è basato su PostgreSQL. Amazon Redshift e PostgreSQL si differenziano per un certo numero di aspetti molto importanti, di cui bisogna tener conto mentre si progettano e sviluppano le applicazioni di data warehouse. Per informazioni sulle differenze tra Amazon Redshift SQL e PostgreSQL, consultare [Amazon Redshift e PostgreSQL](c_redshift-and-postgres-sql.md).

**Nota**  
Le dimensioni massime per una istruzione SQL è di 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)
+ [MODIFICA MODELLO](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)
+ [CREARE DATASHARE](r_CREATE_DATASHARE.md)
+ [CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md)
+ [CREATE EXTERNAL MODEL](r_create_external_model.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)
+ [CREATE EXTERNAL VIEW](r_CREATE_EXTERNAL_VIEW.md)
+ [CREATE FUNCTION](r_CREATE_FUNCTION.md)
+ [CREATE GROUP](r_CREATE_GROUP.md)
+ [CREATE IDENTITY PROVIDER](r_CREATE_IDENTITY_PROVIDER.md)
+ [CREATE LIBRARY](r_CREATE_LIBRARY.md)
+ [CREATE MASKING POLICY](r_CREATE_MASKING_POLICY.md)
+ [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)
+ [CREATE MODEL](r_CREATE_MODEL.md)
+ [CREATE PROCEDURE](r_CREATE_PROCEDURE.md)
+ [CREATE RLS POLICY](r_CREATE_RLS_POLICY.md)
+ [CREATE ROLE](r_CREATE_ROLE.md)
+ [CREATE SCHEMA](r_CREATE_SCHEMA.md)
+ [CREATE TABLE](r_CREATE_TABLE_NEW.md)
+ [CREATE TABLE AS](r_CREATE_TABLE_AS.md)
+ [CREARE UN MODELLO](r_CREATE_TEMPLATE.md)
+ [CREA UTENTE](r_CREATE_USER.md)
+ [CREATE VIEW](r_CREATE_VIEW.md)
+ [DEALLOCATE](r_DEALLOCATE.md)
+ [DECLARE](declare.md)
+ [DELETE](r_DELETE.md)
+ [DESC DATASHARE](r_DESC_DATASHARE.md)
+ [DESC IDENTITY PROVIDER](r_DESC_IDENTITY_PROVIDER.md)
+ [DETACH MASKING POLICY](r_DETACH_MASKING_POLICY.md)
+ [DETACH RLS POLICY](r_DETACH_RLS_POLICY.md)
+ [DROP DATABASE](r_DROP_DATABASE.md)
+ [DROP DATASHARE](r_DROP_DATASHARE.md)
+ [DROP EXTERNAL VIEW](r_DROP_EXTERNAL_VIEW.md)
+ [DROP FUNCTION](r_DROP_FUNCTION.md)
+ [DROP GROUP](r_DROP_GROUP.md)
+ [DROP IDENTITY PROVIDER](r_DROP_IDENTITY_PROVIDER.md)
+ [DROP LIBRARY](r_DROP_LIBRARY.md)
+ [DROP MASKING POLICY](r_DROP_MASKING_POLICY.md)
+ [DROP MODEL](r_DROP_MODEL.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)
+ [DROP PROCEDURE](r_DROP_PROCEDURE.md)
+ [DROP RLS POLICY](r_DROP_RLS_POLICY.md)
+ [DROP ROLE](r_DROP_ROLE.md)
+ [DROP SCHEMA](r_DROP_SCHEMA.md)
+ [DROP TABLE](r_DROP_TABLE.md)
+ [RILASCIA UN MODELLO](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 (tabella esterna)](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)
+ [MOSTRA](r_SHOW.md)
+ [MOSTRA LE CONCESSIONI ALLE COLONNE](r_SHOW_COLUMN_GRANTS.md)
+ [SHOW COLUMNS](r_SHOW_COLUMNS.md)
+ [MOSTRA I VINCOLI](r_SHOW_CONSTRAINTS.md)
+ [SHOW EXTERNAL TABLE](r_SHOW_EXTERNAL_TABLE.md)
+ [SHOW DATABASES](r_SHOW_DATABASES.md)
+ [MOSTRA LE FUNZIONI](r_SHOW_FUNCTIONS.md)
+ [SHOW GRANTS](r_SHOW_GRANTS.md)
+ [SHOW MODEL](r_SHOW_MODEL.md)
+ [SHOW DATASHARES](r_SHOW_DATASHARES.md)
+ [MOSTRA PARAMETRI](r_SHOW_PARAMETERS.md)
+ [MOSTRA LE POLITICHE](r_SHOW_POLICIES.md)
+ [SHOW PROCEDURE](r_SHOW_PROCEDURE.md)
+ [MOSTRA PROCEDURE](r_SHOW_PROCEDURES.md)
+ [SHOW SCHEMAS](r_SHOW_SCHEMAS.md)
+ [SHOW TABLE](r_SHOW_TABLE.md)
+ [SHOW TABLES](r_SHOW_TABLES.md)
+ [MOSTRA MODELLO](r_SHOW_TEMPLATE.md)
+ [MOSTRA MODELLI](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 la transazione attualmente in esecuzione ed elimina tutti gli aggiornamenti apportati da quella transazione. ABORT non ha alcun effetto sulle transazioni già completate.

Questo comando esegue la stessa funzione del comando ROLLBACK. Per informazioni, consultare [ROLLBACK](r_ROLLBACK.md).

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

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

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

WORK  
Parola chiave facoltativa.

TRANSACTION  
Parola chiave facoltativa; WORK e TRANSACTION sono sinonimi.

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

L'esempio seguente crea una tabella quindi avvia una transazione in cui i dati vengono inseriti nella tabella. Il comando ABORT esegue quindi il rollback dell'inserimento dei dati per lasciare vuota la tabella.

Il seguente comando crea una tabella di esempio chiamata MOVIE\$1GROSS:

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

Il prossimo set di comandi avvia una transazione che inserisce due righe di dati nella tabella:

```
begin;

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

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

Successivamente, il seguente comando seleziona i dati dalla tabella per mostrare che è stato inserito:

```
select * from movie_gross;
```

L'output del comando mostra che entrambe le righe sono state inserite:

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

Questo comando esegue ora il rollback delle modifiche dei dati dove è iniziata la transazione:

```
abort;
```

Selezionando i dati dalla tabella ora mostra una tabella vuota:

```
select * from movie_gross;

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

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

Cambia gli attributi di un database.

## Privilegi richiesti
<a name="r_ALTER_DATABASE-privileges"></a>

Per utilizzare ALTER DATABASE, è richiesto uno dei seguenti privilegi.
+ Superuser
+ Utenti con il privilegio ALTER DATABASE
+ Proprietario del database

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

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

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

 *database\$1name*   
Nome del database da modificare. In genere, si modifica un database a cui non si è attualmente connessi; in ogni caso, le modifiche hanno effetto solo nelle sessioni successive. Puoi modificare il proprietario del database corrente, ma non è possibile rinominarlo:  

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

RENAME TO   
Rinomina il database specificato. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md). Non puoi rinominare i database dev, padb\$1harvest, template0, template1 o sys:internal e non puoi rinominare il database corrente. Solo il proprietario del database o un [superuser](r_superusers.md#def_superusers) può rinominare un database; i proprietari che non sono utenti con privilegi avanzati devono inoltre avere il privilegio CREATEDB.

 *new\$1name*   
Nuovo nome del database.

OWNER TO   
Cambia il proprietario del database specificato. Puoi modificare il proprietario del database corrente o di un altro database. Solo un utente con privilegi avanzati può cambiare il proprietario.

 *new\$1owner*   
Nuovo proprietario del database. Il nuovo proprietario deve essere un utente di database esistente con privilegi di scrittura. Per ulteriori informazioni sui privilegi degli utenti, consultare [GRANT](r_GRANT.md).

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
Numero massimo di connessioni di database che gli utenti possono aprire contemporaneamente. Il limite non viene applicato per gli utenti con privilegi avanzati. Utilizza la parola chiave UNLIMITED per consentire il numero massimo di connessioni simultanee. È possibile che venga applicato anche un limite al numero di connessioni per ciascun utente. Per ulteriori informazioni, consultare [CREA UTENTE](r_CREATE_USER.md). Il valore predefinito è UNLIMITED. Per visualizzare le connessioni correnti, eseguire una query sulla vista di sistema [STV\$1SESSIONS](r_STV_SESSIONS.md).  
Se si applicano entrambi i limiti di connessione utente e database, deve essere disponibile uno slot di connessione inutilizzato che rientra in entrambi i limiti quando un utente tenta di connettersi.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Una clausola che specifica se la ricerca o il confronto tra stringhe fa distinzione tra maiuscole e minuscole o meno.   
Puoi modificare la distinzione tra maiuscole e minuscole del database corrente anche se è vuoto.  
Per modificare la distinzione tra maiuscole e minuscole, devi disporre dell’autorizzazione ALTER per il database corrente. Gli utenti con privilegi avanzati o i proprietari di database con l’autorizzazione CREATE DATABASE possono anche modificare la distinzione tra maiuscole e minuscole per i database.  
CASE\$1SENSITIVE e CS sono intercambiabili e producono gli stessi risultati. Allo stesso modo CASE\$1INSENSITIVE e CI sono intercambiabili e producono gli stessi risultati.

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
Una clausola che specifica il livello di isolamento utilizzato quando vengono eseguite query su un database. Per ulteriori informazioni sui livello di isolamento, consulta [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md).  
+ Isolamento SNAPSHOT: fornisce un livello di isolamento con protezione contro i conflitti di aggiornamento ed eliminazione. 
+ Isolamento SERIALIZABLE: fornisce la serializzabilità completa per le transazioni simultanee.
Considerare quanto segue durante la modifica del livello di isolamento di un database:  
+ Per modificare il livello di isolamento del database, è necessario disporre del privilegio utente con privilegi avanzati o del privilegio CREATE DATABASE per il database corrente.
+ Non è possibile modificare il livello di isolamento del database `dev`. 
+ Non è possibile modificare il livello di isolamento all'interno di un blocco di transazioni.
+ Il comando alter isolation level non riesce se altri utenti sono connessi al database.
+ Il comando alter isolation level può modificare le impostazioni del livello di isolamento della sessione corrente.

INTEGRATION  
Modifica un database di integrazione Zero-ETL.

REFRESH \$1\$1 ALL \$1 INERROR \$1 TABLES [IN SCHEMA *schema* [, ...]] \$1 TABLE *schema.table* [, ...]\$1  
Una clausola che specifica se Amazon Redshift aggiorna tutte le tabelle o le tabelle con errori nello schema o nella tabella specificati. L'aggiornamento attiverà la replica completa delle tabelle nello schema o nella tabella specificati dal database di origine.  
Per ulteriori informazioni, consulta [Integrazioni Zero-ETL](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.html) nella *Guida alla gestione di Amazon Redshift*. Per ulteriori informazioni sugli stati di integrazione, consulta [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  
La clausola QUERY\$1ALL\$1STATES imposta se è possibile eseguire query sulle tabelle di integrazione Zero-ETL in tutti gli stati (`Synced`, `Failed`, `ResyncRequired` e `ResyncInitiated`). Per impostazione predefinita puoi eseguire query su una tabella di integrazione Zero-ETL solo nello stato `Synced`.

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
La clausola ACCEPTINVCHARS imposta se le tabelle di integrazione Zero-ETL continuano con l’importazione quando per il tipo di dati VARCHAR vengono rilevati caratteri non validi. Quando vengono rilevati caratteri non validi, il carattere non valido viene sostituito con un carattere `?` predefinito.

REFRESH\$1INTERVAL <interval>  
La clausola REFRESH\$1INTERVAL imposta l’intervallo di tempo approssimativo, in secondi, per aggiornare i dati dall’origine zero-ETL al database di destinazione. Il valore `interval` può essere impostato su un numero compreso tra 0 e 432.000 secondi (5 giorni) per le integrazioni Zero-ETL il cui tipo di origine è Aurora MySQL, Aurora PostgreSQL o RDS per MySQL. Per le integrazioni Zero-ETL di Amazon DynamoDB, il valore `interval` può essere impostato su un numero compreso tra 900 e 432.000 secondi (15 minuti – 5 giorni).  
Per ulteriori informazioni sulla creazione di database con integrazioni Zero-ETL, consulta [Creazione di database di destinazione in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html) nella *Guida alla gestione di Amazon Redshift*.

TRUNCATECOLUMNS [=] \$1TRUE \$1 FALSE\$1  
La clausola TRUNCATECOLUMNS imposta se le tabelle di integrazione Zero-ETL continuano con l’importazione quando i valori per gli attributi della colonna VARCHAR o della colonna SUPER superano il limite. Quando è `TRUE`, i valori vengono troncati per adattarsi alla colonna e i valori degli attributi JSON in overflow vengono troncati per adattarsi alla colonna SUPER.

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1 [ FOR \$1 \$1ALL\$1 TABLES [IN SCHEMA schema [, ...]] \$1 TABLE schema.table [, ...]\$1 ]  
Una clausola che specifica se Amazon Redshift imposterà la modalità cronologia per tutte le tabelle o le tabelle nello schema specificato che partecipano all’integrazione Zero-ETL. Questa opzione è applicabile solo ai database creati per l’integrazione Zero-ETL.  
La clausola HISTORY\$1MODE può essere impostata su `TRUE` o `FALSE`. Il valore predefinito è `FALSE`. L’attivazione e la disattivazione della modalità cronologia sono applicabili solo alle tabelle che si trovano nello stato `Synced`. Per informazioni su HISTORY\$1MODE, consulta [Modalità cronologia](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html) nella *Guida alla gestione di Amazon Redshift*.

## Note per l'utilizzo
<a name="r_ALTER_DATABASE-usage-notes"></a>

I comandi di ALTER DATABASE si applicano alle sessioni successive e non alle sessioni correnti. Devi riconnetterti al database modificato per vedere l'effetto della modifica.

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

L'esempio seguente rinomina un database denominato TICKIT\$1SANDBOX in TICKIT\$1TEST: 

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

L'esempio seguente modifica il proprietario del database TICKIT (il database corrente) in DWUSER: 

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

L'esempio seguente modifica la distinzione tra maiuscole e minuscole del database sampledb:

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

Nell'esempio seguente viene modificato un database denominato **sampledb** con livello di isolamento SNAPSHOT.

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

L'esempio seguente aggiorna le tabelle **schema1.sample\$1table1** e **schema2.sample\$1table2** del database **sample\$1integration\$1db** nell'integrazione Zero-ETL.

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

L'esempio seguente aggiorna tutte le tabelle sincronizzate e non riuscite nell'integrazione Zero-ETL.

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

L’esempio seguente imposta l’intervallo di aggiornamento per le integrazioni Zero-ETL su 600 secondi.

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

L’esempio seguente aggiorna tutte le tabelle con `ErrorState` presenti nello schema **sample\$1schema**.

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

L’esempio seguente attiva la modalità cronologia per la tabella `myschema.table1`.

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

L’esempio seguente attiva la modalità cronologia per tutte le tabelle in `myschema`. 

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

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

Cambia la definizione di una unità di condivisione dati. È possibile aggiungere o rimuovere oggetti utilizzando ALTER DATASHARE. È possibile modificare una unità di condivisione dati solo nel database corrente. Aggiunta o rimozione di oggetti dal database associato a una unità di condivisione dati. Il proprietario dell'unità di condivisione dati con le autorizzazioni necessarie per gli oggetti dell'unità di condivisione dati da aggiungere o rimuovere può modificare l'unità.

## Privilegi richiesti
<a name="r_ALTER_DATASHARE-privileges"></a>

Di seguito sono riportati i privilegi richiesti per ALTER DATASHARE:
+ Utente con privilegi avanzati.
+ Utente con il privilegio ALTER DATASHARE.
+ Utenti con privilegio ALTER o ALL sull'unità di condivisione dati.
+ Per aggiungere oggetti specifici a una unità di condivisione dati, gli utenti devono avere il privilegio sugli oggetti. Per questo caso, gli utenti devono essere i proprietari degli oggetti o disporre dei privilegi SELECT, USAGE o ALL sugli oggetti. 

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

La sintassi seguente illustra come aggiungere o rimuovere oggetti nell'unità unità di condivisione dati.

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

La sintassi seguente illustra come configurare le proprietà dell'unità unità di condivisione dati.

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

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

*datashare\$1name*  
Il nome della unità di condivisione dati da modificare. 

ADD \$1 REMOVE  
Una clausola che specifica se aggiungere o rimuovere oggetti dall'unità di condivisione dati.

TABLE *schema*.*table* [, ...]  
Il nome della tabella o della vista nello schema specificato da aggiungere all'unità di condivisione dati.

SCHEMA *schema* [, ...]   
Il nome dello schema da aggiungere all'unità di condivisione dati.

FUNZIONE *schema*.*sql\$1udf* (argtype,...) [, ...]  
Il nome della funzione SQL definita dall'utente da aggiungere all'unità di condivisione dati.

ALL TABLES IN SCHEMA *schema* [, ...]   
Una clausola che specifica se aggiungere tutte le tabelle e le viste nello schema specificato all'unità di condivisione dati.

ALL FUNCTIONS IN SCHEMA *schema* [, ...] \$1  
Una clausola che specifica l'aggiunta di tutte le funzioni dello schema specificato all'unità di condivisione dati.

[ SET PUBLICACCESSIBLE [=] TRUE \$1 FALSE ]  
Una clausola che specifica se una unità di condivisione dati può essere condivisa in un cluster accessibile pubblicamente.

[ SET INCLUDENEW [=] TRUE \$1 FALSE FOR SCHEMA *schema* ]  
Una clausola che specifica se aggiungere al datashare eventuali future tabelle, viste o funzioni SQL definite dall'utente (UDFs) create nello schema specificato. Le tabelle, le viste o il codice SQL UDFs correnti nello schema specificato non vengono aggiunti al datashare. Solo gli utenti con privilegi avanzati possono modificare questa proprietà per ogni coppia unità di condivisione dati-schema. Per impostazione predefinita, la clausola INCLUDENEW è false. 

## Note per l'utilizzo di ALTER DATASHARE
<a name="r_ALTER_DATASHARE_usage"></a>
+ I seguenti utenti possono modificare una unità di condivisione dati:
  + Un utente con privilegi avanzati
  + Il proprietario dell'unità di condivisione dati
  + Utenti con privilegio ALTER o ALL sull'unità di condivisione dati
+ Per aggiungere oggetti specifici a una unità di condivisione dati, gli utenti devono avere il privilegio sugli oggetti. Gli utenti devono essere i proprietari degli oggetti o disporre dei privilegi SELECT, USAGE o ALL sugli oggetti.
+ È possibile condividere schemi, tabelle, viste regolari, viste con associazione tardiva, viste materializzate e funzioni SQL definite dall'utente (). UDFs Aggiungere uno schema all'unità di condivisione dati prima di aggiungere altri oggetti nello schema. 

  Quando si aggiunge uno schema, Amazon Redshift non aggiunge tutti gli oggetti sotto di esso. È necessario aggiungerli esplicitamente. 
+ Ti consigliamo di creare condivisioni di AWS Data Exchange dati con l'impostazione accessibile al pubblico attivata.
+ In generale, si consiglia di non modificare un AWS Data Exchange datashare per disattivare l'accessibilità pubblica utilizzando l'istruzione ALTER DATASHARE. Se lo si farà, gli Account AWS che hanno accesso all'unità di condivisione dati perderanno l'accesso se i cluster sono accessibili pubblicamente. L'esecuzione di questo tipo di alterazione può violare i termini del prodotto dei dati in AWS Data Exchange. Per un'eccezione a questa raccomandazione, vedere di seguito.

  L'esempio seguente mostra un errore quando viene creato un AWS Data Exchange datashare con l'impostazione disattivata.

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

  Per consentire la modifica di un AWS Data Exchange datashare per disattivare l'impostazione accessibile al pubblico, impostate la variabile seguente ed eseguite nuovamente l'istruzione ALTER DATASHARE.

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

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

  In questo caso, Amazon Redshift genera un valore casuale una tantum per impostare la variabile di sessione per consentire ALTER DATASHARE SET PUBLICACCESSIBLE FALSE per un'unità unità di condivisione dati AWS Data Exchange .

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

Nell’esempio seguente viene aggiunto lo schema `public` all’unità di condivisione dati `salesshare`.

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

Nell'esempio seguente vengono aggiunte le tabelle `public.tickit_sales_redshift` all'unità di condivisione dati `salesshare`.

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

Nell'esempio seguente vengono aggiunte tutte le tabelle all'unità di condivisione dati `salesshare`

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

Nell'esempio seguente vengono rimosse le tabelle `public.tickit_sales_redshift` dall'unità di condivisione dati `salesshare`.

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

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

Definisce il set predefinito di autorizzazioni di accesso da applicare agli oggetti che verranno creati in futuro dall’utente specificato. Per impostazione predefinita, gli utenti possono modificare solo le proprie autorizzazioni di accesso di default. Solo l’utente con privilegi avanzati può specificare le autorizzazioni predefinite per gli altri utenti.

È possibile applicare i privilegi predefiniti a ruoli, utenti o a gruppi di utenti. Puoi impostare le autorizzazioni predefinite a livello globale per tutti gli oggetti creati nel database corrente o per gli oggetti creati solo negli schemi specificati. 

Le autorizzazioni predefinite si applicano solo ai nuovi oggetti. L’esecuzione di ALTER DEFAULT PRIVILEGES non modifica le autorizzazioni per gli oggetti esistenti. Per concedere le autorizzazioni per tutti gli oggetti correnti e futuri creati da qualsiasi utente all’interno di un database o uno schema, consulta [Autorizzazioni con ambito.](https://docs.aws.amazon.com/redshift/latest/dg/t_scoped-permissions.html) 

Per visualizzare le informazioni sui privilegi predefiniti per gli utenti del database, eseguire una query sulla tabella del catalogo di sistema [PG\$1DEFAULT\$1ACL](r_PG_DEFAULT_ACL.md). 

Per ulteriori informazioni sui privilegi, consultare [GRANT](r_GRANT.md).

## Privilegi richiesti
<a name="r_ALTER_DEFAULT_PRIVILEGES-privileges"></a>

Di seguito sono elencati i privilegi richiesti per ALTER DEFAULT PRIVILEGES:
+ Superuser
+ Utenti con il privilegio ALTER DEFAULT PRIVILEGES
+ Gli utenti che modificano i propri privilegi di accesso di default
+ Utenti che definiscono i privilegi per gli schemi per i quali dispongono di privilegi di accesso

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

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

where grant_or_revoke_clause is one of:

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

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

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

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

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

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

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

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

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

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

FOR USER *target\$1user*  <a name="default-for-user"></a>
Opzionale. Il nome dell'utente per il quale sono definiti i privilegi predefiniti. Solo l'utente con privilegi avanzati può specificare i privilegi predefiniti per gli altri utenti. Il valore di default è l'utente corrente.

IN SCHEMA *schema\$1name*   <a name="default-in-schema"></a>
Opzionale. Se viene visualizzata una clausola IN SCHEMA, i privilegi predefiniti specificati vengono applicati ai nuovi oggetti creati nel *schema\$1name* indicato. In questo caso, l'utente o il gruppo di utenti che costituisce il target di ALTER DEFAULT PRIVILEGES deve disporre del privilegio CREATE per lo schema specificato. I privilegi predefiniti specifici di uno schema vengono aggiunti ai privilegi predefiniti globali esistenti. Per impostazione predefinita, i privilegi predefiniti vengono applicati a livello globale all'intero database. 

GRANT   <a name="default-grant"></a>
L’insieme di privilegi da concedere agli utenti o ai gruppi specificati per tutte le nuove tabelle e viste, funzioni o stored procedure create dall’utente indicato. Con la clausola GRANT puoi impostare gli stessi privilegi e opzioni disponibili per il comando [GRANT](r_GRANT.md). 

WITH GRANT OPTION   <a name="default-grant-option"></a>
Clausola che indica che l'utente che riceve i privilegi può a sua volta concedere gli stessi privilegi agli altri. Non puoi concedere WITH GRANT OPTION a un gruppo o a PUBLIC. 

TO *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*   <a name="default-to"></a>
Il nome dell'utente, del ruolo o del gruppo di utenti a cui vengono applicati i privilegi predefiniti specificati.

REVOKE   <a name="default-revoke"></a>
L'insieme di privilegi da revocare agli utenti o ai gruppi specificati per tutte le nuove tabelle, funzioni o procedure archiviate create dall'utente indicato. Con la clausola REVOKE puoi impostare gli stessi privilegi e opzioni disponibili per il comando [REVOKE](r_REVOKE.md). 

GRANT OPTION FOR  <a name="default-revoke-option"></a>
 Clausola che revoca solo l'opzione per concedere un privilegio specificato ad altri utenti e non revoca il privilegio stesso. Non puoi revocare GRANT OPTION a un gruppo o a PUBLIC. 

FROM *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*  <a name="default-from"></a>
Il nome dell'utente, del ruolo o del gruppo di utenti a cui vengono revocati per impostazione predefinita i privilegi specificati.

RESTRICT   <a name="default-restrict"></a>
L'opzione RESTRICT revoca solo i privilegi che l'utente ha concesso direttamente. Questa è l’impostazione predefinita.

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

Supponiamo che si desideri consentire a un utente nel gruppo di utenti `report_readers` di visualizzare tutte le tabelle e le viste create dall’utente `report_admin`. In questo caso, emettere il seguente comando come utente con privilegi avanzati. 

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

Nell’esempio seguente, il primo comando concede i privilegi SELECT per tutte le nuove tabelle create. Ogni volta che crei una nuova vista, devi concedere esplicitamente i privilegi alla vista o eseguire nuovamente il comando `alter default privileges`.

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

L'esempio seguente concede il privilegio INSERT al gruppo di utenti `sales_admin` per tutte le nuove tabelle e viste create nello schema `sales`. 

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

L'esempio seguente inverte il comando ALTER DEFAULT PRIVILEGES dell'esempio precedente. 

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

Per impostazione predefinita, il gruppo di utenti PUBLIC dispone dell'autorizzazione execute per tutte le nuove funzioni definite dall'utente. Per revocare le autorizzazioni execute `public` per le nuove funzioni e quindi concedere l'autorizzazione execute solo al gruppo di utenti `dev_test`, eseguire i seguenti comandi. 

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

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

Modifica uno schema esterno esistente nel database corrente. Solo i proprietari dello schema, gli utenti con privilegi avanzati o gli utenti con i privilegi ALTER per lo schema possono modificarlo. È possibile modificare solo gli schemi esterni creati da DATA CATALOG, KAFKA o MSK.

Il proprietario di questo schema è l'emittente del comando CREATE EXTERNAL SCHEMA. Per trasferire la proprietà di uno schema esterno, utilizza ALTER SCHEMA per cambiare il proprietario. Per concedere l’accesso allo schema ad altri utenti o gruppi di utenti, utilizza il comando GRANT.

Non puoi utilizzare i comandi GRANT o REVOKE per le autorizzazioni su una tabella esterna. Puoi invece concedere o revocare le autorizzazioni per lo schema esterno. 

Per ulteriori informazioni, consulta gli argomenti seguenti:
+ [ALTER SCHEMA](r_ALTER_SCHEMA.md)
+ [GRANT](r_GRANT.md)
+ [REVOKE](r_REVOKE.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [Abilitazione dell’autenticazione mTLS per uno schema esterno esistente](materialized-view-streaming-ingestion-mtls.md#materialized-view-streaming-ingestion-mtls-alter)

Per visualizzare i dettagli degli schemi esterni, esegui query sulla vista di sistema SVV\$1EXTERNAL\$1SCHEMAS. Per ulteriori informazioni, consulta [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md).

## Sintassi
<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 disponi di uno schema esterno esistente che utilizzi per l’importazione in streaming e desideri implementare mTLS per l’autenticazione, puoi eseguire un comando come il seguente, che specifica l’autenticazione mTLS e l’ARN del certificato ACM in ACM. 

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

In alternativa puoi modificare l’autenticazione mTLS, con riferimento all’ARN del segreto in Secrets Manager.

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

L’esempio seguente mostra come modificare l’URI per ALTER EXTERNAL SCHEMA:

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

L’esempio seguente mostra come modificare il ruolo IAM per ALTER EXTERNAL SCHEMA:

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

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

 <role-name>IAM\$1ROLE [predefinito \$1 'SESSION' \$1 'arn:aws:iam: :< account-id>:role/ ']AWS   
Utilizza la parola chiave `default` per fare in modo che Amazon Redshift usi il ruolo IAM impostato come predefinito.  
Utilizzare `'SESSION'` se ci si connette al cluster Amazon Redshift utilizzando un'identità federata e si accede alle tabelle dallo schema esterno creato con questo comando.  
Per ulteriori informazioni, consulta [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html).

AUTHENTICATION  
Il tipo di autenticazione definito per l'importazione di dati in streaming. L’importazione in streaming con i tipi di autenticazione funziona con Apache Kafka, Confluent Cloud e Streaming gestito da Amazon per Apache Kafka. Per ulteriori informazioni, consulta [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html).

AUTHENTICATION\$1ARN  
L'ARN del AWS Certificate Manager certificato utilizzato da Amazon Redshift per l'autenticazione mtls con Apache Kafka, Confluent Cloud o Amazon Managed Streaming for Apache Kafka (Amazon MSK). L’ARN è disponibile nella console ACM quando scegli il certificato emesso.

SECRET\$1ARN  
L'Amazon Resource Name (ARN) di un segreto supportato creato utilizzando. Gestione dei segreti AWS Per informazioni su come creare e recuperare un ARN per un segreto, consulta [Gestione dei segreti con Gestione dei segreti AWS](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) nella *Guida per l’utente di Gestione dei segreti AWS * e [Recupero del nome della risorsa Amazon (ARN) del segreto in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html).

URI  
L’URL di bootstrap del cluster Apache Kafka, Confluent Cloud o Streaming gestito da Amazon per Apache Kafka (Amazon MSK). L'endpoint deve essere raggiungibile (instradabile) dal cluster Amazon Redshift. Per ulteriori informazioni, consulta [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>

Utilizza il comando ALTER EXTERNAL VIEW per aggiornare la vista esterna. A seconda dei parametri utilizzati, possono essere interessati anche altri motori SQL, come Amazon Athena e Amazon EMR Spark, che possono fare riferimento a questa vista. Per ulteriori informazioni sulle viste del Catalogo dati, consulta [Viste del AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

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

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

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

 *schema\$1name.view\$1name*   
Lo schema allegato al AWS Glue database, seguito dal nome della vista.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
La notazione dello schema da usare per la modifica della vista. È possibile specificare di utilizzare il AWS Glue Data Catalog, un database Glue creato dall'utente o uno schema esterno creato dall'utente. Per ulteriori informazioni, consulta [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).

FORCE  
Indica se AWS Lake Formation aggiornare la definizione della vista anche se gli oggetti a cui si fa riferimento nella tabella non sono coerenti con altri motori SQL. Se Lake Formation esegue l'aggiornamento, la vista viene considerata obsoleta per gli altri motori SQL fino a quando non vengono aggiornati.

 *AS query\$1definition*   
La definizione della query SQL che Amazon Redshift esegue per alterare la vista.

REMOVE DEFINITION  
Indica se rilasciare e ricreare le viste. Le viste devono essere rilasciate e ricreate per contrassegnarle come `PROTECTED`.

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

L'esempio seguente modifica una vista del catalogo dati denominata 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>

Rinomina una funzione o cambia il proprietario. Sono richiesti sia il nome della funzione che i tipi di dati. Solo il proprietario o un utente con privilegi avanzati può rinominare una funzione. Solo un utente con privilegi avanzati può cambiare il proprietario di una funzione. 

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

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

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

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

 *function\$1name*   
Il nome della funzione da modificare. Specifica il nome della funzione nel percorso di ricerca corrente oppure utilizza il formato `schema_name.function_name` per usare uno schema specifico.

*py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
Opzionale. Un elenco dei nomi e dei tipi di dati degli argomenti di input per la funzione definita dall’utente Python o un elenco dei tipi di dati degli argomenti di input per la funzione SQL definita dall’utente.

 *new\$1name*   
Un nuovo nome per la funzione definita dall’utente. 

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
Un nuovo proprietario per la funzione definita dall’utente. 

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

L’esempio seguente cambia il nome di una funzione da `first_quarter_revenue` in `quarterly_revenue`.

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

L’esempio seguente cambia il proprietario della funzione `quarterly_revenue` in `etl_user`.

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

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

Cambia un gruppo di utenti. Usa questo comando per aggiungere utenti al gruppo, rimuovere utenti dal gruppo o rinominare il gruppo. 

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

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

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

 *group\$1name*   
Nome del gruppo di utenti da modificare. 

ADD   
Aggiunge un utente a un gruppo di utenti. 

DROP   
Rimuove un utente da un gruppo di utenti. 

 *username*   
Nome dell'utente da aggiungere al gruppo o rimuovere dal gruppo. 

RENAME TO   
Rinomina il gruppo utente. I nomi di gruppo che iniziano con due caratteri di sottolineatura sono riservati all'uso interno di Amazon Redshift. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md). 

 *new\$1name*   
Nuovo nome del gruppo di utenti. 

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

L'esempio seguente aggiunge un utente denominato DWUSER al gruppo ADMIN\$1GROUP.

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

L'esempio seguente rinomina il gruppo ADMIN\$1GROUP in ADMINISTRATORS. 

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

L'esempio seguente aggiunge due utenti al gruppo ADMIN\$1GROUP. 

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

L'esempio seguente elimina due utenti dal gruppo ADMIN\$1GROUP. 

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

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

Modifica un provider di identità per assegnare nuovi parametri e valori. Quando si esegue questo comando, tutti i valori dei parametri impostati in precedenza vengono eliminati prima dell'assegnazione dei nuovi valori. Solo un utente con privilegi avanzati può modificare un provider di identità.

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

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

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

 *identity\$1provider\$1name*   
Il nome del nuovo provider di identità. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

 *parameter\$1string*   
Stringa contenente un oggetto JSON formattato correttamente che contiene i parametri e i valori richiesti per il provider di identità specifico.

 *spazio dei nomi*   
Il namespace dell’organizzazione.

 *iam\$1role*   
Il ruolo IAM che fornisce le autorizzazioni per la connessione a Centro identità IAM. Questo parametro è applicabile solo quando il tipo di provider di identità è. AWSIDC

 *auto\$1create\$1roles*   
Attiva o disattiva la funzionalità di creazione automatica del ruolo. Se il valore è TRUE, Amazon Redshift abilita la funzionalità di creazione automatica del ruolo. Se il valore è FALSE, Amazon Redshift disabilita la funzionalità di creazione automatica del ruolo. Se il valore di questo parametro non è specificato, Amazon Redshift determina il valore utilizzando la seguente logica:   
+  Se `AUTO_CREATE_ROLES` viene fornito ma il valore non è specificato, il valore viene impostato su TRUE. 
+  Se `AUTO_CREATE_ROLES` non viene fornito e il provider di identità sì AWSIDC, il valore è impostato su FALSE. 
+  Se `AUTO_CREATE_ROLES` non viene fornito e il provider di identità è Azure, il valore viene impostato su TRUE. 
Per includere i gruppi, specifica `INCLUDE`. L’impostazione predefinita è vuota, il che significa che devi includere tutti i gruppi se `AUTO_CREATE_ROLES` è attivo.  
Per escludere i gruppi, specifica `EXCLUDE`. L’impostazione predefinita è vuota, il che significa che non devi escludere alcun gruppo se `AUTO_CREATE_ROLES` è attivo.

 *filter\$1pattern*   
Un’espressione di caratteri UTF-8 valida con il modello da associare ai nomi dei gruppi. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_ALTER_IDENTITY_PROVIDER.html)
Se il *filter\$1pattern* non contiene metacaratteri, allora il modello rappresenta solo la stringa stessa; in questo caso LIKE agisce come l'operatore di uguaglianza.   
*filter\$1pattern* supporta i seguenti caratteri:  
+  Caratteri alfabetici maiuscoli e minuscoli (A-Z e a-z) 
+  Numeri (0-9) 
+  I seguenti caratteri speciali: 

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

 *DISABLE o ENABLE*   
Attiva o disattiva un provider di identità. L’impostazione predefinita è ENABLE.

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

Nell'esempio seguente viene modificato un provider di identità denominato *oauth\$1standard*. Si applica in particolare a quando Microsoft Azure AD è il provider di identità.

```
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"]
}'
```

L’esempio seguente mostra come impostare il namespace del provider di identità. Ciò può essere applicato a Microsoft Azure AD, se segue un’istruzione come nell’esempio precedente, o a un altro provider di identità. Può essere applicato anche al caso in cui connetti un cluster con provisioning Amazon Redshift esistente o un gruppo di lavoro Amazon Redshift serverless a Centro identità IAM, se disponi di una connessione configurata tramite un’applicazione gestita.

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

L’esempio seguente imposta il ruolo IAM e funziona nel caso d’uso per configurare l’integrazione di Redshift con Centro identità IAM.

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

Per ulteriori informazioni sulla configurazione di una connessione a Centro identità IAM di Redshift, consulta [Connessione di Redshift a Centro identità IAM per offrire agli utenti un’esperienza di single sign-on](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

**Disabilitazione di un provider di identità**

L’istruzione di esempio seguente mostra come disabilitare un provider di identità. Quando è disabilitato, gli utenti federati del provider di identità non possono accedere al cluster finché non viene nuovamente abilitato.

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

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

Modifica una politica di mascheramento dinamico dei dati esistente. Per ulteriori informazioni sul mascheramento dinamico dei dati, consulta [Mascheramento dinamico dei dati](t_ddm.md).

Una politica di mascheramento può essere modificata da utenti con privilegi avanzati e da utenti o ruoli che dispongono del ruolo sys:secadmin.

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

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

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

*nome\$1policy*   
 Nome della policy di mascheramento. Deve essere il nome di una politica di mascheramento già esistente nel database. 

database\$1name  
Il nome del database da cui viene creata la policy. Il database può essere il database connesso o un database che supporta le autorizzazioni federate di Amazon Redshift.

*masking\$1expression*  
Espressione SQL utilizzata per trasformare le colonne di destinazione. Può essere scritta utilizzando funzioni di manipolazione dei dati, come le funzioni di manipolazione delle stringhe, o in combinazione con funzioni definite dall'utente scritte in SQL, Python o con AWS Lambda.   
 L'espressione deve corrispondere alle colonne di input e ai tipi di dati dell'espressione originale. Ad esempio, se le colonne di input della politica di mascheramento originale fossero `sample_1 FLOAT` e `sample_2 VARCHAR(10)`, non sarebbe possibile modificare la politica di mascheramento per prendere una terza colonna o fare in modo che la politica assuma un valore FLOAT e un valore BOOLEAN. Se si utilizza una costante come espressione di mascheramento, è necessario convertirla in modo esplicito su un tipo che corrisponda al tipo di input.  
 È necessario disporre dell'autorizzazione USAGE per tutte le funzioni definite dall'utente utilizzate nell'espressione di mascheramento. 

Per l'utilizzo di ALTER MASKING POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di 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>

Modifica gli attributi di una vista materializzata. 

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

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

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

*mv\$1name*  
Il nome della vista materializzata da modificare.

AUTO REFRESH \$1 YES \$1 NO \$1  
Una clausola che attiva o disattiva l'aggiornamento automatico di una vista materializzata. Per informazioni sull'aggiornamento automatico delle viste materializzate, consultare [Aggiornamento di una vista materializzata](materialized-view-refresh.md).

ALTER DISTSTYLE ALL  
Una clausola che modifica lo stile di distribuzione esistente di una relazione e lo imposta su `ALL`. Considera i seguenti aspetti:  
+ ALTER DISTSTYLE, ALTER SORTKEY e VACUUM non possono essere eseguiti contemporaneamente per la stessa relazione. 
  + Se VACUUM è attualmente in esecuzione, l'esecuzione di ALTER DISTSTYLE ALL restituisce un errore. 
  + Se ALTER DISTSTYLE ALL è in esecuzione, il vacuum di background non viene avviato per una relazione. 
+ Il comando ALTER DISTSTYLE ALL non è supportato per le relazioni con chiavi di ordinamento interlacciate e tabelle temporanee.
+ Se lo stile di distribuzione è stato precedentemente definito come AUTO, la tabella non è più un candidato per l’ottimizzazione automatica della tabella. 
Per ulteriori informazioni su DISTSTYLE ALL, consulta [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTSTYLE EVEN  
Una clausola che modifica lo stile di distribuzione esistente di una relazione e lo imposta su `EVEN`. Considera i seguenti aspetti:  
+ ALTER DISTSYTLE, ALTER SORTKEY e VACUUM non possono essere eseguiti contemporaneamente per la stessa relazione. 
  + Se VACUUM è attualmente in esecuzione, l'esecuzione di ALTER DISTSTYLE EVEN restituisce un errore. 
  + Se ALTER DISTSTYLE EVEN è in esecuzione, il vacuum di background non viene avviato per una relazione. 
+ Il comando ALTER DISTSTYLE EVEN non è supportato per le relazioni con chiavi di ordinamento interlacciate e tabelle temporanee.
+ Se lo stile di distribuzione è stato precedentemente definito come AUTO, la tabella non è più un candidato per l’ottimizzazione automatica della tabella. 
Per ulteriori informazioni su DISTSTYLE EVEN, consulta [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTKEY *column\$1name* o ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
Una clausola che modifica la colonna utilizzata come chiave di distribuzione di una relazione. Considera i seguenti aspetti:  
+ VACUUM e ALTER DISTKEY non possono essere eseguiti contemporaneamente per la stessa relazione. 
  + Se VACUUM è già in esecuzione, ALTER DISTKEY restituisce un errore.
  + Se ALTER DISTKEY è in esecuzione, il vacuum di background non viene avviato per una relazione.
  + Se ALTER DISTKEY è in esecuzione, il vacuum in primo piano restituisce un errore.
+ Puoi eseguire solo un comando ALTER DISTKEY per una relazione alla volta. 
+ Il comando ALTER DISTKEY non è supportato per le relazioni con chiavi di ordinamento interlacciate. 
+ Se lo stile di distribuzione è stato precedentemente definito come AUTO, la tabella non è più un candidato per l’ottimizzazione automatica della tabella. 
Quando si specifica DISTSTYLE KEY, i dati vengono distribuiti dai valori nella colonna DISTKEY. Per ulteriori informazioni su DISTSTYLE, consulta [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER DISTSTYLE AUTO  
Una clausola che modifica lo stile di distribuzione esistente di una relazione su AUTO.   
Quando modifichi uno stile di distribuzione su AUTO, lo stile di distribuzione della relazione viene impostato come segue:   
+ Una piccola relazione con DISTSTYLE ALL viene convertita in AUTO(ALL). 
+ Una piccola relazione con DISTSTYLE EVEN viene convertita in AUTO(ALL). 
+ Una piccola relazione con DISTSTYLE KEY viene convertita in AUTO(ALL). 
+ Una relazione grande con DISTSTYLE ALL viene convertita in AUTO(EVEN). 
+ Una relazione grande con DISTSTYLE EVEN viene convertita in AUTO(EVEN). 
+ Una relazione grande con DISTSTYLE KEY viene convertita in AUTO(KEY) e DISTKEY viene conservato. In questo caso Amazon Redshift non apporta modifiche alla relazione.
Se Amazon Redshift determina che un nuovo stile o una nuova chiave di distribuzione migliorerà le prestazioni delle query, Amazon Redshift potrebbe modificare lo stile o la chiave di distribuzione della relazione in futuro. Ad esempio, Amazon Redshift potrebbe convertire una relazione con DISTSTYLE di AUTO(KEY) in AUTO(EVEN) o viceversa. Per ulteriori informazioni sul comportamento in caso di modifica delle chiavi di distribuzione, tra cui la ridistribuzione dei dati e i blocchi, consulta [Suggerimenti di Amazon Redshift Advisor](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation).  
Per ulteriori informazioni su DISTSTYLE AUTO, consulta [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).   
Per visualizzare lo stile di distribuzione di una relazione, esegui query sulla vista del catalogo di sistema SVV\$1TABLE\$1INFO. Per ulteriori informazioni, consulta [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Per visualizzare i suggerimenti di Amazon Redshift Advisor per le relazioni, esegui query sulla vista del catalogo di sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Per ulteriori informazioni, consulta [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Per visualizzare le azioni intraprese da Amazon Redshift, eseguire una query sulla vista del catalogo di sistema SVL\$1AUTO\$1WORKER\$1ACTION. Per ulteriori informazioni, consulta [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
Una clausola che modifica o aggiunge la chiave di ordinamento utilizzata per una relazione. ALTER SORTKEY non è supportato per le tabelle temporanee.  
Quando si modifica una chiave di ordinamento, la codifica di compressione delle colonne nella chiave di ordinamento nuova o originale può cambiare. Se nessuna codifica è definita esplicitamente per la relazione, Amazon Redshift assegna automaticamente le codifiche di compressione come segue:  
+ Le colonne definite come chiavi di ordinamento vengono assegnate alla compressione RAW.
+ Le colonne definite come tipi di dati BOOLEAN, REAL o DOUBLE PRECISION vengono assegnate alla compressione RAW.
+ Alle colonne definite come SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ viene assegnata la compressione. AZ64
+ Le colonne definite come CHAR o VARCHAR sono assegnate alla compressione LZO.
Considera i seguenti aspetti:  
+ Puoi definire un massimo di 400 colonne per una chiave di ordinamento per relazione. 
+ È possibile modificare una chiave di ordinamento interlacciata in una chiave di ordinamento composta o nessuna chiave di ordinamento. È possibile modificare una chiave di ordinamento interlacciata in una chiave di ordinamento composta o nessuna chiave di ordinamento. 
+ Se la chiave di ordinamento è stata precedentemente definita come AUTO, la relazione non è più un candidato per l’ottimizzazione automatica della tabella. 
+ Amazon Redshift consiglia di utilizzare la codifica RAW (senza compressione) per le colonne definite come chiavi di ordinamento. Quando si modifica una colonna per sceglierla come chiave di ordinamento, la compressione della colonna viene modificata in compressione RAW (senza compressione). Ciò può aumentare la quantità di archiviazione richiesta dalla relazione. L’aumento delle dimensioni della relazione dipende dalla definizione specifica della relazione e dal contenuto della relazione. Per ulteriori informazioni sulla compressione, consulta [Codifiche di compressione](c_Compression_encodings.md). 
Quando i dati vengono caricati in una relazione, seguono l’ordine della chiave di ordinamento. Quando si modifica la chiave di ordinamento, Amazon Redshift riordina i dati. Per ulteriori informazioni su SORTKEY, consulta [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).

ALTER SORTKEY AUTO  
Una clausola che modifica o aggiunge la chiave di ordinamento della relazione di destinazione ad AUTO. ALTER SORTKEY AUTO non è supportato per le tabelle temporanee.   
Quando modifichi una chiave di ordinamento e la imposti su AUTO, Amazon Redshift conserva la chiave di ordinamento esistente della relazione.   
Se Amazon Redshift determina che una nuova chiave di ordinamento migliorerà le prestazioni delle query, Amazon Redshift potrebbe modificare la chiave di ordinamento della relazione in futuro.   
Per ulteriori informazioni su SORTKEY AUTO, consulta [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md).   
Per visualizzare la chiave di ordinamento di una relazione, esegui query sulla vista del catalogo di sistema SVV\$1TABLE\$1INFO. Per ulteriori informazioni, consulta [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Per visualizzare i suggerimenti di Amazon Redshift Advisor per le relazioni, esegui query sulla vista del catalogo di sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Per ulteriori informazioni, consulta [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Per visualizzare le azioni intraprese da Amazon Redshift, eseguire una query sulla vista del catalogo di sistema SVL\$1AUTO\$1WORKER\$1ACTION. Per ulteriori informazioni, consulta [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER SORTKEY NONE  
Una clausola che rimuove la chiave di ordinamento della tabella di relazione.   
Se la chiave di ordinamento è stata precedentemente definita come AUTO, la relazione non è più un candidato per l’ottimizzazione automatica della tabella. 

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
Una clausola che attiva o disattiva la sicurezza a livello di riga per una relazione.  
Quando per una relazione è attivata la protezione a livello di riga, è possibile leggere solo le righe al livello di riga a cui la policy di sicurezza consente l'accesso. Quando non ci sono policy che consentono l'accesso alla relazione, non è possibile visualizzare alcuna riga dalla relazione. Solo gli utenti con privilegi avanzati e gli utenti o i ruoli che hanno il ruolo `sys:secadmin` possono impostare la clausola ROW LEVEL SECURITY. Per ulteriori informazioni, consulta [Sicurezza a livello di riga](t_rls.md).  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  Una clausola che consente di scegliere il tipo di congiunzione della policy di sicurezza a livello di riga per una relazione. Quando a una relazione sono associate più policy di sicurezza a livello di riga, è possibile combinare le policy con la clausola AND oppure OR. Per impostazione predefinita, Amazon Redshift combina le policy RLS con la clausola AND. Gli utenti con privilegi avanzati, gli utenti o i ruoli che hanno il ruolo `sys:secadmin` possono utilizzare questa clausola per definire il tipo di combinazione della policy di sicurezza a livello di riga per una relazione. Per ulteriori informazioni, consulta [Combinazione di più policy per utente](t_rls_combine_policies.md). 
+ FOR DATASHARES

   Una clausola che determina se è possibile accedere a una relazione protetta da RLS in un'unità di condivisione dati. Per impostazione predefinita, non è possibile accedere a una relazione protetta da RLS in un'unità di condivisione dati. Il comando ALTER MATERIALIZED VIEW ROW LEVEL SECURITY eseguito con questa clausola influisce solo sulla proprietà di accessibilità dell'unità di condivisione dati della relazione. La proprietà ROW LEVEL SECURITY non viene modificata.

   Se rendi accessibile una relazione protetta da RLS nelle unità di condivisione dati, la relazione non dispone di una sicurezza a livello di riga nel database con unità di condivisione dati sul lato consumer. La relazione mantiene la proprietà RLS sul lato producer. 

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

Nell'esempio seguente la vista materializzata `tickets_mv` viene abilitata perché possa essere aggiornata automaticamente.

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

# Esempi di DISTSTYLE e SORTKEY per ALTER MATERIALIZED VIEW
<a name="r_ALTER_MATERIALIZED_VIEW-DISTSTYLE-SORTKEY-examples"></a>

Gli esempi in questo argomento mostrano come eseguire modifiche a DISTSTYLE e SORTKEY utilizzando ALTER MATERIALIZED VIEW.

Le seguenti query di esempio mostrano come modificare una colonna DISTSTYLE KEY DISTKEY utilizzando una tabella base di esempio:

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

Modifica una vista materializzata in 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;
```

I comandi seguenti mostrano esempi di ALTER MATERIALIZED VIEW SORTKEY utilizzando una tabella base di esempio:

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

Modifica di una policy di sicurezza a livello di riga esistente su una tabella.

Una policy può essere modificata da un utente con privilegi avanzati e da utenti o ruoli che dispongono del ruolo `sys:secadmin`.

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

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

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

 *nome\$1policy*   
Il nome della policy .

database\$1name  
Il nome del database da cui viene creata la politica. Il database può essere il database connesso o un database che supporta le autorizzazioni federate di Amazon Redshift.

USING (* using\$1predicate\$1exp *)  
Specifica un filtro applicato alla clausola WHERE della query. Amazon Redshift applica un predicato di policy prima dei predicati utente a livello di query. Ad esempio, **current\$1user = ‘joe’ and price > 10** limita Joe a visualizzare solo i record con un prezzo superiore a 10 USD.  
L'espressione ha accesso alle variabili dichiarate nella clausola WITH dell'istruzione CREATE RLS POLICY utilizzata per creare la policy con il nome "nome\$1policy".

Per l'utilizzo di ALTER RLS POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

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

L'esempio seguente modifica una policy 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>

Rinomina un ruolo o cambia il proprietario. Per un elenco di ruoli Amazon Redshift definiti dal sistema, consulta [Ruoli definiti dal sistema di Amazon Redshift](r_roles-default.md).

## Autorizzazioni richieste
<a name="r_ALTER_ROLE-privileges"></a>

Di seguito sono riportate le autorizzazioni richieste per ALTER ROLE:
+ Superuser
+ Utenti con le autorizzazioni ALTER ROLE

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

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

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

 *ruolo*   
Il nome del ruolo da modificare.

RENAME TO  
Un nuovo nome per il ruolo.

OWNER TO *user\$1name*  
Un nuovo proprietario per il ruolo. 

EXTERNALID TO *external\$1id*  
Un nuovo ID esterno per il ruolo, associato a un provider di identità. Per ulteriori informazioni, consulta [Native identity provider (IdP) federation for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html) (Federazione di provider di identità nativi (IdP) per Amazon Redshift).

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

L'esempio seguente cambia il nome di un ruolo da `sample_role1` a `sample_role2`.

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

L'esempio seguente cambia il proprietario del ruolo.

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

La sintassi di ALTER ROLE è simile ad ALTER PROCEDURE di seguito.

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

L'esempio seguente cambia il proprietario di una procedura in `etl_user`.

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

Nell'esempio seguente viene aggiornato un ruolo `sample_role1` con un nuovo ID esterno associato a un provider di identità.

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

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

Rinomina una procedura o cambia il proprietario. Sono richiesti sia il nome della procedura che i tipi di dati o la firma. Una procedura può essere rinominata solo dal proprietario o da un utente con privilegi avanzati. Solo un utente con privilegi avanzati può cambiare il proprietario di una procedura. 

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

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

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

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

 *sp\$1name*   
Il nome della procedura da cambiare. Specifica solo il nome della procedura nel percorso di ricerca corrente oppure utilizza il formato `schema_name.sp_procedure_name` per utilizzare uno schema specifico.

*[argname] [argmode] argtype*   
Elenco di nomi di argomento, modalità di argomento e tipi di dati. Sono richiesti solo i tipi di dati di input, utilizzati per individuare la procedura archiviata. In alternativa, puoi fornire la firma completa utilizzata per creare la procedura che include i parametri di input e output con le relative modalità.

 *new\$1name*   
Nuovo nome per la procedura archiviata. 

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
Nuovo proprietario della procedura archiviata. 

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

L'esempio seguente cambia il nome di una procedura da `first_quarter_revenue` a `quarterly_revenue`.

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

Questo esempio è uguale al seguente.

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

L'esempio seguente cambia il proprietario di una procedura in `etl_user`.

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

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

Cambia la definizione di uno schema esistente. Usa questo comando per rinominare uno schema o modificare il proprietario di uno schema. Ad esempio, rinomina uno schema esistente per conservare una copia di backup di tale schema quando pianifichi di creare una nuova versione dello schema. Per ulteriori informazioni sugli schemi, consultare [CREATE SCHEMA](r_CREATE_SCHEMA.md).

Per visualizzare le quote dello schema configurate, consultare [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md).

Per visualizzare i record in cui le quote dello schema sono state superate, consultare [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md).

## Privilegi richiesti
<a name="r_ALTER_SCHEMA-privileges"></a>

Di seguito sono riportati i privilegi richiesti per ALTER SCHEMA:
+ Superuser
+ Utente con il privilegio ALTER SCHEMA
+ Proprietario dello schema

Quando si modifica il nome di uno schema, tenere presente che gli oggetti che utilizzano il vecchio nome, come le procedure archiviate o le viste materializzate, devono essere aggiornati per utilizzare il nuovo nome.

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

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

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

 *schema\$1name*   
Il nome dello schema del database da modificare. 

RENAME TO   
Clausola che rinomina lo schema. 

 *new\$1name*   
Il nuovo nome dello schema. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md). 

OWNER TO   
Clausola che modifica il proprietario dello schema. 

 *new\$1owner*   
Il nuovo proprietario dello schema. 

QUOTA   
La quantità massima di spazio su disco che lo schema specificato può utilizzare. Questo spazio è la dimensione collettiva di tutte le tabelle nello schema specificato. Amazon Redshift converte il valore selezionato in megabyte. Il gigabyte è l'unità di misura predefinita quando non si specifica un valore.   
Per ulteriori informazioni sulla configurazione delle quote dello schema, consultare [CREATE SCHEMA](r_CREATE_SCHEMA.md).

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

L'esempio seguente rinomina lo schema SALES in US\$1SALES.

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

L'esempio seguente concede la proprietà dello schema US\$1SALES all'utente DWUSER.

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

Nell'esempio seguente la quota viene modificata a 300 GB e viene rimossa.

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

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

Modifica un'opzione di configurazione a livello di sistema per il cluster Amazon Redshift o il gruppo di lavoro Redshift Serverless.

## Privilegi richiesti
<a name="r_ALTER_SYSTEM-privileges"></a>

Uno dei seguenti tipi di utente può eseguire il comando ALTER SYSTEM:
+ Superuser
+ Utente amministratore

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

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

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

 *system-level-configuration*   
Una configurazione a livello di sistema. Valori validi: `data_catalog_auto_mount` e `metadata_security`.

\$1vero\$1 t \$1 attivo \$1 falso \$1 f \$1 disattivato\$1   
Un valore per attivare o disattivare la configurazione a livello di sistema. Un `true`, `t` oppure `on` indica di attivare la configurazione. Un `false`, `f` oppure `off` indica di disattivare la configurazione.

## Note per l'utilizzo
<a name="r_ALTER_SYSTEM-usage-notes"></a>

Per un cluster con provisioning, le modifiche apportate a `data_catalog_auto_mount` diventano effettive al successivo riavvio del cluster. Per ulteriori informazioni, consulta [Riavvio di un cluster](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#reboot-cluster) nella *Guida alla gestione di Amazon Redshift*.

Per un gruppo di lavoro serverless, le modifiche apportate a `data_catalog_auto_mount` non diventano immediatamente effettive.

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

L'esempio seguente attiva il montaggio automatico di  AWS Glue Data Catalog.

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

L'esempio seguente attiva la sicurezza dei metadati.

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

### Impostazione di un namespace di identità predefinito
<a name="r_ALTER_SYSTEM-identity"></a>

Questo esempio è specifico per l’utilizzo di un provider di identità. Puoi integrare Redshift con IAM Identity Center e un provider di identità per centralizzare la gestione delle identità per Redshift e altri servizi. AWS 

L’esempio seguente mostra come impostare il namespace di identità predefinito per il sistema. Se effettui questa operazione successivamente, semplifichi l’esecuzione delle istruzioni GRANT e CREATE perché non devi includere il namespace come prefisso per ogni identità.

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

Dopo avere eseguito il comando, puoi utilizzare istruzioni come le seguenti:

```
GRANT SELECT ON TABLE mytable TO alice;

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

L’effetto dell’impostazione del namespace di identità predefinito è che ogni identità non lo richiede come prefisso. In questo esempio, `alice` viene sostituito da `MYCO:alice`. Ciò accade con qualsiasi identità inclusa. Per ulteriori informazioni sull’utilizzo di un provider di identità con Redshift, consulta [Connessione di Redshift a Centro identità IAM per offrire agli utenti un’esperienza di single sign-on](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

Per ulteriori informazioni sulle impostazioni relative alla configurazione di Redshift con Centro identità IAM, consulta [SET](r_SET.md) e [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md).

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

Questo comando modifica la definizione di una tabella del database Amazon Redshift o la tabella esterna di Amazon Redshift Spectrum. Questo comando aggiorna i valori e le proprietà impostati da [CREATE TABLE](r_CREATE_TABLE_NEW.md) o [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). Puoi utilizzare ALTER TABLE in una vista per la sicurezza a livello di riga (RLS).

Non è possibile eseguire ALTER TABLE su una tabella esterna all'interno di un blocco di transazione (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

ALTER TABLE blocca le operazioni di lettura e scrittura della tabella fino al completamento della transazione che contiene l'operazione ALTER TABLE, a meno che nella documentazione non sia specificamente indicato che è possibile eseguire query sui dati o eseguire altre operazioni sulla tabella durante la modifica.

## Privilegi richiesti
<a name="r_ALTER_TABLE-privileges"></a>

L'utente che modifica una tabella deve disporre del privilegio appropriato affinché il comando venga eseguito correttamente. A seconda del comando ALTER TABLE, è richiesto uno dei seguenti privilegi.
+ Superuser
+ Utenti con il privilegio ALTER TABLE
+ Il proprietario della tabella con il privilegio USAGE sullo schema

## Sintassi
<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 [, ...] )
```

Per ridurre il tempo necessario per eseguire il comando ALTER TABLE, è possibile combinare alcune clausole del comando ALTER TABLE.

Amazon Redshift supporta le seguenti combinazioni delle clausole ALTER TABLE:

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

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

 *table\$1name*   
Nome della tabella da modificare. Specifica solo il nome della tabella o utilizzare il formato *schema\$1name.table\$1name* per utilizzare uno schema specifico. Le tabelle esterne devono essere qualificate da un nome di schema esterno. Inoltre puoi specificare un nome di vista se utilizzi l'istruzione ALTER TABLE per rinominare una vista o cambiare il proprietario. La lunghezza massima per il nome della tabella è 127 byte; i nomi più lunghi vengono troncati a 127 byte. Puoi utilizzare caratteri multibyte UTF-8 fino a un massimo di quattro byte. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

ADD *table\$1constraint*   
Clausola che aggiunge il vincolo specificato alla tabella. Per le descrizioni dei valori validi di *table\$1constraint*, vedi [CREATE TABLE](r_CREATE_TABLE_NEW.md).  
Non puoi aggiungere un vincolo della chiave primaria a una colonna nullable. Se la colonna è stata originariamente creata con il vincolo NOT NULL, puoi aggiungere il vincolo della chiave primaria.

DROP CONSTRAINT *constraint\$1name*   
Clausola che rimuove il vincolo denominato dalla tabella. Per rimuovere un vincolo, specifica il nome del vincolo e non il tipo di vincolo. Per visualizzare i nomi dei vincoli di tabella, esegui la seguente query.  

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

RESTRICT   
Clausola che rimuove solo il vincolo specificato. RESTRICT è un'opzione per DROP CONSTRAINT. RESTRICT non può essere usata con CASCADE. 

CASCADE   
Clausola che rimuove il vincolo specificato e tutto quello che dipende da quel vincolo. CASCADE è un'opzione per DROP CONSTRAINT. CASCADE non può essere usata con RESTRICT.

OWNER TO *new\$1owner*   
Clausola che modifica il proprietario della tabella (o vista) sul valore *new\$1owner*.

RENAME TO *new\$1name*   
Clausola che rinomina una tabella (o una vista) sul valore specificato in *new\$1name*. La lunghezza massima per il nome della tabella è 127 byte; i nomi più lunghi vengono troncati a 127 byte.  
Non è possibile rinominare una tabella permanente con un nome che inizia con "\$1". Un nome di tabella che inizia con "\$1" indica una tabella temporanea.  
Non puoi rinominare una tabella esterna.

ALTER COLUMN *column\$1name* TYPE *updated\$1varchar\$1data\$1type\$1size*   
Una clausola che modifica le dimensioni di una colonna definita come un tipo di dati VARCHAR. Questa clausola supporta solo la modifica della dimensione di un tipo di dati VARCHAR. Considera i seguenti limiti:  
+ Non è possibile modificare una colonna con le codifiche di compressione BYTEDICT, RUNLENGTH o K. TEXT255 TEXT32 
+ Non è possibile ridurre le dimensioni al di sotto delle dimensioni massime dei dati esistenti. 
+ Non puoi alterare le colonne con valori predefiniti. 
+ Non puoi alterare le colonne con UNIQUE, PRIMARY KEY o FOREIGN KEY. 
+ Non è possibile modificare le colonne all'interno di un blocco di transazione (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

ALTER COLUMN *column\$1name* ENCODE *new\$1encode\$1type*   
Una clausola che modifica la codifica di compressione di una colonna. Se si specifica la codifica di compressione per una colonna, la tabella non è più impostata su ENCODE AUTO. Per informazioni sulla codifica della compressione, consultare [Compressione delle colonne per ridurre la dimensione dei dati archiviati](t_Compressing_data_on_disk.md).   
Quando si modifica la codifica di compressione per una colonna, la tabella rimane disponibile per l'esecuzione di query.  
Considera i seguenti limiti:  
+ Non è possibile modificare una colonna con la stessa codifica definita per la colonna. 
+ Non è possibile modificare la codifica per una colonna in una tabella con un sortkey interlacciato. 

ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, .....;   
Una clausola che modifica la codifica di compressione di più colonne in un singolo comando. Per informazioni sulla codifica della compressione, consultare [Compressione delle colonne per ridurre la dimensione dei dati archiviati](t_Compressing_data_on_disk.md).  
Quando si modifica la codifica di compressione per una colonna, la tabella rimane disponibile per l'esecuzione di query.  
 Considera i seguenti limiti:  
+ Non è possibile modificare più volte una colonna con lo stesso tipo di codifica o con un tipo di codifica diverso in un singolo comando.
+ Non è possibile modificare una colonna con la stessa codifica definita per la colonna. 
+ Non è possibile modificare la codifica per una colonna in una tabella con un sortkey interlacciato. 

ALTER DISTSTYLE ALL  
Una clausola che modifica lo stile di distribuzione esistente di una tabella in `ALL`. Considera i seguenti aspetti:  
+ ALTER DISTSTYLE, ALTER SORTKEY e VACUUM non possono essere eseguiti contemporaneamente sulla stessa tabella. 
  + Se VACUUM è attualmente in esecuzione, l'esecuzione di ALTER DISTSTYLE ALL restituisce un errore. 
  + Se ALTER DISTSTYLE è in esecuzione, il vacuum di background non viene avviato su una tabella. 
+ Il comando ALTER DISTSTYLE ALL non è supportato per le tabelle con chiavi di ordinamento interlacciato e tabelle temporanee.
+ Se lo stile di distribuzione è stato precedentemente definito come AUTO, la tabella non è più un candidato per l'ottimizzazione automatica della tabella. 
Per ulteriori informazioni su DISTSTYLE ALL, consultare [CREATE TABLE](r_CREATE_TABLE_NEW.md).

ALTER DISTSTYLE EVEN  
Una clausola che modifica lo stile di distribuzione esistente di una tabella in `EVEN`. Considera i seguenti aspetti:  
+ ALTER DISTSYTLE, ALTER SORTKEY e VACUUM non possono essere eseguiti contemporaneamente sulla stessa tabella. 
  + Se VACUUM è attualmente in esecuzione, l'esecuzione di ALTER DISTSTYLE EVEN restituisce un errore. 
  + Se ALTER DISTSTYLE EVEN è in esecuzione, il vacuum di background non viene avviato su una tabella. 
+ Il comando ALTER DISTSTYLE EVEN non è supportato per le tabelle con chiavi di ordinamento interlacciato e tabelle temporanee.
+ Se lo stile di distribuzione è stato precedentemente definito come AUTO, la tabella non è più un candidato per l'ottimizzazione automatica della tabella. 
Per ulteriori informazioni su DISTSTYLE ALL EVEN, consultare [CREATE TABLE](r_CREATE_TABLE_NEW.md).

ALTER DISTKEY *column\$1name* o ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
Una clausola che modifica la colonna utilizzata come chiave di distribuzione di una tabella. Considera i seguenti aspetti:  
+ VACUUM e ALTER DISTKEY non possono essere eseguiti contestualmente sulla stessa tabella. 
  + Se VACUUM è già in esecuzione, ALTER DISTKEY restituisce un errore.
  + Se ALTER DISTKEY è in esecuzione, il vacuum di background non viene avviato su una tabella.
  + Se ALTER DISTKEY è in esecuzione, il vacuum in primo piano restituisce un errore.
+ Su una tabella, è possibile eseguire solo un comando ALTER DISTKEY alla volta. 
+ Il comando ALTER DISTKEY non è supportato sulle tabelle con chiavi di ordinamento interlacciato. 
+ Se lo stile di distribuzione è stato precedentemente definito come AUTO, la tabella non è più un candidato per l'ottimizzazione automatica della tabella. 
Quando si specifica DISTSTYLE KEY, i dati vengono distribuiti dai valori nella colonna DISTKEY. Per ulteriori informazioni su DISTSTYLE, consultare [CREATE TABLE](r_CREATE_TABLE_NEW.md).

ALTER DISTSTYLE AUTO  
Una clausola che modifica lo stile di distribuzione esistente di una tabella in AUTO.   
Quando si modifica uno stile di distribuzione su AUTO, lo stile di distribuzione della tabella viene impostato come segue:   
+ Una piccola tabella con DISTSTYLE ALL è convertita in AUTO(ALL). 
+ Una piccola tabella con DISTSTYLE EVEN è convertita in AUTO(ALL). 
+ Una piccola tabella con DISTSTYLE KEY è convertita in AUTO(ALL). 
+ Una tabella grande con DISTSTYLE ALL è convertita in AUTO(ALL). 
+ Una tabella grande con DISTSTYLE EVEN è convertita in AUTO(ALL). 
+ Una tabella grande con DISTSTYLE KEY viene convertita in AUTO(KEY) e il DISTKEY viene conservato In questo caso, Amazon Redshift non apporta modifiche alla tabella.
Se Amazon Redshift determina che un nuovo stile o chiave di distribuzione migliorerà le prestazioni delle query, Amazon Redshift potrebbe modificare lo stile o la chiave di distribuzione della tabella in futuro. Ad esempio, Amazon Redshift potrebbe convertire una tabella con un DISTSTYLE di AUTO(KEY) in AUTO(EVEN) o viceversa. Per ulteriori informazioni sul comportamento in caso di modifica delle chiavi di distribuzione, tra cui la ridistribuzione dei dati e i blocchi, consulta i [suggerimenti di Amazon Redshift Advisor](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation).  
Per ulteriori informazioni su DISTSTYLE AUTO, consultare [CREATE TABLE](r_CREATE_TABLE_NEW.md).   
Per visualizzare lo stile di distribuzione di una tabella, eseguire una query sulla vista del catalogo di sistema SVV\$1TABLE\$1INFO. Per ulteriori informazioni, consulta [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Per visualizzare i suggerimenti di Amazon Redshift Advisor per le tabelle, eseguire una query sulla vista del catalogo di sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Per ulteriori informazioni, consulta [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Per visualizzare le azioni intraprese da Amazon Redshift, eseguire una query sulla vista del catalogo di sistema SVL\$1AUTO\$1WORKER\$1ACTION. Per ulteriori informazioni, consulta [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
Una clausola che modifica o aggiunge la chiave di ordinamento utilizzata per una tabella. ALTER SORTKEY non è supportato per le tabelle temporanee.  
Quando si modifica una chiave di ordinamento, la codifica di compressione delle colonne nella chiave di ordinamento nuova o originale può cambiare. Se nessuna codifica è definita esplicitamente per la tabella, allora Amazon Redshift assegna automaticamente le codifiche di compressione come segue:  
+ Le colonne definite come chiavi di ordinamento vengono assegnate alla compressione RAW.
+ Le colonne definite come tipi di dati BOOLEAN, REAL o DOUBLE PRECISION vengono assegnate alla compressione RAW.
+ Alle colonne definite come SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ viene assegnata la compressione. AZ64
+ Le colonne definite come CHAR o VARCHAR sono assegnate alla compressione LZO.
Considera i seguenti aspetti:  
+ È possibile definire un massimo di 400 colonne per una chiave di ordinamento per tabella. 
+ È possibile modificare una chiave di ordinamento interlacciata in una chiave di ordinamento composta o nessuna chiave di ordinamento. È possibile modificare una chiave di ordinamento interlacciata in una chiave di ordinamento composta o nessuna chiave di ordinamento. 
+ Se la chiave di ordinamento è stata precedentemente definita come AUTO, la tabella non è più un candidato per l'ottimizzazione automatica della tabella. 
+ Amazon Redshift consiglia di utilizzare la codifica RAW (senza compressione) per le colonne definite come chiavi di ordinamento. Quando si modifica una colonna per sceglierla come chiave di ordinamento, la compressione della colonna viene modificata in compressione RAW (senza compressione). Ciò può aumentare la quantità di archiviazione richiesta dalla tabella. L'aumento delle dimensioni della tabella dipende dalla definizione specifica della tabella e dal contenuto della tabella. Per ulteriori informazioni su questi componenti, consultare . [Codifiche di compressione](c_Compression_encodings.md) 
Quando i dati vengono caricati in una tabella seguono l'ordine della chiave di ordinamento. Quando si modifica la chiave di ordinamento, Amazon Redshift riordina i dati. Per ulteriori informazioni su SORTKEY, consultare [CREATE TABLE](r_CREATE_TABLE_NEW.md).

ALTER SORTKEY AUTO  
Una clausola che modifica o aggiunge la chiave di ordinamento della tabella di destinazione ad AUTO. ALTER SORTKEY AUTO non è supportato per le tabelle temporanee.   
Quando si modifica una chiave di ordinamento in AUTO, Amazon Redshift conserva la chiave di ordinamento esistente della tabella.   
Se Amazon Redshift determina che una nuova chiave di ordinamento migliorerà le prestazioni delle query, Amazon Redshift potrebbe modificare la chiave di ordinamento della tabella in futuro.   
Per ulteriori informazioni su SORTKEY AUTO, consultare [CREATE TABLE](r_CREATE_TABLE_NEW.md).   
Per visualizzare la chiave di ordinamento di una tabella, eseguire una query sulla vista del catalogo di sistema SVV\$1TABLE\$1INFO. Per ulteriori informazioni, consulta [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Per visualizzare i suggerimenti di Amazon Redshift Advisor per le tabelle, eseguire una query sulla vista del catalogo di sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Per ulteriori informazioni, consulta [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Per visualizzare le azioni intraprese da Amazon Redshift, eseguire una query sulla vista del catalogo di sistema SVL\$1AUTO\$1WORKER\$1ACTION. Per ulteriori informazioni, consulta [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md). 

ALTER SORTKEY NONE  
Una clausola che rimuove la chiave di ordinamento della tabella di destinazione.   
Se la chiave di ordinamento è stata precedentemente definita come AUTO, la tabella non è più un candidato per l'ottimizzazione automatica della tabella. 

ALTER ENCODE AUTO  
Una clausola che modifica il tipo di codifica delle colonne della tabella di destinazione in AUTO. Quando si modifica la codifica in AUTO, Amazon Redshift conserva il tipo di codifica esistente delle colonne nella tabella. Quindi, se Amazon Redshift determina che un nuovo tipo di codifica può migliorare le prestazioni delle query, Amazon Redshift può modificare il tipo di codifica delle colonne della tabella.   
Se si modifica una o più colonne per specificare una codifica, Amazon Redshift non regola più automaticamente la codifica per tutte le colonne della tabella. Le colonne mantengono le impostazioni di codifica correnti.  
Le seguenti azioni non influiscono sull'impostazione ENCODE AUTO per la tabella:   
+ Ridenominazione della tabella.
+ Modifica dell'impostazione DISTSTYLE o SORTKEY per la tabella.
+ Aggiunta o eliminazione di una colonna con un'impostazione ENCODE.
+ Utilizzo dell'opzione COMPUPDATE del comando COPY. Per ulteriori informazioni, consulta [Operazioni di caricamento dati](copy-parameters-data-load.md).
Per visualizzare la codifica di una tabella, eseguire una query sulla vista del catalogo di sistema SVV\$1TABLE\$1INFO. Per ulteriori informazioni, consulta [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md).

RENAME COLUMN *column\$1name* TO *new\$1name*   
Clausola che rinomina una colonna sul valore specificato in *new\$1name*. La lunghezza massima per il nome della colonna è 127 byte; i nomi più lunghi vengono troncati a 127 byte. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

ADD [ COLUMN ] *column\$1name*   
Clausola che aggiunge una colonna con il nome specificato alla tabella. Puoi aggiungere una sola colonna in ogni istruzione ALTER TABLE.  
Non puoi aggiungere una colonna che sia la chiave di distribuzione (DISTKEY) o una chiave di ordinamento (SORTKEY) della tabella.  
 Non puoi utilizzare un comando ALTER TABLE ADD COLUMN per modificare i seguenti attributi di tabella e colonna:   
+ UNIQUE
+ PRIMARY KEY
+ REFERENCES (chiave esterna)
+ IDENTITY o GENERATED BY DEFAULT AS IDENTITY
La lunghezza massima per il nome della colonna è 127 byte; i nomi più lunghi vengono troncati a 127 byte. Il numero massimo di colonne che puoi definire in una singola tabella è 1.600.  
Le seguenti restrizioni si applicano quando si aggiunge una colonna a una tabella esterna:  
+ Non puoi aggiungere una colonna a una tabella esterna con i vincoli di colonna DEFAULT, ENCODE, NOT NULL o NULL. 
+ Non puoi aggiungere colonne a una tabella esterna definita utilizzando il formato file AVRO. 
+ Se le pseudocolonne sono abilitate, il numero massimo di colonne che è possibile definire in una singola tabella esterna è 1.598. Se le pseudocolonne non sono abilitate, il numero massimo di colonne che puoi definire in una singola tabella è 1.600. 
Per ulteriori informazioni, consulta [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md).

 *column\$1type*   
Tipo dei dati della colonna da aggiungere. Per le colonne CHAR e VARCHAR, puoi utilizzare la parola chiave MAX invece di dichiarare una lunghezza massima. MAX imposta la lunghezza massima a 4.096 byte per CHAR o a 65.535 byte per VARCHAR. La dimensione massima di un oggetto di tipo GEOMETRY è di 1.048.447 byte.   
Per informazioni sui tipi di dati supportati da Amazon Redshift, consultare [Tipi di dati](c_Supported_data_types.md).

DEFAULT *default\$1expr*   <a name="alter-table-default"></a>
Clausola che assegna un valore di dati predefinito per la colonna. Il tipo di dati di *default\$1expr* deve corrispondere al tipo di dati della colonna. Il valore DEFAULT deve essere un'espressione senza variabili. Le sottoquery, i riferimenti incrociati ad altre colonne della tabella corrente e le funzioni definite dall'utente non sono consentiti.  
*default\$1expr* è utilizzato in qualsiasi operazione INSERT che non specifica un valore per la colonna. Se non viene specificato alcun valore predefinito, il valore predefinito per la colonna è null.  
Se un'operazione COPY incontra un campo nullo su una colonna che ha un valore DEFAULT e un vincolo NOT NULL, il comando COPY inserisce il valore di *default\$1expr*.   
DEFAULT non è supportato per le tabelle esterne.

ENCODE *encoding*   
La codifica della compressione per una colonna. Per impostazione predefinita, Amazon Redshift gestisce automaticamente la codifica di compressione per tutte le colonne di una tabella se non si specifica la codifica di compressione per qualsiasi colonna della tabella o se si specifica l'opzione ENCODE AUTO per la tabella.  
Se si specifica la codifica di compressione per qualsiasi colonna della tabella o se non si specifica l'opzione ENCODE AUTO per la tabella, Amazon Redshift assegna automaticamente la codifica di compressione alle colonne per le quali non si specifica la codifica di compressione come segue:  
+ Per impostazione predefinita, tutte le colonne nelle tabelle temporanee vengono assegnate alla compressione RAW.
+ Le colonne definite come chiavi di ordinamento vengono assegnate alla compressione RAW.
+ Alle colonne definite come tipi di dati BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY o GEOGRAPHY viene assegnata la compressione di tipo RAW.
+ Alle colonne definite come SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ viene assegnata la compressione. AZ64
+ Le colonne definite come CHAR, VARCHAR o VARBYTE sono assegnate alla compressione LZO.
Se non vuoi che una colonna venga compressa, specifica esplicitamente la codifica RAW.
Sono supportate le seguenti [compression encodings](c_Compression_encodings.md#compression-encoding-list):  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (nessuna compressione)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD
ENCODE non è supportato per le tabelle esterne.

NOT NULL \$1 NULL   
NOT NULL specifica che la colonna non può contenere valori null. NULL, il valore predefinito, specifica che la colonna accetta valori nulli.  
NOT NULL e NULL non sono supportati per tabelle esterne.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Una clausola che specifica se la stringa di ricerca o il confronto per la colonna fa distinzione o meno tra maiuscole e minuscole. Il valore di default corrisponde alla stessa configurazione corrente della distinzione tra maiuscole e minuscole del database.  
Per informazioni sul confronto di database, utilizzare il comando seguente:  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE e CS sono intercambiabili e producono gli stessi risultati. Allo stesso modo CASE\$1INSENSITIVE e CI sono intercambiabili e producono gli stessi risultati.

DROP [ COLUMN ] *column\$1name*   
Il nome della colonna da eliminare dalla tabella.  
Non puoi rimuovere l'ultima colonna di una tabella. Una tabella deve avere almeno una colonna.  
Non puoi rimuovere una colonna che sia la chiave di distribuzione (DISTKEY) o una chiave di ordinamento (SORTKEY) della tabella. Il comportamento predefinito per DROP COLUMN è RESTRICT se la colonna contiene oggetti dipendenti, ad esempio una vista, una chiave primaria, una chiave esterna o una restrizione UNIQUE.  
Le seguenti restrizioni si applicano quando si rimuove una colonna da una tabella esterna:  
+ Non puoi rimuovere una colonna da una tabella esterna se la colonna viene utilizzata come partizione.
+ Non puoi rimuovere una colonna da una tabella esterna definita utilizzando il formato file AVRO. 
+ RESTRICT e CASCADE vengono ignorati per le tabelle esterne.
+ Non è possibile eliminare le colonne della tabella delle policy a cui viene fatto riferimento all'interno della definizione della policy a meno che non si elimini o si scolleghi la policy. Ciò vale anche quando viene specificata l'opzione CASCADE. È possibile eliminare altre colonne nella tabella delle policy.
Per ulteriori informazioni, consulta [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md).

RESTRICT   
Quando viene utilizzato con DROP COLUMN, RESTRICT indica che la colonna da rimuovere non è stata rimossa, in questi casi:  
+ Se una vista definita fa riferimento alla colonna che si vuole eliminare
+ Se una chiave esterna fa riferimento alla colonna
+ Se la colonna fa parte di una chiave multiparte
RESTRICT non può essere usata con CASCADE.  
RESTRICT e CASCADE vengono ignorati per le tabelle esterne.

CASCADE   
Se utilizzato con DROP COLUMN, rimuove la colonna specificata e tutto ciò che dipende da tale colonna. CASCADE non può essere usata con RESTRICT.  
RESTRICT e CASCADE vengono ignorati per le tabelle esterne.

Le seguenti opzioni si applicano solo alle tabelle esterne.

SET LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*' \$1  
Il percorso della cartella Amazon S3 che contiene i file di dati o un file manifest che contiene un elenco di percorsi di oggetti Amazon S3. I bucket devono trovarsi nella stessa regione AWS del cluster Amazon Redshift. Per AWS un [Limitazioni di Amazon Redshift Spectrum](c-spectrum-considerations.md) elenco delle regioni supportate, vedere. Per ulteriori informazioni sull'uso di un file manifest, vedi LOCATION nel riferimento CREATE EXTERNAL TABLE [Parameters](r_CREATE_EXTERNAL_TABLE.md#r_CREATE_EXTERNAL_TABLE-parameters).

SET FILE FORMAT *format*  
Il formato dei file di dati esterni.  
I formati validi sono:  
+ AVRO 
+ PARQUET
+ RCFILE
+ SEQUENCEFILE
+ TEXTFILE 

SET TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*')   
Clausola che imposta la definizione della tabella delle proprietà della tabella per una tabella esterna.   
Le proprietà della tabella rispettano la distinzione tra maiuscole e minuscole.  
'numRows'='*row\$1count*'   
Proprietà che imposta il valore numRows per la definizione della tabella. Per aggiornare in modo esplicito le statistiche di una tabella esterna, imposta la proprietà numRows in modo da indicare le dimensioni della tabella. Amazon Redshift non analizza le tabelle esterne per generare le statistiche delle tabelle che l'ottimizzatore di query utilizza per generare un piano di query. Se le statistiche della tabella non sono impostate per una tabella esterna, Amazon Redshift genera un piano di esecuzione della query. Il piano si basa sul presupposto che le tabelle esterne sono le tabelle più grandi e che quelle locali sono le più piccole.  
'skip.header.line.count'='*line\$1count*'  
Proprietà che imposta il numero di righe da saltare all'inizio di ogni file sorgente.

PARTITION ( *partition\$1column*=*partition\$1value* [, ...] SET LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1  
Clausola che imposta una nuova posizione per una o più colonne di partizione. 

ADD [ IF NOT EXISTS ] PARTITION ( *partition\$1column*=*partition\$1value* [, ...] ) LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1 [, ... ]  
Una clausola che aggiunge una o più partizioni. È possibile specificare più clausole PARTITION utilizzando una singola istruzione ALTER TABLE … ADD.  
Se si utilizza il AWS Glue catalogo, è possibile aggiungere fino a 100 partizioni utilizzando una singola istruzione ALTER TABLE.
La clausola IF NOT EXISTS indica che se la partizione specificata esiste già, il comando non deve apportare modifiche. Indica inoltre che il comando deve restituire un messaggio che la partizione esiste, anziché terminare con un errore. Questa clausola è utile durante lo scripting, quindi lo script non fallisce se ALTER TABLE tenta di aggiungere una partizione già esistente. 

DROP PARTITION (*partition\$1column*=*partition\$1value* [, ...] )   
Clausola che rimuove la partizione specificata. La rimozione di una partizione altera solo i metadati della tabella esterna. I dati su Amazon S3 non sono interessati.

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
Una clausola che attiva o disattiva la sicurezza a livello di riga per una relazione.  
Quando per una relazione è attivata la protezione a livello di riga, è possibile leggere solo le righe al livello di riga a cui la policy di sicurezza consente l'accesso. Quando non ci sono policy che consentono l'accesso alla relazione, non è possibile visualizzare alcuna riga dalla relazione. Solo gli utenti con privilegi avanzati e gli utenti o i ruoli che hanno il ruolo `sys:secadmin` possono impostare la clausola ROW LEVEL SECURITY. Per ulteriori informazioni, consulta [Sicurezza a livello di riga](t_rls.md). Questa istruzione è supportata sul database connesso o su un database con autorizzazioni federate di Amazon Redshift. La clausola FOR DATASHARES non è supportata su un database con autorizzazioni federate Amazon Redshift.  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  Una clausola che consente di scegliere il tipo di congiunzione della policy di sicurezza a livello di riga per una relazione. Quando a una relazione sono associate più policy di sicurezza a livello di riga, è possibile combinare le policy con la clausola AND oppure OR. Per impostazione predefinita, Amazon Redshift combina le policy RLS con la clausola AND. Gli utenti con privilegi avanzati, gli utenti o i ruoli che hanno il ruolo `sys:secadmin` possono utilizzare questa clausola per definire il tipo di combinazione della policy di sicurezza a livello di riga per una relazione. Per ulteriori informazioni, consulta [Combinazione di più policy per utente](t_rls_combine_policies.md). 
+ FOR DATASHARES

  Una clausola che determina se è possibile accedere a una relazione protetta da RLS in un'unità di condivisione dati. Per impostazione predefinita, non è possibile accedere a una relazione protetta da RLS in un'unità di condivisione dati. Il comando ALTER TABLE ROW LEVEL SECURITY eseguito con questa clausola influisce solo sulla proprietà di accessibilità dell'unità di condivisione dati della relazione. La proprietà ROW LEVEL SECURITY non viene modificata. 

   Se rendi accessibile una relazione protetta da RLS nelle unità di condivisione dati, la relazione non dispone di una sicurezza a livello di riga nel database con unità di condivisione dati sul lato consumer. La relazione mantiene la proprietà RLS sul lato producer. 

MASKING \$1 ON \$1 OFF \$1 FOR DATASHARES  
Una clausola che determina se è possibile accedere a una relazione protetta da DDM in un’unità di condivisione dati. Per impostazione predefinita, non è possibile accedere a una relazione protetta da DDM in un’unità di condivisione dati. Se rendi accessibile una relazione protetta da DDM nelle unità di condivisione dati, la relazione non dispone di una sicurezza a livello di riga nel database con unità di condivisione dati sul lato consumer. La relazione mantiene la proprietà di mascheramento sul lato producer. Solo gli utenti con privilegi avanzati e gli utenti o i ruoli che hanno il ruolo `sys:secadmin` possono impostare la clausola MASKING FOR DATASHARES. Per ulteriori informazioni, consulta [Mascheramento dinamico dei dati](t_ddm.md). 

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

Per esempi che mostrano come utilizzare il comando ALTER TABLE, consultare quanto segue.
+ [Esempi di ALTER TABLE](r_ALTER_TABLE_examples_basic.md)
+ [Esempi per alterare la tabella esterna](r_ALTER_TABLE_external-table.md)
+ [Esempi di ALTER TABLE ADD e DROP COLUMN](r_ALTER_TABLE_COL_ex-add-drop.md)

# Esempi di ALTER TABLE
<a name="r_ALTER_TABLE_examples_basic"></a>

I seguenti esempi dimostrano l'utilizzo di base del comando ALTER TABLE. 

## Ridenominazione di una tabella o una vista
<a name="r_ALTER_TABLE_examples_basic-rename-a-table"></a>

Il seguente comando rinomina la tabella USERS in USERS\$1BKUP: 

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

 Puoi anche usare questo tipo di comando per rinominare una vista. 

## Modifica del proprietario di una tabella o di una vista
<a name="r_ALTER_TABLE_examples_basic-change-the-owner-of-a-table-or-view"></a>

Il seguente comando modifica il proprietario della tabella VENUE nell'utente DWUSER: 

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

I seguenti comandi creano una vista, quindi cambiano il suo proprietario: 

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

## Ridenominazione di una colonna
<a name="r_ALTER_TABLE_examples_basic-rename-a-column"></a>

Il seguente comando rinomina la colonna VENUESEATS della tabella VENUE in VENUESIZE: 

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

## Rimozione del vincolo di una tabella
<a name="r_ALTER_TABLE_examples_drop-constraint"></a>

Per eliminare un vincolo di tabella, ad esempio una chiave primaria, una chiave esterna o un vincolo univoco, individua innanzitutto il nome interno del vincolo. Poi specifica il nome del vincolo nel comando ALTER TABLE. L'esempio seguente trova i vincoli per la tabella CATEGORY, quindi rimuove la chiave primaria con il 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;
```

## Modificare una colonna VARCHAR
<a name="r_ALTER_TABLE_examples_alter-column"></a>

Per preservare lo storage, è possibile definire una tabella inizialmente con colonne VARCHAR con la dimensione minima necessaria per i requisiti di dati attuali. Successivamente, per utilizzare stringhe più lunghe, è possibile modificare la tabella per aumentare le dimensioni della colonna. 

L'esempio seguente aumenta le dimensioni della colonna EVENTNAME in VARCHAR(300). 

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

## Modificare una colonna VARBYTE
<a name="r_ALTER_TABLE_examples_alter-varbyte-column"></a>

Per preservare l’archiviazione, puoi definire una tabella inizialmente con colonne VARBYTE con la dimensione minima necessaria per i requisiti di dati attuali. Successivamente, per utilizzare stringhe più lunghe, è possibile modificare la tabella per aumentare le dimensioni della colonna. 

L’esempio seguente aumenta le dimensioni della colonna EVENTNAME in VARBYTE(300). 

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

## Modifica della codifica di compressione per una colonna
<a name="r_ALTER_TABLE_examples_alter-column-encoding"></a>

È possibile modificare la codifica di compressione di una colonna. Di seguito è riportata una serie di esempi che dimostrano questo approccio. La definizione di tabella per questi esempi è come segue.

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

L'istruzione seguente modifica la codifica di compressione per la colonna c0 dalla codifica LZO alla codifica. AZ64 

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

L'istruzione seguente modifica la codifica di compressione per la colonna c1 dalla codifica Zstandard alla codifica. AZ64 

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

La seguente istruzione modifica la codifica di compressione per la colonna c2 dalla codifica LZO alla codifica Byte-Dictionary. 

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

La seguente istruzione modifica la codifica di compressione per la colonna c3 dalla codifica Zstandard alla codifica Runlength. 

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

## Modificare una colonna DISTSTYLE KEY DISTKEY
<a name="r_ALTER_TABLE_examples_alter-distkey"></a>

I seguenti esempi mostrano come modificare DISTSTYLE e DISTKEY di una tabella.

Crea una tabella con stile di distribuzione EVEN. La vista SVV\$1TABLE\$1INFO mostra che 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
```

Modificare la tabella DISTKEY in `inv_warehouse_sk`. La vista SVV\$1TABLE\$1INFO mostra la colonna `inv_warehouse_sk` come chiave di distribuzione risultante. 

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

select "table", "diststyle" from svv_table_info;

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

Modificare la tabella DISTKEY in `inv_item_sk`. La vista SVV\$1TABLE\$1INFO mostra la colonna `inv_item_sk` come chiave di distribuzione risultante. 

```
alter table inventory alter distkey inv_item_sk;

select "table", "diststyle" from svv_table_info;

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

## Modificare una tabella in DISTSTYLE ALL
<a name="r_ALTER_TABLE_examples_alter-diststyle-all"></a>

Gli esempi seguenti mostrano come modificare una tabella in DISTSTYLE ALL.

Crea una tabella con stile di distribuzione EVEN. La vista SVV\$1TABLE\$1INFO mostra che 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
```

Modificare la tabella DISTSTYLE su ALL. La vista SVV\$1TABLE\$1INFO mostra il DISTSYTLE modificato. 

```
alter table inventory alter diststyle all;

select "table", "diststyle" from svv_table_info;

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

## Modifica una tabella SORTKEY
<a name="r_ALTER_TABLE_examples_alter-sortkey"></a>

È possibile modificare una tabella per avere una chiave di ordinamento composta o nessuna chiave di ordinamento.

Nella seguente definizione della tabella, tabella `t1` è definita con una chiave di ordinamento interlacciata.

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

Il comando seguente modifica la tabella da una chiave di ordinamento interlacciata a una chiave di ordinamento composta.

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

Il comando seguente modifica la tabella per rimuovere la chiave di ordinamento interlacciata.

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

Nella seguente definizione della tabella, tabella `t1` è definita con una colonna `c0` come chiave di ordinamento.

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

Il comando seguente modifica la tabella `t1` in una chiave di ordinamento composta.

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

## Modifica di una tabella in ENCODE AUTO
<a name="r_ALTER_TABLE_examples_alter-encode-auto"></a>

L'esempio seguente mostra come modificare una tabella in ENCODE AUTO. 

La definizione di tabella per questo esempio è come segue. `c0`La colonna è definita con il tipo di codifica e la colonna `c1` è definita con il tipo di AZ64 codifica LZO.

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

Per questa tabella, l'istruzione seguente modifica la codifica in AUTO.

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

L'esempio seguente mostra come modificare una tabella per rimuovere l'impostazione ENCODE AUTO. 

La definizione di tabella per questo esempio è come segue. Le colonne della tabella sono definite senza codifica. In questo caso, la codifica predefinita è ENCODE AUTO.

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

Per questa tabella, la seguente istruzione modifica la codifica della colonna c0 in LZO. La codifica della tabella non è più impostata su ENCODE AUTO.

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

## Modifica del controllo della sicurezza a livello di riga
<a name="r_ALTER_TABLE_examples_basic-rls"></a>

Il seguente comando disattiva RLS per la tabella: 

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

Il seguente comando disattiva RLS (sicurezza a livello di riga) per la tabella: 

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

Il seguente comando attiva RLS per la tabella e la rende accessibile nell'unità di condivisione dati: 

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

Il seguente comando attiva RLS per la tabella e la rende inaccessibile nell'unità di condivisione dati: 

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

Il seguente comando attiva RLS e imposta il tipo di combinazione RLS su OR per la tabella: 

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

Il seguente comando attiva RLS e imposta il tipo di combinazione RLS su AND per la tabella: 

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

# Esempi per alterare la tabella esterna
<a name="r_ALTER_TABLE_external-table"></a>

I seguenti esempi utilizzano un bucket Amazon S3 situato nella regione Stati Uniti orientali (Virginia settentrionale) (`us-east-1`) Regione AWS e le tabelle di esempio create in [Esempi](r_CREATE_EXTERNAL_TABLE_examples.md) CREATE TABLE. Per ulteriori informazioni su come utilizzare le partizioni con tabelle esterne, consulta [Partizionamento delle tabelle esterne di Redshift Spectrum](c-spectrum-external-tables.md#c-spectrum-external-tables-partitioning). 

L'esempio seguente imposta la proprietà della tabella numRows per la tabella esterna SPECTRUM.SALES su 170.000 righe.

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

L'esempio seguente modifica la posizione della tabella esterna SPECTRUM.SALES.

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

L'esempio seguente modifica il formato della tabella esterna SPECTRUM.SALES in Parquet.

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

L'esempio seguente aggiunge una partizione per la tabella 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/';
```

L'esempio seguente aggiunge tre partizioni per la tabella 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/';
```

L'esempio seguente altera SPECTRUM.SALES\$1PART per eliminare la partizione con `saledate='2008-01-01''`.

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

L'esempio seguente imposta un nuovo percorso Amazon S3 per la partizione con `saledate='2008-01-01'`.

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

L'esempio seguente cambia il nome di `sales_date` in `transaction_date`. 

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

Il seguente esempio imposta la mappatura della colonna sulla mappatura in base alla posizione per una tabella esterna che utilizza il formato ORC (optimized row columnar).

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

Il seguente esempio imposta la mappatura della colonna sulla mappatura del nome per una tabella esterna che utilizza il formato ORC (optimized row columnar).

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

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

I seguenti esempi mostrano come usare ALTER TABLE per aggiungere e rimuovere una colonna di base e anche come eliminare una colonna con un oggetto dipendente. 

## ADD e DROP di una colonna di base
<a name="r_ALTER_TABLE_COL_ex-add-then-drop-a-basic-column"></a>

L'esempio seguente aggiunge una colonna autonoma FEEDBACK\$1SCORE alla tabella USERS. Questa colonna contiene semplicemente uninteger e il valore predefinito per questa colonna è NULL (nessun punteggio di feedback). 

Per prima cosa, esegui una query sulla tabella di catalogo PG\$1TABLE\$1DEF per visualizzare lo schema della tabella 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
```

Ora aggiungi la colonna feedback\$1score: 

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

Seleziona la colonna FEEDBACK\$1SCORE da USERS per verificare che sia stata aggiunta: 

```
select feedback_score from users limit 5;

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

Rimuovi la colonna per ripristinare la DDL originale: 

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

## Eliminazione di una colonna con un oggetto dipendente
<a name="r_ALTER_TABLE_COL_ex-dropping-a-column-with-a-dependent-object"></a>

Nell'esempio seguente viene rimossa una colonna che ha un oggetto dipendente. Di conseguenza, anche l'oggetto dipendente viene rimosso. 

Per iniziare, aggiungi nuovamente la colonna FEEDBACK\$1SCORE alla tabella USERS: 

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

Quindi, crea una vista dalla tabella USERS chiamata USERS\$1VIEW: 

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

Ora prova a rimuovere la colonna FEEDBACK\$1SCORE dalla tabella USERS. Questa istruzione DROP utilizza il comportamento predefinito (RESTRICT): 

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

Amazon Redshift visualizza un messaggio di errore indicante che la colonna non può essere rimossa perché un altro oggetto dipende da essa. 

Prova a rimuovere nuovamente la colonna FEEDBACK\$1SCORE, questa volta specificando CASCADE per eliminare tutti gli oggetti dipendenti: 

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

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

Aggiunge le righe a una tabella di destinazione spostando i dati da una tabella di origine esistente. I dati nella tabella di origine vengono spostati nelle colonne corrispondenti della tabella di destinazione. L'ordine delle colonne non ha importanza. Dopo che i dati sono stati aggiunti alla tabella di destinazione, la tabella di origine è vuota. ALTER TABLE APPEND è in genere molto più veloce di un'operazione [CREATE TABLE AS](r_CREATE_TABLE_AS.md) o [INSERT](r_INSERT_30.md) INTO simile in quanto i dati vengono spostati, non duplicati. 

**Nota**  
ALTER TABLE APPEND sposta i blocchi di dati tra la tabella di origine e la tabella di destinazione. Per migliorare le prestazioni, ALTER TABLE APPEND non compatta lo storage come parte dell'operazione di aggiunta. Di conseguenza, l'utilizzo della memoria aumenta temporaneamente. Per recuperare lo spazio, esegui un'operazione [VACUUM](r_VACUUM_command.md).

Le colonne con lo stesso nome devono avere anche attributi di colonna identici. Se la tabella di origine o la tabella di destinazione contiene colonne che non esistono nell'altra tabella, utilizza i parametri IGNOREEXTRA o FILLTARGET per specificare la modalità di gestione delle colonne aggiuntive. 

Non puoi aggiungere una colonna di identità. Se entrambe le tabelle includono una colonna di identità, il comando non riesce. Se solo una tabella ha una colonna di identità, includi il parametro FILLTARGET o IGNOREEXTRA. Per ulteriori informazioni, consulta [Note per l'utilizzo di ALTER TABLE APPEND](#r_ALTER_TABLE_APPEND_usage).

Puoi aggiungere una colonna GENERATED BY DEFAULT AS IDENTITY. Puoi aggiornare colonne definite come GENERATED BY DEFAULT AS IDENTITY con i valori forniti. Per ulteriori informazioni, consulta [Note per l'utilizzo di ALTER TABLE APPEND](#r_ALTER_TABLE_APPEND_usage). 

La tabella di destinazione deve essere una tabella permanente. Tuttavia, l'origine può essere una tabella permanente o una vista materializzata configurata per l'importazione di dati in streaming. Entrambe le tabelle devono utilizzare lo stesso stile di distribuzione e la stessa chiave di distribuzione, se ne è stata definita una. Se gli oggetti sono ordinati, entrambi gli oggetti devono utilizzare lo stesso stile di ordinamento e definire le stesse colonne come chiavi di ordinamento.

Un comando ALTER TABLE APPEND automaticamente esegue il commit al completamento dell'operazione. Non è possibile eseguire il rollback. Non è possibile eseguire ALTER TABLE APPEND all'interno di un blocco di transazioni (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

## Privilegi richiesti
<a name="r_ALTER_TABLE_APPEND-privileges"></a>

A seconda del comando ALTER TABLE APPEND, è richiesto uno dei seguenti privilegi:
+ Superuser
+ Utenti con il privilegio di sistema ALTER TABLE
+ Utenti con privilegi DELETE e SELECT sulla tabella di origine e privilegi INSERT sulla tabella di destinazione

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

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

L'aggiunta da una vista materializzata funziona solo nel caso in cui la vista materializzata sia configurata per [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md).

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

 *target\$1table\$1name*   
Il nome della tabella a cui vengono aggiunte le righe. Specifica solo il nome della tabella o utilizzare il formato *schema\$1name.table\$1name* per utilizzare uno schema specifico. La tabella di destinazione deve essere una tabella permanente esistente.

 FROM *source\$1table\$1name*   
Il nome della tabella che fornisce le righe da aggiungere. Specifica solo il nome della tabella o utilizzare il formato *schema\$1name.table\$1name* per utilizzare uno schema specifico. La tabella di origine deve essere una tabella permanente esistente.

 FROM *source\$1materialized\$1view\$1name*   
Il nome di una vista materializzata che fornisce le righe da aggiungere. L'aggiunta da una vista materializzata funziona solo nel caso in cui la vista materializzata sia configurata per [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md). La vista materializzata di origine deve esistere già. 

IGNOREEXTRA   
Parola chiave che specifica che se la tabella di origine include colonne che non sono presenti nella tabella di destinazione, i dati nelle colonne aggiuntive devono essere eliminati. Non puoi usare IGNOREEXTRA con FILLTARGET. 

FILLTARGET   
Parola chiave che specifica che se la tabella di origine include colonne che non sono presenti nella tabella di origine, le colonne devono contenere il valore di colonna [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) se definito, altrimenti NULL. Non puoi usare IGNOREEXTRA con FILLTARGET. 

## Note per l'utilizzo di ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND_usage"></a>
+ ALTER TABLE APPEND sposta solo colonne identiche dalla tabella di origine alla tabella di destinazione. L'ordine delle colonne non ha importanza. 
+  Se la tabella di origine o le tabelle di destinazione contengono colonne aggiuntive, utilizza FILLTARGET o IGNOREEXTRA in base alle seguenti regole: 
  + Se la tabella di origine contiene colonne che non esistono nella tabella di destinazione, includi IGNOREEXTRA. Il comando ignora le colonne aggiuntive nella tabella di origine.
  + Se la tabella di destinazione contiene colonne che non esistono nella tabella di origine, includi FILLTARGET. Il comando inserisce nelle colonne aggiuntive della tabella di destinazione il valore di colonna predefinito o il valore IDENTITY se definito, altrimenti NULL.
  + Se sia la tabella di origine che la tabella di destinazione contengono colonne aggiuntive, il comando non riesce. Non puoi usare entrambi FILLTARGET e IGNOREEXTRA. 
+ Se una colonna con lo stesso nome ma attributi diversi esiste in entrambe le tabelle, il comando non riesce. Le colonne con nome simile devono avere i seguenti attributi in comune: 
  + Tipo di dati
  + Dimensione colonna
  + Codifica di compressione
  + Non null
  + Stile di ordinamento
  + Colonne con chiave di ordinamento
  + Stile di distribuzione
  + Colonne con chiave di distribuzione
+ Non puoi aggiungere una colonna di identità. Se sia la tabella di origine che la tabella di destinazione hanno colonne di identità, il comando non riesce. Se solo la tabella di origine ha una colonna di identità, includi il parametro IGNOREEXTRA in modo che la colonna di identità venga ignorata. Se solo la tabella di destinazione ha una colonna Identity, includi il parametro FILLTARGET in modo che la colonna di identità venga compilata in base alla clausola IDENTITY definita per la tabella. Per ulteriori informazioni, consulta [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default). 
+ Puoi aggiungere una colonna di identità predefinita con l'istruzione ALTER TABLE APPEND. Per ulteriori informazioni, consulta [CREATE TABLE](r_CREATE_TABLE_NEW.md). 
+ Le operazioni ALTER TABLE APPEND mantengono blocchi esclusivi quando vengono eseguite sulle viste materializzate in streaming di Amazon Redshift connesse a uno dei seguenti elementi:
  +  Un flusso di dati Amazon Kinesis 
  +  Un argomento Streaming gestito da Amazon per Apache Kafka 
  +  Un flusso esterno supportato, ad esempio un argomento Confluent Cloud Kafka 

  Per ulteriori informazioni, consulta [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md).

## Esempi di ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND_examples"></a>

Supponiamo che la tua organizzazione mantenga una tabella, SALES\$1MONTHLY, per acquisire le transazioni di vendita correnti. Vuoi spostare i dati dalla tabella delle transazioni alla tabella SALES, ogni mese. 

Puoi utilizzare i seguenti comandi INSERT INTO e TRUNCATE per eseguire l'operazione. 

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

Tuttavia, puoi eseguire la stessa operazione in modo molto più efficiente utilizzando il comando ALTER TABLE APPEND. 

Innanzitutto, eseguire una query sulla tabella del catalogo di sistema [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md) per verificare che entrambe le tabelle abbiano le stesse colonne con attributi di colonna identici. 

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

Quindi, guarda le dimensioni di ogni tabella.

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

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

Ora esegui il seguente comando ALTER TABLE APPEND.

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

Guarda di nuovo le dimensioni di ogni tabella. La tabella SALES\$1MONTHLY ora ha 0 righe e la tabella SALES è cresciuta di 2000 righe.

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

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

Se la tabella di origine ha più colonne della tabella di destinazione, specifica il parametro IGNOREEXTRA. L'esempio seguente utilizza il parametro IGNOREEXTRA per ignorare le colonne aggiuntive nella tabella SALES\$1LISTING quando si accede alla tabella SALES.

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

Se la tabella di destinazione ha più colonne della tabella di origine, specifica il parametro FILLTARGET. L'esempio seguente utilizza il parametro FILLTARGET per popolare le colonne nella tabella SALES\$1REPORT che non esistono nella tabella SALES\$1MONTH.

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

L'esempio seguente mostra un esempio di come utilizzare ALTER TABLE APPEND con una vista materializzata come origine.

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

I nomi delle tabelle e delle viste materializzate in questo esempio sono esempi. L'aggiunta da una vista materializzata funziona solo nel caso in cui la vista materializzata sia configurata per [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md). Sposta tutti i record della vista materializzata di origine in una tabella di destinazione con lo stesso schema della vista materializzata e lascia intatta la vista materializzata. Si tratta dello stesso comportamento di quando l'origine dei dati è una tabella.

# MODIFICA MODELLO
<a name="r_ALTER_TEMPLATE"></a>

Modifica la definizione di un modello esistente. Utilizzate questo comando per rinominare un modello, modificare il proprietario di un modello, aggiungere o rimuovere parametri dalla definizione del modello o impostare i valori dei parametri.

## Privilegi richiesti
<a name="r_ALTER_TEMPLATE-privileges"></a>

Per modificare un modello, è necessario disporre di una delle seguenti opzioni:
+ Privilegi di superutente
+ Privilegio ALTER TEMPLATE e privilegio USAGE sullo schema contenente il modello

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

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

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

 *database\$1name*   
(Facoltativo) Il nome del database in cui viene creato il modello. Se non viene specificato, viene utilizzato il database corrente. 

 *schema\$1name*   
(Facoltativo) Il nome dello schema in cui viene creato il modello. Se non viene specificato, il modello viene cercato nel percorso di ricerca corrente. 

 *nome\$1modello*   
Il nome del modello da modificare. 

RENAME TO   
Una clausola che rinomina il modello. 

 *new\$1name*   
Il nuovo nome del modello. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md). 

OWNER TO   
Una clausola che modifica il proprietario del modello. 

 *new\$1owner*   
Il nuovo proprietario del modello. 

*PARAMETRO* ADD [AS] [*valore*]  
Aggiunge un nuovo parametro al modello.  
+ Per i parametri relativi solo alle parole chiave (come CSV o GZIP), specifica solo il nome del parametro.
+ Per i parametri che richiedono valori, specificate il nome del parametro seguito dal valore. Facoltativamente, puoi includere AS tra il parametro e il valore. 

*Parametro DROP*  
Rimuove il parametro specificato dal modello. Non è possibile eliminare più parametri con un solo comando DROP.

*IMPOSTA *il parametro* SU *value1* [, *parameter2 SU value2*,...]*  
Aggiorna i valori dei parametri del modello esistenti. Utilizzalo solo per i parametri che hanno già dei valori. È possibile aggiornare più parametri con un unico comando.

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

L'esempio seguente rinomina il modello test\$1template in demo\$1template.

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

L'esempio seguente assegna la proprietà dello schema demo\$1template all'utente bob.

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

L'esempio seguente aggiunge un parametro `CSV` al template demo\$1template

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

L'esempio seguente aggiunge un parametro `TIMEFORMAT 'auto'` al modello demo\$1template

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

L'esempio seguente elimina il parametro `ENCRYPTED` dal modello demo\$1template

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

L'esempio seguente imposta il `DELIMITER` parametro su `'|'` e il `TIMEFORMAT` parametro su: `'epochsecs'`

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

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

Cambia un utente del database.

## Privilegi richiesti
<a name="r_ALTER_USER-privileges"></a>

Di seguito sono riportati i privilegi richiesti per ALTER USER:
+ Superuser
+ Utenti con il privilegio ALTER USER
+ Utente attuale che desidera modificare la propria password

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

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

where option is

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

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

 *username*   
Nome dell'utente. 

WITH   
Parola chiave facoltativa. 

CREATEDB \$1 NOCREATEDB   
L'opzione CREATEDB consente all'utente di creare nuovi database. NOCREATEDB è il valore predefinito. 

CREATEUSER \$1 NOCREATEUSER   
L'opzione CREATEUSER crea un utente con privilegi avanzati con tutti i privilegi del database, incluso CREATE USER. L'impostazione predefinita è NOCREATEUSER. Per ulteriori informazioni, consulta [Utenti con privilegi avanzati](r_superusers.md).

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="alter-user-syslog-access"></a>
Una clausola che specifica il livello di accesso che l'utente ha per tabelle e viste di sistema di Amazon Redshift.   
Gli utenti normali che dispongono dell’autorizzazione SYSLOG ACCESS RESTRICTED possono visualizzare solo le righe generate da tale utente nelle tabelle e nelle viste di sistema visibili all’utente. Il valore predefinito è RESTRICTED.   
Gli utenti con privilegi normali che dispongono dell’autorizzazione SYSLOG ACCESS UNRESTRICTED possono visualizzare tutte le righe nelle tabelle e nelle viste di sistema visibili all’utente, incluse quelle generate da un altro utente. UNRESTRICTED non fornisce un accesso regolare all'utente alle tabelle visibili agli utenti con privilegi avanzati. Solo gli utenti con privilegi avanzati possono vedere le tabelle visibili agli utenti con privilegi avanzati.   
Concedere all'utente un accesso illimitato alle tabelle di sistema offre all'utente la visibilità dei dati generati da altri utenti. Ad esempio, STL\$1QUERY e STL\$1QUERYTEXT contengono il testo completo delle istruzioni INSERT, UPDATE e DELETE, che potrebbero contenere dati sensibili generati dall'utente. 
Tutte le righe in SVV\$1TRANSACTIONS sono visibili per tutti gli utenti.   
Per ulteriori informazioni, consulta [Visibilità dei dati nelle tabelle e nelle viste di sistema](cm_chap_system-tables.md#c_visibility-of-data).

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
Imposta la password dell'utente.   
Per impostazione predefinita, gli utenti possono modificare le proprie password, a meno che la password non sia disabilitata. Per disabilitare la password di un utente, specifica DISABLE. Quando la password di un utente è disabilitata, la password viene eliminata dal sistema e l'utente può accedere solo utilizzando credenziali utente temporanee AWS Identity and Access Management (IAM). Per ulteriori informazioni, consultare [Utilizzo dell'autenticazione IAM per generare credenziali utente di database](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html). Solo un utente con privilegi avanzati può abilitare o disabilitare le password. Non puoi disabilitare la password di un utente con privilegi avanzati. Per abilitare una password, esegui ALTER USER e specifica una password.  
Per i dettagli sull'utilizzo del parametro PASSWORD, consultare [CREA UTENTE](r_CREATE_USER.md). 

VALID UNTIL '*expiration\$1date*'   
Specifica che la password ha una data di scadenza. Usa il valore `'infinity'` per evitare di avere una data di scadenza. Il tipo di dati valido per questo parametro è il timestamp.   
Solo gli utenti con privilegi avanzati possono utilizzare questo parametro.

RENAME TO   
Rinomina l'utente. 

 *new\$1name*   
Nuovo nome dell'utente. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).  
Quando rinomini un utente, devi anche reimpostarne la password. La password reimpostata non deve necessariamente essere diversa dalla password precedente. Il nome utente viene utilizzato come parte della crittografia della password, quindi quando un utente viene rinominato, la password viene cancellata. L'utente non sarà in grado di accedere fino a quando la password viene ripristinata. Ad esempio:   

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

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
Numero massimo di connessioni di database che l'utente può aprire contemporaneamente. Il limite non viene applicato per gli utente con privilegi avanzati. Utilizza la parola chiave UNLIMITED per consentire il numero massimo di connessioni simultanee. È possibile che venga applicato anche un limite al numero di connessioni per ciascun database. Per ulteriori informazioni, consulta [CREATE DATABASE](r_CREATE_DATABASE.md). Il valore predefinito è UNLIMITED. Per visualizzare le connessioni correnti, eseguire una query sulla vista di sistema [STV\$1SESSIONS](r_STV_SESSIONS.md).  
Se si applicano entrambi i limiti di connessione utente e database, deve essere disponibile uno slot di connessione inutilizzato che rientra in entrambi i limiti quando un utente tenta di connettersi.

TIMEOUT SESSIONE *limite* \$1 REIMPOSTARE IL TIMEOUT DELLA SESSIONE  
Il tempo massimo (in secondi) in cui una sessione rimane inattiva o inutilizzata. L'intervallo è compreso tra 60 secondi (un minuto) e 1.728.000 secondi (20 giorni). Se per l'utente non è impostato alcun timeout di sessione, verrà applicata l'impostazione del cluster. Per ulteriori informazioni, consulta [Quote e limiti in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) nella *Guida alla gestione di Amazon Redshift*.  
Quando si imposta il timeout della sessione, viene applicato solo alle nuove sessioni.  
Per visualizzare informazioni sulle sessioni utente attive, tra cui l'ora di inizio, il nome utente e il timeout della sessione, eseguire una query sulla vista di sistema [STV\$1SESSIONS](r_STV_SESSIONS.md). Per visualizzare le informazioni sulla cronologia delle sessioni utente, eseguire una query sulla vista [STL\$1SESSIONS](r_STL_SESSIONS.md). Per recuperare informazioni sugli utenti del database, inclusi i valori di timeout della sessione, eseguire una query sulla vista [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md).

SET   
Imposta un parametro di configurazione su un nuovo valore predefinito per tutte le sessioni eseguite dall'utente specificato. 

RESET   
Reimposta un parametro di configurazione sul valore predefinito originale per l'utente specificato. 

 *parameter*   
Nome del parametro da impostare o reimpostare. 

 *value*   
Nuovo valore del parametro. 

DEFAULT   
Imposta il parametro di configurazione sul valore predefinito per tutte le sessioni eseguite dall'utente specificato. 

EXTERNALID *external\$1id*   
L'identificativo dell'utente, associato a un provider di identità. L'utente deve avere la password disabilitata. Per ulteriori informazioni, consulta [Native identity provider (IdP) federation for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html) (Federazione di provider di identità nativi (IdP) per Amazon Redshift).

## Note per l'utilizzo
<a name="r_ALTER_USER_usage_notes"></a>
+ **Tentativo di modificare rdsdb**: non puoi modificare l'utente denominato `rdsdb`.
+ **Creazione di una password sconosciuta**: quando si utilizza l'autenticazione AWS Identity and Access Management (IAM) per creare le credenziali utente del database, è possibile creare un superutente in grado di accedere solo utilizzando credenziali temporanee. Non puoi disabilitare la password di un superutente, ma puoi creare una password sconosciuta utilizzando una stringa hash generata casualmente. MD5 

  ```
  alter user iam_superuser password 'md51234567890123456780123456789012';
  ```
+ **Impostazione di search\$1path**: quando imposti il parametro [search\$1path](r_search_path.md) con il comando ALTER USER, la modifica diventa effettiva all'accesso successivo dell'utente specificato. Se si desidera modificare il valore di search\$1path per l'utente e la sessione correnti, utilizzare un comando SET. 
+ **Impostazione del fuso orario**: quando utilizzi SET TIMEZONE con il comando ALTER USER, la modifica diventa effettiva all'accesso successivo dell'utente specificato.
+ **Utilizzo del mascheramento dinamico dei dati e delle policy di sicurezza a livello di riga**: quando il cluster o lo spazio dei nomi serverless di cui è stato effettuato il provisioning prevede il mascheramento dinamico dei dati o policy di sicurezza a livello di riga, i seguenti comandi sono bloccati per gli utenti normali: 

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

  Solo gli utenti con privilegi avanzati e gli utenti con il privilegio ALTER USER possono impostare queste opzioni di configurazione. Per ulteriori informazioni sulla sicurezza a livello di riga. consulta [Sicurezza a livello di riga](t_rls.md). Per informazioni sul mascheramento dinamico dei dati, consulta [Mascheramento dinamico dei dati](t_ddm.md). 

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

L'esempio seguente concede all'utente ADMIN il privilegio di creare database: 

```
alter user admin createdb;
```

L'esempio seguente imposta la password dell'utente ADMIN su `adminPass9` e imposta una data e un'ora di scadenza per la password: 

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

L'esempio seguente rinomina l'utente il gruppo ADMIN in SYSADMIN: 

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

Nell'esempio seguente il timeout della sessione di inattività per un utente viene aggiornato a 300 secondi.

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

Reimposta il timeout della sessione di inattività dell'utente. Quando si reimposta, viene applicata l'impostazione del cluster. Per eseguire questo comando, è necessario essere un utente con privilegi avanzati del database. Per ulteriori informazioni, consulta [Quote e limiti in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) nella *Guida alla gestione di Amazon Redshift*.

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

Nell'esempio seguente viene aggiornato l'ID esterno di un utente denominato `bob`. Lo spazio dei nomi è `myco_aad`. Se lo spazio dei nomi non è associato a un provider di identità registrato, si verifica un errore.

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

L'esempio seguente imposta il fuso orario per tutte le sessioni eseguite da un utente di database specifico. Modifica il fuso orario per le sessioni successive e non per quella corrente.

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

Nell’esempio seguente viene impostato il numero massimo di connessioni al database che l’utente `bob` è autorizzato a tenere aperte.

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

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

Aggiorna le statistiche della tabella per l'utilizzo da parte del pianificatore di query. 

## Privilegi richiesti
<a name="r_ANALYZE-privileges"></a>

Di seguito sono riportati i privilegi necessari per ANALYZE:
+ Superuser
+ Utenti con il privilegio ANALYZE
+ Proprietario della relazione
+ Proprietario del database con cui è condivisa la tabella

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

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

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

VERBOSE   
Clausola che restituisce i messaggi di informazione sull'avanzamento relativi all'operazione ANALYZE. Questa opzione è utile quando non si specifica una tabella.

 *table\$1name*   
Puoi analizzare tabelle specifiche, incluse le tabelle temporanee. Puoi qualificare la tabella con il nome dello schema. Puoi specificare facoltativamente un table\$1name per analizzare una singola tabella. Non puoi specificare più di un *table\$1name* con una singola istruzione ANALYZE *table\$1name*. Se non si specifichi un valore *nome\$1tabella*, saranno analizzate tutte le tabelle nel database correntemente connesso, comprese le tabelle persistenti nel catalogo di sistema. Amazon Redshift salta l'analisi di una tabella se la percentuale di righe che sono state modificate dall'ultima analisi è inferiore alla soglia di analisi. Per ulteriori informazioni, consulta [Soglia di analisi](#r_ANALYZE-threshold).  
Non è necessario analizzare le tabelle di sistema di Amazon Redshift (tabelle STL e STV).

 *column\$1name*   
Se specifichi un *table\$1name*, puoi anche specificare una o più colonne nella tabella (come un elenco separato da colonne tra parentesi). Se viene specificato un elenco di colonne, vengono analizzate solo le colonne elencate.

 PREDICATE COLUMNS \$1 ALL COLUMNS   
Clausole che indicano se ANALYZE deve includere solo le colonne di predicato. Specifica PREDICATE COLUMNS per analizzare solo le colonne che sono state utilizzate come predicati nelle query precedenti o sono probabili candidati da utilizzare come predicati. Specifica ALL COLUMNS per analizzare tutte le colonne. Il valore predefinito è ALL COLUMNS.   
Una colonna è inclusa nel set di colonne dei predicati se una delle seguenti condizioni è vera:  
+ La colonna è stata utilizzata in una query come parte di un filtro, condizione di join o clausola group by.
+ La colonna è una chiave di distribuzione.
+ La colonna fa parte di una chiave di ordinamento.
Se nessuna colonna è contrassegnata come colonne di predicato, ad esempio perché la tabella non è stata ancora sottoposta a query, tutte le colonne vengono analizzate anche quando viene specificato PREDICATE COLUMNS. Quando ciò accade, Amazon Redshift potrebbe rispondere con un messaggio del tipo No predicate columns found for "». *table-name* Analisi di tutte le colonne. Per ulteriori informazioni sulle colonne di predicato, consultare [Analisi delle tabelle](t_Analyzing_tables.md).

## Note per l'utilizzo
<a name="r_ANALYZE-usage-notes"></a>

Amazon Redshift esegue automaticamente ANALYZE sulle tabelle create con i seguenti comandi: 
+ CREATE TABLE AS
+ CREATE TEMP TABLE AS 
+ SELECT INTO

 Non puoi analizzare una tabella esterna.

Non è necessario eseguire il comando ANALYZE su queste tabelle quando vengono create per la prima volta. Se le modifichi, devi analizzarle come fai per le altre tabelle.

### Soglia di analisi
<a name="r_ANALYZE-threshold"></a>

Per ridurre i tempi di elaborazione e migliorare le prestazioni generali del sistema, Amazon Redshift salta ANALYZE per una tabella se la percentuale di righe che sono state modificate dall'ultima esecuzione del comando ANALYZE è inferiore alla soglia di analisi specificata dal parametro [analyze\$1threshold\$1percent](r_analyze_threshold_percent.md). Per impostazione predefinita, `analyze_threshold_percent` è 10. Per cambiare `analyze_threshold_percent` per la sessione corrente, emettere il comando [SET](r_SET.md). L'esempio seguente cambia `analyze_threshold_percent` sul 20 percento.

```
set analyze_threshold_percent to 20;
```

Per analizzare le tabelle quando è stato modificato solo un piccolo numero di righe, imposta `analyze_threshold_percent` su un numero arbitrariamente piccolo. Ad esempio, se imposti `analyze_threshold_percent` su 0.01, una tabella con 100.000.000 di righe non viene ignorata se sono state modificate almeno 10.000 righe. 

```
set analyze_threshold_percent to 0.01;
```

Se ANALYZE salta una tabella perché non soddisfa la soglia di analisi, Amazon Redshift restituisce il seguente messaggio.

```
ANALYZE SKIP
```

Per analizzare tutte le tabelle anche se non sono state modificate righe, imposta `analyze_threshold_percent` su 0.

Per visualizzare i risultati delle operazioni ANALYZE, eseguire una query della tabella di sistema [STL\$1ANALYZE](r_STL_ANALYZE.md). 

Per ulteriori informazioni sull'analisi delle tabelle, consultare [Analisi delle tabelle](t_Analyzing_tables.md).

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

Analizza tutte le tabelle nel database TICKIT e restituisci le informazioni sull'avanzamento.

```
analyze verbose;
```

Analizza solo la tabella LISTING.

```
analyze listing;
```

Analizza le colonne VENUEID e VENUENAME nella tabella VENUE. 

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

Analizza solo le colonne di predicato della tabella VENUE.

```
analyze venue predicate columns;
```

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

Esegue l'analisi della compressione e produce un rapporto con la codifica di compressione suggerita per le tabelle analizzate. Per ogni colonna, il report include una stima della potenziale riduzione dello spazio su disco rispetto alla codifica RAW.

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

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

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

 *table\$1name*   
Puoi analizzare la compressione di tabelle specifiche, incluse le tabelle temporanee. Puoi qualificare la tabella con il nome dello schema. Puoi specificare facoltativamente un *table\$1name* per analizzare una singola tabella. Se non specifichi un valore *table\$1name*, vengono analizzate tutte le tabelle nel database attualmente connesso. Non puoi specificare più di un *table\$1name* con una singola istruzione ANALYZE COMPRESSION.

 *column\$1name*   
Se specifichi un *table\$1name*, puoi anche specificare una o più colonne nella tabella (come un elenco separato da colonne tra parentesi).

COMPROWS  
Numero di righe da utilizzare come dimensione del campione per l'analisi della compressione. L'analisi viene eseguita su righe da ciascuna sezione di dati. Ad esempio, se specifichi COMPROWS 1000000 (1.000.000) e il sistema contiene 4 sezioni totali, vengono lette e analizzate non più di 250.000 righe per sezione. Se COMPROWS non è specificato, la dimensione del campione è impostata su 100.000 per sezione. I valori di COMPROWS inferiori al valore predefinito di 100.000 righe per sezione vengono automaticamente aggiornati al valore predefinito. Tuttavia, l'analisi della compressione non produce raccomandazioni se la quantità di dati nella tabella è insufficiente per produrre un campione significativo. Se il numero COMPROWS è maggiore del numero di righe nella tabella, il comando ANALYZE COMPRESSION procede comunque ed esegue l'analisi della compressione su tutte le righe disponibili. L’utilizzo di COMPROWS genera un errore se non è specificata una tabella.

 *numrows*   
Numero di righe da utilizzare come dimensione del campione per l'analisi della compressione. L'intervallo accettato per *numrows* è un numero compreso tra 1000 e 1000000000 (1.000.000.000).

## Note per l'utilizzo
<a name="r_ANALYZE_COMPRESSION_usage_notes"></a>

ANALYZE COMPRESSION acquisisce un blocco di tabella esclusivo che impedisce letture e scritture simultanee nella tabella. Esegui il comando ANALYZE COMPRESSION solo quando la tabella è inattiva.

Esegui ANALYZE COMPRESSION per ottenere consigli per schemi di codifica delle colonne, basati su un campione dei contenuti della tabella. ANALYZE COMPRESSION è uno strumento di consulenza e non modifica le codifiche delle colonne della tabella. La codifica suggerita può essere applicata ricreando la tabella o creando una nuova tabella con lo stesso schema. Ricreare una tabella non compressa con schemi di codifica appropriati può ridurre significativamente il footprint su disco. Questo approccio consente di risparmiare spazio su disco e migliora le prestazioni delle query per i carichi di lavoro associati all'I/O.

ANALYZE COMPRESSION salta la fase di analisi effettiva e restituisce direttamente il tipo di codifica originale su qualsiasi colonna designata come SORTKEY. Lo fa perché le scansioni con limiti di intervallo potrebbero funzionare male quando le colonne SORTKEY sono molto più compresse di altre colonne.

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

L'esempio seguente mostra la codifica e la riduzione percentuale stimata per le colonne solo nella tabella 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
```

L'esempio seguente analizza le colonne QTYSOLD, COMMISSION e SALETIME nella tabella 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>

Collega una policy di mascheramento dinamico dei dati esistente a una colonna. Per ulteriori informazioni sul mascheramento dinamico dei dati, consulta [Mascheramento dinamico dei dati](t_ddm.md).

Una policy di mascheramento può essere collegata da utenti con privilegi avanzati e da utenti o ruoli che dispongono del ruolo sys:secadmin.

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

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

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

*nome\$1policy*   
Nome della policy di mascheramento da collegare.

database\$1name  
Il nome del database in cui vengono create la politica e la relazione. La politica e la relazione devono trovarsi sullo stesso database. Il database può essere il database connesso o un database che supporta le autorizzazioni federate di Amazon Redshift.

schema\$1name  
Il nome dello schema a cui appartiene la relazione.

 *relation\$1name*   
Il nome della relazione a cui collegare la politica di mascheramento.

*output\$1column\$1names*   
INmi delle colonne a cui verrà applicata la policy di mascheramento.

*output\$1paths*   
Il percorso completo dell'oggetto SUPER a cui viene applicata la politica di mascheramento, incluso il nome della colonna. Ad esempio, per una relazione con una colonna di tipo SUPER denominata `person`, *output\$1path* può essere `person.name.first_name`. 

*input\$1column\$1names*   
Nomi delle colonne che la policy di mascheramento utilizzerà come input. Questo parametro è facoltativo. Se non specificato, la politica di mascheramento utilizza come input *output\$1column\$1names*.

*input\$1paths*   
Il percorso completo dell'oggetto SUPER che la politica di mascheramento utilizza come input. Questo parametro è facoltativo. Se non specificato, la politica di mascheramento utilizza come input *output\$1path*.

*user\$1name*   
Nome dell'utente a cui verrà collegata la policy di mascheramento. Non è possibile collegare due politiche alla stessa combinazione di utente e colonna oppure ruolo e colonna. È possibile collegare una policy a un utente e un'altra policy al ruolo dell'utente. In questo caso, si applica la policy con la priorità più alta.  
È possibile impostare solo uno tra user\$1name, role\$1name e PUBLIC in un singolo comando ATTACH MASKING POLICY. 

*role\$1name*   
Nome del ruolo a cui verrà collegata la policy di mascheramento. Non è possibile allegare due politiche alla stessa column/role coppia. È possibile collegare una policy a un utente e un'altra policy al ruolo dell'utente. In questo caso, si applica la policy con la priorità più alta.  
È possibile impostare solo uno tra user\$1name, role\$1name e PUBLIC in un singolo comando ATTACH MASKING POLICY. 

*PUBLIC*   
Collega la policy di mascheramento a tutti gli utenti che accedono alla tabella. Affinché vengano applicate, è necessario assegnare alle altre politiche di mascheramento allegate a specifiche column/user o column/role coppie una priorità maggiore rispetto alla politica PUBLIC.  
È possibile impostare solo uno tra user\$1name, role\$1name e PUBLIC in un singolo comando ATTACH MASKING POLICY. 

*priority*   
La priorità della policy di mascheramento. Quando si applicano più policy di mascheramento alla query di un determinato utente, si applica la policy con la massima priorità.  
Non è possibile collegare due politiche diverse alla stessa colonna con la medesima priorità, anche se sono collegate a utenti o ruoli diversi. È possibile collegare la stessa politica più volte allo stesso set di tabella, colonna di output, colonna di input e parametri di priorità, purché l'utente o il ruolo a cui si riferisce la politica ogni volta sia diverso.   
Non è possibile applicare una policy a una colonna con la stessa priorità di un'altra policy associato a quella colonna, anche se si tratta di ruoli diversi. Questo campo è facoltativo. Se non si specifica una priorità, per impostazione predefinita la policy di mascheramento prevede l'associazione con una priorità pari a 0.

Per l'utilizzo di ATTACH MASKING POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di 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>

Collegamento di una policy di sicurezza a livello di riga su una tabella a uno o più utenti o ruoli.

Una policy può essere collegata da superuser e utenti o ruoli che dispongono del ruolo `sys:secadmin`.

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

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

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

 *nome\$1policy*   
Il nome della policy .

database\$1name  
Il nome del database in cui vengono create la politica e la relazione. La politica e la relazione devono trovarsi sullo stesso database. Il database può essere il database connesso o un database che supporta le autorizzazioni federate di Amazon Redshift.

schema\$1name  
Il nome dello schema a cui appartiene la relazione.

table\$1name  
La relazione a cui è collegata la policy di sicurezza a livello di riga.

TO \$1 *nome\$1utente* \$1 ROLE *nome\$1ruolo* \$1 PUBLIC\$1 [, ...]  
Specifica se la policy è collegata a uno o più utenti o ruoli specificati. 

Per l'utilizzo di ATTACH RLS POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Note per l'utilizzo
<a name="r_ATTACH_RLS_POLICY-usage"></a>

Quando lavori con l'istruzione ATTACH RLS POLICY, tieni presente quanto segue:
+ La tabella che viene collegata deve contenere tutte le colonne elencate nella clausola WITH dell'istruzione di creazione della policy.
+ Amazon Redshift RLS non supporta il collegamento di policy RLS ai seguenti oggetti:
  +  Tabelle 
  +  Visualizzazioni
  +  Viste con associazione tardiva 
  +  Viste materializzate
+ Amazon Redshift RLS non supporta il collegamento di policy RLS ai seguenti oggetti:
  +  Tabelle del catalogo 
  +  Relazioni tra database 
  +  Tabelle esterna 
  +  Tabelle temporanee 
  +  Tabelle di ricerca delle policy
  + Tabelle di base di viste materializzate
+ Le policy RLS collegate a utenti con privilegi avanzati o utenti con l’autorizzazione `sys:secadmin` vengono ignorate.

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

Nell’esempio seguente una policy RLS viene collegata alla tabella e alle combinazioni di ruoli specificate. La policy RLS si applica a tutti gli utenti con il ruolo `analyst` o `dbadmin` quando accedono alla tabella tickit\$1category\$1redshift.

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

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

Inizia una transazione. Sinonimo di START TRANSACTION.

Una transazione è una singola unità logica di lavoro composta da uno o più comandi. In generale, tutti i comandi in una transazione vengono eseguiti in uno snapshot del database la cui ora di inizio è determinata dal valore impostato per il parametro di configurazione del sistema `transaction_snapshot_begin`.

Per impostazione predefinita, le singole operazioni Amazon Redshift (query, istruzioni DDL, caricamenti) vengono sottoposte automaticamente al commit nel database. Se vuoi sospendere il commit per un'operazione fino al completamento del lavoro successivo, è necessario aprire una transazione con l'istruzione BEGIN, quindi eseguire i comandi richiesti e chiudere la transazione con un'istruzione [COMMIT](r_COMMIT.md) o [END](r_END.md). Se necessario, è possibile utilizzare un'istruzione [ROLLBACK](r_ROLLBACK.md) per interrompere una transazione in corso. Un'eccezione a questo comportamento è costituita dal comando [TRUNCATE](r_TRUNCATE.md) che esegue il commit della transazione in cui viene eseguito e non può essere sottoposto al rollback.

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

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

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

Where option is

SERIALIZABLE
| READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ

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

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

WORK   
Parola chiave facoltativa.

TRANSACTION   
Parola chiave facoltativa; WORK e TRANSACTION sono sinonimi.

ISOLATION LEVEL SERIALIZABLE   
L'isolamento serializzabile è supportato per impostazione predefinita, quindi il comportamento della transazione è lo stesso indipendentemente dal fatto che questa sintassi sia inclusa nell'istruzione. Per ulteriori informazioni, consulta [Gestione delle operazioni di scrittura simultanee](c_Concurrent_writes.md). Non sono supportate altri livelli di isolamento.  
Lo standard SQL definisce quattro livelli di isolamento della transazione per impedire *letture modificate* (in cui una transazione legge i dati scritti da una transazione concorrente non impegnata), *letture non ripetibili* (in cui una transazione rilegge i dati letti in precedenza e trova che i dati sono stati modificati da un'altra transazione che ha eseguito il commit dalla lettura iniziale) e *letture fantasma* (in cui una transazione esegue nuovamente una query, restituisce un set di righe che soddisfa una condizione di ricerca e poi trova che il set di righe è cambiato a causa di un'altra transazione recentemente sottoposta al commit):  
+ Lettura non sottoposta al commit: sono possibili letture modificate, letture non ripetibili e letture fantasma.
+ Lettura sottoposta al commit: sono possibili letture non ripetibili e letture fantasma.
+ Lettura ripetibile: sono possibili letture fantasma.
+ Serializzabile: impedisce letture modificate, letture non ripetibili e letture fantasma.
Sebbene sia possibile utilizzare uno qualsiasi dei quattro livelli di isolamento della transazione, Amazon Redshift elabora tutti i livelli di isolamento come serializzabili.

READ WRITE   
Fornisce le autorizzazioni di lettura e scrittura alla transazione.

READ ONLY   
Fornisce solo le autorizzazioni di lettura alla transazione.

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

L'esempio seguente avvia un blocco di transazione serializzabile: 

```
begin;
```

L'esempio seguente avvia il blocco di transazione con un livello di isolamento serializzabile e le autorizzazioni di lettura e scrittura: 

```
begin read write;
```

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

Esegue una procedura archiviata. Il comando CALL deve includere il nome della procedura e i valori dell'argomento di input. Per chiamare una procedura archiviata, utilizza l'istruzione CALL.

**Nota**  
CALL non può fare parte di alcuna query normale.

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

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

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

 *sp\$1name*   
Il nome della procedura da eseguire. 

 *argument*   
Il valore dell'argomento di input. Questo parametro può essere anche un nome di funzione, ad esempio `pg_last_query_id()`. Non puoi utilizzare le query come argomenti CALL. 

## Note per l'utilizzo
<a name="r_CALL_procedure-usage-notes"></a>

Le procedure archiviate di Amazon Redshift supportano le chiamate nidificate e ricorsive, come descritto di seguito. Inoltre, assicurati che il supporto del tuo autista sia up-to-date descritto di seguito.

**Topics**
+ [Chiamate nidificate](#r_CALL_procedure-nested-calls)
+ [Supporto driver](#r_CALL_procedure-driver-support)

### Chiamate nidificate
<a name="r_CALL_procedure-nested-calls"></a>

Le procedure archiviate di Amazon Redshift supportano le chiamate nidificate e ricorsive. Il numero massimo consentito di livelli di nidificazione è 16. Le chiamate nidificate possono incapsulare la logica di business in procedure più piccole, condivisibili da più intermediari. 

Se chiami una procedura nidificata che dispone di parametri di output, la procedura interna deve definire argomenti INOUT. In questo caso, la procedura interna viene trasmessa a una variabile non costante. Gli argomenti OUT non sono consentiti. Questo comportamento si verifica in quanto una variabile è necessaria per mantenere l'output di una chiamata interna.

La relazione tra procedure interne ed esterne è registrata nella colonna `from_sp_call` di [SVL\$1STORED\$1PROC\$1CALL](r_SVL_STORED_PROC_CALL.md). 

L'esempio seguente mostra la trasmissione di variabili a una chiamata di procedura nidificata tramite argomenti 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)
```

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

È consigliabile aggiornare i driver Java Database Connectivity (JDBC) e Open Database Connectivity (ODBC) alla versione più recente che dispone del supporto per le procedure archiviate di Amazon Redshift. 

Se lo strumento del tuo client utilizza le operazioni API che trasmettono al server tramite l'istruzione CALL, devi essere in grado di utilizzare il driver esistente. Se esistenti, i parametri di output vengono restituiti come insieme di risultati di una riga. 

Le versioni più recenti dei driver JDBC e ODBC di Amazon Redshift dispongono del supporto dei metadati per il rilevamento delle procedure archiviate. oltre che del supporto `CallableStatement` per le applicazioni Java personalizzate. Per ulteriori informazioni sui driver, consulta [Connessione a un cluster Amazon Redshift tramite gli strumenti del client SQL](https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-to-cluster.html) nella *Guida alla gestione di Amazon Redshift*. 

Gli esempi seguenti mostrano come utilizzare operazioni API diverse del driver JDBC per le chiamate delle procedure archiviate.

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

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

L'esempio seguente chiama il nome della procedura `test_spl`.

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

L'esempio seguente chiama il nome della procedura `test_spl2`.

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

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

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

Annulla una query del database attualmente in esecuzione.

Il comando CANCEL richiede l’ID processo o l’ID sessione della query in esecuzione e visualizza un messaggio di conferma per verificare che la query sia stata annullata.

## Privilegi richiesti
<a name="r_CANCEL-privileges"></a>

Di seguito sono riportati i privilegi richiesti per CANCEL:
+ Utente con privilegi avanzati che annulla la propria query
+ Utente con privilegi avanzati che annulla la query di un utente
+ Utenti con il privilegio CANCEL che annulla la query di un utente
+ Utente che annulla la propria query

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

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

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

 *process\$1id*   
Per annullare una query in esecuzione in un cluster Amazon Redshift, utilizza `pid` (ID processo) di [STV\$1RECENTS](r_STV_RECENTS.md) corrispondente alla query da annullare.  
Per annullare una query in esecuzione in un gruppo di lavoro Amazon Redshift serverless, utilizza `session_id` di [SYS\$1QUERY\$1HISTORY](SYS_QUERY_HISTORY.md) corrispondente alla query da annullare.

'*message*'   
Messaggio di conferma facoltativo che viene visualizzato al termine dell'annullamento della query. Se non si specifica un messaggio, Amazon Redshift visualizza il messaggio predefinito come verifica. È necessario racchiudere il messaggio tra virgolette singole.

## Note per l'utilizzo
<a name="r_CANCEL-usage-notes"></a>

Non puoi annullare una query specificando un *ID query*. Devi specificare l’*ID processo* (PID) o l’*ID sessione* della query. Puoi annullare solo le query attualmente eseguite dall'utente. Gli utenti con privilegi avanzati possono annullare tutte le query.

Se le query in più sessioni contengono blocchi sulla stessa tabella, è possibile utilizzare la funzione [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md) per terminare una delle sessioni. Questa operazione forza qualsiasi transazione attualmente in esecuzione nella sessione terminata al fine di rilasciare tutti i blocchi ed eseguire il rollback della transazione. Per visualizzare i blocchi correnti, eseguire una query sulla tabella di sistema [STV\$1LOCKS](r_STV_LOCKS.md). 

Seguendo determinati eventi interni, Amazon Redshift può riavviare una sessione attiva e assegnare un nuovo PID. Se il PID è cambiato, è possibile che venga ricevuto il seguente messaggio di errore:

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

Per trovare il nuovo PID, eseguire una query sulla tabella di sistema [STL\$1RESTARTED\$1SESSIONS](r_STL_RESTARTED_SESSIONS.md) e filtrare la colonna `oldpid`.

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

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

Per annullare una query attualmente in esecuzione in un cluster Amazon Redshift, recupera prima l’ID processo della query da annullare. Per determinare il processo IDs per tutte le query attualmente in esecuzione, digitate il seguente 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);
```

Controlla il testo della query per determinare quale ID processo (PID) corrisponde alla query che vuoi annullare.

Digita il seguente comando per utilizzare PID 802 per annullare quella query: 

```
cancel 802;
```

La sessione in cui è stata eseguita la query visualizza il seguente messaggio: 

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

dove `168` è l'ID query (non l'ID processo utilizzato per annullare la query).

In alternativa, puoi specificare un messaggio di conferma personalizzato da visualizzare al posto del messaggio predefinito. Per specificare un messaggio personalizzato, includi il messaggio tra virgolette singole alla fine del comando CANCEL: 

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

La sessione in cui è stata eseguita la query visualizza il seguente messaggio: 

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

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

(Facoltativo) Chiude tutte le risorse libere associate a un cursore aperto. [COMMIT](r_COMMIT.md), [END](r_END.md) e [ROLLBACK](r_ROLLBACK.md) chiudono automaticamente il cursore, quindi non è necessario usare il comando CLOSE per chiudere esplicitamente il cursore. 

Per ulteriori informazioni, consultare [DECLARE](declare.md), [FETCH](fetch.md). 

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

```
CLOSE cursor
```

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

*cursor*   
Nome del cursore da chiudere. 

## Esempio di CLOSE
<a name="close-example"></a>

I seguenti comandi chiudono il cursore ed eseguono un commit che termina la transazione:

```
close movie_cursor;
commit;
```

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

Crea o modifica un commento su un oggetto di database.

## Sintassi
<a name="r_COMMENT-synopsis"></a>

```
COMMENT ON
{
TABLE object_name |
COLUMN object_name.column_name |
CONSTRAINT constraint_name ON table_name |
DATABASE object_name |
VIEW object_name
}
IS 'text' | NULL
```

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

 *object\$1name*   
Nome dell'oggetto del database che viene commentato. Puoi aggiungere un commento ai seguenti oggetti:  
+ TABLE
+ COLUMN (prende anche un *column\$1name*).
+ CONSTRAINT (prende anche un *constraint\$1name* e un *table\$1name*).
+ DATABASE
+ VIEW
+ SCHEMA

IS '*text*' \$1 NULL  
Il testo del commento che si desidera aggiungere o sostituire per l'oggetto specificato. La stringa *text* ha un tipo di dati TEXT. Racchiudi il commento tra virgolette singole. Impostare il valore su NULL per rimuovere il testo del commento.

 *column\$1name*   
Nome della colonna che viene commentata. Parametro di COLUMN. Segue una tabella specificata in `object_name`.

 *constraint\$1name*   
Nome del vincolo che viene commentato. Parametro di CONSTRAINT.

 *table\$1name*   
Nome della tabella contenente il vincolo. Parametro di CONSTRAINT.

## Note per l'utilizzo
<a name="r_COMMENT-usage-notes"></a>

Per aggiungere o aggiornare un commento, si deve essere un superuser o il proprietario di un oggetto di database.

I commenti sui database possono essere applicati solo al database corrente. Viene visualizzato un messaggio di avviso se tenti di commentare un database diverso. Lo stesso avviso viene visualizzato per i commenti su database che non esistono.

I commenti su tabelle esterne, colonne esterne e colonne di viste con associazione tardiva non sono supportati.

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

Nell'esempio seguente viene aggiunto un commento alla tabella SALES. 

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

Nell'esempio seguente viene visualizzato il commento nella tabella SALES. 

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

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

Nell'esempio seguente viene rimosso un commento dalla tabella SALES. 

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

Nell'esempio seguente viene aggiunto un commento alla colonna EVENTID della tabella SALES. 

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

Nell'esempio seguente viene visualizzato un commento nella colonna EVENTID (colonna numero 5) della tabella SALES. 

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

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

Nell'esempio seguente viene aggiunto un commento descrittivo alla tabella EVENT. 

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

Per visualizzare i commenti, eseguire una query sul catalogo di sistema PG\$1DESCRIPTION. L'esempio seguente restituisce la descrizione per la tabella 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>

Esegue il commit della transazione corrente nel database. Questo comando rende permanenti gli aggiornamenti del database dalla transazione.

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

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

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

WORK  
Parola chiave facoltativa. Questa parola chiave non è supportata all'interno di una procedura archiviata. 

TRANSACTION  
Parola chiave facoltativa. WORK e TRANSACTION sono sinonimi. Nessuno dei due è supportato all'interno d una procedura archiviata. 

Per informazioni su come utilizzare COMMIT all'interno di una procedura archiviata, consultare [Gestione delle transazioni](stored-procedure-transaction-management.md). 

## Esempi
<a name="r_COMMIT-examples"></a>

Ciascuno degli esempi seguenti esegue il commit della transazione corrente nel database:

```
commit;
```

```
commit work;
```

```
commit transaction;
```

# COPY
<a name="r_COPY"></a>


|  | 
| --- |
|  La crittografia lato client per i comandi COPY e UNLOAD non sarà più disponibile per i nuovi clienti a partire dal 30 aprile 2025. Se hai utilizzato la crittografia lato client con i comandi COPY e UNLOAD nei 12 mesi precedenti il 30 aprile 2025, puoi continuare a utilizzare la crittografia lato client con COPY o UNLOAD fino al 30 aprile 2026. Dopo il 30 aprile 2026 non potrai utilizzare la crittografia lato client per i comandi COPY e UNLOAD. Consigliamo di passare alla crittografia lato server per COPY e UNLOAD il prima possibile. Se utilizzi già la crittografia lato server per COPY e UNLOAD, non cambia nulla e puoi continuare a utilizzarla senza modificare le query. Per ulteriori informazioni sulla crittografia per COPY e UNLOAD, consulta il parametro ENCRYPTED di seguito.  | 

Carica i dati in una tabella dai file di dati o da una tabella Amazon DynamoDB. I file possono trovarsi in un bucket Amazon Simple Storage Service (Amazon S3), un cluster Amazon EMR o un host remoto che accede tramite una connessione Secure Shell (SSH).

**Nota**  
Le tabelle esterne di Amazon Redshift Spectrum sono di sola lettura. Non è possibile eseguire il comando COPY per una tabella esterna.

Il comando COPY aggiunge i nuovi dati di input come righe aggiuntive nella tabella.

La dimensione massima di una singola riga di input da qualsiasi origine è pari a 4 MB.

**Topics**
+ [Autorizzazioni richieste](#r_COPY-permissions)
+ [Sintassi di COPY](#r_COPY-syntax)
+ [Parametri obbligatori](#r_COPY-syntax-required-parameters)
+ [Parametri facoltativi](#r_COPY-syntax-overview-optional-parameters)
+ [Note sull'utilizzo e risorse aggiuntive per il comando COPY](#r_COPY-using-the-copy-command)
+ [Esempi di comando COPY](#r_COPY-using-the-copy-command-examples)
+ [COPY JOB](r_COPY-JOB.md)
+ [COPIA con TEMPLATE](r_COPY-WITH-TEMPLATE.md)
+ [Documentazione di riferimento dei parametri di COPY](r_COPY-parameters.md)
+ [Note per l'utilizzo](r_COPY_usage_notes.md)
+ [Esempi di COPY](r_COPY_command_examples.md)

## Autorizzazioni richieste
<a name="r_COPY-permissions"></a>

Per utilizzare il comando COPY, è necessario disporre del privilegio [INSERT](r_GRANT.md#grant-insert) per la tabella Amazon Redshift.

## Sintassi di COPY
<a name="r_COPY-syntax"></a>

```
COPY table-name 
[ column-list ]
FROM data_source
authorization
[ [ FORMAT ] [ AS ] data_format ] 
[ parameter [ argument ] [, ... ] ]
```

È possibile eseguire un'operazione COPY con soli tre parametri: un nome di tabella, un'origine dati e l'autorizzazione per accedere ai dati. 

Amazon Redshift estende la funzionalità del comando COPY per consentirti di caricare i dati in diversi formati di dati da diverse origini dati, controllare l'accesso per caricare i dati, gestire le trasformazioni di dati e gestire l'operazione di caricamento. 

Le seguenti sezioni presentano i parametri obbligatori del comando COPY e raggruppano i parametri opzionali per funzione. Gli argomenti successivi descrivono ogni parametro e spiegano come interagiscono le diverse opzioni. Puoi anche andare direttamente alla descrizione di un parametro utilizzando un elenco alfabetico di parametri. 

## Parametri obbligatori
<a name="r_COPY-syntax-required-parameters"></a>

Il comando COPY necessita di tre elementi: 
+ [Table Name](#r_COPY-syntax-overview-table-name)
+ [Data Source](#r_COPY-syntax-overview-data-source)
+ [Authorization](#r_COPY-syntax-overview-credentials)

Il comando COPY più semplice utilizza il seguente formato. 

```
COPY table-name 
FROM data-source
authorization;
```

L'esempio seguente crea una tabella chiamata CATDEMO, poi carica la tabella con dati campione da un file di dati in Amazon S3 chiamato `category_pipe.txt`. 

```
create table catdemo(catid smallint, catgroup varchar(10), catname varchar(10), catdesc varchar(50));
```

Nell'esempio seguente, l'origine dati per il comando COPY è un file di dati chiamato `category_pipe.txt` nella cartella `tickit` di un bucket Amazon S3 chiamato `redshift-downloads`. Il comando COPY è autorizzato ad accedere al bucket Amazon S3 tramite un ruolo AWS Identity and Access Management (IAM). Se il cluster possiede un ruolo IAM esistente per accedere ad Amazon S3 collegato, è possibile sostituire l'Amazon Resource Name (ARN) del ruolo nel comando COPY successivo ed eseguirlo.

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

Per istruzioni complete su come utilizzare i comandi COPY per caricare dati di esempio, incluse istruzioni per caricare dati da altre AWS regioni, consulta [Load Sample Data from Amazon S3 nella Amazon](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html) Redshift Getting Started Guide.

*table-name*  <a name="r_COPY-syntax-overview-table-name"></a>
Il nome della tabella di destinazione per il comando COPY. La tabella deve esistere già nel database. La tabella può essere temporanea o persistente. Il comando COPY aggiunge i nuovi dati di input a tutte le righe esistenti nella tabella.

FROM *data-source*  <a name="r_COPY-syntax-overview-data-source"></a>
La posizione dei dati di origine da caricare nella tabella di destinazione. È possibile specificare un file manifest con alcune origini dati.   
Di solito, il repository dei dati più utilizzato è un bucket Amazon S3. È possibile anche caricare da file di dati ubicati in un cluster Amazon EMR, un'istanza Amazon EC2 o un host remoto a cui il cluster può accedere utilizzando una connessione SSH oppure è possibile caricare direttamente da una tabella DynamoDB.   
+ [COPY da Amazon S3](copy-parameters-data-source-s3.md)
+ [COPY da Amazon EMR](copy-parameters-data-source-emr.md) 
+ [COPY da host remoto (SSH)](copy-parameters-data-source-ssh.md)
+ [COPY da Amazon DynamoDB](copy-parameters-data-source-dynamodb.md)

Autorizzazione  <a name="r_COPY-syntax-overview-credentials"></a>
Una clausola che indica il metodo utilizzato dal cluster per l'autenticazione e l'autorizzazione all'accesso ad altre risorse. AWS Il comando COPY richiede l'autorizzazione per accedere ai dati in un'altra AWS risorsa, tra cui Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. È possibile fornire tale autorizzazione referenziando il ruolo IAM collegato al cluster o fornendo l'ID chiave di accesso e la chiave di accesso segreta per un utente IAM.   
+ [Parametri di autorizzazione](copy-parameters-authorization.md) 
+ [Controllo degli accessi basato sui ruoli](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 
+ [Controllo degli accessi basato su chiave](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based) 

## Parametri facoltativi
<a name="r_COPY-syntax-overview-optional-parameters"></a>

È possibile specificare facoltativamente il modo in cui COPY mappa i dati dei campi in colonne nella tabella di destinazione, definire gli attributi dei dati di origine per consentire al comando COPY di leggere correttamente e analizzare i dati di origine e gestire le operazioni che il comando COPY deve eseguire durante il processo di caricamento. 
+ [Opzioni di mappatura di colonne](copy-parameters-column-mapping.md)
+ [Parametri del formato dei dati](#r_COPY-syntax-overview-data-format)
+ [Parametri di conversione dei dati](#r_COPY-syntax-overview-data-conversion)
+ [Operazioni di caricamento dati](#r_COPY-syntax-overview-data-load)

### Mappatura di colonne
<a name="r_COPY-syntax-overview-column-mapping"></a>

Per impostazione predefinita, COPY inserisce i valori dei campi nelle colonne della tabella di destinazione nello stesso ordine in cui i campi si presentano nei file di dati. Se l'ordine predefinito delle colonne non funziona, puoi specificare un elenco di colonne o utilizzare JSONPath espressioni per mappare i campi dei dati di origine alle colonne di destinazione. 
+ [Column List](copy-parameters-column-mapping.md#copy-column-list)
+ [JSONPaths File](copy-parameters-column-mapping.md#copy-column-mapping-jsonpaths)

### Parametri del formato dei dati
<a name="r_COPY-syntax-overview-data-format"></a>

È possibile caricare dati da file di testo in formato larghezza fissa, delimitato da caratteri, valori separati da virgole (CSV) o JSON o da file Avro.

Per impostazione predefinita, il comando COPY prevede che i dati di origine siano in file di testo UTF-8 delimitati da caratteri. Il delimitatore predefinito è una barra verticale ( \$1 ). Se i dati di origine sono in un altro formato, utilizza i seguenti parametri per specificare il formato dei dati.
+ [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) 

### Parametri di conversione dei dati
<a name="r_COPY-syntax-overview-data-conversion"></a>

Mentre carica la tabella, COPY tenta di convertire in modo implicito le stringhe nei dati di origine nel tipo di dati della colonna di destinazione. Se hai necessità di specificare una conversione diversa dal comportamento predefinito o se la conversione predefinita dà luogo a errori, è possibile gestire le conversioni dei dati specificando i seguenti parametri.
+ [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) 

### Operazioni di caricamento dati
<a name="r_COPY-syntax-overview-data-load"></a>

Gestisce il comportamento predefinito dell'operazione di caricamento per la risoluzione dei problemi o per ridurre i tempi di caricamento specificando i seguenti parametri. 
+ [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) 

## Note sull'utilizzo e risorse aggiuntive per il comando COPY
<a name="r_COPY-using-the-copy-command"></a>

Per ulteriori informazioni su come utilizzare il comando COPY, consultare i seguenti argomenti: 
+ [Note per l'utilizzo](r_COPY_usage_notes.md)
+ [Tutorial: Caricamento dei dati da Amazon S3](tutorial-loading-data.md)
+ [Best practice di Amazon Redshift per il caricamento di dati](c_loading-data-best-practices.md)
+ [Caricamento delle tabelle con il comando COPY](t_Loading_tables_with_the_COPY_command.md)
  + [Caricamento di dati da Amazon S3](t_Loading-data-from-S3.md)
  + [Caricamento di dati da Amazon EMR](loading-data-from-emr.md)
  + [Caricamento di dati da host remoti](loading-data-from-remote-hosts.md) 
  + [Caricamento di dati da una tabella Amazon DynamoDB](t_Loading-data-from-dynamodb.md)
+ [Risoluzione di problemi di caricamento dei dati](t_Troubleshooting_load_errors.md)

## Esempi di comando COPY
<a name="r_COPY-using-the-copy-command-examples"></a>

Per altri esempi che mostrano come eseguire COPY da varie origini, in formati diversi e con diverse opzioni di COPY, consulta [Esempi di COPY](r_COPY_command_examples.md).

# COPY JOB
<a name="r_COPY-JOB"></a>

Per ulteriori informazioni sull’utilizzo di questo comando, consulta [Creare un’integrazione di eventi S3 per copiare automaticamente i file dai bucket Amazon S3](loading-data-copy-job.md).

Gestisce i comandi COPY per il caricamento dei dati in una tabella. Il comando COPY JOB è un'estensione del comando COPY e automatizza il caricamento dei dati dai bucket Amazon S3. Quando crei un processo COPY, Amazon Redshift rileva quando vengono creati nuovi file Amazon S3 in un percorso specificato e li carica automaticamente senza il tuo intervento. Gli stessi parametri utilizzati nel comando COPY originale vengono utilizzati durante il caricamento dei dati. Amazon Redshift tiene traccia dei file caricati (in base al nome di file) per verificare che vengano caricati una sola volta.

**Nota**  
Per informazioni sul comando COPY, inclusi utilizzo, parametri e autorizzazioni, consulta [COPY](r_COPY.md).

## Autorizzazione richiesta
<a name="r_COPY-JOB-privileges"></a>

Per utilizzare il comando COPY JOB, devi disporre di una delle seguenti autorizzazioni oltre a tutte le autorizzazioni necessarie per usare COPY:
+ Superuser
+  Tutte le seguenti: 
  +  L’autorizzazione con ambito CREATE, ALTER o DROP pertinente per COPY JOBS nel database per cui desideri eseguire il comando COPY. 
  +  Autorizzazione USAGE per lo schema per cui si desidera eseguire il comando COPY o l’autorizzazione con ambito USAGE per gli schemi del database per cui si desidera eseguire il comando COPY. 
  +  Autorizzazione INSERT per la tabella per cui desideri eseguire il comando COPY o autorizzazione con ambito INSERT per le tabelle dello schema o del database per cui desideri eseguire il comando COPY. 

Il ruolo IAM specificato con il comando COPY deve disporre dell'autorizzazione per accedere ai dati da caricare. Per ulteriori informazioni, consulta [Autorizzazioni IAM per COPY, UNLOAD e CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions).

## Sintassi
<a name="r_COPY-JOB-syntax"></a>

Crea un processo di copia. I parametri del comando COPY vengono salvati con il processo di copia.

Non puoi eseguire il comando COPY JOB CREATE nell’ambito di un blocco di transazioni.

```
COPY copy-command JOB CREATE job-name
[AUTO ON | OFF]
```

Modifica la configurazione di un processo di copia.

```
COPY JOB ALTER job-name
[AUTO ON | OFF]
```

Esegui un processo di copia. Vengono utilizzati i parametri del comando COPY memorizzati.

```
COPY JOB RUN job-name
```

Elenca tutti i processi di copia.

```
COPY JOB LIST
```

Mostra i dettagli di un processo di copia.

```
COPY JOB SHOW job-name
```

Elimina un processo di copia.

Non puoi eseguire il comando COPY JOB DROP nell’ambito di un blocco di transazioni.

```
COPY JOB DROP job-name
```

## Parameters
<a name="r_COPY-JOB-parameters"></a>

*copy-command*  
Un comando COPY che carica i dati da Amazon S3 ad Amazon Redshift. La clausola contiene i parametri COPY che definiscono il bucket Amazon S3, la tabella di destinazione, il ruolo IAM e altri parametri utilizzati durante il caricamento dei dati. Sono supportati tutti i parametri del comando COPY per il caricamento di dati Amazon S3 con le seguenti eccezioni:  
+ COPY JOB non importa file preesistenti nella cartella a cui fa riferimento il comando COPY. Vengono importati solo i file creati dopo il timestamp di creazione di COPY JOB.
+ Non è possibile specificare un comando COPY con le opzioni MAXERROR o IGNOREALLERRORS.
+ Non è possibile specificare un file manifesto. COPY JOB richiede una posizione Amazon S3 designata per monitorare i file appena creati.
+ Non è possibile specificare un comando COPY con tipi di autorizzazione come le chiavi Access e Secret. Sono supportati solo i comandi COPY che utilizzano il parametro `IAM_ROLE` per l'autorizzazione. Per ulteriori informazioni, consulta [Parametri di autorizzazione](copy-parameters-authorization.md).
+ Il comando COPY JOB non supporta il ruolo IAM predefinito associato al cluster. Devi specificare il `IAM_ROLE` nel comando COPY. 
Per ulteriori informazioni, consulta [COPY da Amazon S3](copy-parameters-data-source-s3.md).

*job-name*  
Nome del processo utilizzato per fare riferimento al processo COPY. Il nome *job-name* non può contenere un trattino (‐).

 [AUTO ON \$1 OFF]   
Clausola che indica se i dati Amazon S3 vengono caricati automaticamente nelle tabelle Amazon Redshift.  
+ Se è selezionato `ON`, Amazon Redshift monitora il percorso Amazon S3 di origine per individuare i file appena creati e, se ne trova, viene eseguito un comando COPY con i parametri COPY nella definizione del processo. Questa è l’impostazione predefinita.
+ Se è selezionato `OFF`, Amazon Redshift non esegue automaticamente il comando COPY JOB.

## Note per l'utilizzo
<a name="r_COPY-JOB-usage-notes"></a>

Le opzioni del comando COPY vengono convalidate solo in fase di esecuzione. Ad esempio, un `IAM_ROLE` e un'origine dati Amazon S3 non validi generano errori di runtime all'avvio del processo COPY JOB.

Se il cluster è in pausa, i processi COPY JOB non vengono eseguiti.

Per eseguire query sui file di comando COPY caricati e per gli errori di caricamento, consulta [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md), [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md), [STL\$1LOADERROR\$1DETAIL](r_STL_LOADERROR_DETAIL.md). Per ulteriori informazioni, consulta [Verifica del caricamento corretto dei dati](verifying-that-data-loaded-correctly.md).

I COPY JOBS non sono supportati sui database zero-ETL poiché funzionano in modalità di sola lettura.

## Esempi
<a name="r_COPY-JOB-examples"></a>

L'esempio seguente mostra la creazione di un processo COPY JOB per il caricamento di dati da un bucket 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;
```

# COPIA con TEMPLATE
<a name="r_COPY-WITH-TEMPLATE"></a>

È possibile utilizzare i modelli Redshift con comandi COPY per semplificare la sintassi dei comandi e garantire la coerenza tra le operazioni di caricamento dei dati. Invece di specificare ripetutamente gli stessi parametri di formattazione, li definisci una volta in un modello e fai riferimento al modello nei comandi COPY. Quando utilizzate un modello, il comando COPY combina i parametri del modello con tutti i parametri specificati direttamente nel comando. Se lo stesso parametro appare sia nel modello che nel comando, il parametro del comando ha la precedenza. Per ulteriori informazioni, consulta [CREARE UN MODELLO](r_CREATE_TEMPLATE.md). 

I modelli per il comando COPY possono essere creati con:
+ [Parametri del formato dei dati](copy-parameters-data-format.md)
+ [Parametri di compressione dei file](copy-parameters-file-compression.md)
+ [Parametri di conversione dei dati](copy-parameters-data-conversion.md)
+ [Operazioni di caricamento dati](copy-parameters-data-load.md)

Per un elenco completo dei parametri supportati, vedere [COPY](r_COPY.md) comando.

## Autorizzazione richiesta
<a name="r_COPY-WITH-TEMPLATE-privileges"></a>

Per utilizzare un modello in un comando COPY, è necessario disporre di:
+ Tutte le autorizzazioni necessarie per eseguire il comando COPY (vedi[Autorizzazioni richieste](r_COPY.md#r_COPY-permissions))
+ Una delle seguenti autorizzazioni del modello:
  + Privilegi di superutente
  + Privilegio USAGE sul modello e privilegio USAGE sullo schema contenente il modello

## Sintassi
<a name="r_COPY-WITH-TEMPLATE-syntax"></a>

```
COPY target_table FROM 's3://...'
authorization
[ option, ...]
USING TEMPLATE [database_name.][schema_name.]template_name;
```

## Parameters
<a name="r_COPY-WITH-TEMPLATE-parameters"></a>

 *database\$1name*   
(Facoltativo) Il nome del database in cui esiste il modello. Se non specificato, viene utilizzato il database corrente.

 *schema\$1name*   
(Facoltativo) Il nome dello schema in cui esiste il modello. Se non viene specificato, il modello viene cercato nel percorso di ricerca corrente.

 *nome\$1modello*   
Il nome del modello da usare in COPY. 

## Note per l'utilizzo
<a name="r_COPY-WITH_TEMPLATE-usage-notes"></a>
+ I parametri specifici del comando (origine, destinazione, autorizzazione) devono ancora essere specificati nel comando COPY.
+ I modelli non possono contenere le specifiche dei file manifest per i comandi COPY.

## Esempi
<a name="r_COPY-WITH-TEMPLATE-examples"></a>

Gli esempi seguenti mostrano come creare un modello e utilizzarlo nei comandi 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 un parametro esiste sia nel modello che nel comando, il parametro del comando ha la precedenza. In questo esempio, se il modello `public.test_template` contiene `DELIMITER '|'` ma il comando COPY lo specifica`DELIMITER ','`, verrà utilizzato il delimitatore di virgola (`,`) del comando anziché il delimitatore pipe () del modello. `|` 

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

# Documentazione di riferimento dei parametri di COPY
<a name="r_COPY-parameters"></a>

COPY dispone di molti parametri che possono essere utilizzati in molte situazioni. Tuttavia, non tutti i parametri sono supportati in ogni situazione. Ad esempio, per il caricamento da file ORC o PARQUET esiste un numero limitato di parametri supportati. Per ulteriori informazioni, consulta [COPY da formati di dati a colonna](copy-usage_notes-copy-from-columnar.md).

**Topics**
+ [Origini dati](copy-parameters-data-source.md)
+ [Parametri di autorizzazione](copy-parameters-authorization.md)
+ [Opzioni di mappatura di colonne](copy-parameters-column-mapping.md)
+ [Parametri del formato dei dati](copy-parameters-data-format.md)
+ [Parametri di compressione dei file](copy-parameters-file-compression.md)
+ [Parametri di conversione dei dati](copy-parameters-data-conversion.md)
+ [Operazioni di caricamento dati](copy-parameters-data-load.md)
+ [Elenco alfabetico dei parametri](r_COPY-alphabetical-parm-list.md)

# Origini dati
<a name="copy-parameters-data-source"></a>

È possibile caricare i dati da file di testo in un bucket Amazon S3, in un cluster Amazon EMR o in un host remoto a cui il cluster può accedere utilizzando una connessione SSH. È possibile caricare i dati anche direttamente da una tabella DynamoDB. 

La dimensione massima di una singola riga di input da qualsiasi origine è pari a 4 MB. 

Per esportare i dati da una tabella a un set di file in un Amazon S3, utilizzare il comando [UNLOAD](r_UNLOAD.md). 

**Topics**
+ [COPY da Amazon S3](copy-parameters-data-source-s3.md)
+ [COPY da Amazon EMR](copy-parameters-data-source-emr.md)
+ [COPY da host remoto (SSH)](copy-parameters-data-source-ssh.md)
+ [COPY da Amazon DynamoDB](copy-parameters-data-source-dynamodb.md)

# COPY da Amazon S3
<a name="copy-parameters-data-source-s3"></a>

Per caricare dati da file ubicati in uno o più bucket S3, utilizzare la clausola FROM per indicare il modo in cui COPY individua i file in Amazon S3. È possibile fornire il percorso dell'oggetto ai file di dati come parte della clausola FROM, oppure è possibile fornire la posizione di un file manifest che contiene un elenco di percorsi dell'oggetto Amazon S3. COPY da Amazon S3 utilizza una connessione HTTPS. Assicurati che gli intervalli IP S3 siano aggiunti all'elenco di indirizzi consentiti. Per ulteriori informazioni sugli intervalli IP S3 richiesti, consulta [Isolamento di rete](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation).

**Importante**  
Se i bucket Amazon S3 che contengono i file di dati non risiedono nella stessa AWS regione del cluster, devi utilizzare il [REGION](#copy-region) parametro per specificare la regione in cui si trovano i dati. 

**Topics**
+ [Sintassi](#copy-parameters-data-source-s3-syntax)
+ [Esempi](#copy-parameters-data-source-s3-examples)
+ [Parametri facoltativi](#copy-parameters-data-source-s3-optional-parms)
+ [Parametri non supportati](#copy-parameters-data-source-s3-unsupported-parms)

## Sintassi
<a name="copy-parameters-data-source-s3-syntax"></a>

```
FROM { 's3://objectpath' | 's3://manifest_file' }
authorization
| MANIFEST
| ENCRYPTED
| REGION [AS] 'aws-region'
| optional-parameters
```

## Esempi
<a name="copy-parameters-data-source-s3-examples"></a>

Nell'esempio seguente viene utilizzato un percorso oggetto per caricare dati da Amazon S3. 

```
copy customer
from 's3://amzn-s3-demo-bucket/customer' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Nell'esempio seguente viene utilizzato un file manifest per caricare dati da Amazon S3. 

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

### Parameters
<a name="copy-parameters-data-source-s3-parameters"></a>

FROM  <a name="copy-parameters-from"></a>
L'origine dei dati da caricare. Per ulteriori informazioni sulla codifica del file Amazon S3, consultare [Parametri di conversione dei dati](copy-parameters-data-conversion.md).

's3://*copy\$1from\$1s3\$1objectpath*'   <a name="copy-s3-objectpath"></a>
Specifica il percorso degli oggetti Amazon S3 che contengono i dati, ad esempio `'s3://amzn-s3-demo-bucket/custdata.txt'`. Il parametro *s3://copy\$1from\$1s3\$1objectpath* può fare riferimento a un singolo file o a un insieme di oggetti o cartelle che hanno lo stesso prefisso della chiave. Ad esempio, il nome `custdata.txt` è un prefisso della chiave che si riferisce a un certo numero di file fisici: `custdata.txt`,`custdata.txt.1`, `custdata.txt.2`, `custdata.txt.bak` e così via. Il prefisso della chiave può anche fare riferimento a un certo numero di cartelle. Ad esempio `'s3://amzn-s3-demo-bucket/custfolder'` fa riferimento alle cartelle `custfolder`, `custfolder_1`, `custfolder_2` e così via. Se un prefisso della chiave fa riferimento a più cartelle, vengono caricati tutti i file in esse contenuti. Se un prefisso della chiave corrisponde sia a un file sia a una cartella, come `custfolder.log`, COPY tenta di caricare anche il file. Se un prefisso della chiave può causare il tentativo da parte di COPY di caricare i file indesiderati, utilizzare un file manifest. Per ulteriori informazioni, consultare [copy_from_s3_manifest_file](#copy-manifest-file).   
Se il bucket S3 che contiene i file di dati non si trova nella stessa AWS regione del cluster, devi utilizzare il [REGION](#copy-region) parametro per specificare la regione in cui si trovano i dati.
Per ulteriori informazioni, consulta [Caricamento di dati da Amazon S3](t_Loading-data-from-S3.md).

's3://*copy\$1from\$1s3\$1manifest\$1file*'   <a name="copy-manifest-file"></a>
Specifica la chiave oggetto Amazon S3 per un file manifest che elenca i file di dati da caricare. L'argomento *'s3://*copy\$1from\$1s3\$1manifest\$1file'** deve fare esplicito riferimento a un singolo file, ad esempio, `'s3://amzn-s3-demo-bucket/manifest.txt'`. Non può fare riferimento a un prefisso della chiave.  
Il manifest è un file di testo in formato JSON che elenca l'URL di ciascun file che deve essere caricato da Amazon S3. L'URL include il nome del bucket e il percorso completo dell'oggetto per il file. I file specificati nel manifesto possono trovarsi in diversi bucket, ma tutti i bucket devono trovarsi nella stessa AWS regione del cluster Amazon Redshift. Se un file viene elencato due volte, viene caricato due volte. L'esempio seguente mostra il JSON per un manifest che carica tre file.   

```
{
  "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}
  ]
}
```
I caratteri delle virgolette doppie sono obbligatori e devono essere virgolette semplici (0x22), non oblique o "intelligenti". Ogni accesso al manifest può facoltativamente includere un flag `mandatory`. Se `mandatory` è impostato come `true`, COPY termina se non trova il file per quella voce; altrimenti COPY continuerà. Il valore predefinito per `mandatory` è `false`.   
Quando si carica da file di dati in formato ORC o Parquet, è necessario un campo `meta`, come mostrato nell'esempio seguente.  

```
{  
   "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
         }
      }
   ]
}
```
Il file manifesto non deve essere crittografato o compresso, anche se sono specificate le opzioni ENCRYPTED, GZIP, LZOP o ZSTD. BZIP2 COPY restituisce un errore se il file manifest specificato non viene trovato o non viene formato correttamente.   
Se si utilizza un file manifest, il parametro MANIFEST deve essere specificato con il comando COPY. Se il parametro MANIFEST non è specificato, COPY presuppone che il file specificato con FROM sia un file di dati.   
Per ulteriori informazioni, consulta [Caricamento di dati da Amazon S3](t_Loading-data-from-S3.md).

*authorization*  
Il comando COPY necessita dell'autorizzazione per accedere ai dati in un'altra risorsa AWS , incluso in Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. È possibile fornire tale autorizzazione facendo riferimento a un ruolo AWS Identity and Access Management (IAM) collegato al cluster (controllo degli accessi basato sui ruoli) o fornendo le credenziali di accesso per un utente (controllo degli accessi basato su chiavi). Per una maggiore sicurezza e flessibilità, consigliamo di utilizzare il controllo degli accessi basato sui ruoli IAM. Per ulteriori informazioni, consulta [Parametri di autorizzazione](copy-parameters-authorization.md).

MANIFEST  <a name="copy-manifest"></a>
Specifica che un manifest viene utilizzato per identificare i file di dati da caricare da Amazon S3. Se si utilizza il parametro MANIFEST, COPY carica i dati dai file elencati nel manifesto a cui fa riferimento *'s3://copy\$1from\$1s3\$1manifest\$1file'*. Se il file manifest non viene trovato o non è formato correttamente, COPY non va a buon fine. Per ulteriori informazioni, consulta [Utilizzo di un manifest per specificare i fili di dati](loading-data-files-using-manifest.md).

ENCRYPTED  <a name="copy-encrypted"></a>
Una clausola che specifica che i file di input su Amazon S3 sono crittografati utilizzando la crittografia lato client con chiavi simmetriche gestite dal cliente. Per ulteriori informazioni, consulta [Caricamento di file di dati crittografati da Amazon S3](c_loading-encrypted-files.md). Non specificare ENCRYPTED se i file di input sono crittati utilizzando la crittografia lato server di Amazon S3 (SSE-KMS o SSE-S3). COPY legge automaticamente i file crittati lato server.  
Se specifichi il parametro ENCRYPTED, devi anche specificare il parametro [MASTER_SYMMETRIC_KEY](#copy-master-symmetric-key) o includere il valore **master\$1symmetric\$1key** nella stringa [Utilizzo del parametro CREDENTIALS](copy-parameters-authorization.md#copy-credentials).  
Se i file crittografati sono in formato compresso, aggiungi il parametro GZIP, LZOP o ZSTD. BZIP2  
I file e JSONPaths i file manifesto non devono essere crittografati, anche se è specificata l'opzione ENCRYPTED.

MASTER\$1SYMMETRIC\$1KEY '*root\$1key*'  <a name="copy-master-symmetric-key"></a>
La chiave master simmetrica era utilizzata per crittografare i file di dati su Amazon S3. Se è specificato MASTER\$1SYMMETRIC\$1KEY, è necessario specificare anche il parametro [ENCRYPTED](#copy-encrypted). MASTER\$1SYMMETRIC\$1KEY non può essere utilizzato con il parametro CREDENTIALS. Per ulteriori informazioni, consulta [Caricamento di file di dati crittografati da Amazon S3](c_loading-encrypted-files.md).  
Se i file crittografati sono in formato compresso, aggiungete il parametro GZIP, LZOP o BZIP2 ZSTD.

REGION [AS] '*aws-region*'  <a name="copy-region"></a>
Speciifica la AWS regione in cui si trovano i dati di origine. REGION è obbligatorio per COPY da un bucket Amazon S3 o una tabella DynamoDB quando la risorsa AWS che contiene i dati non si trova nella stessa regione del cluster Amazon Redshift.   
Il valore per *aws\$1region* deve corrispondere a una regione elencata nella tabella [Regioni ed endpoint di Amazon Redshift](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region).  
Se viene specificato il parametro REGION, tutte le risorse, compresi un file manifest o più bucket Amazon S3 devono trovarsi nella regione specificata.   
Il trasferimento di dati tra regioni comporta costi aggiuntivi a carico del bucket Amazon S3 o della tabella DynamoDB che contiene i dati. Per ulteriori informazioni sui prezzi, consulta **Data Transfer OUT da Amazon S3 a un'altra AWS regione nella** pagina dei prezzi di [Amazon S3](https://aws.amazon.com/s3/pricing/) **e Data Transfer** OUT nella pagina dei prezzi di Amazon [DynamoDB](https://aws.amazon.com/dynamodb/pricing/). 
Per impostazione predefinita, COPY presuppone che i dati si trovino nella stessa regione del cluster Amazon Redshift. 

## Parametri facoltativi
<a name="copy-parameters-data-source-s3-optional-parms"></a>

Facoltativamente è possibile specificare i seguenti parametri con COPY da Amazon S3: 
+ [Opzioni di mappatura di colonne](copy-parameters-column-mapping.md)
+ [Parametri del formato dei dati](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parametri di conversione dei dati](copy-parameters-data-conversion.md)
+ [Operazioni di caricamento dati](copy-parameters-data-load.md)

## Parametri non supportati
<a name="copy-parameters-data-source-s3-unsupported-parms"></a>

Non è possibile utilizzare i seguenti parametri con COPY da Amazon S3: 
+ SSH
+ READRATIO

# COPY da Amazon EMR
<a name="copy-parameters-data-source-emr"></a>

È possibile utilizzare il comando COPY per caricare dati in parallelo da un cluster Amazon EMR configurato per scrivere file di testo nel Hadoop Distributed File System (HDFS) del cluster sotto forma di file a larghezza fissa, delimitati da caratteri, CSV, formattati JSON o Avro.

**Topics**
+ [Sintassi](#copy-parameters-data-source-emr-syntax)
+ [Esempio](#copy-parameters-data-source-emr-example)
+ [Parameters](#copy-parameters-data-source-emr-parameters)
+ [Parametri supportati](#copy-parameters-data-source-emr-optional-parms)
+ [Parametri non supportati](#copy-parameters-data-source-emr-unsupported-parms)

## Sintassi
<a name="copy-parameters-data-source-emr-syntax"></a>

```
FROM 'emr://emr_cluster_id/hdfs_filepath'  
authorization
[ optional_parameters ]
```

## Esempio
<a name="copy-parameters-data-source-emr-example"></a>

Nell'esempio seguente i dati vengono caricati da un cluster Amazon EMR. 

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Parameters
<a name="copy-parameters-data-source-emr-parameters"></a>

FROM  
L'origine dei dati da caricare. 

 'emr://*emr\$1cluster\$1id*/*hdfs\$1file\$1path*'  <a name="copy-emr"></a>
L'identificatore univoco per il cluster Amazon EMR e il percorso del file HDFS che fa riferimento ai file di dati per il comando COPY. I nomi dei file di dati HDFS non devono contenere i caratteri jolly asterisco (\$1) e punto interrogativo (?).   
Il cluster Amazon EMR deve continuare a funzionare fino al completamento dell'operazione COPY. Se uno qualsiasi dei file di dati HDFS viene modificato o cancellato prima del completamento dell'operazione COPY, si potrebbero ottenere risultati imprevisti o l'operazione COPY potrebbe fallire. 
È possibile utilizzare i caratteri jolly asterisco (\$1) e punto interrogativo (?) come parte dell'argomento *hdfs\$1file\$1path* del nome file. Ad esempio `'emr://j-SAMPLE2B500FC/myoutput/part*'` identifica i file `part-0000`, `part-0001` e così via. Se il percorso del file non contiene caratteri jolly, viene trattato come una stringa letterale. Se specifichi solo il nome di una cartella, COPY tenta di caricare tutti i file nella cartella.   
Se utilizzi caratteri jolly o solo il nome della cartella, verifica che non vengano caricati file indesiderati. Ad esempio, alcuni processi potrebbero scrivere un file di log nella cartella di output.
Per ulteriori informazioni, consulta [Caricamento di dati da Amazon EMR](loading-data-from-emr.md).

*authorization*  
Il comando COPY necessita dell'autorizzazione per accedere ai dati in un'altra risorsa AWS , incluso in Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. Puoi fornire tale autorizzazione facendo riferimento a un ruolo AWS Identity and Access Management (IAM) collegato al cluster (controllo degli accessi basato sui ruoli) o fornendo le credenziali di accesso per un utente (controllo degli accessi basato su chiavi). Per una maggiore sicurezza e flessibilità, consigliamo di utilizzare il controllo degli accessi basato sui ruoli IAM. Per ulteriori informazioni, consulta [Parametri di autorizzazione](copy-parameters-authorization.md).

## Parametri supportati
<a name="copy-parameters-data-source-emr-optional-parms"></a>

Facoltativamente è possibile specificare i seguenti parametri con COPY da Amazon EMR: 
+ [Opzioni di mappatura di colonne](copy-parameters-column-mapping.md)
+ [Parametri del formato dei dati](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parametri di conversione dei dati](copy-parameters-data-conversion.md)
+ [Operazioni di caricamento dati](copy-parameters-data-load.md)

## Parametri non supportati
<a name="copy-parameters-data-source-emr-unsupported-parms"></a>

Non è possibile utilizzare i seguenti parametri con COPY da Amazon EMR: 
+ ENCRYPTED
+ MANIFEST
+ REGION
+ READRATIO
+ SSH

# COPY da host remoto (SSH)
<a name="copy-parameters-data-source-ssh"></a>

È possibile utilizzare il comando COPY per caricare dati in parallelo da uno o più host remoti, quali istanze Amazon Elastic Compute Cloud (Amazon EC2) o altri computer. COPY si connette agli host remoti utilizzando Secure Shell (SSH) ed esegue comandi sugli host remoti per generare output di testo. L'host remoto può essere un'istanza EC2 Linux o un altro computer Unix o Linux configurato per accettare connessioni SSH. Amazon Redshift può connettersi a più host e può aprire più connessioni SSH per ogni host. Amazon Redshift invia un comando univoco attraverso ogni connessione per generare output di testo per l'output standard dell'host, che legge quindi come un file di testo.

Utilizzare la clausola FROM per specificare la chiave oggetto di Amazon S3 per il file manifest che fornisce le informazioni che COPY utilizza per aprire le connessioni SSH ed eseguire i comandi remoti. 

**Topics**
+ [Sintassi](#copy-parameters-data-source-ssh-syntax)
+ [Esempi](#copy-parameters-data-source-ssh-examples)
+ [Parameters](#copy-parameters-data-source-ssh-parameters)
+ [Parametri facoltativi](#copy-parameters-data-source-ssh-optional-parms)
+ [Parametri non supportati](#copy-parameters-data-source-ssh-unsupported-parms)

**Importante**  
 Se il bucket S3 che contiene i file manifest non si trova nella stessa regione AWS del cluster, è necessario utilizzare il parametro REGION per specificare la regione in cui si trova il bucket. 

## Sintassi
<a name="copy-parameters-data-source-ssh-syntax"></a>

```
FROM 's3://'ssh_manifest_file' }
authorization
SSH
| optional-parameters
```

## Esempi
<a name="copy-parameters-data-source-ssh-examples"></a>

Nell'esempio seguente viene utilizzato un file manifest per caricare dati da un host remoto tramite SSH. 

```
copy sales
from 's3://amzn-s3-demo-bucket/ssh_manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
ssh;
```

## Parameters
<a name="copy-parameters-data-source-ssh-parameters"></a>

FROM  
L'origine dei dati da caricare. 

's3://*copy\$1from\$1ssh\$1manifest\$1file*'  <a name="copy-ssh-manifest"></a>
Il comando COPY può connettersi a più host tramite SSH e può creare più connessioni SSH per ogni host. COPY esegue un comando attraverso ogni connessione host, quindi carica l'output dai comandi in parallelo nella tabella. L'argomento *s3://copy\$1from\$1ssh\$1manifest\$1file* specifica la chiave oggetto di Amazon S3 per il file manifest che fornisce le informazioni che COPY utilizza per aprire connessioni SSH ed eseguire i comandi remoti.  
L'argomento *s3://copy\$1from\$1ssh\$1manifest\$1file* deve fare esplicito riferimento a un singolo file; non può essere un prefisso della chiave. Di seguito viene riportato un esempio:  

```
's3://amzn-s3-demo-bucket/ssh_manifest.txt'
```
Il file manifest è un file di testo in formato JSON che Amazon Redshift utilizza per la connessione all'host. Il file manifesto specifica gli endpoint dell'host SSH e i comandi che verranno eseguiti sugli host per restituire i dati ad Amazon Redshift. Facoltativamente, puoi includere la chiave pubblica dell'host, il nome utente di login e un flag obbligatorio per ogni voce. L'esempio seguente mostra un file manifest che crea due connessioni 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>"} 
     ] 
}
```
Il file manifest contiene un costrutto `"entries"` per ogni connessione SSH. È possibile avere più connessioni a un singolo host o più connessioni a più host. I caratteri delle doppie virgolette sono richiesti come mostrato, sia per i nomi dei campi sia per i valori. I caratteri delle virgolette devono essere virgolette semplici (0x22), non oblique o "intelligenti". L'unico valore che non necessita di caratteri di virgolette doppie è il valore booleano `true` o `false` per il campo `"mandatory"`.   
Nella seguente lista sono descritti i campi del file manifest.     
endpoint  <a name="copy-ssh-manifest-endpoint"></a>
L'indirizzo URL o l'indirizzo IP dell'host, ad esempio `"ec2-111-222-333.compute-1.amazonaws.com"` o `"198.51.100.0"`.   
command  <a name="copy-ssh-manifest-command"></a>
Il comando che deve essere eseguito dall'host per generare output di testo o binario in formato gzip, lzop, bzip2 o zstd. Il comando può essere qualsiasi comando che l'utente *"host\$1user\$1name"* è autorizzato a eseguire. Il comando può essere semplice come stampare un file o eseguire una query su un database o lanciare uno script. L'output (file di testo o file binario gzip, lzop o bzip2) deve essere in un formato che il comando COPY di Amazon Redshift possa importare. Per ulteriori informazioni, consulta [Preparazione dei dati di input](t_preparing-input-data.md).  
publickey  <a name="copy-ssh-manifest-publickey"></a>
(Facoltativo) La chiave pubblica dell'host. Se fornita, Amazon Redshift userà la chiave pubblica per identificare l'host. Se la chiave pubblica non viene fornita, Amazon Redshift non proverà a eseguire l'identificazione dell'host. Ad esempio, se la chiave pubblica dell'host remoto è `ssh-rsa AbcCbaxxx…Example root@amazon.com`, digita il seguente testo nel campo della chiave pubblica: `"AbcCbaxxx…Example"`  
mandatory  <a name="copy-ssh-manifest-mandatory"></a>
(Facoltativo) Una clausola che indica se il comando COPY debba fallire se il tentativo di connessione fallisce. Il valore predefinito è `false`. Se Amazon Redshift non riesce a effettuare almeno una connessione, il comando COPY avrà esito negativo.  
username  <a name="copy-ssh-manifest-username"></a>
(Facoltativo) Il nome utente che verrà utilizzato per accedere al sistema host ed eseguire il comando remoto. Il nome di accesso dell'utente deve essere lo stesso usato per aggiungere la chiave pubblica del cluster Amazon Redshift al file delle chiavi autorizzate dell'host. Il nome utente predefinito è `redshift`.
Per ulteriori informazioni sulla creazione di un file manifest, consultare [Processo di caricamento dei dati](loading-data-from-remote-hosts.md#load-from-host-process).  
Per utilizzare COPY da un host remoto, il parametro SSH deve essere specificato con il comando COPY. Se il parametro SSH non è specificato, COPY presuppone che il file specificato con FROM sia un file di dati e non va a buon fine.   
Se si utilizza la compressione automatica, il comando COPY esegue due operazioni di lettura dati, il che significa che eseguirà il comando remoto due volte. La prima operazione di lettura consiste nel fornire un campione di dati per l'analisi della compressione e la seconda operazione di lettura carica effettivamente i dati. Se la doppia esecuzione del comando remoto potrebbe causare un problema, è necessario disattivare la compressione automatica. Per disattivare la compressione automatica, esegui il comando COPY con il parametro COMPUPDATE impostato su OFF. Per ulteriori informazioni, consulta [Caricamento di tabelle con compressione automatica](c_Loading_tables_auto_compress.md).  
Per le procedure dettagliate sull'utilizzo di COPY da SSH, consultare [Caricamento di dati da host remoti](loading-data-from-remote-hosts.md).

*authorization*  
Il comando COPY necessita dell'autorizzazione per accedere ai dati in un'altra risorsa AWS , incluso in Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. È possibile fornire tale autorizzazione facendo riferimento a un ruolo AWS Identity and Access Management (IAM) collegato al cluster (controllo degli accessi basato sui ruoli) o fornendo le credenziali di accesso per un utente (controllo degli accessi basato su chiavi). Per una maggiore sicurezza e flessibilità, consigliamo di utilizzare il controllo degli accessi basato sui ruoli IAM. Per ulteriori informazioni, consulta [Parametri di autorizzazione](copy-parameters-authorization.md).

SSH  <a name="copy-ssh"></a>
Una clausola che specifica che i dati devono essere caricati da un host remoto utilizzando il protocollo SSH. Se specifichi SSH. devi anche fornire un file manifest usando l'argomento [s3://copy_from_ssh_manifest_file](#copy-ssh-manifest).   
Se stai utilizzando SSH per effettuare la copia da un host utilizzando un indirizzo IP privato su un VPC remoto, il VPC deve avere il routing VPC avanzato abilitato. Per ulteriori informazioni sul routing VPC avanzato, consultare [Amazon Redshift Spectrum con il routing VPC avanzato](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html).

## Parametri facoltativi
<a name="copy-parameters-data-source-ssh-optional-parms"></a>

Facoltativamente è possibile specificare i seguenti parametri con COPY da SSH: 
+ [Opzioni di mappatura di colonne](copy-parameters-column-mapping.md)
+ [Parametri del formato dei dati](copy-parameters-data-format.md#copy-data-format-parameters)
+ [Parametri di conversione dei dati](copy-parameters-data-conversion.md)
+ [Operazioni di caricamento dati](copy-parameters-data-load.md)

## Parametri non supportati
<a name="copy-parameters-data-source-ssh-unsupported-parms"></a>

Non è possibile utilizzare i seguenti parametri con COPY da SSH: 
+ ENCRYPTED
+ MANIFEST
+ READRATIO

# COPY da Amazon DynamoDB
<a name="copy-parameters-data-source-dynamodb"></a>

Per caricare i dati da una tabella DynamoDB esistente, utilizza la clausola FROM per specificare il nome della tabella DynamoDB.

**Topics**
+ [Sintassi](#copy-parameters-data-source-dynamodb-syntax)
+ [Esempi](#copy-parameters-data-source-dynamodb-examples)
+ [Parametri facoltativi](#copy-parameters-data-source-dynamodb-optional-parms)
+ [Parametri non supportati](#copy-parameters-data-source-dynamodb-unsupported-parms)

**Importante**  
Se la tabella DynamoDB non si trova nella stessa regione del cluster Amazon Redshift è necessario utilizzare il parametro REGION per specificare la regione in cui si trovano i dati. 

## Sintassi
<a name="copy-parameters-data-source-dynamodb-syntax"></a>

```
FROM 'dynamodb://table-name' 
authorization
READRATIO ratio
| REGION [AS] 'aws_region'  
| optional-parameters
```

## Esempi
<a name="copy-parameters-data-source-dynamodb-examples"></a>

Nell'esempio seguente i dati sono caricati da una tabella DynamoDB. 

```
copy favoritemovies from 'dynamodb://ProductCatalog'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
readratio 50;
```

### Parameters
<a name="copy-parameters-data-source-dynamodb-parameters"></a>

FROM  
L'origine dei dati da caricare. 

'dynamodb://*table-name*'  <a name="copy-dynamodb"></a>
Il nome della tabella DynamoDB che contiene i dati, ad esempio `'dynamodb://ProductCatalog'`. Per maggiori dettagli su come gli attributi DynamoDB siano mappati alle colonne Amazon Redshift, consultare [Caricamento di dati da una tabella Amazon DynamoDB](t_Loading-data-from-dynamodb.md).  
Il nome di una tabella DynamoDB è univoco per AWS un account, identificato dalle AWS credenziali di accesso.

*authorization*  
Il comando COPY necessita dell'autorizzazione per accedere ai dati in un'altra risorsa AWS , incluso in Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. È possibile fornire tale autorizzazione facendo riferimento a un ruolo AWS Identity and Access Management (IAM) collegato al cluster (controllo degli accessi basato sui ruoli) o fornendo le credenziali di accesso per un utente (controllo degli accessi basato su chiavi). Per una maggiore sicurezza e flessibilità, consigliamo di utilizzare il controllo degli accessi basato sui ruoli IAM. Per ulteriori informazioni, consulta [Parametri di autorizzazione](copy-parameters-authorization.md).

READRATIO [AS] *ratio*  <a name="copy-readratio"></a>
La percentuale di throughput assegnato della tabella DynamoDB da utilizzare per il caricamento dei dati. READRATIO è necessario per COPY da DynamoDB. Non può essere utilizzato con COPY da Amazon S3. È consigliabile impostare la percentuale su un valore minore del throughput assegnato mediamente non utilizzato. I valori validi sono numeri interi compresi tra 1 e 200.  
Impostando READRATIO su 100 o su un valore superiore si consente a Amazon Redshift di consumare l'intero throughput assegnato della tabella DynamoDB che degrada notevolmente le prestazioni delle operazioni di lettura simultanee rispetto alla stessa tabella durante la sessione di COPY. Il traffico della funzione di scrittura non viene modificato. I valori superiori a 100 possono risolvere problemi in scenari rari quando Amazon Redshift non è in grado di soddisfare il throughput assegnato della tabella. Se i dati vengono caricati da DynamoDB ad Amazon Redshift su base continuativa, considerare l'organizzazione delle tabelle DynamoDB come una serie temporale per separare il traffico in tempo reale dall'operazione COPY.

## Parametri facoltativi
<a name="copy-parameters-data-source-dynamodb-optional-parms"></a>

Facoltativamente è possibile specificare i seguenti parametri con COPY da Amazon DynamoDB: 
+ [Opzioni di mappatura di colonne](copy-parameters-column-mapping.md)
+ Sono supportati i seguenti parametri di conversione dei dati:
  + [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) 
+ [Operazioni di caricamento dati](copy-parameters-data-load.md)

## Parametri non supportati
<a name="copy-parameters-data-source-dynamodb-unsupported-parms"></a>

Non è possibile utilizzare i seguenti parametri con COPY da DynamoDB: 
+ Tutti i parametri del formato dei dati
+ ESCAPE
+ FILLRECORD
+ IGNOREBLANKLINES
+ IGNOREHEADER
+ NULL
+ REMOVEQUOTES
+ ACCEPTINVCHARS
+ MANIFEST
+ ENCRYPTED

# Parametri di autorizzazione
<a name="copy-parameters-authorization"></a>

Il comando COPY richiede l'autorizzazione per accedere ai dati in un'altra AWS risorsa, tra cui Amazon S3, Amazon EMR, Amazon DynamoDB e Amazon EC2. Per concedere questa autorizzazione, è necessario fare riferimento a un [ruolo (IAM)AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) associato al cluster (*controllo degli accessi basato sul ruolo*). Puoi crittografare i dati di caricamento su Amazon S3. 

I seguenti argomenti forniscono ulteriori dettagli ed esempi di opzioni di autenticazione:
+ [Autorizzazioni IAM per COPY, UNLOAD e CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)
+ [Controllo degli accessi basato sui ruoli](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)
+ [Controllo degli accessi basato su chiave](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based)

Utilizza una delle seguenti opzioni per fornire l'autorizzazione per il comando COPY: 
+ Parametro [Utilizzo del parametro IAM\$1ROLE](#copy-iam-role)
+ Parametri di [Utilizzo dei parametri ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY](#copy-access-key-id)
+ [Utilizzo del parametro CREDENTIALS](#copy-credentials)Clausola 

## Utilizzo del parametro IAM\$1ROLE
<a name="copy-iam-role"></a>

### IAM\$1ROLE
<a name="copy-iam-role-iam"></a>

Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando COPY. 

L'Amazon Resource Name (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione. Se specifichi IAM\$1ROLE, non è possibile utilizzare ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN o CREDENTIALS.

Di seguito è mostrata la sintassi del parametro IAM\$1ROLE. 

```
IAM_ROLE { default | 'arn:aws:iam::<Account AWS-id>:role/<role-name>' }
```

Per ulteriori informazioni, consulta [Controllo degli accessi basato sui ruoli](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

## Utilizzo dei parametri ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id"></a>

### ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id-access"></a>

Questo metodo di autorizzazione non è raccomandato. 

**Nota**  
Invece di fornire le credenziali di accesso come testo in chiaro, consigliamo vivamente di utilizzare l'autenticazione basata sui ruoli specificando il parametro IAM\$1ROLE. Per ulteriori informazioni, consulta [Controllo degli accessi basato sui ruoli](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

### SESSION\$1TOKEN
<a name="copy-token"></a>

Il token di sessione da utilizzare con le credenziali di accesso temporaneo. Quando è specificato SESSION\$1TOKEN, devi utilizzare anche ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY per fornire credenziali di chiave di accesso temporanee. Se specifichi SESSION\$1TOKEN, non è possibile utilizzare IAM\$1ROLE o CREDENTIALS. Per ulteriori informazioni, consultare [Credenziali di sicurezza temporanee](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials) nella Guida per l'utente di IAM.

**Nota**  
Invece di creare credenziali di sicurezza temporanee, consigliamo vivamente di utilizzare l'autenticazione basata su ruoli. Quando si autorizza l'uso di un ruolo IAM, Amazon Redshift crea automaticamente credenziali utente temporanee per ogni sessione. Per ulteriori informazioni, consulta [Controllo degli accessi basato sui ruoli](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based). 

Di seguito è riportata la sintassi del parametro SESSION\$1TOKEN con i parametri ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY. 

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

Se specifichi SESSION\$1TOKEN, non è possibile utilizzare CREDENTIALS o IAM\$1ROLE. 

## Utilizzo del parametro CREDENTIALS
<a name="copy-credentials"></a>

### CREDENTIALS
<a name="copy-credentials-cred"></a>

Una clausola che indica il metodo utilizzato dal cluster per accedere ad altre AWS risorse che contengono file di dati o file manifest. Non è possibile utilizzare il parametro CREDENTIALS con IAM\$1ROLE o ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY.

Di seguito è mostrata la sintassi del parametro CREDENTIALS.

```
[WITH] CREDENTIALS [AS] 'credentials-args'
```

**Nota**  
Per una maggiore flessibilità, consigliamo di utilizzare il parametro [IAM\$1ROLE](#copy-iam-role-iam) invece del parametro CREDENTIALS.

Facoltativamente, se utilizzi il parametro [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted), la stringa *credentials-args* fornisce anche la chiave di crittografia.

La stringa *credentials-args* prevede la distinzione tra maiuscole e minuscole e non deve contenere spazi.

Le parole chiave WITH e AS sono opzionali e vengono ignorate.

È possibile specificare [role-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based.phrase) o [key-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based.phrase). In entrambi i casi, l'utente o il ruolo IAM deve disporre delle autorizzazioni necessarie per accedere alle risorse AWS specificate. Per ulteriori informazioni, consulta [Autorizzazioni IAM per COPY, UNLOAD e CREATE LIBRARY](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions). 

**Nota**  
Per salvaguardare le AWS credenziali e proteggere i dati sensibili, consigliamo vivamente di utilizzare il controllo degli accessi basato sui ruoli. 

Per specificare il controllo degli accessi basato su ruoli, fornisci la stringa *credentials-args* nel seguente formato.

```
'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
```

Per utilizzare le credenziali del token temporanee, devi fornire l'ID chiave di accesso, la chiave di accesso segreta e il token temporanei. La stringa *credentials-args* è nel seguente formato. 

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>'
```

Un comando COPY che utilizza il controllo degli accessi basato su ruoli con credenziali temporanee sarebbe simile all’istruzione di esempio seguente: 

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

 Per ulteriori informazioni, consulta [Credenziali di sicurezza temporanee](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials).

Se viene utilizzato il [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) parametro, la stringa *credentials-args* ha il seguente formato, dove *<root-key>* è il valore della chiave principale utilizzata per crittografare i file.

```
CREDENTIALS
'<credentials-args>;master_symmetric_key=<root-key>'
```

Un comando COPY che utilizza il controllo degli accessi basato su ruoli con una chiave di crittografia sarebbe simile al comando di esempio seguente:

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

# Opzioni di mappatura di colonne
<a name="copy-parameters-column-mapping"></a>

Per impostazione predefinita, COPY inserisce i valori nelle colonne della tabella di destinazione nello stesso ordine in cui i campi vengono visualizzati nei file di dati. Se l'ordine predefinito delle colonne non funziona, puoi specificare un elenco di colonne o utilizzare JSONPath espressioni per mappare i campi di dati di origine alle colonne di destinazione. 
+ [Column List](#copy-column-list)
+ [JSONPaths File](#copy-column-mapping-jsonpaths)

## Elenco di colonne
<a name="copy-column-list"></a>

È possibile specificare un elenco separato da virgole di nomi di colonna per caricare i campi dati sorgente in specifiche colonne di destinazione. Le colonne possono essere in qualsiasi ordine nell'istruzione COPY, ma quando si caricano da flat file, come in un bucket Amazon S3, il loro ordine deve corrispondere all'ordine dei dati di origine. 

Durante il caricamento da una tabella Amazon DynamoDB l'ordine non è importante. Il comando COPY fa corrispondere i nomi degli attributi negli elementi recuperati dalla tabella DynamoDB ai nomi di colonna nella tabella Amazon Redshift. Per ulteriori informazioni, consultare [Caricamento di dati da una tabella Amazon DynamoDB](t_Loading-data-from-dynamodb.md)

 Il formato dell'elenco di colonne è il seguente.

```
COPY tablename (column1 [,column2, ...]) 
```

Se una colonna nella tabella di destinazione viene omessa dall'elenco delle colonne, COPY carica l'espressione [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) della colonna di destinazione.

Se la colonna di destinazione non ha un valore predefinito, COPY tenta di caricare NULL.

Se COPY tenta di assegnare NULL a una colonna definita come NOT NULL, il comando COPY non viene eseguito. 

Se una colonna [IDENTITY](r_CREATE_TABLE_NEW.md#identity-clause) è inclusa nell'elenco di colonne, allora è necessario specificare anche [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids); se viene omessa una colonna IDENTITY, allora EXPLICIT\$1IDS non può essere specificato. Se non è specificato un elenco di colonne, il comando si comporta come se fosse specificato un elenco completo di colonne in ordine, con le colonne IDENTITY omesse se non era specificato anche EXPLICIT\$1IDS.

Se una colonna è definita con GENERATED BY DEFAULT AS IDENTITY, può esser copiata. i valori vengono generati o aggiornati con i valori forniti dall'utente. L'opzione EXPLICIT\$1IDS non è obbligatoria. COPY non aggiorna la filigrana ad elevata identità. Per ulteriori informazioni, consulta [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

## JSONPaths file
<a name="copy-column-mapping-jsonpaths"></a>

Quando si carica da file di dati in formato JSON o Avro, COPY mappa automaticamente gli elementi dei dati nei dati di origine JSON o Avro alle colonne della tabella di destinazione. Lo fa associando i nomi dei campi nello schema Avro ai nomi delle colonne nella tabella di destinazione o nell'elenco delle colonne.

In alcuni casi, i nomi delle colonne e dei campi non corrispondono o è necessario mappare a livelli più profondi nella gerarchia dei dati. In questi casi, puoi utilizzare un JSONPaths file per mappare in modo esplicito gli elementi di dati JSON o Avro alle colonne. 

Per ulteriori informazioni, consulta [JSONPaths file](copy-parameters-data-format.md#copy-json-jsonpaths). 

# Parametri del formato dei dati
<a name="copy-parameters-data-format"></a>

Per impostazione predefinita, il comando COPY prevede che i dati di origine siano testi UTF-8 delimitati da caratteri. Il delimitatore predefinito è una barra verticale ( \$1 ). Se i dati di origine sono in un altro formato, utilizza i seguenti parametri per specificare il formato dei dati: 
+ [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) 

Oltre ai formati di dati standard, COPY supporta i seguenti formati di dati a colonna per COPY da Amazon S3: 
+ [ORC](#copy-orc) 
+ [PARQUET](#copy-parquet) 

COPY dal formato a colonne è supportato con alcune restrizioni. Per ulteriori informazioni, consulta [COPY da formati di dati a colonna](copy-usage_notes-copy-from-columnar.md). <a name="copy-data-format-parameters"></a>Parametri del formato dei dati

FORMAT [AS]  <a name="copy-format"></a>
(Facoltativo) Identifica le parole chiave del formato dei dati. Gli argomenti FORMAT sono descritti di seguito.

CSV [ QUOTE [AS] *'quote\$1character'* ]  <a name="copy-csv"></a>
Consente l'utilizzo del formato CSV nei dati di input. Per creare automaticamente sequenza di escape con i delimitatori, i caratteri di linea e i ritorni a capo, racchiudi il campo nel carattere specificato dal parametro QUOTE. Il carattere virgoletta di default è una virgoletta doppia ( " ). Quando si utilizza il carattere virgolette in un campo, eseguire l'escape del carattere aggiungendo altre virgolette. Ad esempio, se il carattere virgoletta è una virgoletta doppia, per inserire la stringa `A "quoted" word` il file di input deve includere la stringa `"A ""quoted"" word"`. Quando si utilizza il parametro CSV, il delimitatore predefinito è una virgola ( , ). È possibile specificare un delimitatore diverso utilizzando il parametro DELIMITER.   
Quando un campo è racchiuso tra virgolette, lo spazio tra i delimitatori e i caratteri delle virgolette viene ignorato. Se il delimitatore è un carattere di spazio, ad esempio un carattere di tabulazione, il delimitatore non viene trattato come spazio.  
Il CSV non può essere utilizzato con FIXEDWIDTH, REMOVEQUOTES o ESCAPE.     
QUOTE [AS] *'quote\$1character'*  <a name="copy-csv-quote"></a>
Opzionale. Specifica il carattere da utilizzare come carattere virgoletta quando si utilizza il parametro CSV. Il carattere predefinito è una doppia virgoletta ( " ). Se si utilizzi il parametro QUOTE per definire un carattere virgoletta diverso dalla doppia virgoletta, non è necessario creare una sequenza di escape con le virgolette doppie all'interno del campo. Il parametro QUOTE può essere utilizzato solo con il parametro CSV. La parola chiave AS è facoltativa.

DELIMITER [AS] ['*delimiter\$1char*']   <a name="copy-delimiter"></a>
Specifica i caratteri utilizzati per separare i campi del file di input, ad esempio un carattere pipe (`|`), una virgola (`,`), una tabulazione (`\t`) o più caratteri come `|~|`. Sono supportati i caratteri non stampabili. I caratteri possono anche essere rappresentati in ottale come unità di codice UTF-8. Per ottale, utilizza il formato '\$1ddd', dove 'd' è una cifra ottale (0 – 7). Il delimitatore predefinito è un carattere pipe (`|`) a meno che non venga utilizzato il parametro CSV, nel qual caso il delimitatore predefinito è una virgola (`,`). La parola chiave AS è facoltativa. DELIMITER non può essere utilizzato con FIXEDWIDTH.

FIXEDWIDTH '*fixedwidth\$1spec*'   <a name="copy-fixedwidth"></a>
Carica i dati da un file in cui ogni larghezza di colonna è fissa, invece di avere colonne separate da un delimitatore. La stringa *fixedwidth\$1spec* specifica l'etichetta e la larghezza della colonna definite dall'utente. L'etichetta della colonna può essere sia una stringa di testo sia un intero, a seconda di ciò che sceglie l'utente. L'etichetta della colonna non ha alcuna relazione con il nome della colonna. L'ordine delle label/width coppie deve corrispondere esattamente all'ordine delle colonne della tabella. FIXEDWIDTH non può essere utilizzato con CSV o DELIMITER. In Amazon Redshift, la lunghezza delle colonne CHAR e VARCHAR è espressa in byte, quindi assicurati che la larghezza della colonna specificata corrisponda alla lunghezza binaria dei caratteri multibyte durante la preparazione del file da caricare. Per ulteriori informazioni, consulta [Tipi di carattere](r_Character_types.md).   
Di seguito viene mostrato il formato per *fixedwidth\$1spec*:   

```
'colLabel1:colWidth1,colLabel:colWidth2, ...'
```

SHAPEFILE [ SIMPLIFY [AUTO] [*'tolleranza'*] ]  <a name="copy-shapefile"></a>
Consente l'utilizzo del formato SHAPEFILE nei dati di input. Per impostazione predefinita, la prima colonna dello shapefile è una colonna `GEOMETRY` o `IDENTITY`. Tutte le colonne successive seguono l'ordine specificato nello shapefile.  
Non è possibile utilizzare SHAPEFILE con FIXEDWIDTH, REMOVEQUOTES o ESCAPE.   
Per utilizzare oggetti `GEOGRAPHY` con `COPY FROM SHAPEFILE`, prima importa in un colonna `GEOMETRY`, quindi converti gli oggetti in oggetti `GEOGRAPHY`.    
SIMPLIFY [*tolleranza*]  <a name="copy-shapefile-simplify"></a>
(Facoltativo) Semplifica tutte le geometrie durante il processo di ingestione utilizzando l' Ramer-Douglas-Peuckeralgoritmo e la tolleranza specificata.   
SIMPLIFY AUTO [*tolleranza*]  <a name="copy-shapefile-simplify"></a>
(Facoltativo) Semplifica solo le geometrie più grandi della dimensione massima della geometria. Questa semplificazione utilizza l' Ramer-Douglas-Peuckeralgoritmo e la tolleranza calcolata automaticamente se questa non supera la tolleranza specificata. Questo algoritmo calcola la dimensione per memorizzare gli oggetti entro la tolleranza specificata. Il valore *tolleranza* è facoltativo.
Per esempi di caricamento di uno shapefile, consultare [Caricamento di uno shapefile in Amazon Redshift](r_COPY_command_examples.md#copy-example-spatial-copy-shapefile).

AVRO [AS] '*avro\$1option*'  <a name="copy-avro"></a>
Specifica che i dati sorgente sono in formato Avro.   
Il formato Avro è supportato per COPY da questi servizi e protocolli:  
+ Simple Storage Service (Amazon S3) 
+ Amazon EMR 
+ Host remoto (SSH) 
Avro non è supportato per COPY da DynamoDB.   
Avro è un protocollo di serializzazione dei dati. Un file sorgente Avro include uno schema che definisce la struttura dei dati. Il tipo di schema Avro deve essere `record`. COPY accetta file Avro creati usando il codec di default non compresso così come i codec di compressione `deflate` e `snappy`. Per ulteriori informazioni su Avro, consultare [Apache Avro](https://avro.apache.org/).   
I valori validi per *avro\$1option* sono i seguenti:  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
Il valore predefinito è `'auto'`.  
COPY mappa automaticamente gli elementi di dati nei dati di origine Avro alle colonne della tabella di destinazione. Lo fa associando i nomi dei campi nello schema Avro ai nomi delle colonne nella tabella di destinazione. La corrispondenza prevede una distinzione tra lettere maiuscole e minuscole per `'auto'` e non fa distinzione tra lettere maiuscole e minuscole per `'auto ignorecase'`.   
I nomi delle colonne nelle tabelle Amazon Redshift sono sempre in minuscolo, quindi quando si utilizza l'opzione `'auto'`, anche i nomi dei campi corrispondenti devono essere in minuscolo. Se i nomi dei campi non sono tutti minuscoli, è possibile utilizzare l'opzione `'auto ignorecase'`. Con l'argomento `'auto'` di default, COPY riconosce solo il primo livello di campi, o *campi esterni*, nella struttura.   
Per mappare esplicitamente i nomi delle colonne ai nomi dei campi Avro, è possibile utilizzare un [JSONPaths file](#copy-json-jsonpaths).   
Per impostazione predefinita, COPY tenta di far corrispondere tutte le colonne della tabella di destinazione ai nomi dei campi Avro. Per caricare un sottoinsieme delle colonne, è possibile specificare facoltativamente un elenco di colonne. Se una colonna nella tabella di destinazione viene omessa dall'elenco delle colonne, COPY carica l'espressione [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) della colonna di destinazione. Se la colonna di destinazione non ha un valore di default, COPY prova a caricare NULL. Se una colonna è inclusa nell'elenco di colonne e COPY non trova un campo corrispondente nei dati Avro, COPY prova a caricare NULL nella colonna.   
Se COPY tenta di assegnare NULL a una colonna definita come NOT NULL, il comando COPY non viene eseguito.   
<a name="copy-avro-schema"></a>**Schema Avro**  
Un file di dati sorgente Avro include uno schema che definisce la struttura dei dati. COPY legge lo schema che fa parte del file di dati sorgente Avro per mappare gli elementi di dati sulle colonne della tabella di destinazione. L'esempio seguente mostra uno schema Avro.   

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"}]
}
```
Lo schema Avro è definito utilizzando il formato JSON. L'oggetto JSON di livello superiore contiene tre coppie nome-valore con i nomi o le *chiavi*, `"name"`, `"type"` e `"fields"`.   
Le chiavi `"fields"` si accoppiano con un array di oggetti che definiscono il nome e il tipo di dati di ogni campo nella struttura dei dati. Per impostazione predefinita, COPY fa corrispondere automaticamente i nomi dei campi ai nomi delle colonne. I nomi delle colonne sono sempre in minuscolo, quindi anche i nomi dei campi corrispondenti devono essere in minuscolo a meno che non si specifichi l'opzione `‘auto ignorecase’`. I nomi dei campi che non corrispondono al nome di una colonna vengono ignorati. L'ordine non ha importanza. Nell'esempio precedente COPY mappa i nomi delle colonne `id`, `guid`, `name` e `address`.   
Con l'argomento predefinito `'auto'`, COPY fa corrispondere solo agli oggetti di primo livello alle colonne. Per eseguire la mappatura a livelli più profondi dello schema o se i nomi dei campi e i nomi delle colonne non corrispondono, utilizza un JSONPaths file per definire la mappatura. Per ulteriori informazioni, consulta [JSONPaths file](#copy-json-jsonpaths).   
Se il valore associato a una chiave è un tipo di dati Avro complesso come byte, array, record, mappa o link, COPY carica il valore come stringa. Qui, la stringa è la rappresentazione JSON dei dati. COPY carica i tipi di dati enum Avro come stringhe, dove il contenuto è il nome del tipo. Per un esempio, consultare [COPY dal formato JSON](copy-usage_notes-copy-from-json.md).  
La dimensione massima dell'intestazione del file Avro, che include lo schema e i metadati del file, è di 1 MB.     
La dimensione massima di un singolo blocco dati Avro è di 4 MB. È diverso dalla dimensione massima della riga. Se si supera la dimensione massima di un singolo blocco dati Avro, anche se la dimensione della riga risultante è inferiore al limite di 4 MB, il comando COPY non viene eseguito.   
Nel calcolo delle dimensioni delle righe, Amazon Redshift internamente conta due volte i caratteri pipe ( \$1 ). Se i dati immessi contengono un numero molto elevato di caratteri pipe, è possibile che la dimensione delle righe superi i 4 MB anche se il blocco di dati è inferiore a 4 MB.

JSON [AS] '*json\$1option*'  <a name="copy-json"></a>
I dati sorgente sono in formato JSON.   
Il formato JSON è supportato per COPY da questi servizi e protocolli:  
+ Simple Storage Service (Amazon S3)
+ COPY da Amazon EMR
+ COPY da SSH
JSON non è supportato per COPY da DynamoDB.   
I valori validi per *json\$1option* sono i seguenti:  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
+ `'noshred'` 
Il valore predefinito è `'auto'`. Amazon Redshift non divide gli attributi delle strutture JSON in più colonne durante il caricamento di un documento JSON.  
Per impostazione predefinita, COPY tenta di far corrispondere tutte le colonne della tabella di destinazione alle chiavi dei nomi dei campi JSON. Per caricare un sottoinsieme delle colonne, è possibile specificare facoltativamente un elenco di colonne. Se le chiavi del nome del campo JSON non sono tutte in minuscolo, è possibile utilizzare l'opzione `'auto ignorecase'` o un [JSONPaths file](#copy-json-jsonpaths) per mappare esplicitamente i nomi delle colonne sulle chiavi dei nomi dei campi JSON.  
Se una colonna nella tabella di destinazione viene omessa dall'elenco delle colonne, COPY carica l'espressione [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) della colonna di destinazione. Se la colonna di destinazione non ha un valore di default, COPY prova a caricare NULL. Se una colonna è inclusa nell'elenco di colonne e COPY non trova un campo corrispondente nei dati JSON, COPY prova a caricare NULL nella colonna.   
Se COPY tenta di assegnare NULL a una colonna definita come NOT NULL, il comando COPY non viene eseguito.   
COPY mappa automaticamente gli elementi di dati nei dati di origine JSON alle colonne della tabella di destinazione. Lo fa associando *chiavi di oggetti*, o nomi, nelle coppie nome-valore di origine ai nomi delle colonne nella tabella di destinazione.   
Fare riferimento ai seguenti dettagli su ogni valore *json\$1option*:    
'auto'  <a name="copy-json-auto"></a>
Questa opzione fa distinzione tra lettere maiuscole e minuscole. I nomi delle colonne nelle tabelle Amazon Redshift sono sempre in minuscolo, quindi quando si utilizza l'opzione `'auto'`, anche i nomi dei campi JSON corrispondenti devono essere in minuscolo.  
'auto ignorecase'  <a name="copy-json-auto-ignorecase"></a>
Con questa opzione, non si fa distinzione tra maiuscole e minuscole. I nomi delle colonne nelle tabelle Amazon Redshift sono sempre minuscoli. Pertanto, quando utilizzi l’opzione `'auto ignorecase'`, i nomi dei campi JSON corrispondenti possono essere minuscoli, maiuscoli o maiuscoli e minuscoli.   
's3://*jsonpaths\$1file*'  <a name="copy-json-pathfile"></a>
Con questa opzione, COPY utilizza il JSONPaths file denominato per mappare gli elementi di dati nei dati di origine JSON alle colonne della tabella di destinazione. L'argomento *`s3://jsonpaths_file`* deve essere una chiave oggetto Amazon S3 che fa esplicito riferimento a un singolo file. Un esempio è `'s3://amzn-s3-demo-bucket/jsonpaths.txt`'. L'argomento non può essere un prefisso di chiave. Per ulteriori informazioni sull'utilizzo di un JSONPaths file, consulta[JSONPaths file](#copy-json-jsonpaths).  
In alcuni casi, il file specificato da `jsonpaths_file` ha lo stesso prefisso del percorso specificato da `copy_from_s3_objectpath` per i file di dati. In tal caso, COPY legge il JSONPaths file come file di dati e restituisce errori. Ad esempio, supponiamo che i file di dati utilizzino il percorso dell'oggetto `s3://amzn-s3-demo-bucket/my_data.json` e che il JSONPaths file lo sia. `s3://amzn-s3-demo-bucket/my_data.jsonpaths` In questo caso, COPY prova a caricare `my_data.jsonpaths` come file di dati.  
'noshred'  <a name="copy-json-noshred"></a>
Con questa opzione, Amazon Redshift non divide gli attributi delle strutture JSON in più colonne durante il caricamento di un documento JSON.

## File di dati JSON
<a name="copy-json-data-file"></a>

Il file di dati JSON contiene un insieme di oggetti o array. COPY carica ogni oggetto o array JSON in una riga della tabella di destinazione. Ogni oggetto o array corrispondente a una riga deve essere una struttura autonoma a livello di root, cioè non deve essere membro di un'altra struttura JSON.

Un *oggetto* JSON inizia e termina con delle parentesi ( \$1 \$1 ) e contiene un insieme non ordinato di coppie nome-valore. Ogni coppia nome e valore è separata da due punti e le coppie sono separate da virgole. Per impostazione predefinita, la *chiave oggetto*, o nome, nelle coppie nome-valore deve corrispondere al nome della colonna corrispondente nella tabella. I nomi delle colonne nelle tabelle Amazon Redshift sono sempre in minuscolo, quindi anche le chiavi dei nomi dei campi JSON corrispondenti devono essere in minuscolo. Se i nomi delle colonne e le chiavi JSON non corrispondono, utilizza un [JSONPaths file](#copy-json-jsonpaths) per mappare esplicitamente le colonne sulle chiavi. 

L'ordine non ha importanza in un oggetto JSON. I nomi che non corrispondono al nome di una colonna vengono ignorati. Di seguito viene mostrata la struttura di un semplice oggetto JSON.

```
{
  "column1": "value1",
  "column2": value2,
  "notacolumn" : "ignore this value"
}
```

Un *array* JSON inizia e termina con delle parentesi ( \$1 \$1 ) e contiene un insieme ordinato di valori separati da virgole. Se i file di dati utilizzano matrici, è necessario specificare un JSONPaths file per abbinare i valori alle colonne. Di seguito viene mostrata la struttura di un semplice array JSON. 

```
["value1", value2]
```

Il JSON deve essere ben formato. Ad esempio, gli oggetti o gli array non possono essere separati da virgole o altri caratteri tranne lo spazio. Le stringhe devono essere racchiuse tra virgolette doppie. I caratteri virgolette devono essere virgolette semplici (0x22), non oblique o "intelligenti".

La dimensione massima di un singolo oggetto o array JSON, compresi parentesi graffe o quadre, è di 4 MB. È diverso dalla dimensione massima della riga. Se la dimensione massima di un singolo oggetto o array JSON viene superata, anche se la dimensione della riga risultante è inferiore al limite di 4 MB, il comando COPY non viene eseguito. 

Nel calcolo delle dimensioni delle righe, Amazon Redshift internamente conta due volte i caratteri pipe ( \$1 ). Se i dati immessi contengono un numero molto elevato di caratteri pipe, è possibile che la dimensione delle righe superi i 4 MB anche se la dimensione dell'oggetto è inferiore a 4 MB.

COPY carica `\n` come carattere newline e carica `\t` come carattere di tabulazione. Per caricare una barra rovesciata, crea una sequenza di escape con una barra rovesciata ( `\\` ).

COPY cerca il sorgente JSON specificato per un oggetto o array JSON valido e ben strutturato. Se COPY rileva caratteri non vuoti prima di individuare una struttura JSON utilizzabile o tra oggetti o array JSON validi, COPY restituisce un errore per ogni istanza. Questi errori contano ai fini del conteggio MAXERROR. Quando il conteggio degli errori è uguale o superiore a MAXERROR, COPY fallisce. 

Per ogni errore, Amazon Redshift registra una riga nella tabella di sistema STL\$1LOAD\$1ERRORS. La colonna LINE\$1NUMBER registra l'ultima riga dell'oggetto JSON che ha causato l'errore. 

Se è specificato IGNOREHEADER, COPY ignora il numero di righe specificato nei dati JSON. I caratteri newline nei dati JSON sono sempre conteggiati per i calcoli IGNOREHEADER. 

COPY carica le stringhe vuote come campi vuoti per impostazione predefinita. Se è specificato EMPTYASNULL, COPY carica le stringhe vuote per i campi CHAR e VARCHAR come NULL. Le stringhe vuote per altri tipi di dati, come ad esempio INT, vengono sempre caricate come NULL. 

Con JSON non sono supportate le seguenti opzioni: 
+ CSV
+ DELIMITER 
+ ESCAPE
+ FILLRECORD 
+ FIXEDWIDTH
+ IGNOREBLANKLINES
+ NULL AS
+ READRATIO
+ REMOVEQUOTES 

Per ulteriori informazioni, consulta [COPY dal formato JSON](copy-usage_notes-copy-from-json.md). Per ulteriori informazioni sulle strutture dati JSON, visita il sito [http://www.json.org/](https://www.json.org/). 

## JSONPaths file
<a name="copy-json-jsonpaths"></a>

Se si carica da dati di origine con formattazione JSON o Avro, per impostazione predefinita COPY mappa gli elementi di dati di primo livello nei dati di origine alle colonne della tabella di destinazione. Lo fa associando ogni nome, o chiave di oggetti, in una coppia nome-valore al nome di una colonna nella tabella di destinazione. 

Se i nomi delle colonne e le chiavi degli oggetti non corrispondono o per eseguire il mapping a livelli più profondi nella gerarchia dei dati, puoi utilizzare un JSONPaths file per mappare in modo esplicito gli elementi di dati JSON o Avro alle colonne. Il JSONPaths file mappa gli elementi di dati JSON alle colonne facendo corrispondere l'ordine delle colonne nella tabella di destinazione o nell'elenco delle colonne.

Il JSONPaths file deve contenere solo un singolo oggetto JSON (non un array). L'oggetto JSON è una coppia nome-valore. La *chiave oggetto*, che è il nome nella coppia nome-valore, deve essere `"jsonpaths"`. *Il *valore* nella coppia nome-valore è una matrice di espressioni. JSONPath * Ogni JSONPath espressione fa riferimento a un singolo elemento nella gerarchia dei dati JSON o nello schema Avro, in modo analogo a come un' XPathespressione si riferisce agli elementi di un documento XML. Per ulteriori informazioni, consulta [JSONPath espressioni](#copy-json-jsonpath-expressions).

Per utilizzare un JSONPaths file, aggiungete la parola chiave JSON o AVRO al comando COPY. Specificate il nome del bucket S3 e il percorso dell'oggetto del JSONPaths file utilizzando il seguente formato.

```
COPY tablename 
FROM 'data_source' 
CREDENTIALS 'credentials-args' 
FORMAT AS { AVRO | JSON } 's3://jsonpaths_file';
```

Il valore `s3://jsonpaths_file` deve essere una chiave oggetto di Amazon S3 che fa riferimento esplicitamente a singolo file, come `'s3://amzn-s3-demo-bucket/jsonpaths.txt'`. Non può essere un prefisso di chiave. 

In alcuni casi, se il caricamento avviene da Amazon S3 il file specificato da `jsonpaths_file` ha lo stesso prefisso del percorso specificato da `copy_from_s3_objectpath` per i file di dati. In tal caso, COPY legge il JSONPaths file come file di dati e restituisce errori. Ad esempio, supponiamo che i file di dati utilizzino il percorso dell'oggetto `s3://amzn-s3-demo-bucket/my_data.json` e che il JSONPaths file lo sia. `s3://amzn-s3-demo-bucket/my_data.jsonpaths` In questo caso, COPY prova a caricare `my_data.jsonpaths` come file di dati.

 Se il nome della chiave è una stringa diversa da `"jsonpaths"`, il comando COPY non restituisce un errore, ma ignora *jsonpaths\$1file* e usa invece l'argomento `'auto'`. 

Se si verifica una delle seguenti situazioni, il comando COPY non va a buon fine:
+ Il JSON ha un formato errato.
+ C'è più di un oggetto JSON.
+ Tutti i caratteri tranne lo spazio esistono al di fuori dell'oggetto.
+ Un elemento array è una stringa vuota o non è una stringa.

MAXERROR non si applica al JSONPaths file. 

Il JSONPaths file non deve essere crittografato, anche se l'[ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted)opzione è specificata.

Per ulteriori informazioni, consulta [COPY dal formato JSON](copy-usage_notes-copy-from-json.md). 

## JSONPath espressioni
<a name="copy-json-jsonpath-expressions"></a>

Il JSONPaths file utilizza JSONPath espressioni per mappare i campi di dati alle colonne di destinazione. Ogni JSONPath espressione corrisponde a una colonna nella tabella di destinazione di Amazon Redshift. L'ordine degli elementi dell' JSONPath array deve corrispondere all'ordine delle colonne nella tabella di destinazione o nell'elenco delle colonne, se viene utilizzato un elenco di colonne. 

I caratteri delle doppie virgolette sono richiesti come mostrato, sia per i nomi dei campi sia per i valori. I caratteri delle virgolette devono essere virgolette semplici (0x22), non oblique o "intelligenti".

Se un elemento dell'oggetto a cui fa riferimento un' JSONPath espressione non viene trovato nei dati JSON, COPY tenta di caricare un valore NULL. Se l'oggetto di riferimento ha un formato errato, COPY restituisce un errore di caricamento. 

Se un elemento dell'array a cui fa riferimento un' JSONPath espressione non viene trovato nei dati JSON o Avro, COPY ha esito negativo e restituisce il seguente errore: `Invalid JSONPath format: Not an array or index out of range.` Rimuovi tutti gli elementi dell'array JSONPaths che non esistono nei dati di origine e verifica che gli array nei dati di origine siano ben formati.  

Le JSONPath espressioni possono utilizzare la notazione tra parentesi o la notazione a punti, ma non è possibile combinare le notazioni. L'esempio seguente mostra le JSONPath espressioni che utilizzano la notazione tra parentesi. 

```
{
    "jsonpaths": [
        "$['venuename']",
        "$['venuecity']",
        "$['venuestate']",
        "$['venueseats']"
    ]
}
```

L'esempio seguente mostra le JSONPath espressioni che utilizzano la notazione a punti. 

```
{
    "jsonpaths": [
        "$.venuename",
        "$.venuecity",
        "$.venuestate",
        "$.venueseats"
    ]
}
```

Nel contesto della sintassi Amazon Redshift COPY, un' JSONPath espressione deve specificare il percorso esplicito di un singolo elemento del nome in una struttura dati gerarchica JSON o Avro. Amazon Redshift non supporta alcun JSONPath elemento, come caratteri jolly o espressioni di filtro, che potrebbe risolversi in un percorso ambiguo o in più elementi del nome.

Per ulteriori informazioni, consulta [COPY dal formato JSON](copy-usage_notes-copy-from-json.md). 

## Utilizzo con Avro Data JSONPaths
<a name="using-jsonpath-with-avro"></a>

L'esempio seguente mostra uno schema Avro con più livelli.

```
{
    "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"}
    ]
}
```

L'esempio seguente mostra un JSONPaths file che utilizza AvroPath espressioni per fare riferimento allo schema precedente. 

```
{
    "jsonpaths": [
        "$.id",
        "$.guid",
        "$.address",
        "$.friends[0].id"
    ]
}
```

L' JSONPaths esempio include i seguenti elementi:

jsonpath  
Il nome dell'oggetto JSON che contiene le AvroPath espressioni.

[ … ]  
Le parentesi racchiudono l'array JSON che contiene gli elementi del percorso.

\$1  
Il segno del dollaro fa riferimento all'elemento root nello schema Avro, che è l'array `"fields"`.

"\$1.id",  
La destinazione dell' AvroPath espressione. In questa istanza, la destinazione è l'elemento nell'array `"fields"` con il nome `"id"`. Le espressioni sono separate da virgole.

"\$1.friends[0].id"  
Le parentesi indicano un indice di matrice. JSONPath le espressioni utilizzano l'indicizzazione a base zero, quindi questa espressione fa riferimento al primo elemento dell'array con il `"friends"` nome. `"id"`

La sintassi dello schema Avro richiede l'utilizzo di *campi interni* per definire la struttura dei tipi di dati record e array. I campi interni vengono ignorati dalle espressioni. AvroPath Per esempio, il campo `"friends"` definisce un array chiamato `"inner_friends"`, che a sua volta definisce un record chiamato `"friends_record"`. L' AvroPath espressione che fa riferimento al campo `"id"` può ignorare i campi aggiuntivi per fare riferimento direttamente al campo di destinazione. Le AvroPath espressioni seguenti fanno riferimento ai due campi che appartengono all'`"friends"`array.

```
"$.friends[0].id"
"$.friends[0].name"
```

## Parametri del formato dei dati a colonna
<a name="copy-parameters-columnar-data"></a>

Oltre ai formati di dati standard, COPY supporta i seguenti formati di dati a colonna per COPY da Amazon S3: COPY dal formato a colonne è supportato con alcune restrizioni. Per ulteriori informazioni, consulta [COPY da formati di dati a colonna](copy-usage_notes-copy-from-columnar.md). 

ORC  <a name="copy-orc"></a>
Carica i dati da un file che utilizza il formato di file ORC (Optimized Row Columnar). 

PARQUET  <a name="copy-parquet"></a>
Carica i dati da un file che utilizza il formato di file Parquet. 

# Parametri di compressione dei file
<a name="copy-parameters-file-compression"></a>

È possibile caricare da file di dati compressi specificando i seguenti parametri. Parametri di compressione dei file

BZIP2   <a name="copy-bzip2"></a>
Un valore che specifica che il file o i file di input sono nel formato compresso bzip2 (file .bz2). L'operazione COPY legge ogni file compresso e decomprime i dati man mano che vengono caricati.

GZIP   <a name="copy-gzip"></a>
Un valore che specifica che il file o i file di input sono nel formato compresso gzip (file .gz). L'operazione COPY legge ogni file compresso e decomprime i dati man mano che vengono caricati.

LZOP   <a name="copy-lzop"></a>
Un valore che specifica che il file o i file di input sono nel formato compresso lzop (file .lzo). L'operazione COPY legge ogni file compresso e decomprime i dati man mano che vengono caricati.  
COPY non supporta i file che vengono compressi usando l'opzione *--filter* di lzop.

ZSTD   <a name="copy-zstd"></a>
Un valore che specifica che il file o i file di input sono nel formato compresso Zstandard (file .zst). L'operazione COPY legge ogni file compresso e decomprime i dati man mano che vengono caricati.  
ZSTD è supportato solo con COPY da Amazon S3.

# Parametri di conversione dei dati
<a name="copy-parameters-data-conversion"></a>

Mentre carica la tabella, COPY tenta di convertire in modo implicito le stringhe nei dati di origine nel tipo di dati della colonna di destinazione. Se hai necessità di specificare una conversione diversa dal comportamento predefinito o se la conversione predefinita dà luogo a errori, è possibile gestire le conversioni dei dati specificando i seguenti parametri. Per ulteriori informazioni sulla sintassi dei parametri, consulta [Sintassi di 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>Parametri di conversione dei dati

ACCEPTANYDATE   <a name="copy-acceptanydate"></a>
Consente il caricamento di qualsiasi formato di data, compresi i formati non validi come `00/00/00 00:00:00` senza generare un errore. Questo parametro è valido solo alle colonne TIMESTAMP e DATE. Utilizza sempre ACCEPTANYDATE con il parametro DATEFORMAT. Se il formato della data per i dati non corrisponde alla specifica DATEFORMAT, Amazon Redshift inserisce un valore NULL nel campo.

ACCEPTINVCHARS [AS] ['*replacement\$1char*']   <a name="copy-acceptinvchars"></a>
Consente il caricamento di dati nelle colonne VARCHAR anche se i dati contengono caratteri UTF-8 non validi. Quando è specificato ACCEPTINVCHARS, COPY sostituisce ogni carattere UTF-8 non valido con una stringa di uguale lunghezza composta dal carattere specificato da *replacement\$1char*. Ad esempio, se il carattere sostitutivo è "`^`", un carattere a tre byte non valido verrà sostituito con "`^^^`".  
 Il carattere sostitutivo può essere qualsiasi carattere ASCII tranne NULL. Il valore predefinito è un punto interrogativo ( ? ). Per informazioni sui caratteri UTF-8 non validi, consultare [Errori di caricamento di caratteri multibyte](multi-byte-character-load-errors.md).  
COPY restituisce il numero di righe che contenevano caratteri UTF-8 non validi e aggiunge una voce alla tabella di sistema [STL\$1REPLACEMENTS](r_STL_REPLACEMENTS.md) per ogni riga interessata, fino a un massimo di 100 righe per ogni porzione di nodo. Vengono sostituiti anche altri caratteri UTF-8 non validi, ma gli eventi di sostituzione non vengono registrati.  
Se non è specificato ACCEPTINVCHARS, COPY restituisce un errore ogni volta che incontra un carattere UTF-8 non valido.   
ACCEPTINVCHARS è valido solo per le colonne VARCHAR.

BLANKSASNULL   <a name="copy-blanksasnull"></a>
Carica come NULL i campi vuoti, composti solo da caratteri di spazio. Questa opzione è valide solo alle colonne CHAR e VARCHAR. I campi vuoti per altri tipi di dati, come ad esempio INT, vengono sempre caricati come NULL. Ad esempio, una stringa che contiene tre caratteri spazio in successione (e nessun altro carattere) viene caricata come NULL. Il comportamento predefinito, senza questa opzione, è di caricare i caratteri spazio così come sono. 

DATEFORMAT [AS] \$1'*dateformat\$1string*' \$1 'auto' \$1  <a name="copy-dateformat"></a>
Se non è specificato nessun DATEFORMAT, il formato predefinito è `'YYYY-MM-DD'`. Ad esempio, un formato valido alternativo è `'MM-DD-YYYY'`.   
Se il comando COPY non riconosce il formato dei valori di data e ora o se i valori di data e ora utilizzano formati diversi, utilizza l'argomento `'auto'` con il parametro DATEFORMAT o TIMEFORMAT. L'argomento `'auto'` riconosce diversi formati che non sono supportati quando si usa una stringa DATEFORMAT e TIMEFORMAT. La parola chiave `'auto'`' prevede una distinzione tra lettere maiuscole e minuscole. Per ulteriori informazioni, consulta [Utilizzo del riconoscimento automatico con DATEFORMAT e TIMEFORMAT](automatic-recognition.md).   
Il formato della data può includere informazioni sull'ora (ore, minuti, secondi), ma tali informazioni vengono ignorate. La parola chiave AS è facoltativa. Per ulteriori informazioni, consulta [Stringhe DATEFORMAT e TIMEFORMATEsempio](r_DATEFORMAT_and_TIMEFORMAT_strings.md).

EMPTYASNULL   <a name="copy-emptyasnull"></a>
Indica che Amazon Redshift dovrebbe caricare i campi vuoti CHAR e VARCHAR come NULL. I campi vuoti per altri tipi di dati, come ad esempio INT, vengono sempre caricati come NULL. I campi vuoti si hanno quando i dati contengono due delimitatori in successione senza caratteri tra i delimitatori. EMPTYASNULL e NULL AS '' (stringa vuota) producono lo stesso comportamento.

ENCODING [AS] *file\$1encoding*  <a name="copy-encoding"></a>
Specifica il tipo di codifica dei dati di caricamento. Il comando COPY converte i dati dalla codifica specificata a UTF-8 durante il caricamento.   
I valori validi per *file\$1encoding* sono i seguenti:  
+ `UTF8`
+ `UTF16`
+ `UTF16LE`
+ `UTF16BE`
+ `ISO88591`
Il valore predefinito è `UTF8`.  
I nomi dei file di origine devono utilizzare la codifica UTF-8.  
I seguenti file devono utilizzare la codifica UTF-8, anche se per i dati di caricamento è specificata una codifica diversa:  
+ File manifesto
+ JSONPaths file
Le stringhe di argomento con i seguenti parametri devono utilizzare UTF-8:  
+ FIXEDWIDTH '*fixedwidth\$1spec*'
+ ACCEPTINVCHARS '*replacement\$1char*'
+ DATEFORMAT '*dateformat\$1string*'
+ TIMEFORMAT '*timeformat\$1string*'
+ NULL AS '*null\$1string*'
I file di dati a larghezza fissa devono utilizzare la codifica UTF-8. Le larghezze dei campi si basano sul numero di caratteri, non sul numero di byte.   
Tutti i dati di caricamento devono utilizzare la codifica specificata. Se COPY incontra una codifica diversa, salta il file e restituisce un errore.   
Se specifichi `UTF16`, i dati devono avere un BOM (byte order mark). Se sai se i dati UTF-16 sono little-endian (LE) o big-endian (BE), è possibile utilizzare `UTF16LE` o `UTF16BE` indipendentemente dalla presenza di un BOM.   
Per utilizzare la codifica ISO-8859-1, specifica `ISO88591`. Per ulteriori informazioni, consulta [ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1) in *Wikipedia*.

ESCAPE   <a name="copy-escape"></a>
Quando si specifica questo parametro, il carattere di barra rovesciata (`\`) nei dati di input viene trattato come un carattere di escape. Il carattere che segue immediatamente il carattere di barra rovesciata viene caricato nella tabella come parte del valore corrente della colonna, anche se è un carattere che normalmente ha uno scopo particolare. Ad esempio, è possibile utilizzare questo parametro per creare una sequenza di escape con il carattere delimitatore, un punto interrogativo, un carattere newline incorporato o il carattere di escape stesso quando uno di questi caratteri è una parte lecita di un valore di colonna.  
Se specifichi il parametro ESCAPE in combinazione con il parametro REMOVEQUOTES, è possibile creare una sequenza di escape e mantenere le virgolette (`'` o `"`) che altrimenti potrebbero essere rimosse. La stringa nulla predefinita, `\N`, funziona così com'è, ma è possibile anche creare una sequenza di escape nei dati di input come `\\N`. Finché non specifichi una stringa nulla alternativa con il parametro NULL AS, `\N` e `\\N` produrranno gli stessi risultati.  
Non è possibile eseguire l'escape del carattere di controllo `0x00` (NUL) e questo carattere deve essere rimosso dai dati di input o convertito. Questo carattere viene trattato come un marcatore EOR (end of record), causando il troncamento del resto del record.
Non è possibile utilizzare il parametro ESCAPE per caricamenti FIXEDWIDTH e non è possibile specificare il carattere di escape stesso; il carattere di escape è sempre il carattere di barra rovesciata. Inoltre, devi assicurarti che i dati di input contengano il carattere di escape nei punti appropriati.  
Di seguito sono riportati alcuni esempi di dati di input e i dati caricati risultanti quando viene specificato il parametro ESCAPE. Il risultato per la riga 4 presuppone che sia stato specificato anche il parametro REMOVEQUOTES. I dati di input sono costituiti da due campi delimitati da pipe:   

```
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'
```
I dati caricati nella colonna 2 assomigliano a questi:   

```
The quick brown fox
jumped over the lazy dog.
A\B\C
A|B|C
A Midsummer Night's Dream
```
L'applicazione del carattere di escape ai dati di input per un caricamento è responsabilità dell'utente. Un'eccezione a questo requisito è quando ricarichi dati che erano stati precedentemente scaricati con il parametro ESCAPE. In questo caso, i dati conterranno già i caratteri di escape necessari.
Il parametro ESCAPE non interpreta la notazione ottale, esadecimale, Unicode o altra sequenza di escape. Ad esempio, se i dati di origine contengono il valore di avanzamento della linea ottale (`\012`) e si prova a caricare questi dati con il parametro ESCAPE, Amazon Redshift carica il valore `012` nella tabella e non interpreta questo valore come un avanzamento di linea in una sequenza di escape.  
Per inserire in una sequenza di escape i caratteri newline nei dati che provengono dalle piattaforme Microsoft Windows, potresti dover utilizzare due caratteri di escape: uno per il ritorno a capo e uno per l'avanzamento di linea. In alternativa, è possibile rimuovere il ritorno a capo prima di caricare il file (ad esempio, utilizzando l'utilità dos2unix).

EXPLICIT\$1IDS   <a name="copy-explicit-ids"></a>
Utilizza EXPLICIT\$1IDS con tabelle che hanno colonne IDENTITY se desideri sostituire i valori generati automaticamente con valori espliciti dai file di dati sorgente per le tabelle. Se il comando include un elenco di colonne, tale elenco deve includere le colonne IDENTITY per poter utilizzare questo parametro. Il formato dei dati per i valori di EXPLICIT\$1IDS deve corrispondere al formato IDENTITY specificato dalla definizione CREATE TABLE.  
Quando esegui un comando COPY su una tabella con l'opzione EXPLICIT\$1IDS, Amazon Redshift non controlla più l'univocità delle colonne IDENTITY della tabella.  
Se una colonna è definita con GENERATED BY DEFAULT AS IDENTITY, può esser copiata. i valori vengono generati o aggiornati con i valori forniti dall'utente. L'opzione EXPLICIT\$1IDS non è obbligatoria. COPY non aggiorna la filigrana ad elevata identità.  
 Per un esempio di comando COPY con EXPLICIT\$1IDS, consulta [Caricamento di VENUE con valori espliciti per una colonna 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>
Consente di caricare file di dati quando mancano colonne contigue alla fine di alcuni record. Le colonne mancanti vengono caricate come NULLs. Per i formati di testo e CSV, se la colonna mancante è una colonna VARCHAR, vengono caricate stringhe di lunghezza zero anziché. NULLs Per caricare colonne in VARCHAR NULLs da testo e CSV, specificate la parola chiave EMPTYASNULL. La sostituzione NULL funziona solo se la definizione della colonna lo consente. NULLs  
Per esempio, se la definizione della tabella contiene quattro colonne CHAR che possono contenere dei null e un record contiene i valori `apple, orange, banana, mango`, il comando COPY può caricare e compilare un record che contiene solo i valori `apple, orange`. I valori CHAR mancanti saranno caricati come valori NULL.

IGNOREBLANKLINES   <a name="copy-ignoreblanklines"></a>
Ignora le righe vuote che contengono solo un avanzamento di linea in un file di dati e non tenta di caricarle.

IGNOREHEADER [ AS ] *number\$1rows*   <a name="copy-ignoreheader"></a>
Tratta il *number\$1rows* specificato come intestazione del file e non carica le righe. Usa IGNOREHEADER per saltare le intestazioni di tutti i file in un caricamento parallelo.

NULL AS '*null\$1string*'   <a name="copy-null-as"></a>
Carica i campi che fanno corrispondere *null\$1string* a NULL, dove *null\$1string* può essere una stringa qualsiasi. Se i dati includono un terminatore null, chiamato anche NUL (UTF-8 0000) o zero binario (0x000), COPY lo tratta come qualsiasi altro carattere. Ad esempio, un record contenente '1' \$1\$1 NUL \$1\$1 '2' viene copiato come stringa di lunghezza da 3 byte. Se un campo contiene solo NUL, è possibile utilizzare NULL AS per sostituire il terminatore null con NULL specificando `'\0'` o `'\000'`, ad esempio `NULL AS '\0'` o `NULL AS '\000'`. Se un campo contiene una stringa che termina con NUL ed è specificato NULL AS, la stringa viene inserita con NUL alla fine. Non utilizzare '\$1n' (newline) per il valore *null\$1string*. Amazon Redshift riserva '\$1n' per l'utilizzo come delimitatore di linea. La *null\$1string* predefinita è `'\N`'.  
Se tenti di caricare i nulli in una colonna definita come NON NULL, il comando COPY fallirà.

REMOVEQUOTES   <a name="copy-removequotes"></a>
Rimuove le virgolette intorno alle stringhe nei dati in entrata. Tutti i caratteri compresi tra le virgolette, inclusi i delimitatori, vengono mantenuti. Se una stringa ha una virgoletta iniziale singola o doppia ma non una virgoletta finale corrispondente, il comando COPY non carica quella riga e restituisce un errore. La seguente tabella mostra alcuni semplici esempi di stringhe che contengono virgolette e i valori caricati risultanti.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/copy-parameters-data-conversion.html)

ROUNDEC   <a name="copy-roundec"></a>
Arrotonda i valori numerici quando la scala del valore di input è maggiore della scala della colonna. Per impostazione predefinita, COPY tronca i valori quando necessario per adattarli alla scala della colonna. Per esempio, se un valore di `20.259` viene caricato in una colonna DECIMAL(8,2), COPY tronca il valore a `20.25` per impostazione predefinita. Se è specificato ROUNDEC, COPY arrotonda il valore a `20.26`. Il comando INSERT arrotonda sempre i valori quando necessario per farli corrispondere alla scala della colonna, quindi un comando COPY con il parametro ROUNDEC si comporta come un comando INSERT.

TIMEFORMAT [AS] \$1'*timeformat\$1string*' \$1 'auto' \$1 'epochsecs' \$1 'epochmillisecs' \$1  <a name="copy-timeformat"></a>
Specifica il formato dell'ora. Se non è specificato alcun TIMEFORMAT, il formato predefinito è `YYYY-MM-DD HH:MI:SS` per le colonne TIMESTAMP o `YYYY-MM-DD HH:MI:SSOF` per le colonne TIMESTAMPTZ, dove `OF` è l'offset rispetto all'UTC (Tempo coordinato universale). Non è possibile includere uno specificatore di fuso orario in *timeformat\$1string*. Per caricare i dati TIMESTAMPTZ in un formato diverso da quello predefinito, specificare "auto"; per maggiori informazioni, consultare [Utilizzo del riconoscimento automatico con DATEFORMAT e TIMEFORMAT](automatic-recognition.md). Per maggiori informazioni su *timeformat\$1string*, consultare [Stringhe DATEFORMAT e TIMEFORMATEsempio](r_DATEFORMAT_and_TIMEFORMAT_strings.md).  
L'argomento `'auto'` riconosce diversi formati che non sono supportati quando si usa una stringa DATEFORMAT e TIMEFORMAT. Se il comando COPY non riconosce il formato dei valori di data e ora o se i valori di data e ora utilizzano formati diversi uno dall'altro, utilizza l'argomento `'auto'` con il parametro DATEFORMAT o TIMEFORMAT. Per ulteriori informazioni, consulta [Utilizzo del riconoscimento automatico con DATEFORMAT e TIMEFORMAT](automatic-recognition.md).   
Se i dati sorgente sono rappresentati come tempo dell'epoca, cioè il numero di secondi o millisecondi dal 1° gennaio 1970, 00:00:00 UTC, specifica `'epochsecs'` o `'epochmillisecs'`.   
Le parole chiave `'auto'`, `'epochsecs'` e `'epochmillisecs'` prevedono una distinzione tra lettere maiuscole e minuscole.  
La parola chiave AS è facoltativa.

TRIMBLANKS   <a name="copy-trimblanks"></a>
Rimuove i caratteri di spazio finale da una stringa VARCHAR. Questo parametro è valido solo per le colonne con un tipo di dati VARCHAR.

TRUNCATECOLUMNS   <a name="copy-truncatecolumns"></a>
Tronca i dati nelle colonne al numero appropriato di caratteri in modo che corrispondano alle specifiche della colonna. Si applica solo alle colonne con un tipo di dati VARCHAR o CHAR e alle righe di dimensioni fino a 4 MB.

# Operazioni di caricamento dati
<a name="copy-parameters-data-load"></a>

Gestisce il comportamento predefinito dell'operazione di caricamento per la risoluzione dei problemi o per ridurre i tempi di caricamento specificando i seguenti parametri. 
+ [COMPROWS](#copy-comprows) 
+ [COMPUPDATE](#copy-compupdate) 
+ [IGNOREALLERRORS](#copy-ignoreallerrors) 
+ [MAXERROR](#copy-maxerror) 
+ [NOLOAD](#copy-noload) 
+ [STATUPDATE](#copy-statupdate) <a name="copy-data-load-parameters"></a>Parameters

COMPROWS *numrows*   <a name="copy-comprows"></a>
Specifica il numero di righe da utilizzare come dimensione del campione per l'analisi della compressione. L'analisi viene eseguita su righe da ciascuna sezione di dati. Ad esempio, se specifichi `COMPROWS 1000000` (1,000,000) e il sistema contiene quattro sezioni totali, vengono lette e analizzate non più di 250.000 righe per ogni sezione.  
Se COMPROWS non è specificato, la dimensione del campione è impostata su 100.000 per ogni sezione. I valori di COMPROWS inferiori al valore predefinito di 100.000 righe per ogni sezione vengono automaticamente aggiornati al valore predefinito. Tuttavia, la compressione automatica non verrà eseguita se la quantità di dati caricati è insufficiente per produrre un campione significativo.  
Se il numero di COMPROWS è maggiore del numero di righe del file di input, il comando COPY continua ad eseguire l'analisi di compressione su tutte le righe disponibili. L'intervallo accettato per questo argomento è un numero compreso tra 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>
Controlla se le codifiche di compressione vengono applicate automaticamente durante un COPY.   
Quando COMPUPDATE è PRESET, il comando COPY sceglie la codifica di compressione per ogni colonna se la tabella di destinazione è vuota; anche se le colonne hanno già codifiche diverse da RAW. Le codifiche di colonna specificate attualmente possono essere sostituite. La codifica per ogni colonna si basa sul tipo di dati della colonna. Nessun dato viene campionato. Amazon Redshift assegna automaticamente la codifica della compressione come segue:  
+ Le colonne definite come chiavi di ordinamento vengono assegnate alla compressione RAW.
+ Le colonne definite come tipi di dati BOOLEAN, REAL o DOUBLE PRECISION vengono assegnate alla compressione RAW.
+ Alle colonne definite come SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIMESTAMP o TIMESTAMPTZ viene assegnata la compressione. AZ64 
+ Le colonne definite come CHAR o VARCHAR sono assegnate alla compressione LZO.
Quando COMPUPDATE viene omesso, il comando COPY sceglie la codifica di compressione per ciascuna colonna solo se la tabella di destinazione è vuota e non è stata specificata una codifica (diversa da RAW) per nessuna colonna. La codifica per ciascuna colonna è determinata da Amazon Redshift. Nessun dato viene campionato.   
Quando COMPUPDATE è impostato su ON (o TRUE) o COMPUPDATE viene specificato senza un'opzione, il comando COPY applica la compressione automatica se la tabella è vuota, anche se le colonne della tabella possiedono già codifiche diverse da RAW. Le codifiche di colonna specificate attualmente possono essere sostituite. La codifica di ciascuna colonna è basata su un'analisi dei dati campione. Per ulteriori informazioni, consulta [Caricamento di tabelle con compressione automatica](c_Loading_tables_auto_compress.md).  
Con COMPUPDATE è impostato su OFF (o FALSE), la compressione automatica è disabilitata. Le codifiche di colonna non vengono modificate.  
Per informazioni sulla tabella di sistema per analizzare la compressione, consultare [STL\$1ANALYZE\$1COMPRESSION](r_STL_ANALYZE_COMPRESSION.md). 

IGNOREALLERRORS   <a name="copy-ignoreallerrors"></a>
Puoi specificare questa opzione per ignorare tutti gli errori che si verificano durante l'operazione di caricamento.   
Non è possibile specificare l'opzione IGNOREALLERRORS se si specifica l'opzione MAXERROR. Non è possibile specificare l'opzione IGNOREALLERRORS per i formati in colonna tra cui ORC e Parquet.

MAXERROR [AS] *error\$1count*   <a name="copy-maxerror"></a>
Se il caricamento restituisce il *error\$1count* numero di errori o superiore, il caricamento fallisce. Se il caricamento restituisce meno errori, continua e restituisce un messaggio INFO che indica il numero di righe che non è stato possibile caricare. Utilizza questo parametro per permettere la prosecuzione del caricamento quando alcune righe non vengono caricate nella tabella a causa di errori di formattazione o altre incongruenze nei dati.   
Imposta questo valore su `0` o `1` se desideri che il caricamento fallisca non appena si verifica il primo errore. La parola chiave AS è facoltativa. Il valore predefinito per MAXERROR è `0` e il limite è `100000`.  
 Il numero effettivo di errori segnalati potrebbe essere maggiore del MAXERROR specificato a causa della natura parallela di Amazon Redshift. Se un nodo qualsiasi nel cluster Amazon Redshift rileva che MAXERROR è stato superato, ogni nodo riporta tutti gli errori incontrati.

NOLOAD   <a name="copy-noload"></a>
Controlla la validità del file di dati senza caricare effettivamente i dati. Utilizza il parametro NOLOAD per assicurarti che il file di dati venga caricato senza errori prima di eseguire il caricamento effettivo dei dati. Eseguire COPY con il parametro NOLOAD è molto più veloce che caricare i dati, perché analizza solo i file.

STATUPDATE [ \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-statupdate"></a>
Regola il calcolo automatico e l'aggiornamento delle statistiche dell'ottimizzatore al termine di un comando COPY che ha avuto successo. Per impostazione predefinita, se il parametro STATUPDATE non viene utilizzato, le statistiche vengono aggiornate automaticamente se la tabella è inizialmente vuota.  
Ogni volta che l'inserimento di dati in una tabella non vuota modifica significativamente le dimensioni della tabella, consigliamo di aggiornare le statistiche eseguendo un comando [ANALYZE](r_ANALYZE.md) o utilizzando l'argomento STATUPDATE ON.  
Con STATUPDATE ON (o TRUE), le statistiche vengono aggiornate automaticamente indipendentemente dal fatto che la tabella sia inizialmente vuota. Se si utilizza STATUPDATE, l'utente corrente deve essere il proprietario della tabella o un utente con privilegi avanzati. Se STATUPDATE non è specificato, è richiesta solo l'autorizzazione di INSERT.  
Con STATUPDATE OFF (o FALSE), le statistiche non vengono mai aggiornate.  
Per ulteriori informazioni, consultare [Analisi delle tabelle](t_Analyzing_tables.md).

# Elenco alfabetico dei parametri
<a name="r_COPY-alphabetical-parm-list"></a>

Il seguente elenco fornisce i collegamenti a ogni descrizione del parametro del comando COPY, in ordine alfabetico.
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate)
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)
+ [ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id-access)
+ [AVRO](copy-parameters-data-format.md#copy-avro)
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull)
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows)
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate)
+ [CREDENTIALS](copy-parameters-authorization.md#copy-credentials-cred)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter)
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull)
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding)
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted)
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape)
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth)
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [FROM](copy-parameters-data-source-s3.md#copy-parameters-from)
+ [GZIP](copy-parameters-file-compression.md#copy-gzip)
+ [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role-iam)
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors)
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines)
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader)
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json)
+ [LZOP](copy-parameters-file-compression.md#copy-lzop)
+ [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
+ [MASTER_SYMMETRIC_KEY](copy-parameters-data-source-s3.md#copy-master-symmetric-key)
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror)
+ [NOLOAD](copy-parameters-data-load.md#copy-noload)
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as)
+ [READRATIO](copy-parameters-data-source-dynamodb.md#copy-readratio)
+ [REGION](copy-parameters-data-source-s3.md#copy-region)
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes)
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec)
+ [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token)
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile)
+ [SSH](copy-parameters-data-source-ssh.md#copy-ssh)
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate)
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat)
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks)
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns)
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd)

# Note per l'utilizzo
<a name="r_COPY_usage_notes"></a>

**Topics**
+ [AWS Autorizzazioni per accedere ad altre risorse](copy-usage_notes-access-permissions.md)
+ [Utilizzo di COPY con gli alias degli Access Point Amazon S3](copy-usage_notes-s3-access-point-alias.md)
+ [Caricamento di dati multibyte da Amazon S3](copy-usage_notes-multi-byte.md)
+ [Caricamento di una colonna definita come tipo dati GEOMETRY o GEOGRAPHY](copy-usage_notes-spatial-data.md)
+ [Caricamento del tipo di dati HLLSKETCH](copy-usage_notes-hll.md)
+ [Caricamento di una colonna definita come tipo dati VARBYTE](copy-usage-varbyte.md)
+ [Errori durante la lettura di più file](copy-usage_notes-multiple-files.md)
+ [COPY dal formato JSON](copy-usage_notes-copy-from-json.md)
+ [COPY da formati di dati a colonna](copy-usage_notes-copy-from-columnar.md)
+ [Stringhe DATEFORMAT e TIMEFORMAT](r_DATEFORMAT_and_TIMEFORMAT_strings.md)
+ [Utilizzo del riconoscimento automatico con DATEFORMAT e TIMEFORMAT](automatic-recognition.md)

# AWS Autorizzazioni per accedere ad altre risorse
<a name="copy-usage_notes-access-permissions"></a>

 Per spostare dati tra il cluster e un'altra AWS risorsa, come Amazon S3, Amazon DynamoDB, Amazon EMR o Amazon EC2, il cluster deve disporre dell'autorizzazione per accedere alla risorsa ed eseguire le azioni necessarie. Ad esempio, per caricare i dati da Amazon S3, COPY deve avere accesso LIST al bucket e accesso GET per gli oggetti del bucket. Per maggiori informazioni sulle autorizzazioni minime, consultare [Autorizzazioni IAM per COPY, UNLOAD e CREATE LIBRARY](#copy-usage_notes-iam-permissions).

Per ottenere l'autorizzazione per accedere alla risorsa, il cluster deve essere autenticato. È possibile scegliere uno dei seguenti metodi di autenticazione: 
+ [Controllo degli accessi basato sui ruoli](#copy-usage_notes-access-role-based)— Per il controllo degli accessi basato sui ruoli, è necessario specificare un ruolo AWS Identity and Access Management (IAM) utilizzato dal cluster per l'autenticazione e l'autorizzazione. Per proteggere AWS le credenziali e i dati sensibili, consigliamo vivamente di utilizzare l'autenticazione basata sui ruoli.
+ [Controllo degli accessi basato su chiave](#copy-usage_notes-access-key-based)— Per il controllo degli accessi basato su chiavi, fornisci le credenziali di AWS accesso (ID della chiave di accesso e chiave di accesso segreta) per un utente come testo semplice.

## Controllo degli accessi basato sui ruoli
<a name="copy-usage_notes-access-role-based"></a>

Con il <a name="copy-usage_notes-access-role-based.phrase"></a>controllo degli accessi basato su ruoli, il cluster assume in modo temporaneo e automatico un ruolo (IAM). Quindi, in base alle autorizzazioni concesse al ruolo, il cluster può accedere alle risorse AWS necessarie.

La creazione di un *ruolo* IAM è simile all'assegnazione delle autorizzazioni a un utente, in quanto è un'identità AWS con policy di autorizzazioni che determinano ciò che l'identità può e non può fare in AWS. Tuttavia, invece di essere associato univocamente a un utente, un ruolo può essere assunto da qualsiasi entità che ne abbia bisogno. Inoltre, a un ruolo non sono associate credenziali (password o chiavi di accesso). Al contrario, se un ruolo è associato a un cluster, le chiavi di accesso vengono create dinamicamente e fornite al cluster.

Ti consigliamo di utilizzare il controllo degli accessi basato sui ruoli perché offre un controllo più sicuro e dettagliato dell'accesso alle AWS risorse e ai dati sensibili degli utenti, oltre a salvaguardare le credenziali. AWS 

L'autenticazione basata sui ruoli offre i seguenti vantaggi:
+ Puoi utilizzare strumenti IAM AWS standard per definire un ruolo IAM e associarlo a più cluster. Quando modifichi la policy di accesso a un ruolo, le modifiche vengono applicate automaticamente a tutti i cluster che utilizzano il ruolo.
+ Puoi definire policy IAM granulari che concedono autorizzazioni a cluster e utenti del database specifici per accedere a risorse e azioni specifiche. AWS 
+ Il cluster ottiene le credenziali di sessione temporanee al momento dell'esecuzione e le aggiorna come necessario fino al completamento dell'operazione. Se utilizzi credenziali temporanee basate su chiavi, l'operazione fallisce se le credenziali temporanee scadono prima del completamento.
+ L'ID chiave di accesso e l'ID chiave di accesso segreta non vengono memorizzati o trasmessi nel codice SQL.

Per utilizzare il controllo degli accessi basato su ruoli, è necessario creare prima un ruolo IAM utilizzando il tipo di ruolo di servizio Amazon Redshift, quindi collegare il ruolo al cluster. Il ruolo deve avere, come minimo, le autorizzazioni elencate in [Autorizzazioni IAM per COPY, UNLOAD e CREATE LIBRARY](#copy-usage_notes-iam-permissions). Per i passaggi per creare un ruolo IAM e collegarlo al cluster, consulta la sezione [Autorizzazione di Amazon Redshift ad accedere ad AWS altri servizi per conto dell'utente](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html) nella *Amazon Redshift* Management Guide.

È possibile aggiungere un ruolo a un cluster o visualizzare i ruoli associati a un cluster utilizzando la Console di gestione, la CLI o l'API di Amazon Redshift. Per ulteriori informazioni, consulta [Associazione di un ruolo IAM a un cluster](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) nella *Guida alla gestione di Amazon Redshift*.

Quando crei un ruolo IAM, IAM restituisce un Amazon Resource Name (ARN) per il ruolo. Per specificare un ruolo IAM, fornisci al ruolo ARN il parametro [Utilizzo del parametro IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role) o il parametro [Utilizzo del parametro CREDENTIALS](copy-parameters-authorization.md#copy-credentials). 

Ad esempio, supponiamo che al cluster sia collegato il seguente ruolo.

```
"IamRoleArn": "arn:aws:iam::0123456789012:role/MyRedshiftRole"
```

Il seguente esempio di comando COPY utilizza il parametro IAM\$1ROLE con l'ARN dell'esempio precedente per l'autenticazione e l'accesso a Amazon S3.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata'  
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Il seguente esempio di comando COPY utilizza il parametro CREDENTIALS per specificare il ruolo IAM.

```
copy customer from 's3://amzn-s3-demo-bucket/mydata' 
credentials 
'aws_iam_role=arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Inoltre, un utente con privilegi avanzati può concedere il privilegio ASSUMEROLE a utenti e gruppi di database per fornire l'accesso a un ruolo per le operazioni COPY. Per informazioni, consulta [GRANT](r_GRANT.md).

## Controllo degli accessi basato su chiave
<a name="copy-usage_notes-access-key-based"></a>

Con il <a name="copy-usage_notes-access-key-based.phrase"></a>controllo degli accessi basato su chiavi, fornisci l'ID della chiave di accesso e la chiave di accesso segreta per un utente IAM autorizzato ad accedere alle AWS risorse che contengono i dati. Puoi utilizzare i parametri [Utilizzo dei parametri ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id) insieme o il parametro [Utilizzo del parametro CREDENTIALS](copy-parameters-authorization.md#copy-credentials).

**Nota**  
Consigliamo vivamente di utilizzare un ruolo IAM per l'autenticazione invece di fornire un ID chiave di accesso in chiaro e una chiave di accesso segreta. Se scegli il controllo degli accessi basato su chiavi, non utilizzare mai le credenziali del tuo AWS account (root). Creare sempre un utente IAM e fornire l'ID della chiave di accesso e la chiave di accesso segreta di quell'utente. Per la procedura per creare un utente IAM, consultare [Creazione di un utente IAM nell'account AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html).

Per eseguire l'autenticazione utilizzando ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY, sostituisci e *<secret-access-key>* con l'ID della chiave di accesso di un utente autorizzato *<access-key-id>* e una chiave di accesso segreta completa, come illustrato di seguito. 

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>';
```

Per eseguire l'autenticazione utilizzando il parametro CREDENTIALS, sostituite *<access-key-id>* e *<secret-access-key>* con l'ID della chiave di accesso di un utente autorizzato e una chiave di accesso segreta completa, come illustrato di seguito.

```
CREDENTIALS
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>';
```

L'utente IAM deve disporre, come minimo, delle autorizzazioni elencate in [Autorizzazioni IAM per COPY, UNLOAD e CREATE LIBRARY](#copy-usage_notes-iam-permissions).

### Credenziali di sicurezza temporanee
<a name="r_copy-temporary-security-credentials"></a>

 Se utilizzi il controllo degli accessi basato su chiave, è possibile limitare ulteriormente l'accesso ai dati degli utenti utilizzando le credenziali di sicurezza temporanee. L'autenticazione basata su ruoli utilizza automaticamente credenziali temporanee. 

**Nota**  
Consigliamo vivamente di utilizzare [role-based access control](#copy-usage_notes-access-role-based.phrase) invece di creare credenziali temporanee e fornire ID chiave di accesso e chiave di accesso segreta come testo in chiaro. Il controllo degli accessi basato sui ruoli utilizza automaticamente le credenziali temporanee. 

Le credenziali di sicurezza temporanee offrono maggiore sicurezza perché hanno una durata breve e non possono essere riutilizzate dopo la loro scadenza. L'ID chiave di accesso e la chiave di accesso segreta generate con il token non possono essere utilizzate senza il token e un utente che ha queste credenziali di sicurezza temporanee può accedere alle risorse solo fino a quando le credenziali non scadono.

Per concedere agli utenti l'accesso temporaneo alle tue risorse, chiami le operazioni API AWS Security Token Service (AWS STS). Le operazioni AWS STS API restituiscono credenziali di sicurezza temporanee costituite da un token di sicurezza, un ID della chiave di accesso e una chiave di accesso segreta. Rilascia le credenziali di sicurezza temporanee agli utenti che necessitano di un accesso temporaneo alle risorse. Questi utenti possono essere utenti IAM esistenti o utenti non AWS . Per ulteriori informazioni sulla creazione delle credenziali di sicurezza temporanee, consultare [Utilizzo delle credenziali di sicurezza temporanee](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html) nella Guida per l'utente di IAM.

È possibile utilizzare sia i parametri [Utilizzo dei parametri ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id) insieme con il parametro [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token) o il parametro [Utilizzo del parametro CREDENTIALS](copy-parameters-authorization.md#copy-credentials). È inoltre necessario fornire l'ID chiave di accesso e la chiave di accesso segreta forniti con il token.

Per eseguire l'autenticazione utilizzando ACCESS\$1KEY\$1ID, SECRET\$1ACCESS\$1KEY e SESSION\$1TOKEN, sostituisci e come mostrato di seguito. *<temporary-access-key-id>* *<temporary-secret-access-key>* *<temporary-token>* 

```
ACCESS_KEY_ID '<temporary-access-key-id>'
SECRET_ACCESS_KEY '<temporary-secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

Per autenticarti utilizzando CREDENTIALS, includi `session_token=<temporary-token>` nella stringa delle credenziali come mostrato di seguito. 

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>';
```

L'esempio seguente mostra un comando COPY con credenziali di sicurezza temporanee.

```
copy table-name
from 's3://objectpath'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>';
```

L'esempio seguente carica la tabella LISTING con credenziali temporanee e crittografia dei file.

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

L'esempio seguente carica la tabella LISTING utilizzando il parametro CREDENTIALS con credenziali temporanee e crittografia dei file.

```
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**  
Le credenziali di sicurezza temporanee devono essere valide per l'intera durata dell'operazione COPY o UNLOAD. Se le credenziali di sicurezza temporanee scadono durante l'operazione, il comando fallisce e la transazione viene annullata. Ad esempio, se le credenziali di sicurezza temporanee scadono dopo 15 minuti e l'operazione COPY richiede un'ora, l'operazione COPY fallisce prima del completamento. Se utilizzi l'accesso basato su ruoli, le credenziali di sicurezza temporanee vengono aggiornate automaticamente fino al completamento dell'operazione.

## Autorizzazioni IAM per COPY, UNLOAD e CREATE LIBRARY
<a name="copy-usage_notes-iam-permissions"></a>

L'utente o il ruolo IAM a cui fa riferimento il parametro CREDENTIALS deve avere, come minimo, le seguenti autorizzazioni:
+ Per COPY da Amazon S3, l'autorizzazione per il LIST del bucket Amazon S3 e il GET degli oggetti Amazon S3 che vengono caricati e il file manifest, se viene utilizzato.
+ Per la COPIA da Amazon S3, Amazon EMR e host remoti (SSH) con dati in formato JSON, autorizzazione a ELENCARE e OTTENERE il file su JSONPaths Amazon S3, se ne viene utilizzato uno. 
+ Per COPY da DynamoDB, l'autorizzazione a SCAN e DESCRIBE sulla tabella DynamoDB che viene caricata. 
+ Per COPY da un cluster Amazon EMR, l'autorizzazione per l'operazione `ListInstances` sul cluster Amazon EMR. 
+ Per UNLOAD su Amazon S3, le autorizzazioni GET, LIST e PUT per il bucket Amazon S3 in cui i file di dati vengono scaricati.
+ Per CREATE LIBRARY da Amazon S3, l'autorizzazione per il LIST del bucket Amazon S3 e il GET degli oggetti Amazon S3 importati.

**Nota**  
Se si riceve il messaggio di errore `S3ServiceException: Access Denied`, quando si esegue un comando COPY, UNLOAD o CREATE LIBRARY, il cluster non ha le autorizzazioni di accesso appropriate per Amazon S3.

È possibile gestire le autorizzazioni IAM assegnando una policy IAM a un ruolo IAM collegato al cluster, all'utente o al gruppo a cui appartiene l'utente. Ad esempio, la policy gestita da `AmazonS3ReadOnlyAccess` concede le autorizzazioni LIST e GET alle risorse Amazon S3. Per ulteriori informazioni sulle policy IAM, consultare [Utilizzo delle policy IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html) nella *Guida per l'utente di IAM*. 

# Utilizzo di COPY con gli alias degli Access Point Amazon S3
<a name="copy-usage_notes-s3-access-point-alias"></a>

Utilizzo di COPY con gli alias degli Access Point Amazon S3 Per ulteriori informazioni, consulta [Utilizzo di un alias in stile bucket per il punto di accesso](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html) nella *Guida utente di Amazon Simple Storage Service*.

# Caricamento di dati multibyte da Amazon S3
<a name="copy-usage_notes-multi-byte"></a>

Se i dati includono caratteri multibyte non ASCII (ad esempio caratteri cinesi o cirillici), è necessario caricare i dati nelle colonne VARCHAR. Il tipo di dati VARCHAR supporta caratteri UTF-8 a quattro byte, ma il tipo di dati CHAR accetta solo caratteri ASCII a byte singolo. Non è possibile caricare caratteri a cinque byte o più lunghi nelle tabelle Amazon Redshift. Per ulteriori informazioni, consulta [Caratteri multibyte](c_Supported_data_types.md#c_Supported_data_types-multi-byte-characters). 

# Caricamento di una colonna definita come tipo dati GEOMETRY o GEOGRAPHY
<a name="copy-usage_notes-spatial-data"></a>

È possibile eseguire COPY su colonne `GEOMETRY` o `GEOGRAPHY` dai dati in un file di testo delimitato da caratteri, ad esempio un file CSV. I dati devono essere nella forma esadecimale del noto formato binario (WKB o EWKB) o del noto formato di testo (WKT o EWKT) e rientrare nella dimensione massima di una singola riga di ingresso al comando COPY. Per ulteriori informazioni, consulta [COPY](r_COPY.md). 

Per informazioni su come caricare da uno shapefile, consulta.[Caricamento di uno shapefile in Amazon Redshift](spatial-copy-shapefile.md).

Per ulteriori informazioni sui tipi di dati `GEOMETRY` o `GEOGRAPHY`, consultare [Query su dati spaziali in Amazon Redshift](geospatial-overview.md).

# Caricamento del tipo di dati HLLSKETCH
<a name="copy-usage_notes-hll"></a>

È possibile copiare gli schizzi HLL solo nel formato sparso o denso supportato da Amazon Redshift. Per utilizzare il comando COPY sugli HyperLogLog schizzi, usa il formato Base64 per schizzi densi e il formato JSON per schizzi sparsi. HyperLogLog HyperLogLog Per ulteriori informazioni, consulta [HyperLogLog funzioni](hyperloglog-functions.md). 

Nell'esempio seguente vengono importati dati da un file CSV in una tabella utilizzando CREATE TABLE e COPY. Innanzitutto, l'esempio crea la tabella `t1` utilizzando CREATE TABLE.

```
CREATE TABLE t1 (sketch hllsketch, a bigint);
```

Quindi utilizza COPY per importare i dati da un file CSV nella tabella `t1`. 

```
COPY t1 FROM s3://amzn-s3-demo-bucket/unload/' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' CSV;
```

# Caricamento di una colonna definita come tipo dati VARBYTE
<a name="copy-usage-varbyte"></a>

È possibile caricare dati da un file in formato CSV, Parquet e ORC. Se si sceglie il formato CSV, i dati vengono caricati da un file nella rappresentazione esadecimale dei dati VARBYTE. Non è possibile caricare i dati VARBYTE con l'opzione `FIXEDWIDTH`. Le opzioni `ADDQUOTES` o `REMOVEQUOTES` di COPY non sono supportate. Una colonna VARBYTE non può essere utilizzata come colonna di partizione. 

# Errori durante la lettura di più file
<a name="copy-usage_notes-multiple-files"></a>

Il comando COPY è atomico e transazionale. In altre parole, anche quando il comando COPY legge i dati da più file, l'intero processo viene trattato come una singola transazione. Se COPY rileva un errore nella lettura di un file, riprova automaticamente fino a quando il processo scade (vedere [statement\$1timeout](r_statement_timeout.md)) o se i dati non possono essere scaricati da Amazon S3 per un periodo di tempo prolungato (tra 15 e 30 minuti), assicurandosi che ogni file venga caricato una sola volta. Se il comando COPY fallisce, l'intera transazione viene interrotta e tutte le modifiche vengono annullate. Per ulteriori informazioni sulla gestione degli errori di caricamento, vedi [Risoluzione di problemi di caricamento dei dati](t_Troubleshooting_load_errors.md). 

Una volta avviato un comando COPY con successo, non fallisce se la sessione termina, ad esempio quando il client si disconnette. Tuttavia, se il comando COPY si trova all'interno di un blocco di transazioni BEGIN … END che non viene completato perché la sessione termina, l'intera transazione, compreso il comando COPY, viene annullata. Per ulteriori informazioni sulle transazioni, consultare [BEGIN](r_BEGIN.md).

# COPY dal formato JSON
<a name="copy-usage_notes-copy-from-json"></a>

La struttura dei dati JSON è costituita da una serie di oggetti o array. Un *oggetto* JSON inizia e termina con delle parentesi e contiene un insieme non ordinato di coppie nome-valore. Ogni nome e valore sono separati da due punti e le coppie sono separate da virgole. Il nome è una stringa tra doppie virgolette. I caratteri virgoletta devono essere virgolette semplici (0x22), non oblique o "smart". 

Un *array* JSON inizia e termina con delle parentesi e contiene un insieme ordinato di valori separati da virgole. Un valore può essere una stringa tra doppie virgolette, un numero, un booleano vero o falso, nullo, un oggetto JSON o un array. 

Gli oggetti e gli array JSON possono essere annidati, consentendo una struttura gerarchica dei dati. L'esempio seguente mostra una struttura di dati JSON con due oggetti validi. 

```
{
    "id": 1006410,
    "title": "Amazon Redshift Database Developer Guide"
}
{
    "id": 100540,
    "name": "Amazon Simple Storage Service User Guide"
}
```

Di seguito sono riportati gli stessi dati di due array JSON.

```
[
    1006410,
    "Amazon Redshift Database Developer Guide"
]
[
    100540,
    "Amazon Simple Storage Service User Guide"
]
```

## Opzioni COPY per JSON
<a name="copy-usage-json-options"></a>

È possibile specificare le seguenti opzioni quando si utilizza COPY con i dati in formato JSON: 
+ `'auto' `: COPY carica automaticamente i campi dal file JSON. 
+ `'auto ignorecase'`: COPY carica automaticamente i campi dal file JSON ignorando la distinzione tra maiuscole e minuscole per i nomi dei campi.
+ `s3://jsonpaths_file`— COPY utilizza un JSONPaths file per analizzare i dati di origine JSON. Un *JSONPaths file* è un file di testo che contiene un singolo oggetto JSON con il nome `"jsonpaths"` associato a una serie di espressioni. JSONPath Se il nome è una stringa diversa da`"jsonpaths"`, COPY utilizza l'`'auto'`argomento anziché il JSONPaths file. 

Per esempi che mostrano come caricare dati utilizzando `'auto'``'auto ignorecase'`, o un JSONPaths file e utilizzando oggetti o array JSON, consulta. [Esempi di copia da JSON](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json) 

## JSONPath opzione
<a name="copy-usage-json-options"></a>

Nella sintassi Amazon Redshift COPY, un' JSONPath espressione specifica il percorso esplicito di un singolo elemento del nome in una struttura dati gerarchica JSON, utilizzando la notazione tra parentesi o la notazione a punti. Amazon Redshift non supporta alcun JSONPath elemento, come caratteri jolly o espressioni di filtro, che potrebbe risolversi in un percorso ambiguo o in più elementi del nome. Di conseguenza, Amazon Redshift non è in grado di analizzare strutture di dati complesse e a più livelli.

Di seguito è riportato un esempio di JSONPaths file con JSONPath espressioni che utilizzano la notazione tra parentesi. Il simbolo del dollaro (\$1) rappresenta la struttura a livello di root. 

```
{
    "jsonpaths": [
       "$['id']",
       "$['store']['book']['title']",
	"$['location'][0]" 
    ]
}
```

 Nell'esempio precedente, `$['location'][0]` fa riferimento al primo elemento di un array. JSON utilizza un'indicizzazione dell'array basata su zero. Gli indici degli array devono essere numeri interi positivi (maggiori o uguali a zero).

L'esempio seguente mostra il JSONPaths file precedente utilizzando la notazione a punti. 

```
{
    "jsonpaths": [
       "$.id",
       "$.store.book.title",
	"$.location[0]"
    ]
}
```

Non è possibile mischiare la notazione a parentesi e a punti nell'array `jsonpaths`. Le parentesi possono essere utilizzate sia nella notazione a parentesi sia nella notazione a punti per fare riferimento a un elemento dell'array. 

Quando si utilizza la notazione a punti, le JSONPath espressioni non possono contenere i seguenti caratteri: 
+ Virgolette singole diritte ( ' ) 
+ Periodo o punto ( . ) 
+ Parentesi ( [ ] ) salvo se utilizzate per fare riferimento a un elemento dell'array 

Se il valore nella coppia nome-valore a cui fa riferimento un' JSONPath espressione è un oggetto o una matrice, l'intero oggetto o matrice viene caricato come stringa, comprese le parentesi o le parentesi. Ad esempio, si supponga che i dati JSON contengano il seguente oggetto. 

```
{
    "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"
        }
    ]
}
```

L' JSONPath espressione restituisce `$['tags']` quindi il seguente valore. 

```
"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]" 
```

L' JSONPath espressione restituisce `$['friends'][1]` quindi il seguente valore. 

```
"{"id": 1,"name": "Renaldo"}" 
```

Ogni JSONPath espressione nell'`jsonpaths`array corrisponde a una colonna nella tabella di destinazione di Amazon Redshift. L'ordine degli elementi dell'array `jsonpaths` deve corrispondere all'ordine delle colonne della tabella di destinazione o, se viene utilizzato un elenco di colonne, di quest'ultimo. 

Per esempi che mostrano come caricare dati utilizzando l'`'auto'`argomento o un JSONPaths file e utilizzando oggetti o array JSON, consulta. [Esempi di copia da JSON](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json) 

Per informazioni su come copiare più file JSON, consultare [Utilizzo di un manifest per specificare i fili di dati](loading-data-files-using-manifest.md).

## Caratteri escape in JSON
<a name="copy-usage-json-escape-characters"></a>

COPY carica `\n` come carattere newline e carica `\t` come carattere di tabulazione. Per caricare una barra rovesciata, crea una sequenza di escape con una barra rovesciata ( `\\` ).

Ad esempio, supponiamo di avere la seguente struttura JSON in un file denominato `escape.json` nel 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."
}
```

Esegui i seguenti comandi per creare la tabella ESCAPES e caricare il 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';
```

Eseguire una query sulla tabella ESCAPES per visualizzare i risultati.

```
select * from escapes;

       backslash        |      newline      |               tab
------------------------+-------------------+----------------------------------
 This is a backslash: \ | This sentence     | This sentence    contains a tab.
                        :  is on two lines.
(1 row)
```

## Perdita di precisione numerica
<a name="copy-usage-json-rounding"></a>

Potrebbe verificarsi una perdita di precisione quando carichi numeri da file di dati in formato JSON in una colonna definita come tipo di dati numerico. Alcuni valori float non sono rappresentati con esattezza nei sistemi informatici. Di conseguenza, i dati copiati da un file JSON potrebbero non essere arrotondati come previsto. Per evitare una perdita di precisione, consigliamo di utilizzare una delle seguenti alternative:
+ Rappresentare il numero come stringa racchiudendo il valore in caratteri di doppia virgoletta.
+ Utilizza [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) per arrotondare il numero invece di troncarlo.
+ Invece di utilizzare file JSON o Avro, utilizza file di testo CSV, delimitati da caratteri o a larghezza fissa.

# COPY da formati di dati a colonna
<a name="copy-usage_notes-copy-from-columnar"></a>

COPY può caricare i dati da Amazon S3 nei seguenti formati di colonna:
+ ORC
+ Parquet

Per esempi di utilizzo di COPY con formati di dati colonnari, consulta [Esempi di COPY](r_COPY_command_examples.md).

COPY supporta i dati formattati a colonna con le seguenti restrizioni:
+ Il bucket Amazon S3 deve trovarsi nella stessa AWS regione del database Amazon Redshift. 
+ Per accedere ai dati Amazon S3 tramite un endpoint VPC, configurare l'accesso utilizzando le policy e i ruoli IAM come descritto in [Utilizzo di Amazon Redshift Spectrum con il routing VPC avanzato](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html) nella *Guida alla gestione di Amazon Redshift*. 
+ COPY non applica automaticamente le codifiche di compressione. 
+ Sono supportati solo i seguenti parametri COPY: 
  + [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars) durante la copia da un file ORC o Parquet.
  + [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
  + [FROM](copy-parameters-data-source-s3.md#copy-parameters-from)
  + [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role)
  + [CREDENTIALS](copy-parameters-authorization.md#copy-credentials)
  + [STATUPDATE ](copy-parameters-data-load.md#copy-statupdate)
  + [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
  + [EXPLICIT\$1IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ Se COPY rileva un errore durante il caricamento, il comando fallisce. ACCEPTANYDATE e MAXERROR non sono supportati per i tipi di dati colonnari..
+ I messaggi di errore vengono inviati al client SQL. Alcuni errori vengono registrati in STL\$1LOAD\$1ERRORS e STL\$1ERROR.
+ COPY inserisce i valori nelle colonne della tabella di destinazione nello stesso ordine in cui si presentano le colonne nei file di dati a colonna. Il numero di colonne nella tabella di destinazione e il numero di colonne nel file di dati devono corrispondere.
+ Se il file specificato per l'operazione COPY include una delle seguenti estensioni, decomprimiamo i dati senza la necessità di aggiungere alcun parametro: 
  + `.gz`
  + `.snappy`
  + `.bz2`
+ Il COPY dai formati di file Parquet e ORC utilizza Redshift Spectrum e l'accesso al bucket. Per utilizzare COPY per questi formati, assicurati che non vi siano policy IAM che blocchino l'uso di Amazon S3 presigned. URLs I URLs prefirmati generati da Amazon Redshift sono validi per 1 ora, in modo che Amazon Redshift abbia abbastanza tempo per caricare tutti i file dal bucket Amazon S3. Viene generato un URL prefirmato univoco per ogni file scansionato da COPY da formati di dati a colonna. Per le policy di bucket che includono un’azione `s3:signatureAge`, assicurati di impostare il valore su almeno 3.600.000 millisecondi. Per ulteriori informazioni, consultare [Utilizzo di Amazon Redshift Spectrum con il routing VPC avanzato](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html).
+ Il parametro REGION non è supportato con COPY da formati di dati a colonna. Anche se il bucket Amazon S3 e il database si trovano nello stesso database, è possibile che si verifichi un errore Regione AWS, ad esempio, l'argomento REGION non è supportato per COPY basato su PARQUET.
+ COPY da formati a colonna ora supporta il dimensionamento simultaneo. Per abilitare il dimensionamento simultaneo, consulta [Configurazione delle code di dimensionamento simultaneo.](https://docs.aws.amazon.com/redshift/latest/dg/concurrency-scaling.html#concurrency-scaling-queues)

# Stringhe DATEFORMAT e TIMEFORMAT
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings"></a>

Il comando COPY utilizza le opzioni DATEFORMAT e TIMEFORMAT per analizzare i valori di data e ora nei dati di origine. DATEFORMAT e TIMEFORMAT sono stringhe formattate che devono corrispondere al formato dei valori di data e ora dei dati di origine. Ad esempio, un comando COPY che carica i dati di origine con il valore della data `Jan-01-1999` deve includere la seguente stringa DATEFORMAT:

```
COPY ...
            DATEFORMAT AS 'MON-DD-YYYY'
```

Per ulteriori informazioni sulla gestione delle conversioni dei dati COPY, consulta [Parametri di conversione dei dati](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-conversion.html). 

Le stringhe DATEFORMAT e TIMEFORMAT possono contenere separatori datetime (come "`-`", "`/`" o "`:`") e i formati datepart e timepart nella tabella seguente.

**Nota**  
Se non è possibile abbinare il formato dei valori di data e ora con i seguenti datepart e timepart o se i valori di data e ora utilizzano formati diversi tra di loro, utilizza l'argomento `'auto'` con il parametro DATEFORMAT o TIMEFORMAT. L'argomento `'auto'` riconosce diversi formati che non sono supportati quando si utilizza una stringa DATEFORMAT o TIMEFORMAT. Per ulteriori informazioni, consulta [Utilizzo del riconoscimento automatico con DATEFORMAT e TIMEFORMAT](automatic-recognition.md).

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

Il formato di data predefinito è. YYYY-MM-DD Il formato di timestamp predefinito senza fuso orario (TIMESTAMP) è HH:MI:SS. YYYY-MM-DD Il formato predefinito del timestamp con fuso orario (TIMESTAMPTZ) è HH:MI:SSOF, dove OF è YYYY-MM-DD l'offset dall'UTC (ad esempio, - 8:00. Non è possibile includere un identificatore di fuso orario (TZ, tz o OF) in timeformat\$1string. Il campo secondi (SS) supporta anche secondi frazionari di dettaglio fino a un livello di microsecondi. Per caricare i dati TIMESTAMPTZ in un formato diverso da quello predefinito, specificare "auto".

Di seguito sono riportati alcuni esempi di date o ore che è possibile trovare nei dati di origine e le relative stringhe DATEFORMAT o TIMEFORMAT.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

## Esempio
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings-examples"></a>

Per un esempio di utilizzo di TIMEFORMAT, consulta [Caricamento di un Timestamp o di un Datestamp](r_COPY_command_examples.md#r_COPY_command_examples-load-a-time-datestamp).

# Utilizzo del riconoscimento automatico con DATEFORMAT e TIMEFORMAT
<a name="automatic-recognition"></a>

Se si specifica `'auto'` come argomento per il parametro DATEFORMAT o TIMEFORMAT, Amazon Redshift riconoscerà e convertirà automaticamente il formato data o ora nei dati di origine. Di seguito viene riportato un esempio.

```
copy favoritemovies from 'dynamodb://ProductCatalog' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
dateformat 'auto';
```

Se usato con l'argomento `'auto'` per DATEFORMAT e TIMEFORMAT, COPY riconosce e converte i formati di data e ora elencati nella tabella in [Stringhe DATEFORMAT e TIMEFORMATEsempio](r_DATEFORMAT_and_TIMEFORMAT_strings.md). Inoltre, l'argomento `'auto'` riconosce i seguenti formati che non sono supportati quando si usa una stringa DATEFORMAT e TIMEFORMAT.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/automatic-recognition.html)

Il riconoscimento automatico non supporta epochsecs ed epochmillisecs.

Per verificare se un valore di data o di timestamp viene convertito automaticamente, utilizza una funzione CAST per tentare di convertire la stringa in un valore di data o timestamp. Ad esempio, i seguenti comandi verificano il valore del timestamp `'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 i dati sorgente di una colonna DATE includono informazioni sull'ora, la componente temporale viene troncata. Se i dati sorgente di una colonna TIMESTAMP omettono informazioni sull'ora, per la componente dell'ora viene utilizzato 00:00:00.

# Esempi di COPY
<a name="r_COPY_command_examples"></a>

**Nota**  
Questi esempi contengono interruzioni di riga per una migliore leggibilità. Non includere interruzioni di riga o spazi nella stringa *credentials-args*.

**Topics**
+ [Caricamento di FAVORITEMOVIES da una tabella DynamoDB](#r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table)
+ [Caricamento di LISTING da un bucket Amazon S3](#r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket)
+ [Caricamento di LISTING da un cluster Amazon EMR](#copy-command-examples-emr)
+ [Example: COPY from Amazon S3 using a manifest](#copy-command-examples-manifest)
+ [Caricamento di LISTING da un file delimitato da pipe (Delimitatore predefinito)](#r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter)
+ [Caricamento di LISTING utilizzando i dati a colonna nel formato Parquet](#r_COPY_command_examples-load-listing-from-parquet)
+ [Caricamento di LISTING utilizzando i dati a colonna nel formato ORC](#r_COPY_command_examples-load-listing-from-orc)
+ [Caricamento di EVENT con le opzioni](#r_COPY_command_examples-load-event-with-options)
+ [Caricamento di VENUE da un file di dati a larghezza fissa](#r_COPY_command_examples-load-venue-from-a-fixed-width-data-file)
+ [Caricamento di CATEGORY da un file CSV](#load-from-csv)
+ [Caricamento di VENUE con valori espliciti per una colonna IDENTITY](#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)
+ [Caricamento di TIME da un file GZIP delimitato da pipe](#r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file)
+ [Caricamento di un Timestamp o di un Datestamp](#r_COPY_command_examples-load-a-time-datestamp)
+ [Caricamento dei dati da un file con valori predefiniti](#r_COPY_command_examples-load-data-from-a-file-with-default-values)
+ [Dati COPY con l'opzione ESCAPE](#r_COPY_command_examples-copy-data-with-the-escape-option)
+ [Esempi di copia da JSON](#r_COPY_command_examples-copy-from-json)
+ [Esempi di copia da Avro](#r_COPY_command_examples-copy-from-avro)
+ [Preparazione dei file per COPY con l'opzione ESCAPE](#r_COPY_preparing_data)
+ [Caricamento di uno shapefile in Amazon Redshift](#copy-example-spatial-copy-shapefile)
+ [Comando COPY con l'opzione NOLOAD](#r_COPY_command_examples-load-noload-option)
+ [Comando COPY con un delimitatore multibyte e l’opzione ENCODING](#r_COPY_command_examples-load-encoding-multibyte-delimiter-option)

## Caricamento di FAVORITEMOVIES da una tabella DynamoDB
<a name="r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table"></a>

 AWS SDKs *Includono un semplice esempio di creazione di una tabella DynamoDB chiamata Movies.* (Per questo esempio, consultare [Nozioni di base su DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.html).) Nell'esempio seguente la tabella MOVIES di Amazon Redshift viene caricata con i dati della tabella DynamoDB. La tabella di Amazon Redshift deve esistere già nel database.

```
copy favoritemovies from 'dynamodb://Movies'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
readratio 50;
```

## Caricamento di LISTING da un bucket Amazon S3
<a name="r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket"></a>

L'esempio seguente carica LISTING da un bucket Amazon S3. Il comando COPY carica tutti i file contenuti nella cartella `/data/listing/`.

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listing/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Caricamento di LISTING da un cluster Amazon EMR
<a name="copy-command-examples-emr"></a>

L'esempio seguente carica la tabella SALES con i dati delimitati da schede da file compressi lzop in un cluster Amazon EMR. COPY carica ogni file nella cartella `myoutput/` che inizia con `part-`.

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '\t' lzop;
```

L'esempio seguente carica la tabella SALES con i dati con dati formattati in JSON in un cluster Amazon EMR. COPY carica ogni file nella cartella `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';
```

## Utilizzo di un manifest per specificare i fili di dati
<a name="copy-command-examples-manifest"></a>

È possibile utilizzare un manifest per assicurarsi che il comando COPY carichi tutti i file richiesti, e solo i file richiesti, da Amazon S3. È anche possibile utilizzare un manifest quando è necessario caricare più file da bucket o file diversi che non condividono lo stesso prefisso. 

Ad esempio, supponi di dover caricare i seguenti tre file: `custdata1.txt`, `custdata2.txt` e `custdata3.txt`. È possibile usare il seguente comando per caricare tutti i file in `amzn-s3-demo-bucket` che iniziano con `custdata` specificando un prefisso: 

```
copy category
from 's3://amzn-s3-demo-bucket/custdata' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Se solo due dei file esistono a causa di un errore, COPY carica solo questi due file e terminerà con successo, con un caricamento di dati che risulterà incompleto. Se il bucket contiene anche un file indesiderato che utilizza lo stesso prefisso, come ad esempio un file chiamato `custdata.backup`, COPY carica anche quel file, caricando così dati indesiderati.

Per assicurarsi che tutti i file richiesti siano caricati e per evitare che vengano caricati file indesiderati, è possibile utilizzare un file manifest. Il manifest è un file di testo con formattazione JSON che elenca i file che devono essere elaborati dal comando COPY. Ad esempio, il seguente manifest carica i tre file nell'esempio precedente.

```
{  
   "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
      }
   ]
}
```

Il flag opzionale `mandatory` indica se COPY deve terminare se il file non esiste. Il valore predefinito è `false`. Indipendentemente da eventuali impostazioni obbligatorie, COPY termina se non vengono trovati file. In questo esempio, COPY restituisce un errore se uno qualsiasi dei file non viene trovato. I file indesiderati che potrebbero essere stati raccolti se hai specificato solo un prefisso della chiave, come `custdata.backup`, vengono ignorati, perché non sono sul manifest. 

Quando si carica da file di dati in formato ORC o Parquet, è necessario un campo `meta`, come mostrato nell'esempio seguente.

```
{  
   "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
         }
      }
   ]
}
```

L'esempio seguente utilizza un manifest denominato `cust.manifest`. 

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc
manifest;
```

È possibile utilizzare un manifest per caricare file da diversi bucket o file che non condividono lo stesso prefisso. L'esempio seguente mostra il JSON per caricare dati con file i cui nomi iniziano con uno stamp di data.

```
{
  "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}
  ]
}
```

Il manifesto può elencare i file che si trovano in bucket diversi, purché i bucket si trovino nella stessa AWS regione del 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}
  ]
}
```

## Caricamento di LISTING da un file delimitato da pipe (Delimitatore predefinito)
<a name="r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter"></a>

L'esempio seguente è un caso molto semplice in cui non sono specificate opzioni e il file di input contiene il delimitatore predefinito, un carattere pipe ("\$1"). 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Caricamento di LISTING utilizzando i dati a colonna nel formato Parquet
<a name="r_COPY_command_examples-load-listing-from-parquet"></a>

Il seguente esempio carica i dati da una cartella su Amazon S3 chiamata parquet. 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/parquet/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as parquet;
```

## Caricamento di LISTING utilizzando i dati a colonna nel formato ORC
<a name="r_COPY_command_examples-load-listing-from-orc"></a>

Il seguente esempio carica i dati da una cartella su Amazon S3 chiamata `orc`. 

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/orc/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc;
```

## Caricamento di EVENT con le opzioni
<a name="r_COPY_command_examples-load-event-with-options"></a>

Il seguente esempio carica i dati delimitati da pipe nella tabella EVENT e applica le seguenti regole: 
+ Se si utilizzano coppie di virgolette per circondare una qualsiasi stringa di caratteri, vengono rimosse.
+ Sia le stringhe vuote sia quelle che contengono spazi vuoti vengono caricate come valori NULL.
+ Il caricamento non riesce se vengono restituiti più di 5 errori.
+ I valori di timestamp devono essere conformi al formato specificato; ad esempio, un timestamp valido è `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';
```

## Caricamento di VENUE da un file di dati a larghezza fissa
<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';
```

L'esempio precedente assume un file di dati formattato nello stesso modo dei dati campione mostrati. Nel seguente esempio, gli spazi fungono da placeholder in modo che tutte le colonne abbiano la stessa larghezza indicata nelle specifiche: 

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

## Caricamento di CATEGORY da un file CSV
<a name="load-from-csv"></a>

Supponi di voler caricare CATEGORY con i valori indicati nella tabella seguente.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_COPY_command_examples.html)

L'esempio seguente mostra il contenuto di un file di testo con i valori dei campi separati da virgole.

```
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 carichi il file utilizzando il parametro DELIMITER per specificare l'input delimitato da virgole, il comando COPY non riesce perché alcuni campi di input contengono virgole. È possibile evitare questo problema utilizzando il parametro CSV e racchiudendo i campi che contengono virgole tra virgolette. Se il carattere virgolette viene visualizzato all'interno di una stringa tra virgolette, è necessario eseguirne l'escape raddoppiando le virgolette. Il carattere di virgoletta di default è una virgoletta doppia, quindi è necessario eseguire l'escape di ogni virgoletta doppia con una virgoletta doppia aggiuntiva. Il nuovo file di input è simile a questo. 

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

Supponendo che il nome del file sia `category_csv.txt`, è possibile caricare il file utilizzando il seguente comando COPY:

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv;
```

In alternativa, per evitare di dover creare una sequenza di escape per le doppie virgolette nell'input, è possibile specificare un carattere virgolette diverso utilizzando il parametro QUOTE AS. Per esempio, la seguente versione di `category_csv.txt` utilizza "`%`" come carattere virgolette.

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

Il seguente comando COPY utilizza QUOTE AS per caricare `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 '%';
```

## Caricamento di VENUE con valori espliciti per una colonna IDENTITY
<a name="r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column"></a>

L'esempio seguente presuppone che quando è stata creata la tabella VENUE almeno una colonna (come la colonna `venueid`) sia stata specificata come colonna IDENTITY. Questo comando sostituisce il comportamento di IDENTITY predefinito dei valori autogeneranti per una colonna IDENTITY e carica invece i valori espliciti dal file venue.txt. Amazon Redshift non verifica se i valori IDENTITY duplicati vengono caricati nella tabella quando utilizza l'opzione EXLICIT\$1IDS. 

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
explicit_ids;
```

## Caricamento di TIME da un file GZIP delimitato da pipe
<a name="r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file"></a>

L'esempio seguente carica la tabella TIME da un file GZIP delimitato dal pipe:

```
copy time
from 's3://amzn-s3-demo-bucket/data/timerows.gz' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
gzip
delimiter '|';
```

## Caricamento di un Timestamp o di un Datestamp
<a name="r_COPY_command_examples-load-a-time-datestamp"></a>

L'esempio seguente carica i dati con un timestamp formattato.

**Nota**  
Il TIMEFORMAT di `HH:MI:SS` può anche supportare i secondi frazionari oltre il `SS` a un livello di dettaglio di microsecondi. Il file `time.txt` utilizzato in questo esempio contiene una riga `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';
```

Il risultato di questa copia è il seguente: 

```
select * from timestamp1;
c1
----------------------------
2009-01-12 14:15:57.119568
(1 row)
```

## Caricamento dei dati da un file con valori predefiniti
<a name="r_COPY_command_examples-load-data-from-a-file-with-default-values"></a>

L'esempio seguente usa una variazione della tabella VENUE nel database TICKIT. Considera una tabella VENUE\$1NEW definita con la seguente dichiarazione: 

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

Considera un file di dati venue\$1noseats.txt che non contiene valori per la colonna VENUESEATS, come mostrato nell'esempio seguente: 

```
1|Toyota Park|Bridgeview|IL|
2|Columbus Crew Stadium|Columbus|OH|
3|RFK Stadium|Washington|DC|
4|CommunityAmerica Ballpark|Kansas City|KS|
5|Gillette Stadium|Foxborough|MA|
6|New York Giants Stadium|East Rutherford|NJ|
7|BMO Field|Toronto|ON|
8|The Home Depot Center|Carson|CA|
9|Dick's Sporting Goods Park|Commerce City|CO|
10|Pizza Hut Park|Frisco|TX|
```

La seguente dichiarazione COPY caricherà la tabella dal file e applicherà il valore DEFAULT ("1000") alla colonna omessa: 

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

Ora visualizza la tabella caricata: 

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

Per l'esempio seguente, oltre a supporre che nel file non siano inclusi dati VENUESEATS, supponi anche che non siano inclusi dati VENUENAME: 

```
1||Bridgeview|IL|
2||Columbus|OH|
3||Washington|DC|
4||Kansas City|KS|
5||Foxborough|MA|
6||East Rutherford|NJ|
7||Toronto|ON|
8||Carson|CA|
9||Commerce City|CO|
10||Frisco|TX|
```

 Usando la stessa definizione della tabella, la seguente dichiarazione COPY non riesce perché non è stato specificato alcun valore DEFAULT per VENUENAME, il quale è una colonna 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 '|';
```

Considera ora una variazione della tabella VENUE che utilizza una colonna 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');
```

Come per l'esempio precedente, supponi che la colonna VENUESEATS non abbia valori corrispondenti nel file sorgente. La seguente dichiarazione COPY carica correttamente la tabella, inclusi i valori dei dati IDENTITY predefiniti, invece di generare tali valori autonomamente: 

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

Questa dichiarazione non riesce perché non include la colonna IDENTITY (VENUEID è assente dall'elenco delle colonne) ma include un parametro 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;
```

Questa dichiarazione non riesce perché non include un parametro 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 '|';
```

## Dati COPY con l'opzione ESCAPE
<a name="r_COPY_command_examples-copy-data-with-the-escape-option"></a>

L'esempio seguente mostra come caricare i caratteri che corrispondono al carattere del delimitatore (in questo caso, il carattere pipe). Nel file di input, assicurati che tutti i caratteri pipe (\$1) che desideri caricare siano resi una sequenza di escape con il carattere di barra rovesciata (\$1). Quindi carica il file con il parametro 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)
```

Senza il parametro ESCAPE, questo comando COPY fallisce con un errore `Extra column(s) found`.

**Importante**  
Se carichi i dati utilizzando un COPY con il parametro ESCAPE, è necessario specificare anche il parametro ESCAPE con il comando UNLOAD per generare il file di output reciproco. Allo stesso modo, se utilizzi UNLOAD usando il parametro ESCAPE, è necessario usare ESCAPE quando effettui un COPY sugli stessi dati.

## Esempi di copia da JSON
<a name="r_COPY_command_examples-copy-from-json"></a>

Negli esempi seguenti, carica la tabella CATEGORY con i seguenti dati. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ [Caricamento da dati JSON utilizzando l'opzione "auto".](#copy-from-json-examples-using-auto)
+ [Caricamento da dati JSON utilizzando l'opzione 'auto ignorecase'](#copy-from-json-examples-using-auto-ignorecase)
+ [Carica dati da JSON utilizzando un file JSONPaths](#copy-from-json-examples-using-jsonpaths)
+ [Caricamento da array JSON utilizzando un file JSONPaths](#copy-from-json-examples-using-jsonpaths-arrays)

### Caricamento da dati JSON utilizzando l'opzione "auto".
<a name="copy-from-json-examples-using-auto"></a>

Per caricare dai dati JSON utilizzando l'opzione `'auto'`, i dati JSON devono essere costituiti da un set di oggetti. I nomi delle chiavi devono corrispondere ai nomi delle colonne, ma l'ordine non ha importanza. Di seguito viene mostrato il contenuto di un file denominato `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"
}
```

Per caricare dal file dati JSON nell'esempio precedente, emettere il seguente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto';
```

### Caricamento da dati JSON utilizzando l'opzione 'auto ignorecase'
<a name="copy-from-json-examples-using-auto-ignorecase"></a>

Per caricare dai dati JSON utilizzando l'opzione `'auto ignorecase'`, i dati JSON devono essere costituiti da un set di oggetti. Il formato maiuscolo/minuscolo dei nomi delle chiavi non deve corrispondere ai nomi delle colonne e l'ordine non ha importanza. Di seguito viene mostrato il contenuto di un file denominato `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"
}
```

Per caricare dal file dati JSON nell'esempio precedente, emettere il seguente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto ignorecase.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto ignorecase';
```

### Carica dati da JSON utilizzando un file JSONPaths
<a name="copy-from-json-examples-using-jsonpaths"></a>

Se gli oggetti dati JSON non corrispondono direttamente ai nomi delle colonne, puoi utilizzare un JSONPaths file per mappare gli elementi JSON alle colonne. L'ordine non ha importanza nei dati di origine JSON, ma l'ordine delle espressioni di JSONPaths file deve corrispondere all'ordine delle colonne. Supponi di avere il seguente file di dati, denominato `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"
}
```

Il JSONPaths file seguente, denominato`category_jsonpath.json`, mappa i dati di origine alle colonne della tabella.

```
{
    "jsonpaths": [
        "$['one']",
        "$['two']",
        "$['three']",
        "$['four']"
    ]
}
```

Per caricare dal file dati JSON nell'esempio precedente, emettere il seguente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_jsonpath.json';
```

### Caricamento da array JSON utilizzando un file JSONPaths
<a name="copy-from-json-examples-using-jsonpaths-arrays"></a>

Per caricare dati JSON costituiti da un set di array, è necessario utilizzare un JSONPaths file per mappare gli elementi dell'array alle colonne. Supponi di avere il seguente file di dati, denominato `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"]
```

Il JSONPaths file seguente, denominato`category_array_jsonpath.json`, mappa i dati di origine alle colonne della tabella.

```
{
    "jsonpaths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]"
    ]
}
```

Per caricare dal file dati JSON nell'esempio precedente, emettere il seguente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_array_data.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_array_jsonpath.json';
```

## Esempi di copia da Avro
<a name="r_COPY_command_examples-copy-from-avro"></a>

Negli esempi seguenti, carica la tabella CATEGORY con i seguenti dati. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ [Caricamento dai dati Avro utilizzando l'opzione "auto".](#copy-from-avro-examples-using-auto)
+ [Caricamento da dati Avro utilizzando l'opzione 'auto ignorecase'](#copy-from-avro-examples-using-auto-ignorecase)
+ [Carica dati da Avro utilizzando un JSONPaths file](#copy-from-avro-examples-using-avropaths)

### Caricamento dai dati Avro utilizzando l'opzione "auto".
<a name="copy-from-avro-examples-using-auto"></a>

Per caricare dai dati Avro usando l'argomento `'auto'`, i nomi dei campi nello schema Avro devono corrispondere ai nomi delle colonne. Quando si utilizza l'argomento `'auto'`, l'ordine non ha importanza. Di seguito viene mostrato lo schema per un file denominato `category_auto.avro`.

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "catid", "type": "int"},
        {"name": "catdesc", "type": "string"},
        {"name": "catname", "type": "string"},
        {"name": "catgroup", "type": "string"},
}
```

I dati in un file Avro sono in formato binario, quindi non sono leggibili dall'utente. Di seguito viene mostrata una rappresentazione JSON dei dati nel file `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"
}
```

Per caricare dal file di dati Avro nell'esempio precedente, emettere il seguente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto';
```

### Caricamento da dati Avro utilizzando l'opzione 'auto ignorecase'
<a name="copy-from-avro-examples-using-auto-ignorecase"></a>

Per caricare dai dati Avro con l'argomento `'auto ignorecase'`, il formato maiuscolo/minuscolo dei nomi dei campi nello schema Avro non deve corrispondere al formato dei nomi delle colonne. Quando si utilizza l'argomento `'auto ignorecase'`, l'ordine non ha importanza. Di seguito viene mostrato lo schema per un file denominato `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"},
}
```

I dati in un file Avro sono in formato binario, quindi non sono leggibili dall'utente. Di seguito viene mostrata una rappresentazione JSON dei dati nel file `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"
}
```

Per caricare dal file di dati Avro nell'esempio precedente, emettere il seguente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto-ignorecase.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto ignorecase';
```

### Carica dati da Avro utilizzando un JSONPaths file
<a name="copy-from-avro-examples-using-avropaths"></a>

Se i nomi dei campi nello schema Avro non corrispondono direttamente ai nomi delle colonne, puoi utilizzare un JSONPaths file per mappare gli elementi dello schema alle colonne. L'ordine delle espressioni del JSONPaths file deve corrispondere all'ordine delle colonne. 

Supponi di avere un file di dati chiamato `category_paths.avro` che contenga gli stessi dati dell'esempio precedente, ma con lo schema seguente.

```
{
    "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"} 
     ]
}
```

Il JSONPaths file seguente, denominato`category_path.avropath`, mappa i dati di origine alle colonne della tabella.

```
{
    "jsonpaths": [
        "$['id']",
        "$['group']",
        "$['name']",
        "$['desc']"
    ]
}
```

Per caricare dal file di dati Avro nell'esempio precedente, emettere il seguente comando COPY.

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
format avro 's3://amzn-s3-demo-bucket/category_path.avropath ';
```

## Preparazione dei file per COPY con l'opzione ESCAPE
<a name="r_COPY_preparing_data"></a>

L'esempio seguente descrive come preparare i dati per eseguire un "escape" dei caratteri newline prima di importarli in una tabella Amazon Redshift usando il comando COPY con il parametro ESCAPE. Senza preparare i dati per delimitare i caratteri newline, Amazon Redshift restituisce errori di caricamento quando si esegue il comando COPY, perché il carattere newline è normalmente usato come separatore di record. 

Ad esempio, si consideri un file o una colonna in una tabella esterna che si desidera copiare in una tabella Amazon Redshift. Se il file o la colonna ha del contenuto formattato in XML o dati simili, è necessario assicurarsi che tutti i caratteri newline (\$1n) che fanno parte del contenuto siano inseriti in una sequenza di escape con il carattere di barra rovesciata (\$1). 

Un file o una tabella che contiene caratteri newline incorporati è che fornisce un modello relativamente facile da associare. Ogni carattere newline incorporato molto probabilmente segue sempre un carattere `>` con potenzialmente alcuni caratteri di spazio (`' '` o tabulazione) in mezzo, come è possibile vedere nel seguente esempio di un file di testo denominato `nlTest1.txt`. 

```
$ cat nlTest1.txt
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>|1000
<xml>
</xml>|2000
```

Con l'esempio seguente, è possibile eseguire un'utilità di elaborazione del testo per pre-elaborare il file sorgente e inserire caratteri di escape, se necessario. (Il carattere `|` deve essere usato come delimitatore per separare i dati delle colonne quando viene copiato in una tabella Amazon Redshift). 

```
$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g' nlTest1.txt > nlTest2.txt
```

Allo stesso modo, è possibile utilizzare Perl per eseguire un'operazione simile: 

```
cat nlTest1.txt | perl -p -e 's/>\s*\n/>\\\n/g' > nlTest2.txt
```

Per facilitare il caricamento dei dati dal file `nlTest2.txt` in Amazon Redshift, è stata creata una tabella a due colonne in Amazon Redshift. La prima colonna c1, è una colonna di caratteri che ha il contenuto in formato XML dal file `nlTest2.txt`. La seconda colonna c2 contiene i valori interi caricati dallo stesso file. 

Dopo aver eseguito il comando `sed`, è possibile caricare correttamente i dati dal file `nlTest2.txt` in una tabella Amazon Redshift utilizzando il parametro ESCAPE. 

**Nota**  
Quando includi il parametro ESCAPE al comando COPY, crea una sequenza di escape con un certo numero di caratteri speciali che includono il carattere di barra rovesciata (incluso newline). 

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

In modo analogo è possibile preparare i file di dati esportati da database esterni. Ad esempio, con un database Oracle, è possibile utilizzare la funzione REPLACE su ogni colonna interessata in una tabella che si desideri copiare in Amazon Redshift. 

```
SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml
```

Inoltre, molti strumenti di esportazione, estrazione, trasformazione e caricamento di database (ETL) che elaborano regolarmente grandi quantità di dati forniscono opzioni per specificare i caratteri di escape e i delimitatori. 

## Caricamento di uno shapefile in Amazon Redshift
<a name="copy-example-spatial-copy-shapefile"></a>

Negli esempi seguenti viene illustrato come caricare uno shapefile Esri mediante COPY. Per ulteriori informazioni sul caricamento di shapefile, consultare [Caricamento di uno shapefile in Amazon Redshift](spatial-copy-shapefile.md). 

### Caricamento di uno shapefile
<a name="copy-example-spatial-copy-shapefile-loading-copy"></a>

I passaggi seguenti mostrano come importare OpenStreetMap dati da Amazon S3 utilizzando il comando COPY. Questo esempio presuppone che l'archivio degli shapefile in Norvegia dal [sito di download di Geofabrik sia stato](https://download.geofabrik.de/europe.html) caricato in un bucket Amazon S3 privato nella tua regione. AWS I file `.shp`, `.shx` e `.dbf` devono condividere lo stesso prefisso Amazon S3 e lo stesso nome file.

#### Importazione dei dati senza semplificazione
<a name="spatial-copy-shapefile-loading-copy-fits"></a>

I seguenti comandi creano tabelle e importano dati che possono adattarsi alle dimensioni massime della geometria senza alcuna semplificazione. Aprire il `gis_osm_natural_free_1.shp` nel software GIS preferito e ispezionare le colonne di questo livello. Per impostazione predefinita, le colonne IDENTITY o GEOMETRY sono le prime. Quando una colonna GEOMETRY è prima, è possibile creare la tabella come illustrato di seguito.

```
CREATE TABLE norway_natural (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Quando invece è la colonna IDENTITY a essere prima, è possibile creare la tabella come illustrato di seguito.

```
CREATE TABLE norway_natural_with_id (
   fid INT IDENTITY(1,1),
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Ora è possibile importare i dati 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
```

In alternativa, è possibile importare i dati come illustrato di seguito. 

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

#### Importazione dei dati con semplificazione
<a name="spatial-copy-shapefile-loading-copy-no-fit"></a>

I seguenti comandi creano tabelle e provano a importare i dati che possono adattarsi alle dimensioni massime della geometria senza alcuna semplificazione. Ispezionare lo shapefile `gis_osm_water_a_free_1.shp` e creare la tabella appropriata come illustrato di seguito.

```
CREATE TABLE norway_water (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Quando viene eseguito il comando COPY, viene generato un errore.

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

L'esecuzione della query su `STL_LOAD_ERRORS` ,ostra che la geometria è troppo 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
```

Per superare questo problema, viene aggiunto il parametro `SIMPLIFY AUTO` al comando COPY per semplificare le geometrie.

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

Per visualizzare le righe e le geometrie semplificate, eseguire una query su `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
```

L'uso di di SIMPLIFY AUTO *tolleranza max* con una tolleranza inferiore a quella calcolata automaticamente probabilmente restituisce un errore di importazione. In questo caso, utilizzare MAXERROR per ignorare gli errori.

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

Eseguire di nuovo la query su `SVL_SPATIAL_SIMPLIFY` per identificare il record che COPY non è riuscito a caricare.

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

In questo esempio, il primo record non è riuscito a adattarsi, quindi la colonna `simplified` riporta false. Il secondo record è stato caricato entro la tolleranza specificata. Tuttavia, la dimensione finale è maggiore rispetto all'utilizzo della tolleranza calcolata automaticamente senza specificare la tolleranza massima. 

### Caricamento da uno shapefile compresso
<a name="copy-example-spatial-copy-shapefile-compressed"></a>

Il comando COPY di Amazon Redshift supporta l'importazione di dati da uno shapefile compresso. Tutti i componenti shapefile devono avere lo stesso prefisso Amazon S3 e lo stesso suffisso di compressione. Ad esempio, si supponga di voler caricare i dati dell'esempio precedente. In questo caso, i file `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` devono condividere la stessa directory Amazon S3. Il comando COPY richiede l'opzione GZIP e la clausola FROM deve specificare il file compresso corretto, come illustrato di seguito.

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

### Caricamento di dati in una tabella con un ordine di colonna diverso
<a name="copy-example-spatial-copy-shapefile-column-order"></a>

Se hai una tabella che non dispone di `GEOMETRY` come prima colonna, è possibile mappare le colonne alla tabella di destinazione. Ad esempio, creare una tabella con `osm_id` specificato come prima colonna.

```
CREATE TABLE norway_natural_order (
   osm_id BIGINT,
   wkb_geometry GEOMETRY,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

Quindi importare uno shapefile utilizzando la mappatura delle colonne.

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

### Caricamento di dati in una tabella con una colonna geografica
<a name="copy-example-spatial-copy-shapefile-geography"></a>

Se hai una tabella con una colonna `GEOGRAPHY`, prima importa in una colonna `GEOMETRY` e quindi converti gli oggetti in oggetti `GEOGRAPHY`. Ad esempio, dopo aver copiato lo shapefile in una colonna `GEOMETRY`, modifica la tabella per aggiungere una colonna del tipo di dati `GEOGRAPHY`.

```
ALTER TABLE norway_natural ADD COLUMN wkb_geography GEOGRAPHY;
```

Quindi converti le geometrie in aree geografiche.

```
UPDATE norway_natural SET wkb_geography = wkb_geometry::geography;
```

Facoltativamente, è possibile eliminare la colonna `GEOMETRY`.

```
ALTER TABLE norway_natural DROP COLUMN wkb_geometry;
```

## Comando COPY con l'opzione NOLOAD
<a name="r_COPY_command_examples-load-noload-option"></a>

Per convalidare i file di dati prima di caricare effettivamente i dati, utilizza l'opzione NOLOAD con il comando COPY. Amazon Redshift analizza il file di input e visualizza gli eventuali errori che si verificano. L'esempio seguente utilizza l'opzione NOLOAD e nessuna riga viene effettivamente caricata nella tabella.

```
COPY public.zipcode1
FROM 's3://amzn-s3-demo-bucket/mydata/zipcode.csv' 
DELIMITER ';' 
IGNOREHEADER 1 REGION 'us-east-1'
NOLOAD
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/myRedshiftRole';

Warnings:
Load into table 'zipcode1' completed, 0 record(s) loaded successfully.
```

## Comando COPY con un delimitatore multibyte e l’opzione ENCODING
<a name="r_COPY_command_examples-load-encoding-multibyte-delimiter-option"></a>

L'esempio seguente viene caricato LATIN1 da un file Amazon S3 che contiene dati multibyte. Il comando COPY specifica il delimitatore nel formato ottale `\302\246\303\254` per separare i campi nel file di input codificato come ISO-8859-1. Per specificare lo stesso delimitatore in UTF-8, indica `DELIMITER '¦ì'`.

```
COPY latin1
FROM 's3://amzn-s3-demo-bucket/multibyte/myfile' 
IAM_ROLE 'arn:aws:iam::123456789012:role/myRedshiftRole'
DELIMITER '\302\246\303\254'
ENCODING ISO88591
```

# CREATE DATABASE
<a name="r_CREATE_DATABASE"></a>

Crea un nuovo database.

Per creare un database, devi essere un utente con privilegi avanzati o disporre del privilegio CREATEDB. Per creare un database associato a un’integrazione Zero-ETL, devi essere un utente con privilegi avanzati o disporre di entrambi i privilegi CREATEDB e CREATEUSER.

Non è possibile eseguire CREATE DATABASE all'interno di un blocco di transazione (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

## Sintassi
<a name="r_CREATE_DATABASE-synopsis"></a>

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

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

 *database\$1name*   
Nome del nuovo database. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

FROM INTEGRATION '<integration\$1id>' [ DATABASE '<source\$1database>' ]   
Specifica se creare il database utilizzando un identificatore di integrazione Zero-ETL. Puoi recuperare il formato `integration_id` dalla vista di sistema SVV\$1INTEGRATION. Per le integrazioni Zero-ETL di Aurora PostgreSQL, devi inoltre specificare il nome `source_database`, che può essere recuperato anche da SVV\$1INTEGRATION.  
Per vedere un esempio, consulta [Crea database per ricevere i risultati delle integrazioni Zero-ETL](#r_CREATE_DATABASE-integration). Per ulteriori informazioni sulla creazione di database con integrazioni Zero-ETL, consulta [Creazione di database di destinazione in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html) nella *Guida alla gestione di Amazon Redshift*.

SET  
Parola chiave facoltativa.

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
La clausola ACCEPTINVCHARS imposta se le tabelle di integrazione Zero-ETL continuano con l’importazione quando per il tipo di dati VARCHAR vengono rilevati caratteri non validi. Quando vengono rilevati caratteri non validi, il carattere non valido viene sostituito con un carattere `?` predefinito.

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
La clausola QUERY\$1ALL\$1STATES imposta se è possibile eseguire query sulle tabelle di integrazione Zero-ETL in tutti gli stati (`Synced`, `Failed`, `ResyncRequired` e `ResyncInitiated`). Per impostazione predefinita puoi eseguire query su una tabella di integrazione Zero-ETL solo nello stato `Synced`.

REFRESH\$1INTERVAL <interval>  
La clausola REFRESH\$1INTERVAL imposta l’intervallo di tempo approssimativo, in secondi, per aggiornare i dati dall’origine zero-ETL al database di destinazione. Il valore può essere impostato su un numero compreso tra 0 e 432.000 secondi (5 giorni) per le integrazioni Zero-ETL il cui tipo di origine è Aurora MySQL, Aurora PostgreSQL o RDS per MySQL. Per le integrazioni Zero-ETL di Amazon DynamoDB, il valore può essere impostato su un numero compreso tra 900 e 432.000 secondi (15 minuti – 5 giorni). L’impostazione predefinita di `interval` è zero (0) secondi per le integrazioni Zero-ETL il cui tipo di origine è Aurora MySQL, Aurora PostgreSQL o RDS per MySQL. Per le integrazioni Zero-ETL di Amazon DynamoDB, l’impostazione predefinita di `interval` è 900 secondi (15 minuti).

TRUNCATECOLUMNS [=] \$1TRUE \$1 FALSE\$1  
La clausola TRUNCATECOLUMNS imposta se le tabelle di integrazione Zero-ETL continuano con l’importazione quando i valori per gli attributi della colonna VARCHAR o della colonna SUPER superano il limite. Quando è `TRUE`, i valori vengono troncati per adattarsi alla colonna e i valori degli attributi JSON in overflow vengono troncati per adattarsi alla colonna SUPER.

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1  
Una clausola che specifica se Amazon Redshift imposterà la modalità cronologia per tutte le nuove tabelle nel database specificato. Questa opzione è applicabile solo ai database creati per l’integrazione Zero-ETL.  
La clausola HISTORY\$1MODE può essere impostata su `TRUE` o `FALSE`. Il valore predefinito è `FALSE`. Per informazioni su HISTORY\$1MODE, consulta [Modalità cronologia](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html) nella *Guida alla gestione di Amazon Redshift*.

WITH  
Parola chiave facoltativa.

OWNER [=] db\$1owner  
Specifica il nome utente del proprietario del database.

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
Numero massimo di connessioni di database che gli utenti possono aprire contemporaneamente. Il limite non viene applicato per gli utente con privilegi avanzati. Utilizza la parola chiave UNLIMITED per consentire il numero massimo di connessioni simultanee. È possibile che venga applicato anche un limite al numero di connessioni per ciascun utente. Per ulteriori informazioni, consultare [CREA UTENTE](r_CREATE_USER.md). Il valore predefinito è UNLIMITED. Per visualizzare le connessioni correnti, eseguire una query sulla vista di sistema [STV\$1SESSIONS](r_STV_SESSIONS.md).  
Se si applicano entrambi i limiti di connessione utente e database, deve essere disponibile uno slot di connessione inutilizzato che rientra in entrambi i limiti quando un utente tenta di connettersi.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Una clausola che specifica se la ricerca o il confronto di stringhe fa distinzione tra maiuscole e minuscole o meno. L’impostazione predefinita fa distinzione tra maiuscole e minuscole.  
COLLATE non è supportato quando si crea un database da un’unità di condivisione dati.  
CASE\$1SENSITIVE e CS sono intercambiabili e producono gli stessi risultati. Allo stesso modo CASE\$1INSENSITIVE e CI sono intercambiabili e producono gli stessi risultati.

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
Una clausola che specifica il livello di isolamento utilizzato quando vengono eseguite query su un database. Per ulteriori informazioni sui livello di isolamento, consulta [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md).  
+ Isolamento SNAPSHOT: fornisce un livello di isolamento con protezione contro i conflitti di aggiornamento ed eliminazione. Questa è l’impostazione predefinita per un database creato in un cluster con provisioning o un namespace serverless. 
+ Isolamento SERIALIZABLE: fornisce la serializzabilità completa per le transazioni simultanee. 

FROM ARN '<ARN>'  
L'ARN del AWS Glue database da utilizzare per creare il database.

\$1 WITH DATA CATALOG SCHEMA '<schema>' \$1 WITH NO DATA CATALOG SCHEMA \$1  
Questo parametro è applicabile solo se il comando CREATE DATABASE utilizza anche il parametro FROM ARN.
Specifica se creare il database utilizzando uno schema per agevolare l'accesso agli oggetti da AWS Glue Data Catalog.

IAM\$1ROLE \$1default \$1 'SESSION' \$1 'arn:aws:iam: :role/ '\$1 *<Account AWS-id>* *<role-name>*  
Questo parametro è applicabile solo se il comando CREATE DATABASE utilizza anche il parametro FROM ARN.
Se specifichi un ruolo IAM associato al cluster quando esegui il comando CREATE DATABASE, Amazon Redshift utilizzerà le credenziali del ruolo quando esegui le query sul database.  
Specificare la parola chiave `default` significa utilizzare il ruolo IAM impostato come predefinito e associato al cluster.  
Utilizzare `'SESSION'` se ci si connette al cluster Amazon Redshift utilizzando un'identità federata e si accede alle tabelle dallo schema esterno creato con questo comando. Per ulteriori informazioni, consulta l'argomento relativo a [Utilizzo di un'identità federata per gestire l'accesso di Amazon Redshift alle risorse locali e alle tabelle esterne di Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html), che illustra come configurare l'identità federata.   
L'Amazon Resource Name (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione. Come minimo, il ruolo IAM deve disporre dell'autorizzazione per eseguire un'operazione LIST sul bucket Amazon S3 a cui accedere e un'operazione GET sugli oggetti Amazon S3 contenuti nel bucket. Per ulteriori informazioni sull'utilizzo di IAM\$1ROLE durante la creazione di un database utilizzando AWS Glue Data Catalog per le condivisioni di dati, consulta [Lavorare con le condivisioni di dati gestite da Lake Formation come consumatore](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html).  
Quanto segue mostra la sintassi per la stringa di parametro IAM\$1ROLE per un singolo ARN.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
È possibile concatenare i ruoli in modo che il cluster possa presumere un altro ruolo IAM, possibilmente appartenente a un altro account. Puoi concatenare fino a 10 ruoli. Per ulteriori informazioni, consulta [Concatenazione di ruoli IAM per Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 Per collegare a questo ruolo IAM una policy di autorizzazioni IAM simile alla seguente.    
****  

```
{
    "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": "*"
        }
    ]
}
```
Per la procedura per creare un ruolo IAM da utilizzare con la query federata, consultare [Creazione di un segreto e di un ruolo IAM per l'utilizzo di query federate](federated-create-secret-iam-role.md).   
Non includere spazi nell'elenco dei ruoli concatenati.
Quanto segue mostra la sintassi per concatenare tre ruoli.  

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

## Sintassi per l'uso di CREATE DATABASE con una unità di condivisione dati
<a name="r_CREATE_DATABASE-datashare-synopsis"></a>

La sintassi seguente descrive il comando CREATE DATABASE utilizzato per creare database da un datashare per condividere dati all'interno dello stesso account. AWS 

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

La sintassi seguente descrive il comando CREATE DATABASE utilizzato per creare database da un datashare per la condivisione di dati tra account. AWS 

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

### Parametri per l'uso di CREATE DATABASE con una unità di condivisione dati
<a name="r_CREATE_DATABASE-parameters-datashare"></a>

FROM DATASHARE   
Una parola chiave che indica dove si trova l'unità di condivisione dati.

 *datashare\$1name*   
Il nome dell'unità di condivisione dati in cui viene creato il database consumer.

WITH PERMISSIONS  
Specifica che il database creato dall'unità di condivisione dati richiede autorizzazioni a livello di oggetto per accedere ai singoli oggetti del database. Senza questa clausola, gli utenti o i ruoli a cui è stata concessa l'autorizzazione USAGE sul database hanno automaticamente accesso a tutti gli oggetti del database.

 NAMESPACE *namespace\$1guid*   
Un valore che specifica lo spazio dei nomi del produttore a cui appartiene l'unità di condivisione dati.

ACCOUNT *account\$1id*  
Un valore che specifica lo spazio dei nomi del produttore a cui appartiene l'unità di condivisione dati.

## Note di utilizzo per CREATE DATABASE per la condivisione di dati
<a name="r_CREATE_DATABASE-usage"></a>

In qualità di superutente del database, quando utilizzi CREATE DATABASE per creare database da datashare all'interno dell' AWS account, specifica l'opzione NAMESPACE. L'opzione ACCOUNT è facoltativa. Quando si utilizza CREATE DATABASE per creare database da unità di condivisione dati tra account AWS , è necessario specificare le opzioni ACCOUNT e NAMESPACE dal producer.

È possibile creare un solo database consumer per un'unità unità di condivisione dati in un cluster consumer. Non è possibile creare più database consumer che si riferiscono alla stessa unità di condivisione dati.

## CREA DATABASE da AWS Glue Data Catalog
<a name="r_CREATE_DATABASE_data-catalog"></a>

Per creare un database utilizzando un ARN di AWS Glue database, specifica l'ARN nel comando CREATE DATABASE.

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

Facoltativamente, puoi anche fornire un valore nel parametro IAM\$1ROLE. Per ulteriori informazioni sui parametri e sui valori accettati, consulta [Parametri](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html#r_CREATE_DATABASE-parameters).

Di seguito sono riportati esempi che dimostrano come creare un database da un ARN utilizzando un ruolo 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;
```

È inoltre possibile creare un database utilizzando uno SCHEMA DEL CATALOGO DATI.

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

## Crea database per ricevere i risultati delle integrazioni Zero-ETL
<a name="r_CREATE_DATABASE-integration"></a>

Per creare un database utilizzando un’identità di integrazione Zero-ETL, specifica il valore `integration_id` nel comando CREATE DATABASE.

```
CREATE DATABASE destination_db_name FROM INTEGRATION 'integration_id';
```

Ad esempio, recupera innanzitutto gli ID di integrazione da SVV\$1INTEGRATION.

```
SELECT integration_id FROM SVV_INTEGRATION;
```

Quindi utilizza uno degli ID di integrazione recuperati per creare il database che riceve le integrazioni Zero-ETL.

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

Quando è necessario il database di origine delle integrazioni Zero-ETL, ad esempio, specifica:

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

Puoi inoltre impostare un intervallo di aggiornamento per il database. Ad esempio, per impostare l’intervallo di aggiornamento su 7.200 secondi per i dati provenienti da una fonte di integrazione Zero-ETL:

```
CREATE DATABASE myacct_mysql FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET REFRESH_INTERVAL 7200;
```

Esegui la query sulla vista del catalogo SVV\$1INTEGRATION per informazioni su un’integrazione Zero-ETL, ad esempio integration\$1id, target\$1database, source, refresh\$1interval e altro.

```
SELECT * FROM svv_integration;
```

L’esempio seguente crea un database a partire da un’integrazione con la modalità cronologia attiva.

```
CREATE DATABASE sample_integration_db FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET HISTORY_MODE = true;
```

## Limiti di CREATE DATABASE
<a name="r_CREATE_DATABASE-create-database-limits"></a>

Amazon Redshift applica i seguenti limiti per i database:
+ Massimo 60 database definiti dall'utente per cluster.
+ Massimo 127 byte per un nome del database.
+ Il nome di un database non può essere una parola riservata. 

## Confronto di database
<a name="r_CREATE_DATABASE-collation"></a>

Il confronto è un insieme di regole che definisce il modo in cui il motore di database confronta e ordina i dati di tipo carattere in SQL. Il confronto senza distinzione tra maiuscole e minuscole è il tipo di confronto più utilizzato. Amazon Redshift utilizza il confronto senza distinzione tra maiuscole e minuscole per facilitare la migrazione da altri sistemi di data warehouse. Con il supporto nativo del confronto senza distinzione tra maiuscole e minuscole, Amazon Redshift continua a utilizzare importanti metodi di regolazione o ottimizzazione, come le chiavi di distribuzione, le chiavi di ordinamento o la scansione con intervallo limitato. 

La clausola COLLATE specifica il confronto di default per tutte le colonne CHAR e VARCHAR nel database. Se è specificato CASE\$1INSENSITIVE, tutte le colonne CHAR o VARCHAR utilizzano confronto senza distinzione tra maiuscole e minuscole Per informazioni sul confronto, consultare [Sequenze di regole di confronto](c_collation_sequences.md).

I dati inseriti o importati nelle colonne senza distinzione tra maiuscole e minuscole manterranno il loro formato maiuscole/minuscole originale. Ma tutte le operazioni di stringa basate su confronto, inclusi l'ordinamento e il raggruppamento, non fanno distinzione tra maiuscole e minuscole. Anche le operazioni di corrispondenza dei modelli come predicati LIKE, SIMILAR TO e funzioni di espressione regolare non fanno distinzione tra maiuscole e minuscole.

Le seguenti operazioni SQL supportano la semantica di confronto applicabile:
+ Operatori di confronto: =, <>, <, <=, >, >=.
+ Operatore LIKE
+ Clausola ORDER BY
+ Clausole GROUP BY
+ Funzioni di aggregazione che utilizzano il confronto di stringhe, come MIN e MAX e LISTAGG
+ Funzioni finestra, ad esempio clausole PARTITION BY e clausole ORDER BY
+ Funzioni scalari greatest() e least(), STRPOS(), REGEXP\$1COUNT(), REGEXP\$1REPLACE(), REGEXP\$1INSTR(), REGEXP\$1SUBSTR()
+ Clausola separata
+ UNION, INTERSECT ed EXCEPT
+ IN LIST

Per le query esterne, incluse le query federate di Amazon Redshift Spectrum e Aurora PostgreSQL, il confronto della colonna VARCHAR o CHAR è uguale al confronto corrente a livello di database.

Nell'esempio seguente viene eseguita una query su una tabella Amazon Redshift Spectrum:

```
SELECT ci_varchar FROM spectrum.test_collation
WHERE ci_varchar = 'AMAZON';

ci_varchar
----------
amazon
Amazon
AMAZON
AmaZon
(4 rows)
```

Per informazioni su come creare le tabelle mediante il confronto di database, consultare [CREATE TABLE](r_CREATE_TABLE_NEW.md).

Per ulteriori informazioni sulla funzione COLLATE, consultare [Funzione COLLATE](r_COLLATE.md).

### Limitazioni del confronto di database
<a name="r_CREATE_DATABASE-collation-limitations"></a>

Di seguito sono elencate le limitazioni nell'utilizzo del confronto di database in Amazon Redshift:
+ Tutte le tabelle o le viste di sistema, incluse le tabelle dei cataloghi PG e le tabelle di sistema di Amazon Redshift, fanno distinzione tra maiuscole e minuscole.
+ Quando il database consumer e il database producer hanno regole di confronto diverse a livello di database, Amazon Redshift non supporta query tra database e tra cluster.
+ Amazon Redshift non supporta il confronto senza distinzione tra maiuscole e minuscole nella query sul solo nodo principale.

  Nell'esempio seguente viene mostrata una query senza distinzione tra maiuscole e minuscole non supportata e l'errore restituito da Amazon Redshift:

  ```
  SELECT collate(usename, 'case_insensitive') FROM pg_user;
  ERROR:  Case insensitive collation is not supported in leader node only query.
  ```
+ Amazon Redshift non supporta l'interazione tra le colonne con distinzione o senza distinzione tra maiuscole e minuscole, ad esempio operazioni di confronto, funzione, join o set.

  Negli esempi seguenti vengono mostrati gli errori restituiti quando interagiscono colonne con distinzione e senza distinzione tra maiuscole e minuscole:

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

Per far funzionare queste query, utilizzare la funzione COLLATE per convertire il confronto di una colonna in modo che corrisponda all'altra. Per ulteriori informazioni, consulta [Funzione COLLATE](r_COLLATE.md).

## Esempi
<a name="r_CREATE_DATABASE-examples"></a>

**Creazione di un database**  
Nell'esempio seguente viene creato un database denominato TICKIT e ne viene assegnata la proprietà all'utente DWUSER:

```
create database tickit
with owner dwuser;
```

Per visualizzare i dettagli sui database, eseguire una query sulla tabella di catalogo PG\$1DATABASE\$1INFO. 

```
select datname, datdba, datconnlimit
from pg_database_info
where datdba > 1;

 datname     | datdba | datconnlimit
-------------+--------+-------------
 admin       |    100 | UNLIMITED
 reports     |    100 | 100
 tickit      |    100 | 100
```

L'esempio seguente crea un database denominato **sampledb** con livello di isolamento SNAPSHOT.

```
CREATE DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
```

Nell'esempio seguente viene creato il database sales\$1db dall'unità di condivisione dati salesshare.

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

### Esempi di confronto di database
<a name="r_CREATE_DATABASE-collation-examples"></a>

**Creazione di un database senza distinzione tra maiuscole e minuscole**  
Nell'esempio seguente viene creato il database `sampledb`, la tabella `T1` e sono inseriti i dati nella tabella `T1`.

```
create database sampledb collate case_insensitive;
```

Esegui la connessione al nuovo database che hai appena creato usando il client SQL. Se usi l'Editor di query Amazon Redshift v2, scegli `sampledb` in **Editor**. Se usi RSQL, esegui un comando come il seguente.

```
\connect sampledb;
```

```
CREATE TABLE T1 (
  col1 Varchar(20) distkey sortkey
);
```

```
INSERT INTO T1 VALUES ('bob'), ('john'), ('Mary'), ('JOHN'), ('Bob');
```

Quindi la query trova i risultati con `John`.

```
SELECT * FROM T1 WHERE col1 = 'John';

 col1
 ------
 john
 JOHN
(2 row)
```

**Ordinamento senza distinzione tra maiuscole e minuscole**  
Nell'esempio seguente è mostrato l'ordinamento senza distinzione tra maiuscole e minuscole con la tabella T1. L’ordinamento di *Bob* e *bob* o *John* e *john* non è deterministico perché sono uguali nella colonna senza distinzione tra maiuscole e minuscole.

```
SELECT * FROM T1 ORDER BY 1;

 col1
 ------
 bob
 Bob
 JOHN
 john
 Mary
(5 rows)
```

Analogamente, nell'esempio seguente è mostrato l'ordinamento senza distinzione tra maiuscole e minuscole con la clausola GROUP BY. *Bob* e *bob* sono uguali e appartengono allo stesso gruppo. È non deterministico ciò che si presenta nel risultato.

```
SELECT col1, count(*) FROM T1 GROUP BY 1;

 col1 | count
 -----+------
 Mary |  1
 bob  |  2
 JOHN |  2
(3 rows)
```

**Esecuzione di query con una funzione finestra su colonne senza distinzione tra maiuscole e minuscole**  
Nell'esempio seguente viene eseguita una query su una funzione finestra senza distinzione tra maiuscole e minuscole.

```
SELECT col1, rank() over (ORDER BY col1) FROM T1;

 col1 | rank
 -----+------
 bob  |   1
 Bob  |   1
 john |   3
 JOHN |   3
 Mary |   5
(5 rows)
```

**Esecuzione di query con la parola chiave DISTINCT**  
Nell'esempio seguente viene eseguita una query sulla tabella `T1` con la parola chiave DISTINCT.

```
SELECT DISTINCT col1 FROM T1;

 col1
 ------
 bob
 Mary
 john
(3 rows)
```

**Esecuzione di query con la clausola UNION**  
Nell'esempio seguente sono mostrati i risultati dell'UNION delle tabelle `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)
```

# CREARE DATASHARE
<a name="r_CREATE_DATASHARE"></a>

Crea una nuova unità di condivisione dati nel database corrente. Il proprietario di questa unità di condivisione dati è l'emittente del comando CREATE DATASHARE.

Amazon Redshift associa ogni unità di condivisione dati a un unico database Amazon Redshift. È possibile aggiungere oggetti all'unità di condivisione dati solo da quel database associato. È possibile creare più unità di condivisione dati sullo stesso database Amazon Redshift.

Per informazioni sulle unità di condivisione dati, consultare [Condivisione dei dati in Amazon Redshift](datashare-overview.md).

Per visualizzare informazioni sulle unità di condivisione dati, utilizzare [SHOW DATASHARES](r_SHOW_DATASHARES.md).

## Privilegi richiesti
<a name="r_CREATE_DATASHARE-privileges"></a>

Di seguito sono riportati i privilegi richiesti per CREATE DATASHARE:
+ Superuser
+ Utenti con il privilegio CREATE DATASHARE
+ Proprietario del database

## Sintassi
<a name="r_CREATE_DATASHARE-synopsis"></a>

```
CREATE DATASHARE datashare_name
[[SET] PUBLICACCESSIBLE [=] TRUE | FALSE ];
```

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

*datashare\$1name*  
Il nome dell'unità di condivisione dati. Il nome dell'unità di condivisione dati deve essere univoco nello spazio dei nomi del cluster.

[[SET] PUBLICACCESSIBLE]  
Una clausola che specifica se una unità di condivisione dati può essere condivisa nei cluster accessibili pubblicamente.  
Il valore predefinito per `SET PUBLICACCESSIBLE` è `FALSE`.

## Note per l’utilizzo
<a name="r_CREATE_DATASHARE_usage"></a>

Per impostazione predefinita, il proprietario dell'unità di condivisione dati possiede solo la condivisione e non gli oggetti all'interno della condivisione.

Solo gli utenti con privilegi avanzati e il proprietario del database possono utilizzare CREATE DATASHARE e delegare i privilegi ALTER ad altri utenti o gruppi. 

## Esempi
<a name="r_CREATE_DATASHARE_examples"></a>

Nell'esempio seguente viene creata l'unità di condivisione dati `salesshare`.

```
CREATE DATASHARE salesshare;
```

Nell'esempio seguente viene creata l'unità di condivisione dati `demoshare` gestita da AWS Data Exchange .

```
CREATE DATASHARE demoshare SET PUBLICACCESSIBLE TRUE, MANAGEDBY ADX;
```

# CREATE EXTERNAL FUNCTION
<a name="r_CREATE_EXTERNAL_FUNCTION"></a>

Crea una funzione scalare definita dall'utente (UDF) basata su Amazon AWS Lambda Redshift. Per ulteriori informazioni sulle funzioni Lambda definite dall'utente, consultare [Lambda scalare UDFs](udf-creating-a-lambda-sql-udf.md).

## Privilegi richiesti
<a name="r_CREATE_EXTERNAL_FUNCTION-privileges"></a>

Di seguito sono riportati i privilegi necessari per CREATE EXTERNAL FUNCTION:
+ Superuser
+ Utenti con il privilegio CREATE [ OR REPLACE ] EXTERNAL FUNCTION

## Sintassi
<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::<Account AWS-id>:role/<role-name>’
RETRY_TIMEOUT milliseconds
MAX_BATCH_ROWS count
MAX_BATCH_SIZE size [ KB | MB ];
```

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

OR REPLACE  
Una clausola che specifica che se una funzione con stesso nome e tipi di dati degli argomenti di input o *firma* è già esistente, la funzione esistente viene sostituita. Puoi sostituire una funzione solo con una nuova funzione che definisce un set identico di tipi di dati. Devi essere un utente con privilegi avanzati per sostituire una funzione.  
Se definisci una funzione con lo stesso nome di una funzione esistente ma con una firma diversa, viene creata una nuova funzione. In altre parole, il nome della funzione è sottoposto a overload. Per ulteriori informazioni, consulta [Overload dei nomi delle funzioni](udf-naming-udfs.md#udf-naming-overloading-function-names).

*external\$1fn\$1name*  
Il nome della funzione esterna. Se si specifica un nome schema (come myschema.myfunction), la funzione viene creata utilizzando lo schema specificato. Altrimenti, la funzione viene creata nello schema corrente. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).   
Consigliamo di assegnare un prefisso `f_` ai nomi di tutte le funzioni definite dall'utente. Amazon Redshift riserva il prefisso `f_` per i nomi delle funzioni definite dall'utente. Utilizzando il prefisso `f_`, è possibile assicurarsi che il nome della funzione non sia in conflitto con i nomi delle funzioni SQL predefinite di Amazon Redshift correnti e future. Per ulteriori informazioni, consulta [Prevenzione dei conflitti di denominazione delle funzioni definite dall'utente](udf-naming-udfs.md).

*data\$1type*  
Il tipo di dati per gli argomenti di input. Per ulteriori informazioni, consultare [Python scalare UDFs](udf-creating-a-scalar-udf.md) e [Lambda scalare UDFs](udf-creating-a-lambda-sql-udf.md).

RETURNS *data\$1type*  
Il tipo di dati del valore restituito dalla funzione. Il tipo di dati RETURNS può essere qualsiasi tipo di dati standard Amazon Redshift. Per ulteriori informazioni, consultare [Python scalare UDFs](udf-creating-a-scalar-udf.md) e [Lambda scalare UDFs](udf-creating-a-lambda-sql-udf.md).

VOLATILE \$1 STABILE  
Informa l'ottimizzatore di query circa la volatilità della funzione.   
Per ottenere la migliore ottimizzazione, etichettare la funzione con la categoria di volatilità più rigida valida. In ordine di rigidità, a partire dalla meno rigida, le categorie di volatilità sono le seguenti:  
+ VOLATILE
+ STABLE
VOLATILE  
Dati gli stessi argomenti, la funzione può restituire risultati diversi su chiamate successive, anche per le righe in una singola istruzione. L'ottimizzatore di query non può fare alcuna ipotesi sul comportamento di una funzione volatile. Una query che utilizza una funzione volatile deve rivalutare la funzione per ogni input.  
STABLE  
Dati gli stessi argomenti, la funzione è garantita per restituire gli stessi risultati nelle chiamate successive elaborate all'interno di una singola istruzione. La funzione può restituire risultati diversi se richiamati in istruzioni diverse. Questa categoria consente all'ottimizzatore di ridurre il numero di volte in cui la funzione viene chiamata all'interno di una singola istruzione.  
Nota che se la severità scelta non è valida per la funzione, c'è il rischio che l'ottimizzatore salti alcune chiamate in base a questa severità. Ciò può comportare un set di risultati errato.  
La clausola IMMUTABLE non è attualmente supportata per Lambda. UDFs

LAMBDA *'lambda\$1fn\$1name'*   
 Il nome della funzione richiamata da Amazon Redshift.  
Per i passaggi per creare una AWS Lambda funzione, consulta [Creare una funzione Lambda con la console nella Guida](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html) per gli *AWS Lambda sviluppatori*.  
Per informazioni sulle autorizzazioni richieste per la funzione Lambda, consultare [Autorizzazioni AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html) nella *Guida per gli sviluppatori di AWS Lambda *.

IAM\$1ROLE \$1default \$1 'arn:aws:iam: :role/ '*<Account AWS-id>**<role-name>*   
Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando CREATE EXTERNAL FUNCTION.  
L'Amazon Resource Name (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione. Il comando CREATE EXTERNAL FUNCTION è autorizzato per il richiamo delle funzioni Lambda tramite questo ruolo IAM. Se il cluster possiede un ruolo IAM esistente con autorizzazioni per richiamare funzioni Lambda collegate, è possibile sostituire l'ARN del ruolo. Per ulteriori informazioni, consulta [Configurazione del parametro di autorizzazione per Lambda UDFs](udf-creating-a-lambda-sql-udf.md#udf-lambda-authorization).  
Di seguito è mostrata la sintassi del parametro IAM\$1ROLE.  

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

RETRY\$1TIMEOUT *millisecondi*   
La quantità di tempo totale, espressa in millisecondi, utilizzata da Amazon Redshift per i ritardi nei backoff dei tentativi.   
Invece di riprovare immediatamente per eventuali query non riuscite, Amazon Redshift esegue i backoff e attende un certo periodo di tempo tra i tentativi. Quindi Amazon Redshift riprova la richiesta di eseguire nuovamente la query non riuscita fino a quando la somma di tutti i ritardi è uguale o superiore al valore RETRY\$1TIMEOUT specificato. Il valore di default è 20.000 millisecondi.  
Quando viene richiamata una funzione Lambda, Amazon Redshift prova a eseguire nuovamente le query che ricevono errori come `TooManyRequestsException`, `EC2ThrottledException` e `ServiceException`.   
È possibile impostare il parametro RETRY\$1TIMEOUT su 0 millisecondi per evitare nuovi tentativi per una funzione Lambda definita dall'utente.

MAX\$1BATCH\$1ROWS *count*  
 Numero massimo di righe che Amazon Redshift invia in una singola richiesta batch per una singola chiamata lambda.   
 Il valore minimo per questo parametro è 1. Il valore massimo è INT\$1MAX o 2.147.483.647.   
 Questo parametro è facoltativo. Il valore predefinito è INT\$1MAX o 2.147.483.647. 

MAX\$1BATCH\$1SIZE *size* [ KB \$1 MB ]   
 La dimensione massima del payload di dati che Amazon Redshift invia in una singola richiesta batch per una singola chiamata lambda.   
 Il valore minimo per questo parametro è 1 KB. Il valore massimo è 5 MB.   
 Il valore predefinito di questo parametro è 5 MB.   
 KB e MB sono facoltativi. Se non si imposta l'unità di misura, Amazon Redshift utilizza per impostazione predefinita KB. 

## Note per l'utilizzo
<a name="r_CREATE_FUNCTION-usage-notes"></a>

Considera quanto segue quando crei UDFs Lambda: 
+ L'ordine delle chiamate alla funzione Lambda sugli argomenti di input non è fisso o garantito. Può variare tra le istanze di esecuzione delle query, a seconda della configurazione del cluster.
+ Non è garantito che le funzioni vengano applicate a ciascun argomento di input una sola volta. L'interazione tra Amazon Redshift e AWS Lambda potrebbe portare a chiamate ripetitive con gli stessi input.

## Esempi
<a name="r_CREATE_FUNCTION-examples"></a>

Di seguito sono riportati alcuni esempi di utilizzo delle funzioni scalari definite dall'utente Lambda (). UDFs

### Esempio di funzione Lambda definita dall'utente scalare che utilizza una funzione Lambda Node.js
<a name="r_CREATE_FUNCTION-lambda-example-node"></a>

L'esempio seguente crea una funzione esterna denominata `exfunc_sum` che utilizza due numeri interi come argomenti di input. Questa funzione restituisce la somma come output intero. Il nome della funzione Lambda da chiamare è `lambda_sum`. La lingua utilizzata per questa funzione Lambda è Node.js 12.x. Assicurarsi di specificare il ruolo IAM. L'esempio utilizza `'arn:aws:iam::123456789012:user/johndoe'` come ruolo IAM.

```
CREATE EXTERNAL FUNCTION exfunc_sum(INT,INT)
RETURNS INT
VOLATILE
LAMBDA 'lambda_sum'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

La funzione Lambda accetta il payload della richiesta ed esegue l'iterazione su ogni riga. Tutti i valori di una singola riga vengono aggiunti per calcolare la somma per quella riga, che viene salvata nell'array di risposte. Il numero di righe nell'array dei risultati è simile al numero di righe ricevute nel payload della richiesta. 

Perché sia riconosciuto dalla funzione esterna, il payload della risposta JSON deve avere i dati di risultato nel campo 'results'. Il campo argomenti nella richiesta inviata alla funzione Lambda contiene il payload dei dati. In caso di richiesta batch, è possibile avere più righe nel payload dei dati. La seguente funzione Lambda itera su tutte le righe nel payload dei dati della richiesta. Inoltre, itera individualmente su tutti i valori all'interno di una singola riga.

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

Nell'esempio seguente viene chiamata la funzione esterna con valori letterali.

```
select exfunc_sum(1,2);
exfunc_sum
------------
 3
(1 row)
```

Nell'esempio seguente viene creata una tabella denominata t\$1sum con due colonne, c1 e c2, del tipo di dati intero e vengono inserite due righe di dati. Quindi la funzione esterna viene chiamata passando i nomi delle colonne di questa tabella. Le due righe della tabella vengono inviate in una richiesta batch nel payload della richiesta come un singolo richiamo 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)
```

### Esempio di funzione Lambda definita dall'utente scalare che utilizza l'attributo RETRY\$1TIMEOUT
<a name="r_CREATE_FUNCTION-lambda-example-retry"></a>

Nella sezione seguente, puoi trovare un esempio di come utilizzare l'attributo RETRY\$1TIMEOUT in Lambda. UDFs 

AWS Lambda le funzioni hanno limiti di concorrenza che è possibile impostare per ciascuna funzione. Per ulteriori informazioni sui limiti di concorrenza, consulta [Gestire la concorrenza per una funzione Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) nella *Guida per gli AWS Lambda sviluppatori* e il post [Managing AWS Lambda Function Concurrency](https://aws.amazon.com/blogs/compute/managing-aws-lambda-function-concurrency) sul blog di Compute. AWS 

Quando il numero di richieste servite da una funzione Lambda definita dall'utente supera i limiti di simultaneità, le nuove richieste ricevono l'errore `TooManyRequestsException`. La funzione Lambda definita dall'utente riprova su questo errore fino a quando la somma di tutti i ritardi tra le richieste inviate alla funzione Lambda è uguale o superiore al valore RETRY\$1TIMEOUT impostato. Il valore di default di RETRY\$1TIMEOUT è 20.000 millisecondi.

L'esempio seguente crea una funzione Lambda denominata `exfunc_sleep_3`. Questa funzione prende in carico il payload della richiesta, itera su ogni riga e converte l'input in maiuscolo. Quindi si interrompe per 3 secondi e restituisce il risultato. Il linguaggio utilizzato per questa funzione Lambda è Python 3.8. 

Il numero di righe nell'array dei risultati è simile al numero di righe ricevute nel payload della richiesta. Perché sia riconosciuto dalla funzione esterna, il payload della risposta JSON deve avere i dati di risultato nel campo `results`. Il campo `arguments` nella richiesta inviata alla funzione Lambda contiene il payload dei dati. In caso di richiesta batch, è possibile avere più righe nel payload dei dati.

Il limite di simultaneità per questa funzione è impostato specificatamente su 1 nella simultaneità riservata per dimostrare l'utilizzo dell'attributo RETRY\$1TIMEOUT. Quando l'attributo è impostato su 1, la funzione Lambda può servire solo una richiesta alla volta.

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

Di seguito, due esempi aggiuntivi illustrano l'attributo RETRY\$1TIMEOUT. Ognuno di essi richiama una singola funzione Lambda definita dall'utente. Durante il richiamo della funzione Lambda, ogni esempio esegue la stessa query SQL per richiamare la funzione Lambda da due sessioni di database simultanee contemporaneamente. Quando la prima query che richiama la funzione Lambda definita dall'utente viene servita dalla funzione, la seconda query riceve l'errore `TooManyRequestsException`. Questo risultato si verifica perché si imposta in modo specifico la simultaneità riservata nella funzione definita dall'utente su 1. Per informazioni su come configurare la simultaneità riservata per le funzioni Lambda, consultare [Configurazione della simultaneità riservata](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#configuration-concurrency-reservedconfiguration-concurrency-reserved).

Nel primo esempio che segue, l'attributo RETRY\$1TIMEOUT per la funzione Lambda definita dall'utente viene impostato su 0 millisecondi. Se la richiesta Lambda riceve una qualsiasi eccezione dalla funzione Lambda, Amazon Redshift non esegue alcun nuovo tentativo. Questo risultato si verifica perché l'attributo RETRY\$1TIMEOUT è impostato su 0.

```
CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar)
RETURNS varchar
VOLATILE
LAMBDA 'exfunc_sleep_3'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test'
RETRY_TIMEOUT 0;
```

Con RETRY\$1TIMEOUT impostato su 0, è possibile eseguire le seguenti due query da sessioni di database separate e visualizzare risultati diversi.

La prima query SQL che utilizza la funzione Lambda definita dall'utente viene eseguita correttamente.

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

La seconda query, eseguita contemporaneamente da una sessione di database separata, riceve l'errore `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]
-----------------------------------------------
```

Nel primo esempio che segue, l'attributo RETRY\$1TIMEOUT per la funzione Lambda definita dall'utente viene impostato su 3.000 millisecondi. Anche se la seconda query viene eseguita contemporaneamente, la funzione Lambda definita dall'utente tenta di nuovo fino a quando il ritardo totale è di 3.000 millisecondi. Pertanto, entrambe le query vengono eseguite correttamente.

```
CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar)
RETURNS varchar
VOLATILE
LAMBDA 'exfunc_sleep_3'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test'
RETRY_TIMEOUT 3000;
```

Con RETRY\$1TIMEOUT impostato su 3.000 millisecondi, è possibile eseguire le seguenti due query da sessioni di database separate e visualizzare gli stessi risultati.

La prima query SQL che esegue la funzione Lambda definita dall'utente viene eseguita correttamente.

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

La seconda query viene eseguita contemporaneamente e la funzione Lambda definita dall'utente prova di nuovo fino a quando il ritardo totale è di 3.000 millisecondi.

```
select exfunc_upper('Varchar');
 exfunc_upper
--------------
 VARCHAR
(1 row)
```

### Esempio di funzione Lambda definita dall'utente scalare che utilizza una funzione Lambda Python
<a name="r_CREATE_FUNCTION-lambda-example-python"></a>

L'esempio seguente crea una funzione esterna denominata `exfunc_multiplication` e che moltiplica i numeri e restituisce un numero intero. Questo esempio incorpora il successo e i campi `error_msg` nella risposta Lambda. Il campo di successo è impostato su false quando c'è un overflow di numeri interi nel risultato della moltiplicazione e il messaggio `error_msg` è impostato su `Integer multiplication overflow`. La funzione `exfunc_multiplication` accetta tre numeri interi come argomenti di input e restituisce la somma come output intero. 

Il nome della funzione Lambda richiamata è `lambda_multiplication`. Il linguaggio utilizzato per questa funzione Lambda è Python 3.8. Assicurarsi di specificare il ruolo IAM.

```
CREATE EXTERNAL FUNCTION exfunc_multiplication(int, int, int)
RETURNS INT
VOLATILE
LAMBDA 'lambda_multiplication'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

La funzione Lambda accetta il payload della richiesta ed esegue l'iterazione su ogni riga. Tutti i valori di una singola riga vengono moltiplicati per calcolare il risultato di tale riga, che viene salvato nell'elenco delle risposte. In questo esempio viene utilizzato un valore di successo booleano impostato su true per impostazione predefinita. Se il risultato della moltiplicazione per una riga ha un overflow intero, il valore di successo è impostato su false. Quindi il ciclo di iterazione si interrompe. 

Durante la creazione del payload di risposta, se il valore di successo è false, la seguente funzione Lambda aggiunge il campo `error_msg` nel payload. Imposta anche il messaggio di errore su `Integer multiplication overflow`. Se il valore di successo è true, i dati dei risultati vengono aggiunti nel campo dei risultati. Il numero di righe nell'array dei risultati, se presente, è simile al numero di righe ricevute nel payload della richiesta. 

Il campo argomenti nella richiesta inviata alla funzione Lambda contiene il payload dei dati. In caso di richiesta batch, è possibile avere più righe nel payload dei dati. La seguente funzione Lambda itera su tutte le righe nel payload dei dati richiesta e itera individualmente su tutti i valori all'interno di una singola riga. 

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

Nell'esempio seguente viene chiamata la funzione esterna con valori letterali.

```
SELECT exfunc_multiplication(8, 9, 2);
  exfunc_multiplication
---------------------------
          144
(1 row)
```

Nell'esempio seguente viene creata una tabella denominata t\$1multi con tre colonne, c1, c2 e c3, del tipo di dati intero. La funzione esterna viene chiamata passando i nomi delle colonne di questa tabella. I dati vengono inseriti in modo tale da causare l'overflow di interi per mostrare come l'errore viene propagato.

```
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**
+ [Prerequisiti per CREATE EXTERNAL MODEL](#r_create_external_model_prereqs)
+ [Privilegi richiesti](#r_simple_create_model-privileges)
+ [Controllo dei costi](#r_create_model_cost)
+ [Sintassi di CREATE EXTERNAL MODEL](#r_create_external_model_syntax)
+ [Parametri e impostazioni di CREATE EXTERNAL MODEL](#r_create_external_model_parameters_settings)
+ [Parametri della funzione di inferenza CREATE EXTERNAL MODEL](#r_create_external_model_if_parameters)

## Prerequisiti per CREATE EXTERNAL MODEL
<a name="r_create_external_model_prereqs"></a>

Prima di utilizzare l’istruzione CREATE MODEL, completa i prerequisiti descritti in [Configurazione del cluster per l'utilizzo di Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup). Di seguito è riportato un riepilogo approfondito dei prerequisiti.
+ Crea un cluster Amazon Redshift con la console di AWS gestione o l'interfaccia a riga di AWS comando (CLI AWS ).
+ Allega la policy AWS Identity and Access Management (IAM) durante la creazione del cluster.
+ Per consentire ad Amazon Redshift e Amazon Bedrock di assumere il ruolo per interagire con altri servizi, aggiungi la seguente policy di attendibilità al ruolo IAM.
+ Abilita l'accesso allo specifico LLMs che desideri utilizzare dalla console Amazon Bedrock.
+ (Facoltativo) Se riscontri eccezioni di limitazione provenienti da Amazon Bedrock, ad esempio `Too many requests, please wait before trying again`, anche con piccole quantità di dati, controlla le quote nella sezione **Service Quotas** nell’account di Amazon Bedrock. Verifica che la quota applicata a livello di account sia almeno uguale al valore di quota AWS predefinito per **InvokeModel**le richieste per il modello che stai utilizzando.

Per maggiori dettagli sul ruolo IAM, sulla policy di attendibilità e su altri prerequisiti, consultare [Configurazione del cluster per l'utilizzo di Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup).

## Privilegi richiesti
<a name="r_simple_create_model-privileges"></a>

Di seguito sono riportati i privilegi richiesti per CREATE EXTERNAL MODEL:
+ Superuser
+ Utenti con il privilegio CREATE MODEL
+ Ruoli con il privilegio GRANT CREATE MODEL

## Controllo dei costi
<a name="r_create_model_cost"></a>

 Amazon Redshift ML utilizza le risorse cluster esistenti per creare modelli di previsione, quindi non sono previsti costi aggiuntivi. Tuttavia, i AWS costi per l'utilizzo di Amazon Bedrock dipendono dal modello selezionato. Per ulteriori informazioni consulta [Costi per l'utilizzo di Amazon Redshift ML](https://docs.aws.amazon.com/redshift/latest/dg/cost.html). 

## Sintassi di CREATE EXTERNAL MODEL
<a name="r_create_external_model_syntax"></a>

Di seguito è riportata la sintassi completa dell’istruzione 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}]
);
```

Il comando `CREATE EXTERNAL MODEL` crea una funzione di inferenza da utilizzare per generare contenuti. 

Di seguito è riportata la sintassi di una funzione di inferenza che `CREATE EXTERNAL MODEL` crea utilizzando `REQUEST_TYPE` uguale a `RAW`: 

```
SELECT inference_function_name(request_super) 
[FROM table];
```

Di seguito è riportata la sintassi di una funzione di inferenza che `CREATE EXTERNAL MODEL` crea utilizzando `REQUEST_TYPE` uguale a `UNIFIED`: 

```
SELECT inference_function_name(input_text, [, inference_config [, additional_model_request_fields]])
[FROM table];
```

Per informazioni su come utilizzare una funzione di inferenza, consulta [Utilizzo di un modello esterno per l’integrazione di Amazon Redshift ML con Amazon Bedrock](machine-learning-br.md#machine-learning-br-use).

## Parametri e impostazioni di CREATE EXTERNAL MODEL
<a name="r_create_external_model_parameters_settings"></a>

Questa sezione descrive i parametri e le impostazioni del comando `CREATE EXTERNAL MODEL`.

**Topics**
+ [Parametri di CREATE EXTERNAL MODEL](#r_create_external_model_parameters)
+ [Impostazioni di CREATE EXTERNAL MODEL](#r_create_external_model_settings)

### Parametri di CREATE EXTERNAL MODEL
<a name="r_create_external_model_parameters"></a>

model\$1name  
Il nome del modello esterno. Il nome del modello in uno schema deve essere unico.

FUNCTION *function\$1name (data\$1type [,...] )*  
Il nome della funzione di inferenza creata da `CREATE EXTERNAL MODEL`. La funzione di inferenza viene utilizzata per inviare richieste ad Amazon Bedrock e recuperare il testo generato da ML.

IAM\$1ROLE * \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1*  
Il ruolo IAM utilizzato da Amazon Redshift per accedere ad Amazon Bedrock. Per informazioni sul ruolo IAM, consulta [Creazione o aggiornamento di un ruolo IAM per l’integrazione di Amazon Redshift ML con Amazon Bedrock](machine-learning-br.md#machine-learning-br-iam).

MODEL\$1TYPE BEDROCK  
Specifica il tipo di modello. L’unico valore valido è `BEDROCK`.

SETTINGS ( MODEL\$1ID model\$1id [,...] )  
Specifica le impostazioni del modello esterno. Per informazioni dettagliate, consulta la sezione seguente.

### Impostazioni di CREATE EXTERNAL MODEL
<a name="r_create_external_model_settings"></a>

MODEL\$1ID model\$1id  
L’identificatore del modello esterno, ad esempio `anthropic.claude-v2`. Per informazioni sul modello Amazon Bedrock IDs, consulta il modello [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html). IDs

PROMPT 'prompt prefix'  
Specifica un prompt statico che Amazon Redshift aggiunge all’inizio di ogni richiesta di inferenza. Supportato solo con `REQUEST_TYPE` uguale a `UNIFIED`.

SUFFIX 'prompt suffix'  
Specifica un prompt statico che Amazon Redshift aggiunge alla fine di ogni richiesta di inferenza. Supportato solo con `REQUEST_TYPE` uguale a `UNIFIED`.

REQUEST\$1TYPE \$1 RAW \$1 UNIFIED \$1  
Specifica il formato della richiesta inviata ad Amazon Bedrock. I valori validi includono quanto segue:  
+ **RAW**: la funzione di inferenza accetta l’input come un unico valore SUPER e restituisce sempre un valore SUPER. Il formato del valore SUPER è specifico del modello Amazon Bedrock selezionato. Un valore SUPER è un modello di previsione che combina più algoritmi per produrre un’unica previsione migliorata.
+ **UNIFIED**: la funzione di inferenza utilizza l’API unificata. Tutti i modelli hanno un’interfaccia unificata e coerente con Amazon Bedrock. Funziona per tutti i modelli che supportano i messaggi. Questo è il valore predefinito.

  Per ulteriori informazioni, consulta la [documentazione dell’API Converse](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html) nella *documentazione dell’API Amazon Bedrock*.

RESPONSE\$1TYPE \$1 VARCHAR \$1 SUPER \$1  
Specifica il formato della risposta. Se il valore dell’impostazione `REQUEST_TYPE` è `RAW`, l’impostazione `RESPONSE_TYPE` è obbligatoria e l’unico valore valido è `SUPER`. Per tutti gli altri valori dell’impostazione `REQUEST TYPE`, il valore predefinito è `VARCHAR` e l’impostazione `RESPONSE_TYPE` è facoltativa. I valori validi includono quanto segue:  
+ **VARCHAR**: Amazon Redshift restituisce solo la risposta testuale generata dal modello.
+ **SUPER**: Amazon Redshift restituisce l’intera risposta JSON generata dal modello come super. Ciò include la risposta testuale e informazioni come il motivo dell’interruzione e l’utilizzo dei token di input e output del modello. Un valore SUPER è un modello di previsione che combina più algoritmi per produrre un’unica previsione migliorata. 

## Parametri della funzione di inferenza CREATE EXTERNAL MODEL
<a name="r_create_external_model_if_parameters"></a>

In questa sezione sono descritti i parametri validi per la funzione di inferenza creata dal comando `CREATE EXTERNAL MODEL`. 

### Parametri della funzione di inferenza CREATE EXTERNAL MODEL per `REQUEST_TYPE` uguale a `RAW`
<a name="r_create_external_model_if_parameters_raw"></a>

Una funzione di inferenza creata con `REQUEST_TYPE` uguale a `RAW` ha un argomento di input super e restituisce sempre un tipo di dati super. La sintassi dell’input super segue la sintassi della richiesta del modello specifico selezionato in Amazon Bedrock.

### Parametri della funzione di inferenza CREATE EXTERNAL MODEL per `REQUEST_TYPE` uguale a `UNIFIED`
<a name="r_create_external_model_if_parameters_unified"></a>

input\$1text  
Il testo che Amazon Redshift invia ad Amazon Bedrock.

inference\$1config  
Un valore super che contiene parametri facoltativi che Amazon Redshift invia ad Amazon Bedrock. Possono essere inclusi i seguenti:  
+ maxTokens
+ stopSequences
+ temperature
+ topP
Questi parametri sono tutti facoltativi e fanno distinzione tra maiuscole e minuscole. Per informazioni su questi parametri, consulta [ InferenceConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InferenceConfiguration.html)*Amazon Bedrock API Reference.*

# CREATE EXTERNAL SCHEMA
<a name="r_CREATE_EXTERNAL_SCHEMA"></a>

Crea un nuovo schema esterno nel database corrente. È possibile utilizzare questo schema esterno per connettersi al database Amazon RDS for PostgreSQL o al database Amazon Aurora Edizione compatibile con PostgreSQL. Puoi anche creare uno schema esterno che faccia riferimento a un database in un catalogo di dati esterno come AWS Glue Athena o a un database in un metastore Apache Hive, come Amazon EMR.

Il proprietario di questo schema è l'emittente del comando CREATE EXTERNAL SCHEMA. Per trasferire la proprietà di uno schema esterno, utilizza [ALTER SCHEMA](r_ALTER_SCHEMA.md) per cambiare il proprietario. Usa il comando [GRANT](r_GRANT.md) per concedere l'accesso allo schema ad altri utenti o gruppi di utenti. 

Non puoi utilizzare i comandi GRANT o REVOKE per le autorizzazioni su una tabella esterna. Puoi invece concedere o revocare le autorizzazioni per lo schema esterno. 

**Nota**  
Se attualmente si dispone di tabelle esterne Redshift Spectrum nel catalogo dati di Amazon Athena, è possibile migrare tale catalogo di Athena a un AWS Glue Data Catalog. Per utilizzare AWS Glue Data Catalog con Redshift Spectrum, potrebbe essere necessario modificare le policy AWS Identity and Access Management (IAM). Per ulteriori informazioni, consulta [Aggiornamento al AWS Glue Data Catalog nella Guida per l'utente](https://docs.aws.amazon.com/athena/latest/ug/glue-athena.html#glue-upgrade) di *Athena*.

Per visualizzare i dettagli degli schemi esterni, eseguire una query sulla vista di sistema [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md). 

## Sintassi
<a name="r_CREATE_EXTERNAL_SCHEMA-synopsis"></a>

La sintassi seguente descrive il comando CREATE EXTERNAL SCHEMA utilizzato per fare riferimento ai dati utilizzando un catalogo dati esterno. Per ulteriori informazioni, consulta [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::<Account 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>:<Account AWS-id>:cluster/msk/<cluster uuid>' ]
[ CATALOG_ROLE [ 'SESSION' | 'catalog-role-arn-string' ] ]
[ CREATE EXTERNAL DATABASE IF NOT EXISTS ]
[ CATALOG_ID 'Amazon Web Services account ID containing Glue or Lake Formation database' ]
```

La sintassi seguente descrive il comando CREATE EXTERNAL SCHEMA utilizzato per fare riferimento ai dati utilizzando una query federata su RDS POSTGRES o Aurora PostgreSQL. È inoltre possibile creare uno schema esterno che faccia riferimento a fonti di streaming, come Kinesis Data Streams. Per ulteriori informazioni, consulta [Esecuzione di query su dati con query federate in 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::<Account AWS-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

La sintassi seguente descrive il comando CREATE EXTERNAL SCHEMA utilizzato per fare riferimento ai dati utilizzando una query federata su RDS MySQL o Aurora MySQL. Per ulteriori informazioni, consulta [Esecuzione di query su dati con query federate in 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::<Account AWS-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

La sintassi seguente descrive il comando CREATE EXTERNAL SCHEMA utilizzato per fare riferimento ai dati in un flusso Kinesis. Per ulteriori informazioni, consulta [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KINESIS
IAM_ROLE [ default | 'arn:aws:iam::<Account AWS-id>:role/<role-name>' ]
```

La sintassi seguente descrive il comando CREATE EXTERNAL SCHEMA utilizzato per fare riferimento al cluster Streaming gestito da Amazon per Apache Kafka o Confluent Cloud e i relativi argomenti da cui importare dati. Per connetterti, fornisci l’URI del broker. Per ulteriori informazioni, consulta [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md).

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KAFKA
[ IAM_ROLE [ default | 'arn:aws:iam::<Account AWS-id>:role/<role-name>' ] ]
URI 'Kafka bootstrap URI'
AUTHENTICATION [ none | iam | mtls ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ];
```

La sintassi seguente descrive il comando CREATE EXTERNAL SCHEMA utilizzato per fare riferimento ai dati utilizzando una query tra database.

```
CREATE EXTERNAL SCHEMA local_schema_name
FROM  REDSHIFT
DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'
```

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

IF NOT EXISTS  
Clausola che indica che se lo schema specificato esiste già, il comando non deve apportare modifiche e deve restituire un messaggio che lo schema esiste, piuttosto che terminare con un errore. Questa clausola è utile durante lo scripting, quindi lo script non fallisce se CREATE EXTERNAL SCHEMA tenta di creare uno schema già esistente. 

local\$1schema\$1name  
Il nome del nuovo schema esterno. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

FROM [ DATA CATALOG ] \$1 HIVE METASTORE \$1 POSTGRES \$1 MYSQL \$1 KINESIS \$1 MSK \$1 REDSHIFT   
Parola chiave che indica dove si trova il database esterno.   
DATA CATALOG indica che il database esterno è definito nel catalogo dati di Athena o AWS Glue Data Catalog.   
Se il database esterno è definito in un catalogo dati esterno in una regione AWS diversa, è necessario il parametro REGION. DATA CATALOG è il valore predefinito.  
HIVE METASTORE indica che il database esterno è definito in un metastore Apache Hive. Se è specificato HIVE METASTORE, l'URI è obbligatorio.   
POSTGRES indica che il database esterno è definito in RDS PostgreSQL o Aurora PostgreSQL.  
MYSQL indica che il database esterno è definito in RDS MySQL o Aurora MySQL.  
KINESIS indica che l'origine dati è un flusso di Kinesis Data Streams.  
MSK indica che l’origine dati è un cluster con provisioning o serverless Amazon MSK.  
KAFKA indica che l’origine dati è un cluster Kafka. Puoi utilizzare questa parola chiave sia per Amazon MSK che per Confluent Cloud.

FROM REDSHIFT  
Una parola chiave che indica che il database si trova in Amazon Redshift.

DATABASE '*nome\$1database\$1redshift*' SCHEMA '*nome\$1schema\$1redshift*'  
Il nome del database Amazon Redshift.   
*nome\$1schema redshift* indica lo schema in Amazon Redshift. Il valore di timeout di default per *nome\$1schema redshift* è `public`.

DATABASE '*nome\$1database\$1federato*'  
Una parola chiave che indica il nome del database esterno in un motore del database PostgreSQL o MySQL supportato. 

[SCHEMA '*nome\$1schema*']  
*nome\$1schema* indica lo schema in un motore del database PostgreSQL supportato. Lo *schema\$1name* predefinito è `public`.  
Non è possibile specificare uno SCHEMA quando si imposta una query federata su un motore di database MySQL supportato. 

REGION '*aws-region*'  
Se il database esterno è definito in un catalogo dati Athena o nella AWS Glue Data Catalog, la AWS regione in cui si trova il database. Questo parametro è obbligatorio se il database è definito in un catalogo dati esterno. 

URI [ 'hive\$1metastore\$1uri' [ PORT port\$1number ] \$1 'hostname' [ PORT port\$1number ] \$1 'Kafka bootstrap URI' ]  
L'URI del nome host e il numero di porta di un motore del database PostgreSQL o MySQL supportato. Il valore *hostname* è il nodo principale del set di repliche. L'endpoint deve essere raggiungibile (instradabile) dal cluster Amazon Redshift. Il port\$1number predefinito per PostgreSQL è 5432. Il port\$1number predefinito per MySQL è 3306.  
Il motore di database PostgreSQL o MySQL supportato deve trovarsi nello stesso VPC del cluster Amazon Redshift con un gruppo di sicurezza che colleghi Amazon Redshift e RDS url-rsPostgreSQL o Aurora PostgreSQL. Inoltre puoi utilizzare il routing VPC avanzato per configurare un caso d’uso tra VPC. Per ulteriori informazioni, consulta [Endpoint VPC gestiti da Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-cluster-cross-vpc.html).
**Specifica di un URI del metastore Hive**  
Se il database si trova in un metastore Hive, specifica l'URI e facoltativamente il numero di porta per il metastore. Il numero di porta predefinito è 9083.   
Un URI non contiene una specifica di protocollo ("http://"). Un URI valido esempio è `uri '172.10.10.10'`.   
**Specifica di un URI del broker per l’importazione di dati in streaming**  
L’inclusione dell’URI bootstrap-broker consente di connettersi a un cluster Amazon MSK o Confluent Cloud e ricevere i dati in streaming. Per ulteriori informazioni e un esempio, consulta [Nozioni di base sull’importazione dati in streaming da Streaming gestito da Amazon per Apache Kafka](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started-MSK.html).

IAM\$1ROLE [predefinito \$1 'SESSION' \$1 'arn:aws:iam: :role/ '] *<Account AWS-id>* *<role-name>*  
Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando CREATE EXTERNAL SCHEMA.  
Utilizzare `'SESSION'` se ci si connette al cluster Amazon Redshift utilizzando un'identità federata e si accede alle tabelle dallo schema esterno creato con questo comando. Per ulteriori informazioni, consulta l'argomento relativo all'[utilizzo di un'identità federata per gestire l'accesso di Amazon Redshift alle risorse locali e alle tabelle esterne di Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html), che illustra come configurare l'identità federata. Si noti che questa configurazione, che utilizza `'SESSION'` al posto dell'ARN, può essere utilizzata solo se lo schema è stato creato utilizzando `DATA CATALOG`.   
L'Amazon Resource Name (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione. Come minimo, il ruolo IAM deve disporre dell'autorizzazione per eseguire un'operazione LIST sul bucket Amazon S3 a cui accedere e un'operazione GET sugli oggetti Amazon S3 contenuti nel bucket.  
Quanto segue mostra la sintassi per la stringa di parametro IAM\$1ROLE per un singolo ARN.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
È possibile concatenare i ruoli in modo che il cluster possa presumere un altro ruolo IAM, possibilmente appartenente a un altro account. Puoi concatenare fino a 10 ruoli. Per un esempio di concatenamento di ruoli, vedi [Concatenazione di ruoli IAM per Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 Per collegare a questo ruolo IAM una policy di autorizzazioni IAM simile alla seguente.    
****  

```
{
    "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": "*"
        }
    ]
}
```
Per la procedura per creare un ruolo IAM da utilizzare con la query federata, consultare [Creazione di un segreto e di un ruolo IAM per l'utilizzo di query federate](federated-create-secret-iam-role.md).   
Non includere spazi nell'elenco dei ruoli concatenati.
Quanto segue mostra la sintassi per concatenare tre ruoli.  

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

*ssm-secret-arn*SECRET\$1ARN ''  
L'Amazon Resource Name (ARN) di un segreto del motore di database PostgreSQL o MySQL supportato creato utilizzando. Gestione dei segreti AWS Per informazioni su come creare e recuperare un ARN per un segreto, consulta [Gestione dei segreti con Gestione dei segreti AWS](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html) nella *Guida per l’utente di Gestione dei segreti AWS * e [Recupero del nome della risorsa Amazon (ARN) del segreto in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html). 

CATALOG\$1ROLE ['SESSIONE' \$1] *catalog-role-arn-string*  
Utilizzare `'SESSION'` per la connessione al cluster Amazon Redshift utilizzando un'identità federata per l'autenticazione e l'autorizzazione al catalogo di dati. Per ulteriori informazioni sul completamento della procedura per l'identità federata, consulta l'argomento relativo all'[utilizzo di un'identità federata per gestire l'accesso di Amazon Redshift alle risorse locali e alle tabelle esterne di Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html). Si noti che il ruolo `'SESSION'` può essere utilizzato solo se lo schema viene creato in DATA CATALOG.  
Il nome della risorsa Amazon (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione del catalogo dati.   
Se CATALOG\$1ROLE non viene specificato, Amazon Redshift utilizza l'IAM\$1ROLE specificato. Il ruolo del catalogo deve disporre dell'autorizzazione per accedere al Data Catalog in AWS Glue o Athena. Per ulteriori informazioni, consulta [Policy IAM per Amazon Redshift Spectrum](c-spectrum-iam-policies.md).   
Quanto segue mostra la sintassi per la stringa di parametro CATALOG\$1ROLE per un singolo ARN.  

```
CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role>'
```
È possibile concatenare i ruoli in modo che il cluster possa presumere un altro ruolo IAM, possibilmente appartenente a un altro account. Puoi concatenare fino a 10 ruoli. Per ulteriori informazioni, consulta [Concatenazione di ruoli IAM per Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
L'elenco di ruoli concatenati non deve includere spazi.
Quanto segue mostra la sintassi per concatenare tre ruoli.  

```
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  
Clausola che crea un database esterno con il nome specificato dall'argomento DATABASE, se il database esterno specificato non esiste. Se il database esterno specificato esiste, il comando non apporta modifiche. In questo caso, il comando restituisce un messaggio che il database esterno esiste, anziché terminare con un errore.  
CREATE EXTERNAL DATABASE IF NOT EXISTS non può essere usato con HIVE METASTORE.  
Per utilizzare CREATE EXTERNAL DATABASE IF NOT EXISTS con il catalogo dati abilitato per AWS Lake Formation, è necessaria l'autorizzazione `CREATE_DATABASE` sul catalogo dati. 

CATALOG\$1ID "*ID account Amazon Web Services contenente il database Glue o Lake Formation*"  
L'ID dell'account in cui è archiviato il database del catalogo dati.  
`CATALOG_ID` può essere specificato solo se si prevede di connettersi al cluster Amazon Redshift o ad Amazon Redshift Serverless utilizzando un'identità federata per l'autenticazione e l'autorizzazione al catalogo di dati configurando una delle seguenti impostazioni:   
+ `CATALOG_ROLE` Da a `'SESSION'`
+ `IAM_ROLE` su `'SESSION'` e `'CATALOG_ROLE'` impostati sul valore predefinito 
Per ulteriori informazioni sul completamento della procedura per l'identità federata, consulta l'argomento relativo all'[utilizzo di un'identità federata per gestire l'accesso di Amazon Redshift alle risorse locali e alle tabelle esterne di Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html). 

AUTHENTICATION  
Il tipo di autenticazione definito per l'importazione di dati in streaming. L'importazione di dati in streaming con i tipi di autenticazione funziona con Amazon Managed Streaming per Apache Kafka. I tipi di `AUTHENTICATION` sono i seguenti:  
+ **none**: specifica che non è richiesta alcuna autenticazione. Ciò corrisponde all’accesso non autenticato in MSK o al testo semplice con TLS in Apache Kafka.
+ **iam**: specifica l'autenticazione IAM. Quando scegli questa opzione, assicurati che il ruolo IAM disponga delle autorizzazioni per l'autenticazione IAM. Per ulteriori informazioni sulla definizione dello schema esterno, consulta [Nozioni di base sull’importazione in streaming da origini Apache Kafka](materialized-view-streaming-ingestion-getting-started-MSK.md).
+ **mtls**: specifica che il protocollo Transport Layer Security (TLS) reciproco fornisce comunicazioni sicure facilitando l’autenticazione tra client e server. In questo caso il client è Redshift e il server è Amazon MSK. Per ulteriori informazioni sulla configurazione dell’importazione in streaming con mTLS, consulta [Autenticazione con mTLS per l’importazione in streaming Redshift da origini Apache Kafka](materialized-view-streaming-ingestion-mtls.md).


AUTHENTICATION\$1ARN  
L'ARN del AWS Certificate Manager certificato utilizzato da Amazon Redshift per l'autenticazione mtls con Amazon MSK. L’ARN è disponibile nella console ACM quando scegli il certificato emesso.

CLUSTER\$1ARN  
Per l’importazione in streaming, CLUSTER\$1ARN è l’identificatore del cluster per il cluster Streaming gestito da Amazon per Apache Kafka da cui stai eseguendo lo streaming. Quando utilizzi CLUSTER\$1ARN, è necessaria una policy del ruolo IAM che includa l’autorizzazione `kafka:GetBootstrapBrokers`. Questa opzione viene fornita per la compatibilità con le versioni precedenti. Attualmente consigliamo di utilizzare l’opzione URI bootstrap-broker per connetterti ai cluster Streaming gestito da Amazon per Apache Kafka. Per ulteriori informazioni, consulta [Importazione dati in streaming](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion.html).

## Note per l’utilizzo
<a name="r_CREATE_EXTERNAL_SCHEMA_usage"></a>

Per i limiti per l'uso del catalogo di dati Athena, consulta [Limiti di Athena](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#amazon-athena-limits) in Riferimenti generali di AWS.

[Per i limiti relativi all'utilizzo di AWS Glue Data Catalog, consulta AWS Glue Limiti in.](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_glue) Riferimenti generali di AWS

Questi limiti non si applicano a un metastore Hive.

È presente un massimo di 9900 schemi per database. Per ulteriori informazioni, consulta [Quote e limiti](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) nella *Guida alla gestione di Amazon Redshift*.

Per annullare la registrazione dello schema, utilizzare il comando [DROP SCHEMA](r_DROP_SCHEMA.md). 

Per visualizzare i dettagli degli schemi esterni, eseguire una query sulle viste di sistema seguenti: 
+ [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md) 
+ [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 
+ [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md) 

## Esempi
<a name="r_CREATE_EXTERNAL_SCHEMA_examples"></a>

L'esempio seguente crea uno schema esterno che utilizza un database in un catalogo dati denominato `sampledb` nella regione Stati Uniti occidentali (Oregon). Usa questo esempio con un catalogo dati Athena o AWS Glue .

```
create external schema spectrum_schema
from data catalog
database 'sampledb'
region 'us-west-2'
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';
```

L'esempio seguente crea uno schema esterno e un nuovo database esterno denominato `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;
```

L'esempio seguente crea uno schema esterno che utilizza un database metastore Hive denominato `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';
```

Nell'esempio seguente sono concatenati i ruoli per utilizzare il ruolo `myS3Role` per accedere ad Amazon S3 ed è utilizzato `myAthenaRole` per l'accesso al catalogo dati. Per ulteriori informazioni, consulta [Concatenazione di ruoli IAM per 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;
```

Nell'esempio seguente viene creato uno schema esterno che fa riferimento a un database 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'
```

Nell'esempio seguente viene creato uno schema esterno per fare riferimento al database sales\$1db importato nel cluster di consumer.

```
CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
```

Nell'esempio seguente viene creato uno schema esterno che fa riferimento a un database Aurora MySQL. 

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema
FROM MYSQL
DATABASE 'my_aurora_db'
URI 'endpoint to aurora hostname'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole'
SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'
```

# CREATE EXTERNAL TABLE
<a name="r_CREATE_EXTERNAL_TABLE"></a>

Crea una nuova tabella esterna nello schema specificato. Tutte le tabelle esterne devono essere create in uno schema esterno. Il percorso di ricerca non è supportato per schemi esterni e tabelle esterne. Per ulteriori informazioni, consulta [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md).

Oltre alle tabelle esterne create utilizzando il comando CREATE EXTERNAL TABLE, Amazon Redshift può fare riferimento a tabelle esterne definite in un AWS Lake Formation catalogo AWS Glue or o in un metastore Apache Hive. Utilizzare il comando [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) per registrare un database esterno definito nel catalogo esterno e rendere disponibili le tabelle esterne per l'uso in Amazon Redshift. Se la tabella esterna esiste in un AWS Lake Formation catalogo AWS Glue o in un metastore Hive, non è necessario creare la tabella utilizzando CREATE EXTERNAL TABLE. Per visualizzare le tabelle esterne, eseguire una query sulla vista di sistema [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md). 

Eseguendo il comando CREATE EXTERNAL TABLE AS, è possibile creare una tabella esterna basata sulla definizione di colonna da una query e scrivere i risultati di tale query in Amazon S3. I risultati sono in formato Apache Parquet o testo delimitato. Se la tabella esterna dispone di una o più chiavi di partizione, Amazon Redshift partiziona i nuovi file in base a tali chiavi di partizione e registra automaticamente le nuove partizioni nel catalogo esterno. Per ulteriori informazioni su CREATE EXTERNAL TABLE AS, consultare [Note per l’utilizzo](r_CREATE_EXTERNAL_TABLE_usage.md). 

È possibile eseguire query su una tabella esterna utilizzando la stessa sintassi SELECT utilizzata con altre tabelle Amazon Redshift. È inoltre possibile utilizzare la sintassi INSERT per scrivere nuovi file nella posizione della tabella esterna su Amazon S3. Per ulteriori informazioni, consulta [INSERT (tabella esterna)](r_INSERT_external_table.md).

Per creare una vista con una tabella esterna, includi la clausola WITH NO SCHEMA BINDING nell'istruzione [CREATE VIEW](r_CREATE_VIEW.md).

Non è possibile eseguire CREATE EXTERNAL TABLE all'interno di una transazione (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

## Privilegi richiesti
<a name="r_CREATE_EXTERNAL_TABLE-privileges"></a>

Per creare tabelle esterne, devi essere il proprietario dello schema esterno o un utente con privilegi avanzati. Per trasferire la proprietà di uno schema esterno, utilizza ALTER SCHEMA per cambiare il proprietario. L'accesso alle tabelle esterne è controllato dall'accesso allo schema esterno. Non puoi [GRANT](r_GRANT.md) o [REVOKE](r_REVOKE.md) autorizzazioni per una tabella esterna. Puoi invece concedere o revocare USAGE sullo schema esterno.

[Note per l’utilizzo](r_CREATE_EXTERNAL_TABLE_usage.md) dispone di informazioni aggiuntive sulle autorizzazioni specifiche per le tabelle esterne.

## Sintassi
<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' [, ...] ) ]
```

Di seguito è riportata la sintassi per CREATE EXTERNAL TABLE AS.

```
CREATE EXTERNAL TABLE
external_schema.table_name
[ PARTITIONED BY (col_name [, … ] ) ]
[ ROW FORMAT DELIMITED row_format ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
 AS
 { select_statement }
```

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

 *external\$1schema.table\$1name*   
Nome della tabella da creare, qualificato da un nome di schema esterno. Le tabelle esterne devono essere create in uno schema esterno. Per ulteriori informazioni, consulta [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md).  
La lunghezza massima per il nome della tabella è 127 byte; i nomi più lunghi vengono troncati a 127 byte. Puoi utilizzare caratteri multibyte UTF-8 fino a un massimo di quattro byte. Amazon Redshift applica un limite di 9.900 tabelle per cluster, comprese le tabelle temporanee definite dall'utente e le tabelle temporanee create da Amazon Redshift durante l'elaborazione delle query o la manutenzione del sistema. Facoltativamente, puoi qualificare il nome della tabella con il nome del database. Nell'esempio seguente, il nome del database è `spectrum_db`, il nome dello schema esterno è `spectrum_schema` e il nome della tabella è `test`.  

```
create external table spectrum_db.spectrum_schema.test (c1 int)
stored as parquet
location 's3://amzn-s3-demo-bucket/myfolder/';
```
Se il database o lo schema specificato non esiste, la tabella non viene creata e l'istruzione restituisce un errore. Non è possibile creare tabelle o viste nei database di sistema `template0`, `template1`, `padb_harvest` o `sys:internal`.  
Il nome della tabella deve essere un nome univoco per lo schema specificato.   
Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

( *column\$1name* *data\$1type* )  
Il nome e il tipo di dati di ciascuna colonna creata.  
La lunghezza massima per il nome della colonna è 127 byte; i nomi più lunghi vengono troncati a 127 byte. Puoi utilizzare caratteri multibyte UTF-8 fino a un massimo di quattro byte. Non puoi specificare i nomi di colonna `"$path"` o `"$size"`. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).  
Per impostazione predefinita, Amazon Redshift crea tabelle esterne con le pseudocolonne `$path` e `$size`. Puoi disabilitare la creazione di pseudocolonne per una sessione impostando il parametro di configurazione `spectrum_enable_pseudo_columns` su `false`. Per ulteriori informazioni, consulta [Pseudocolonne](r_CREATE_EXTERNAL_TABLE_usage.md#r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns).  
Se le pseudocolonne sono abilitate, il numero massimo di colonne che è possibile definire in una singola tabella è 1.598. Se le pseudocolonne non sono abilitate, il numero massimo di colonne che puoi definire in una singola tabella è 1.600.   
Se stai creando una "tabella di grandi dimensioni", assicurati che il tuo elenco di colonne non superi i limiti della larghezza delle righe per i risultati intermedi durante i carichi e l'elaborazione delle query. Per ulteriori informazioni, consulta [Note per l'utilizzo](r_CREATE_TABLE_NEW.md#r_CREATE_TABLE_usage).  
Per un comando CREATE EXTERNAL TABLE AS., non è necessario un elenco di colonne, poiché queste derivano dalla query.

 *data\$1type*   
Sono supportate le seguenti [Tipi di dati](c_Supported_data_types.md):  
+ SMALLINT () INT2
+ NUMERO INTERO (INT,) INT4
+ BIG INT () INT8
+ DECIMAL (NUMERIC)
+ REALE () FLOAT4
+ DOPPIA PRECISIONE (FLOAT8)
+ BOOLEAN (BOOL)
+ CHAR (CHARACTER)
+ VARCHAR (CHARACTER VARYING)
+ VARBYTE (CHARACTER VARYING): può essere utilizzato con file di dati Parquet e ORC e solo con colonne non partizionate.
+ DATE: può essere utilizzato solo con i file di testo, Parquet o file di dati ORC oppure come colonna di partizione.
+ TIMESTAMP
  
Per DATE, è possibile utilizzare i formati come descritto di seguito. Per i valori mensili rappresentati tramite cifre, sono supportati i seguenti formati:  
+ `mm-dd-yyyy`, ad esempio, `05-01-2017`. Questa è l’impostazione predefinita.
+ `yyyy-mm-dd`, dove l'anno è rappresentato da più di 2 cifre. Ad esempio, `2017-05-01`.
Per i valori mensili rappresentati tramite l'abbreviazione di tre lettere, sono supportati i seguenti formati:  
+ `mmm-dd-yyyy`, ad esempio, `may-01-2017`. Questa è l’impostazione predefinita.
+ `dd-mmm-yyyy`, dove l'anno è rappresentato da più di 2 cifre. Ad esempio, `01-may-2017`.
+ `yyyy-mmm-dd`, dove l'anno è rappresentato da più di 2 cifre. Ad esempio, `2017-may-01`.
Per i valori dell'anno che sono costantemente inferiori a 100, l'anno viene calcolato nel modo seguente:  
+ Se l'anno è inferiore a 70, l'anno viene calcolato come anno più 2000. Ad esempio, la data 05-01-17 nel formato `mm-dd-yyyy` viene convertito in `05-01-2017`.
+ Se l'anno è inferiore a 100 ma superiore a 69, l'anno viene calcolato come anno più 1900. Ad esempio, la data 05-01-89 nel formato `mm-dd-yyyy` viene convertito in `05-01-1989`.
+ Per i valori dell'anno rappresentati da due cifre, aggiungi zeri iniziali per rappresentare l'anno in 4 cifre.
I valori di timestamp nei file di testo devono essere nel formato `yyyy-mm-dd HH:mm:ss.SSSSSS`, come il seguente valore di timestamp `2017-05-01 11:30:59.000000`.  
La lunghezza di una colonna VARCHAR è definita in termini di byte, non caratteri. Ad esempio, una colonna VARCHAR(12) può contenere 12 caratteri a byte singolo o 6 caratteri a due byte. Quando invii una query a una tabella esterna, i risultati sono troncati in modo da essere compatibili con le dimensioni definite della colonna senza restituire un errore. Per ulteriori informazioni, consulta [Storage e intervalli](r_Character_types.md#r_Character_types-storage-and-ranges).   
Per garantire le prestazioni migliori, consigliamo di specificare le dimensioni della colonna più piccole compatibili con i dati. Per individuare le dimensioni massime in byte per i valori di una colonna, utilizza la funzione [OCTET\$1LENGTH](r_OCTET_LENGTH.md). Nell'esempio seguente viene restituita la dimensione massima dei valori nella colonna dell'e-mail.  

```
select max(octet_length(email)) from users;

max
---
 62
```

PARTITIONED BY (*col\$1name* *data\$1type* [, … ] )  
Una clausola che definisce una tabella partizionata con una o più colonne di partizione. Viene utilizzata una directory di dati separata per ciascuna combinazione specificata, che può migliorare le prestazioni della query in alcune circostanze. Le colonne partizionate non esistono all'interno dei dati della tabella stessa. Se usi un valore per *col\$1name* uguale a una colonna della tabella, viene restituito un errore.   
Dopo aver creato una tabella partizionata, modificare la tabella utilizzando un'istruzione [ALTER TABLE](r_ALTER_TABLE.md) ... ADD PARTITION per registrare nuove partizioni nel catalogo esterno. Quando si aggiunge una partizione, si definisce la posizione della sottocartella su Amazon S3 contenenti i dati della partizione.  
Ad esempio, se la tabella `spectrum.lineitem_part` è definita con `PARTITIONED BY (l_shipdate date)`, esegui il seguente comando ALTER TABLE per aggiungere una partizione.  

```
ALTER TABLE spectrum.lineitem_part ADD PARTITION (l_shipdate='1992-01-29')
LOCATION 's3://spectrum-public/lineitem_partition/l_shipdate=1992-01-29';
```
Se utilizzi CREATE EXTERNAL TABLE AS, non è necessario eseguire ALTER TABLE…ADD PARTITION. Amazon Redshift registra automaticamente le nuove partizioni nel catalogo esterno. Amazon Redshift scrive inoltre automaticamente i dati corrispondenti nelle partizioni Amazon S3 in base alla chiave o alle chiavi di partizione definite nella tabella.  
Per visualizzare le partizioni, eseguire una query sulla vista di sistema [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md).  
Per un comando CREATE EXTERNAL TABLE AS, non è necessario specificare il tipo di dati della colonna di partizione perché questa colonna è derivata dalla query. 

ROW FORMAT DELIMITED *rowformat*  
Clausola che specifica il formato dei dati sottostanti. I valori possibili di *rowformat* sono indicati di seguito:  
+ LINES TERMINATED BY '*delimiter*' 
+ FIELDS TERMINATED BY '*delimiter*' 
Specifica un singolo carattere ASCII per '*delimiter*'. Puoi specificare caratteri ASCII non stampabili utilizzando un ottale, nel formato `'\`*`ddd`*`'` dove *`d`* è una cifra ottale (0 – 7) fino a '\$1177'. L'esempio seguente specifica il carattere BEL (bell) usando l'ottale.   

```
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\007'
```
Se ROW FORMAT è omesso, il formato predefinito è DELIMITED FIELDS TERMINATED BY '\$1A' (inizio dell'intestazione) e LINES TERMINATED BY '\$1n' (newline). 

ROW FORMAT SERDE '*serde\$1name*' [WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
Clausola che specifica il formato SERDE dei dati sottostanti.     
'*serde\$1name*'  
Nome della SerDe. È possibile specificare utilizzando i seguenti formati.  
+ org.apache.hadoop.hive.serde2. RegexSerDe 
+ com.amazonaws.glue.serde. GrokSerDe 
+ org.apache.hadoop.hive.serde 2.open CSVSerde 

  Questo parametro supporta la seguente proprietà per Open: SerDe CSVSerde 

  ```
  'wholeFile' = 'true' 
  ```

  Impostare la proprietà `wholeFile`a proprietà `true` per analizzare correttamente i nuovi caratteri di riga (\$1 n) all'interno di stringhe virgolate per le richieste OpenCSV. 
+ org.openx.data.jsonserde. JsonSerDe
  + Il JSON SERDE supporta anche i file Ion. 
  + Il JSON deve essere ben formato. 
  + I timestamp in Ion e JSON devono utilizzare il formato. ISO8601
  + Questo parametro supporta la seguente proprietà per: SerDe JsonSerDe 

    ```
    'strip.outer.array'='true' 
    ```

     Ion/JSON Elabora i file contenenti un array molto grande racchiuso tra parentesi esterne ([...]) come se contenesse più record JSON all'interno dell'array. 
+ com.amazon.ionhiveserde. IonHiveSerDe

  Il formato Amazon ION fornisce formati di testo e binari, oltre ai tipi di dati. Per una tabella esterna che fa riferimento ai dati in formato ION, devi mappare ogni colonna della tabella verso l'elemento corrispondente nei dati di formato ION. Per ulteriori dettagli, consultare [Amazon Ion](https://amzn.github.io/ion-docs/). È inoltre necessario specificare i formati di input e di output.  
WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
Facoltativamente, specifica i nomi e i valori delle proprietà, separati da virgole.
Se ROW FORMAT è omesso, il formato predefinito è DELIMITED FIELDS TERMINATED BY '\$1A' (inizio dell'intestazione) e LINES TERMINATED BY '\$1n' (newline). 

STORED AS *file\$1format*  
Il formato per i file di dati.   
I formati validi sono:  
+ PARQUET
+ RCFILE ( ColumnarSerDe solo per uso di dati, non) LazyBinaryColumnarSerDe
+ SEQUENCEFILE
+ TEXTFILE (per file di testo, inclusi i file JSON)
+ ORC 
+ AVRO 
+ INPUTFORMAT '*input\$1format\$1classname*' OUTPUTFORMAT '*output\$1format\$1classname*' 
Il comando CREATE EXTERNAL TABLE AS supporta solo due formati di file, TEXTFILE e PARQUET.  
Per INPUTFORMAT e OUTPUTFORMAT, specifica un nome di classe, come illustrato nel seguente esempio.   

```
'org.apache.hadoop.mapred.TextInputFormat'
```

LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*'\$1  <a name="create-external-table-location"></a>
Il percorso della cartella o del bucket Amazon S3 con i file di dati o un file manifest che contiene un elenco di percorsi di oggetti Amazon S3. I bucket devono trovarsi nella stessa AWS regione del cluster Amazon Redshift. Per un elenco delle regioni AWS supportate, consultare [Limitazioni di Amazon Redshift Spectrum](c-spectrum-considerations.md).  
Se il percorso specifica un bucket o una cartella, ad esempio `'s3://amzn-s3-demo-bucket/custdata/'`, Redshift Spectrum esegue la scansione dei file nel bucket o nella cartella specificati e in qualsiasi sottocartella. Redshift Spectrum ignora i file e i file nascosti che iniziano con un punto o un trattino basso.   
Se il percorso specifica un file manifest, l'argomento `'s3://bucket/manifest_file'` deve fare riferimento esplicitamente a un singolo file, ad esempio `'s3://amzn-s3-demo-bucket/manifest.txt'`. Non può fare riferimento a un prefisso della chiave.   
Il manifest è un file di testo in formato JSON che elenca l'URL di ciascun file che deve essere caricato da Amazon S3 e la dimensione del file, in byte. L'URL include il nome del bucket e il percorso completo dell'oggetto per il file. I file specificati nel manifesto possono trovarsi in diversi bucket, ma tutti i bucket devono trovarsi nella stessa AWS regione del cluster Amazon Redshift. Se un file viene elencato due volte, viene caricato due volte. L'esempio seguente mostra il JSON per un manifest che carica tre file.   

```
{
  "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 } }
  ]
}
```
È possibile rendere obbligatoria l'inclusione di un particolare file. A tale scopo, includere un'opzione `mandatory` a livello di file nel manifest. Quando si esegue una query su una tabella esterna con un file obbligatorio mancante, l'istruzione SELECT ha esito negativo. Assicurarsi che tutti i file inclusi nella definizione della tabella esterna siano presenti. Se non sono tutti presenti, viene visualizzato un errore che mostra il primo file obbligatorio che non viene trovato. L'esempio seguente mostra il JSON per un manifest con l' opzione `mandatory` impostata su `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 } }
  ]
}
```
Per fare riferimento ai file creati utilizzando UNLOAD, puoi utilizzare il manifest creato utilizzando [UNLOAD](r_UNLOAD.md) con il parametro MANIFEST. Il file manifest è compatibile con un file manifest per [COPY da Amazon S3](copy-parameters-data-source-s3.md), ma usa chiavi diverse. Le chiavi non utilizzate vengono ignorate. 

TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*' [, ...] )   
Clausola che imposta la definizione della tabella delle proprietà della tabella.   
Le proprietà della tabella rispettano la distinzione tra maiuscole e minuscole.  
 'compression\$1type'='*value*'   
 Proprietà che imposta il tipo di compressione da utilizzare se il nome file non contiene un'estensione. Se imposti questa proprietà e c'è un'estensione di file, l'estensione viene ignorata e viene utilizzato il valore impostato dalla proprietà. I valori validi per il tipo di compressione sono i seguenti:  
+ bzip2
+ gzip
+ nessuno
+ snappy  
'data\$1cleansing\$1enabled'='true / false'  
Questa proprietà imposta se la gestione dei dati è attiva per la tabella. Se 'data\$1cleansing\$1enabled' è impostata su true, la gestione dei dati è attiva per la tabella. Se 'data\$1cleansing\$1enabled' è impostata su false, la gestione dei dati non è attiva per la tabella. Di seguito è riportato l'elenco delle proprietà di gestione dei dati a livello di tabella controllate da questa proprietà:  
+ column\$1count\$1mismatch\$1handling
+ invalid\$1char\$1handling
+ numeric\$1overflow\$1handling
+ replacement\$1char
+ surplus\$1char\$1handling
Per alcuni esempi, consulta [Esempi di gestione dei dati](r_CREATE_EXTERNAL_TABLE_examples.md#r_CREATE_EXTERNAL_TABLE_examples-data-handling).  
'invalid\$1char\$1handling'='*valore*'   
Specifica l'azione da eseguire quando i risultati della query contengono valori di caratteri UTF-8 non validi. È possibile specificare le seguenti operazioni:    
DISABILITATO  
Non esegue la gestione dei caratteri non validi.  
FAIL  
Annulla le query che restituiscono dati contenenti valori UTF-8 non validi.  
SET\$1TO\$1NULL   
Sostituisce valori UTF-8 non validi con null.  
DROP\$1ROW  
Sostituisce ogni valore della riga con null.  
REPLACE  
Sostituisce il carattere non valido con il carattere sostitutivo specificato tramite `replacement_char`.  
'replacement\$1char'='*carattere*'  
Specifica il carattere sostitutivo da utilizzare quando si imposta `invalid_char_handling` su `REPLACE`.  
'numeric\$1overflow\$1handling'='value'  
Specifica l'azione da eseguire quando i dati ORC contengono un numero intero (ad esempio BIGINT o int64) maggiore della definizione di colonna (ad esempio SMALLINT o int16). È possibile specificare le seguenti operazioni:    
DISABILITATO  
La gestione dei caratteri non validi è disattivata.  
FAIL  
Se i dati includono caratteri non validi annullare la query.  
SET\$1TO\$1NULL  
Impostare i caratteri non validi su null.  
DROP\$1ROW  
Impostare ogni valore della riga su null.  
'surplus\$1bytes\$1handling'='*value*'  
Specifica come gestire i dati caricati che superano la lunghezza del tipo di dati definito per le colonne contenenti dati VARBYTE. Per impostazione predefinita, Redshift Spectrum imposta il valore su null per i dati che superano la larghezza della colonna.  
È possibile specificare le seguenti operazioni da eseguire quando la query restituisce dati che superano la larghezza del tipo di dati:    
SET\$1TO\$1NULL  
Sostituisce i dati che superano la larghezza della colonna con null.  
DISABILITATO  
Non esegue la gestione dei byte in eccedenza.  
FAIL  
Annulla le query che restituiscono dati che superano la larghezza della colonna.  
DROP\$1ROW  
Elimina tutte le righe contenenti dati che superano la larghezza della colonna.  
TRUNCATE  
Rimuove i caratteri che superano il numero massimo di caratteri definito per la colonna.  
'surplus\$1char\$1handling'='*valore*'  
Specifica come gestire i dati caricati che superano la lunghezza del tipo di dati definito per le colonne contenenti dati VARCHAR, CHAR o stringa. Per impostazione predefinita, Redshift Spectrum imposta il valore su null per i dati che superano la larghezza della colonna.  
È possibile specificare le seguenti operazioni da eseguire quando la query restituisce dati che superano la larghezza della colonna:    
SET\$1TO\$1NULL  
Sostituisce i dati che superano la larghezza della colonna con null.  
DISABILITATO  
Non esegue la gestione dei caratteri in eccedenza.  
FAIL  
Annulla le query che restituiscono dati che superano la larghezza della colonna.  
DROP\$1ROW  
Sostituisce ogni valore della riga con null.  
TRUNCATE  
Rimuove i caratteri che superano il numero massimo di caratteri definito per la colonna.  
'column\$1count\$1mismatch\$1handling'='valore’  
Determina se il file contiene più o meno valori in una riga rispetto al numero di colonne specificato nella definizione della tabella esterna. Questa proprietà è disponibile solo per il formato di file di testo non compresso. È possibile specificare le seguenti operazioni:    
DISABILITATO  
La gestione della mancata corrispondenza del conteggio di colonne è disattivata.  
FAIL  
La query ha esito negativo se viene rilevata una mancata corrispondenza del conteggio delle colonne.  
SET\$1TO\$1NULL  
Compila i valori mancanti con NULL e ignora i valori aggiuntivi in ogni riga.  
DROP\$1ROW  
Elimina tutte le righe che contengono errori relativi alla mancata corrispondenza del conteggio delle colonne dalla scansione.  
'numRows'='*row\$1count*'   
Proprietà che imposta il valore numRows per la definizione della tabella. Per aggiornare in modo esplicito le statistiche di una tabella esterna, imposta la proprietà numRows in modo da indicare le dimensioni della tabella. Amazon Redshift non analizza le tabelle esterne per generare le statistiche delle tabelle che l'ottimizzatore di query utilizza per generare un piano di query. Se le statistiche delle tabelle non sono impostate per una tabella esterna, Amazon Redshift genera un piano di esecuzione delle query basato sul presupposto che le tabelle esterne sono le tabelle più grandi e quelle locali le più piccole.  
'skip.header.line.count'='*line\$1count*'  
Proprietà che imposta il numero di righe da saltare all'inizio di ogni file sorgente.  
'serialization.null.format'=' '  
Proprietà che specifica che Spectrum deve restituire un valore `NULL` quando esiste una corrispondenza esatta con il testo fornito in un campo.  
'orc.schema.resolution'='mapping\$1type'  
Una proprietà che imposta il tipo di mappatura della colonna per le tabelle che utilizzano il formato di dati ORC. La proprietà viene ignorata per tutti gli altri formati di dati.  
I valori validi per il tipo di mappatura della colonna sono i seguenti:   
+ nome 
+ position 
Se la proprietà *orc.schema.resolution* viene omessa, le colonne vengono mappate in base al nome per impostazione predefinita. Se *orc.schema.resolution* è impostata su un valore diverso da *'name'* o *'position'*, le colonne vengono mappate in base alla posizione. Per ulteriori informazioni sulla mappatura delle colonne, consulta [Mappatura delle colonne di una tabella esterna alle colonne ORC](c-spectrum-external-tables.md#c-spectrum-column-mapping-orc).  
Il comando COPY mappa sui file di dati ORC soltanto in base alla posizione. La proprietà della tabella *orc.schema.resolution* non ha effetto sul comportamento del comando COPY.   
'write.parallel'='on / off'  
Proprietà che imposta se CREATE EXTERNAL TABLE AS deve scrivere dati in parallelo. Per impostazione predefinita, CREATE EXTERNAL TABLE AS scrive i dati in parallelo in più file, in base al numero di sezioni nel cluster. L'opzione predefinita è "attiva". Quando 'write.parallel' è impostato su off, CREATE EXTERNAL TABLE AS scrive su uno o più file di dati in serie su Amazon S3. Questa proprietà della tabella si applica anche a qualsiasi istruzione INSERT successiva nella stessa tabella esterna.  
‘write.maxfilesize.mb'=‘size'  
Una proprietà che imposta la dimensione massima (in MB) di ogni file scritto su Amazon S3 da CREATE EXTERNAL TABLE AS. La dimensione deve essere un numero intero valido compreso tra 5 e 6200. La dimensione massima predefinita del file è 6.200 MB. Questa proprietà della tabella si applica anche a qualsiasi istruzione INSERT successiva nella stessa tabella esterna.  
'write.kms.key.id'='*valore*'  
Puoi specificare una AWS Key Management Service chiave per abilitare la crittografia lato server (SSE) per oggetti Amazon S3, dove il *valore* è uno dei seguenti:   
+ `auto`per utilizzare la AWS KMS chiave predefinita memorizzata nel bucket Amazon S3.
+ *kms-key* che si specifica per crittografare i dati.  
*select\$1statement*  
Istruzione che inserisce una o più righe nella tabella esterna definendo qualsiasi query. Tutte le righe prodotte dalla query vengono scritte in Amazon S3 in formato testo o Parquet in base alla definizione della tabella.

## Esempi
<a name="r_CREATE_EXTERNAL_TABLE_examples_link"></a>

Una raccolta di esempi è disponibile all'indirizzo [Esempi](r_CREATE_EXTERNAL_TABLE_examples.md).

# Note per l’utilizzo
<a name="r_CREATE_EXTERNAL_TABLE_usage"></a>

Questo argomento contiene note di utilizzo per [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). Non è possibile visualizzare i dettagli per le tabelle Amazon Redshift Spectrum che utilizzano le stesse risorse utilizzate per le tabelle Amazon Redshift standard come [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md), [STV\$1TBL\$1PERM](r_STV_TBL_PERM.md), PG\$1CLASS o information\$1schema. Se il tuo strumento di business intelligence o di analisi non riconosce le tabelle esterne Redshift Spectrum, configura l'applicazione per eseguire la query su [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>

In alcuni casi, puoi eseguire il comando CREATE EXTERNAL TABLE AS su un catalogo AWS Glue dati, un catalogo AWS Lake Formation esterno o un metastore Apache Hive. In questi casi, si utilizza un ruolo AWS Identity and Access Management (IAM) per creare lo schema esterno. Questo ruolo IAM deve disporre di autorizzazioni di lettura e scrittura per Amazon S3. 

Se si utilizza un catalogo Lake Formation, il ruolo IAM deve disporre dell'autorizzazione per creare una tabella nel catalogo. In questo caso, deve anche disporre dell'autorizzazione per la posizione del data lake sul percorso di destinazione di Amazon S3. Questo ruolo IAM diventa il proprietario della nuova tabella AWS Lake Formation .

Per garantire che i nomi file siano univoci, Amazon Redshift utilizza il seguente formato per il nome di ogni file caricato in Amazon S3 per impostazione predefinita.

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

 Un esempio è `20200303_004509_810669_1007_0001_part_00.parquet`.

Quando si esegue il comando CREATE EXTERNAL TABLE AS, considerare quanto segue:
+ La posizione di Amazon S3 deve essere vuota.
+ Quando si utilizza la clausola STORED AS, Amazon Redshift supporta solo i formati PARQUET e TEXTFILE.
+ Non è necessario definire un elenco di definizioni di colonna. I nomi delle colonne e i tipi di dati delle colonne della nuova tabella esterna derivano direttamente dalla query SELECT.
+ Non è necessario definire il tipo di dati della colonna di partizione nella clausola PARTITIONED BY. Se si specifica una chiave di partizione, il nome di questa colonna deve essere presente nel risultato della query SELECT. Quando si dispone di più colonne di partizione, il loro ordine nella query SELECT non ha importanza. Per creare la tabella esterna, Amazon Redshift utilizza l'ordine definito nella clausola PARTITIONED BY.
+ Amazon Redshift suddivide automaticamente i file di output in cartelle di partizione in base ai valori della chiave di partizione. Per impostazione predefinita, Amazon Redshift rimuove le colonne di partizione dai file di output.
+ La clausola LINES TERMINATE BY 'delimiter' non è supportata.
+ La clausola ROW FORMAT SERDE 'serde\$1name' non è supportata.
+ L'utilizzo dei file manifest non è supportato. Pertanto, non è possibile definire la clausola LOCATION in un file manifest su Amazon S3.
+ Amazon Redshift aggiorna automaticamente la proprietà della tabella 'numRows' alla fine del comando.
+ La proprietà di tabella 'compression\$1type' accetta solo 'none' o 'snappy' per il formato di file PARQUET.
+ Amazon Redshift non consente la clausola LIMIT nella query SELECT esterna. È possibile invece utilizzare una clausola LIMIT nidificata.
+ È possibile utilizzare STL\$1UNLOAD\$1LOG per tenere traccia dei file scritti in Amazon S3 da ogni operazione CREATE EXTERNAL TABLE AS.

## Autorizzazioni per creare ed eseguire query sulle tabelle esterne
<a name="r_CREATE_EXTERNAL_TABLE_usage-permissions"></a>

Per creare tabelle esterne, assicurarsi di essere il proprietario dello schema esterno o un utente con privilegi avanzati. Per trasferire la proprietà di uno schema esterno, utilizza [ALTER SCHEMA](r_ALTER_SCHEMA.md). L'esempio seguente cambia il proprietario dello schema `spectrum_schema` in `newowner`.

```
alter schema spectrum_schema owner to newowner;
```

Per eseguire una query di Redshift Spectrum, sono necessarie le seguenti autorizzazioni:
+ Autorizzazione di utilizzare lo schema 
+ Autorizzazione di creare tabelle temporanee nel database corrente 

L'esempio seguente concede l'autorizzazione all'utilizzo dello schema `spectrum_schema` al gruppo di utenti `spectrumusers`.

```
grant usage on schema spectrum_schema to group spectrumusers;
```

L'esempio seguente concede l'autorizzazione temporanea per il database `spectrumdb` al gruppo di utenti `spectrumusers`. 

```
grant temp on database spectrumdb to group spectrumusers;
```

## Pseudocolonne
<a name="r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns"></a>

Per impostazione predefinita, Amazon Redshift crea tabelle esterne con le pseudocolonne *\$1path* e *\$1size*. Selezionare queste colonne per visualizzare il percorso ai file di dati su Amazon S3 e le dimensioni dei file di dati per ogni riga restituita da una query. I nomi di colonna *\$1path* e *\$1size* devono essere delimitati da virgolette doppie. La clausola *SELECT \$1* non restituisce le pseudocolonne. Devi includere in modo esplicito i nomi delle colonne *\$1path* e *\$1size* nella tua query, come indicato nel seguente esempio.

```
select "$path", "$size"
from spectrum.sales_part
where saledate = '2008-12-01';
```

Puoi disabilitare la creazione di pseudocolonne per una sessione impostando il parametro di configurazione *spectrum\$1enable\$1pseudo\$1columns* su *false*. 

**Importante**  
La selezione di *\$1size* o *\$1path* comporta dei costi in quanto Redshift Spectrum esegue la scansione dei file di dati su Amazon S3 per determinare la dimensione del set di risultati. Per ulteriori informazioni sui prezzi, consultare [Prezzi di Amazon Redshift](https://aws.amazon.com/redshift/pricing/).

## Impostazione delle opzioni di gestione dati
<a name="r_CREATE_EXTERNAL_TABLE_usage-data-handling"></a>

È possibile impostare i parametri della tabella per specificare la gestione dell'input per i dati da sottoporre a query in tabelle esterne, tra cui: 
+ I caratteri in eccedenza nelle colonne contenenti dati VARCHAR, CHAR e stringa. Per ulteriori informazioni, consultare la proprietà della tabella esterna `surplus_char_handling`.
+ I caratteri non validi nelle colonne contenenti dati VARCHAR, CHAR e stringa. Per ulteriori informazioni, consultare la proprietà della tabella esterna `invalid_char_handling`.
+ Carattere sostitutivo da utilizzare quando si specifica REPLACE per la proprietà della tabella esterna `invalid_char_handling`.
+ Gestione dell'eccedenza cast nelle colonne contenenti dati interi e decimali. Per ulteriori informazioni, consultare la proprietà della tabella esterna `numeric_overflow_handling`.
+ Surplus\$1bytes\$1handling per specificare la gestione dell'input per i byte in eccesso nelle colonne contenenti dati varbyte. Per ulteriori informazioni, consultare la proprietà della tabella esterna `surplus_bytes_handling`.

# Esempi
<a name="r_CREATE_EXTERNAL_TABLE_examples"></a>

Nell'esempio seguente viene creata una tabella denominata SALES nello schema esterno Amazon Redshift denominato `spectrum`. I dati sono in file di testo delimitati da tabulazioni. La clausola TABLE PROPERTIES imposta la proprietà numRows su 170.000 righe.

A seconda dell'identità utilizzata per eseguire CREATE EXTERNAL TABLE, è possibile che sia necessario configurare delle autorizzazioni IAM. Come best practice, consigliamo di collegare le policy di autorizzazioni a un ruolo IAM, che quindi viene assegnato a utenti e gruppi secondo le necessità. Per ulteriori informazioni, consulta [Identity and access management in 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');
```

L'esempio seguente crea una tabella che utilizza JsonSerDe per fare riferimento ai dati in 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';
```

Nell'esempio CREATE EXTERNAL TABLE AS seguente viene creata una tabella esterna non partizionata. Quindi il risultato della query SELECT viene scritto come Apache Parquet nella posizione Amazon S3 di destinazione.

```
CREATE EXTERNAL TABLE spectrum.lineitem
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/lineitem/'
AS SELECT * FROM local_lineitem;
```

Nell'esempio seguente viene creata una tabella esterna partizionata e vengono incluse le colonne di partizione nella query 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;
```

Per un elenco di database esistenti nel catalogo dati esterno, eseguire una query sulla vista di 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"}
```

Per visualizzare i dettagli delle tabelle esterne, eseguire una query sulle viste di sistema [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) e [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md).

L'esempio seguente esegue una query sulla vista SVV\$1EXTERNAL\$1TABLES.

```
select schemaname, tablename, location from svv_external_tables;
```

```
schemaname | tablename            | location
-----------+----------------------+--------------------------------------------------------
spectrum   | sales                | s3://redshift-downloads/tickit/spectrum/sales
spectrum   | sales_part           | s3://redshift-downloads/tickit/spectrum/sales_partition
```

L'esempio seguente esegue una query sulla vista SVV\$1EXTERNAL\$1COLUMNS. 

```
select * from svv_external_columns where schemaname like 'spectrum%' and tablename ='sales';
```

```
schemaname | tablename | columnname | external_type | columnnum | part_key
-----------+-----------+------------+---------------+-----------+---------
spectrum   | sales     | salesid    | int           |         1 |        0
spectrum   | sales     | listid     | int           |         2 |        0
spectrum   | sales     | sellerid   | int           |         3 |        0
spectrum   | sales     | buyerid    | int           |         4 |        0
spectrum   | sales     | eventid    | int           |         5 |        0
spectrum   | sales     | saledate   | date          |         6 |        0
spectrum   | sales     | qtysold    | smallint      |         7 |        0
spectrum   | sales     | pricepaid  | decimal(8,2)  |         8 |        0
spectrum   | sales     | commission | decimal(8,2)  |         9 |        0
spectrum   | sales     | saletime   | timestamp     |        10 |        0
```

Per visualizzare le partizioni della tabella, usa la seguente query.

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

L'esempio seguente restituisce la dimensione totale dei file di dati correlati per una tabella esterna.

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

## Esempi di partizionamento
<a name="r_CREATE_EXTERNAL_TABLE_examples-partitioning"></a>

Per creare una tabella esterna partizionata per data, esegui il comando seguente.

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

Per aggiungere le partizioni, esegui il comando 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/';
```

Per selezionare i dati dalla tabella partizionata, esegui la seguente query.

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

Per visualizzare le partizioni delle tabelle, eseguire una query sulla vista di 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
```

## Esempi di formati di riga
<a name="r_CREATE_EXTERNAL_TABLE_examples-row-format"></a>

Di seguito viene mostrato un esempio di specifica dei parametri ROW FORMAT SERDE per i file di dati memorizzati nel 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' ;
```

Di seguito viene illustrato un esempio di specificazione dei parametri ROW FORMAT SERDE utilizzando. 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';
```

Di seguito viene mostrato un esempio di specifica dei parametri 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';
```

Il seguente esempio mostra come definire un log di accesso al server Amazon S3 in un bucket S3. È possibile utilizzare Redshift Spectrum per eseguire query sui log degli accessi di 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’;
```

Di seguito viene mostrato un esempio di specifica dei parametri ROW FORMAT SERDE per i file di dati memorizzati nel 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'
```

## Esempi di gestione dei dati
<a name="r_CREATE_EXTERNAL_TABLE_examples-data-handling"></a>

Gli esempi seguenti accedono al file: [spi\$1global\$1rankings.csv](https://s3.amazonaws.com/redshift-downloads/docs-downloads/spi_global_rankings.csv). È possibile caricare il file `spi_global_rankings.csv` in un bucket Amazon S3 per provare questi esempi.

Nell'esempio seguente viene creato lo schema esterno `schema_spectrum_uddh` e il database `spectrum_db_uddh`. Per`aws-account-id`, inserisci l'ID AWS del tuo account e `role-name` inserisci il nome del tuo ruolo 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;
```

Nell'esempio seguente viene creata la tabella esterna denominata `soccer_league` nello schema esterno `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');
```

Controllare Il numero di righe nella tabella `soccer_league`.

```
select count(*) from schema_spectrum_uddh.soccer_league;
```

Viene visualizzato il numero di righe.

```
count
645
```

La seguente query visualizza i primi 10 club. Poiché il club `Barcelona` include un carattere non valido nella stringa, per il nome viene visualizzato un valore NULL.

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

Nell'esempio seguente viene modificata la tabella `soccer_league` per specificare le proprietà `invalid_char_handling`, `replacement_char` e `data_cleansing_enabled` della tabella esterna per inserire un punto interrogativo (?) come sostituto di caratteri imprevisti.

```
alter  table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='REPLACE','replacement_char'='?','data_cleansing_enabled'='true');
```

Nell'esempio seguente viene sottoposta a query la tabella `soccer_league` per team con un grado da 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;
```

Poiché le proprietà della tabella sono state modificate, i risultati riportano i primi 10 club, con il carattere di sostituzione punto interrogativo (?) nell'ottava riga per il club `Barcelona`.

```
league_rank	club_name	league_name		league_nspi
1		Manchester City	Barclays Premier Lea	34595
2		Bayern Munich	German Bundesliga	34151
3		Liverpool	Barclays Premier Lea	33223
4		Chelsea		Barclays Premier Lea	32808
5		Ajax		Dutch Eredivisie	32790
6		Atletico Madrid	Spanish Primera Divi	31517
7		Real Madrid	Spanish Primera Divi	31469
8		Barcel?na	Spanish Primera Divi	31321
9		RB Leipzig	German Bundesliga	31014
10		Paris Saint-Ger	French Ligue 1		30929
```

L'esempio seguente modifica la tabella `soccer_league` per specificare le proprietà `invalid_char_handling` della tabella esterna per eliminare le righe con caratteri imprevisti.

```
alter table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='DROP_ROW','data_cleansing_enabled'='true');
```

Nell'esempio seguente viene sottoposta a query la tabella `soccer_league` per team con un grado da 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;
```

I risultati riportano i club principali senza includere l'ottava riga per il `Barcelona`.

```
league_rank   club_name         league_name            league_nspi
1             Manchester City   Barclays Premier Lea   34595
2             Bayern Munich     German Bundesliga      34151
3             Liverpool         Barclays Premier Lea   33223
4             Chelsea           Barclays Premier Lea   32808
5             Ajax              Dutch Eredivisie       32790
6             Atletico Madrid   Spanish Primera Divi   31517
7             Real Madrid       Spanish Primera Divi   31469
9             RB Leipzig        German Bundesliga      31014
10            Paris Saint-Ger   French Ligue 1         30929
```

# CREATE EXTERNAL VIEW
<a name="r_CREATE_EXTERNAL_VIEW"></a>

La funzionalità di anteprima delle viste del catalogo dati è disponibile solo nelle seguenti regioni.
+ Stati Uniti orientali (Ohio) (us-east-2)
+ Stati Uniti orientali (Virginia settentrionale) (us-east-1)
+ Stati Uniti occidentali (California settentrionale) (us-west-1)
+ Asia Pacifico (Tokyo) (ap-northeast-1)
+ Europa (Irlanda) (eu-west-1)
+ Europa (Stoccolma) (eu-north-1)

Crea una vista nel catalogo dati. Una vista del catalogo dati è un singolo schema di visualizzazione che funziona con altri motori SQL come Amazon Athena e Amazon EMR. Puoi eseguire query sulla vista utilizzando il motore che preferisci. Per ulteriori informazioni sulle viste del Catalogo dati, consulta [Creazione di viste del Catalogo dati](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

## Sintassi
<a name="r_CREATE_EXTERNAL_VIEW-synopsis"></a>

```
CREATE EXTERNAL VIEW schema_name.view_name [ IF NOT EXISTS ]
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
AS query_definition;
```

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

 *schema\$1name.view\$1name*   
Lo schema allegato al AWS Glue database, seguito dal nome della vista.

PROTECTED  
Specifica che il comando CREATE EXTERNAL VIEW deve essere completato solo se la query all'interno di query\$1definition può essere completata correttamente.

IF NOT EXISTS  
Crea la vista se non esiste già.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
La notazione dello schema da utilizzare per la creazione della vista. È possibile specificare di utilizzare il AWS Glue Data Catalog, un database Glue creato dall'utente o uno schema esterno creato dall'utente. Per ulteriori informazioni, consulta [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).

 *query\$1definition*   
La definizione della query SQL che Amazon Redshift esegue per alterare la vista.

## Esempi
<a name="r_CREATE_EXTERNAL_VIEW-examples"></a>

L'esempio seguente crea una vista del catalogo dati denominata sample\$1schema.glue\$1data\$1catalog\$1view.

```
CREATE EXTERNAL PROTECTED VIEW sample_schema.glue_data_catalog_view IF NOT EXISTS
AS SELECT * FROM sample_database.remote_table "remote-table-name";
```

# CREATE FUNCTION
<a name="r_CREATE_FUNCTION"></a>

Crea una nuova funzione definita dall'utente (UDF) scalare utilizzando una clausola SQL SELECT o un programma Python.

Per maggiori informazioni ed esempi, consulta [Funzioni definite dall’utente in Amazon Redshift](user-defined-functions.md).

## Privilegi richiesti
<a name="r_CREATE_FUNCTION-privileges"></a>

Devi ottenere l’autorizzazione in uno dei seguenti modi per eseguire CREATE OR REPLACE FUNCTION:
+ Per CREATE FUNCTION:
  + L'utente con privilegi avanzati può utilizzare linguaggi attendibili e non attendibili per creare funzioni.
  + Gli utenti con il privilegio CREATE [ OR REPLACE ] FUNCTION possono creare funzioni con linguaggi attendibili.
+ Per REPLACE FUNCTION:
  + Superuser
  + Utenti con il privilegio CREATE [ OR REPLACE ] FUNCTION
  + Proprietario della funzione

## Sintassi
<a name="r_CREATE_FUNCTION-synopsis"></a>

```
CREATE [ OR REPLACE ] FUNCTION f_function_name
( { [py_arg_name  py_arg_data_type |
sql_arg_data_type } [ , ... ] ] )
RETURNS data_type
{ VOLATILE | STABLE | IMMUTABLE }
AS $$
  { python_program | SELECT_clause }
$$ LANGUAGE { plpythonu | sql }
```

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

OR REPLACE  
Specifica che se una funzione con stesso nome e tipi di dati degli argomenti di input o *firma* è già esistente, la funzione esistente viene sostituita. Puoi sostituire una funzione solo con una nuova funzione che definisce un set identico di tipi di dati. Devi essere un utente con privilegi avanzati per sostituire una funzione.  
Se definisci una funzione con lo stesso nome di una funzione esistente ma con una firma diversa, viene creata una nuova funzione. In altre parole, il nome della funzione è sottoposto a overload. Per ulteriori informazioni, consulta [Overload dei nomi delle funzioni](udf-naming-udfs.md#udf-naming-overloading-function-names).

 *f\$1function\$1name*   
Il nome della funzione. Se si specifica un nome schema (come `myschema.myfunction`), la funzione viene creata utilizzando lo schema specificato. Altrimenti, la funzione viene creata nello schema corrente. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).  
Consigliamo di assegnare un prefisso `f_` ai nomi di tutte le funzioni definite dall'utente. Amazon Redshift riserva il prefisso `f_` esclusivamente per le funzioni definite dall'utente e aggiungendo il prefisso `f_` si evita che il nome della funzione entri in conflitto con altri nomi di funzioni SQL predefinite di Amazon Redshift correnti o future. Per ulteriori informazioni, consulta [Prevenzione dei conflitti di denominazione delle funzioni definite dall'utente](udf-naming-udfs.md).  
Puoi definire più di una funzione con lo stesso nome di funzione se i tipi di dati per gli argomenti di input sono diversi. In altre parole, il nome della funzione è sottoposto a overload. Per ulteriori informazioni, consulta [Overload dei nomi delle funzioni](udf-naming-udfs.md#udf-naming-overloading-function-names).

 *py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
Per una UDF Python, un elenco di nomi di argomento di input e i tipi di dati. Per una UDF SQL, un elenco di tipi di dati senza nomi di argomento. In una UDF Python, fai riferimento agli argomenti usando i nomi di argomento. In una UDF SQL, fai riferimento agli argomenti che utilizzano \$1 1, \$1 2 e così via, in base all'ordine degli argomenti nell'elenco degli argomenti.   
Per una UDF SQL, i tipi di dati di input e di restituzione possono essere qualsiasi tipo di dati Amazon Redshift standard. Per una UDF Python, il tipo di dati di input e restituiti può essere SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE PRECISION, BOOLEAN, CHAR, VARCHAR, DATE o TIMESTAMP. Inoltre, le funzioni definite dall'utente in Python (UDFs) supportano un tipo di dati ANYELEMENT. Questo viene automaticamente convertito in un tipo di dati standard basato sul tipo di dati dell'argomento corrispondente fornito in fase di runtime. Se più argomenti utilizzano ANYELEMENT, verranno risolti tutti nello stesso tipo di dati in fase di runtime, in base al primo argomento ANYELEMENT dell'elenco. Per ulteriori informazioni, consultare [Tipi di dati delle funzioni definite dall'utente Python](udf-data-types.md) e [Tipi di dati](c_Supported_data_types.md).  
Puoi specificare un massimo di 32 argomenti.

 RETURNS *data\$1type*   
Il tipo di dati del valore restituito dalla funzione. Il tipo di dati RETURNS può essere qualsiasi tipo di dati standard Amazon Redshift. Inoltre, Python UDFs può utilizzare un tipo di dati ANYELEMENT, che viene automaticamente convertito in un tipo di dati standard in base all'argomento fornito in fase di esecuzione. Se specifichi ANYELEMENT per il tipo di dati di restituzione, almeno un argomento deve utilizzare ANYELEMENT. Il tipo di dati di restituzione effettivo corrisponde al tipo di dati fornito per l'argomento ANYELEMENT quando viene chiamata la funzione. Per ulteriori informazioni, consulta [Tipi di dati delle funzioni definite dall'utente Python](udf-data-types.md).

 VOLATILE \$1 STABLE \$1 IMMUTABLE   
Informa l'ottimizzatore di query circa la volatilità della funzione.   
Ottieni la migliore ottimizzazione se etichetti la funzione con la categoria di volatilità più rigida valida. Tuttavia, se la categoria è troppo rigida, c'è il rischio che l'ottimizzatore salti erroneamente alcune chiamate, determinando un set di risultati errato. In ordine di rigidità, a partire dalla meno rigida, le categorie di volatilità sono le seguenti:  
+ VOLATILE
+ STABLE
+ IMMUTABLE
VOLATILE  
Dati gli stessi argomenti, la funzione può restituire risultati diversi su chiamate successive, anche per le righe in una singola istruzione. L'ottimizzatore di query non può fare alcuna ipotesi sul comportamento di una funzione volatile, quindi una query che utilizza una funzione volatile deve rivalutare la funzione per ogni riga di input.  
STABLE  
Dati gli stessi argomenti, la funzione è garantita per restituire gli stessi risultati per tutte le righe elaborate all'interno di una singola istruzione. La funzione può restituire risultati diversi se richiamati in istruzioni diverse. Questa categoria consente all'ottimizzatore di ottimizzare più chiamate della funzione all'interno di una singola istruzione in un'unica chiamata per l'istruzione.   
IMMUTABLE  
Dati gli stessi argomenti, la funzione restituisce sempre lo stesso risultato, per sempre. Quando una query chiama una funzione `IMMUTABLE` con argomenti costanti, l'ottimizzatore prevaluta la funzione.

AS \$1\$1 *statement* \$1\$1  
 Un costrutto che racchiude l'istruzione da eseguire. Le parole chiavi letterali `AS $$` e `$$` sono obbligatorie.   
Amazon Redshift richiede di racchiudere l'istruzione nella funzione utilizzando un formato chiamato dollar quoting. Qualsiasi elemento all'interno dell'inquadramento viene trasmesso esattamente com'è. Non è necessario impostare il carattere escape per i caratteri speciali, poiché il contenuto della stringa è scritto letteralmente.   
 Con *dollar quoting, *utilizzi una coppia di simboli del dollaro (\$1\$1) per indicare l'inizio e la fine dell'istruzione da eseguire, come mostrato nell'esempio seguente.   

```
$$ my statement $$
```
 Facoltativamente, tra i segni del dollaro in ciascuna coppia, puoi specificare una stringa per aiutare a identificare l'istruzione. La stringa che utilizzi deve essere uguale sia all'inizio che alla fine delle coppie dell'inquadramento. Questa stringa effettua la distinzione tra lettere maiuscole e minuscole e segue gli stessi vincoli di un identificatore senza virgolette, tranne per il fatto che non può contenere segni di dollaro. Gli esempi seguenti utilizzano la stringa `test`.   

```
$test$ my statement $test$
```
Per ulteriori informazioni sul dollar quoting, consultare la sezione relativa alle costanti di stringa racchiuse tra simboli del dollaro nell'argomento relativo alla [struttura lessicale](https://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html) della documentazione di PostgreSQL. 

*python\$1program*   
Programma Python eseguibile valido che restituisce un valore. L'istruzione che passi con la funzione deve essere conforme ai requisiti di indentazione specificati nella [guida di stile per il codice Python](https://www.python.org/dev/peps/pep-0008/#indentation) sul sito Web Python. Per ulteriori informazioni, consulta [Supporto del linguaggio Python per UDFs](udf-python-language-support.md).

*SQL\$1clause*   
Clausola SQL SELECT.  
La clausola SELECT non può includere nessuno dei seguenti tipi di clausole:  
+ FROM
+ INTO
+ WHERE
+ GROUP BY
+ ORDER BY
+ LIMIT

LANGUAGE \$1 plpythonu \$1 sql \$1   
Per Python, specifica `plpythonu`. Per SQL, specifica `sql`. Devi disporre dell'autorizzazione per l'utilizzo nel linguaggio per SQL o plpythonu. Per ulteriori informazioni, consulta [Sicurezza e autorizzazioni delle UDF](udf-security-and-privileges.md).

## Note per l'utilizzo
<a name="r_CREATE_FUNCTION-usage-notes"></a>

### Funzioni nidificate
<a name="r_CREATE_FUNCTION-usage-notes-nested-functions"></a>

Puoi chiamare un'altra funzione definita dall'utente (UDF) SQL da una UDF SQL. La funzione nidificata deve esistere quando si esegue il comando CREATE FUNCTION. Amazon Redshift non tiene traccia delle dipendenze per UDFs, quindi se elimini la funzione annidata, Amazon Redshift non restituisce alcun errore. Tuttavia, l'UDF non riesce se la funzione nidificata non esiste. Ad esempio, la funzione seguente chiama la funzione `f_sql_greater `nella clausola SELECT.

```
create function f_sql_commission (float, float )
  returns float
stable
as $$
  select f_sql_greater ($1, $2)
$$ language sql;
```

### Sicurezza e privilegi dell'UDF
<a name="r_CREATE_FUNCTION-usage-notes-security-and-privileges"></a>

Per creare una UDF devi disporre dell'autorizzazione per l'utilizzo nel linguaggio per SQL o plpythonu (Python). Per impostazione predefinita, USAGE ON LANGUAGE SQL è concesso a PUBLIC. Tuttavia, devi concedere esplicitamente USAGE ON LANGUAGE PLPYTHONU a utenti o gruppi specifici. 

Per revocare l'utilizzo per SQL, revoca innanzitutto l'utilizzo da PUBLIC. Quindi concedi l'utilizzo su SQL solo agli utenti o ai gruppi specifici autorizzati a creare SQL. UDFs L'esempio seguente revoca l'utilizzo su SQL da PUBLIC, quindi concede l'utilizzo al gruppo di utenti `udf_devs`.

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```

Per eseguire una UDF, devi disporre dell'autorizzazione di esecuzione per ciascuna funzione. Per impostazione predefinita, l'autorizzazione di esecuzione per new UDFs viene concessa a PUBLIC. Per limitare l'utilizzo, revocare l'autorizzazione da PUBLIC per la funzione. Quindi concedi il privilegio a specifici individui o gruppi. 

L'esempio seguente revoca l'esecuzione sulla funzione `f_py_greater` da PUBLIC quindi concede l'utilizzo al gruppo di utenti `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;
```

Per impostazione predefinita gli utenti con privilegi avanzati hanno tutti i privilegi. 

Per ulteriori informazioni, consultare [GRANT](r_GRANT.md) e [REVOKE](r_REVOKE.md).

## Esempi
<a name="r_CREATE_FUNCTION-examples"></a>

### Esempio di funzione definita dall'utente Python scalare
<a name="r_CREATE_FUNCTION-python-example"></a>

L'esempio seguente crea una UDF Python che confronta due numeri interi e restituisce il valore più grande.

```
create function f_py_greater (a float, b float)
  returns float
stable
as $$
  if a > b:
    return a
  return b
$$ language plpythonu;
```

L'esempio seguente esegue una query sulla tabella SALES e chiama la nuova funzione `f_py_greater` per restituire il valore di COMMISSION o il 20 percento di PRICEPAID, a seconda di quale valore è più grande.

```
select f_py_greater (commission, pricepaid*0.20) from sales;
```

### Esempio di UDF SQL scalare
<a name="r_CREATE_FUNCTION-sql-example"></a>

L'esempio seguente crea una funzione che confronta due numeri e restituisce il valore più grande. 

```
create function f_sql_greater (float, float)
  returns float
stable
as $$
  select case when $1 > $2 then $1
    else $2
  end
$$ language sql;
```

La query seguente chiama la nuova funzione `f_sql_greater` per eseguire una query sulla tabella SALES e restituisce il valore di COMMISSION o il 20 percento di PRICEPAID, a seconda di quale valore è più grande.

```
select f_sql_greater (commission, pricepaid*0.20) from sales;
```

# CREATE GROUP
<a name="r_CREATE_GROUP"></a>

Definisce un nuovo gruppo di utenti. Solo un utente con privilegi avanzati può creare un gruppo.

## Sintassi
<a name="r_CREATE_GROUP-synopsis"></a>

```
CREATE GROUP group_name
[ [ WITH ] [ USER username ] [, ...] ]
```

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

 *group\$1name*   
Nome del nuovo gruppo di utenti. I nomi di gruppo che iniziano con due caratteri di sottolineatura sono riservati all'uso interno di Amazon Redshift. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

WITH  
Sintassi opzionale per indicare i parametri aggiuntivi di CREATE GROUP.

UTENTE  
Aggiungi uno o più utenti al gruppo.

 *username*   
Nome dell'utente da aggiungere al gruppo.

## Esempi
<a name="r_CREATE_GROUP-examples"></a>

L'esempio seguente crea un gruppo di utenti denominato ADMIN\$1GROUP con due utenti e. ADMIN1 ADMIN2

```
create group admin_group with user admin1, admin2;
```

# CREATE IDENTITY PROVIDER
<a name="r_CREATE_IDENTITY_PROVIDER"></a>

Definisce un nuovo provider di identità. Solo un utente con privilegi avanzati può modificare un provider di identità.

## Sintassi
<a name="r_CREATE_IDENTITY_PROVIDER-synopsis"></a>

```
CREATE IDENTITY PROVIDER identity_provider_name TYPE type_name
NAMESPACE namespace_name
[PARAMETERS parameter_string]
[APPLICATION_ARN arn]
[IAM_ROLE iam_role]
[AUTO_CREATE_ROLES
    [ TRUE [ { INCLUDE | EXCLUDE } GROUPS LIKE filter_pattern] |
      FALSE
    ]
  ];
```

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

 *identity\$1provider\$1name*   
Il nome del nuovo provider di identità. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

*type\$1name*  
Il provider di identità con cui interfacciarsi. Azure e AWSIDC sono attualmente gli unici provider di identità supportati.

*namespace\$1name*  
Lo spazio dei nomi. Si tratta di un identificatore univoco e in formato abbreviato per la directory del provider di identità.

 *parameter\$1string*   
Stringa contenente un oggetto JSON formattato correttamente che contiene i parametri e i valori richiesti per il provider di identità.

 *Guadagnare*   
Il nome della risorsa Amazon (ARN) per un’applicazione gestita da Centro identità IAM. Questo parametro è applicabile solo quando il tipo di provider di identità è. AWSIDC

 *iam\$1role*   
Il ruolo IAM che fornisce le autorizzazioni per effettuare la connessione a Centro identità IAM. Questo parametro è applicabile solo quando il tipo di provider di identità è. AWSIDC

 *auto\$1create\$1roles*   
Attiva o disattiva la funzionalità di creazione automatica del ruolo. Se il valore è TRUE, Amazon Redshift abilita la funzionalità di creazione automatica del ruolo. Se il valore è FALSE, Amazon Redshift disabilita la funzionalità di creazione automatica del ruolo. Se il valore di questo parametro non è specificato, Amazon Redshift determina il valore utilizzando la seguente logica:   
+  Se `AUTO_CREATE_ROLES` viene fornito ma il valore non è specificato, il valore viene impostato su TRUE. 
+  Se `AUTO_CREATE_ROLES` non viene fornito e il provider di identità sì AWSIDC, il valore è impostato su FALSE. 
+  Se `AUTO_CREATE_ROLES` non viene fornito e il provider di identità è Azure, il valore viene impostato su TRUE. 
Per includere i gruppi, specifica `INCLUDE`. L’impostazione predefinita è vuota, il che significa che devi includere tutti i gruppi se `AUTO_CREATE_ROLES` è attivo.  
Per escludere i gruppi, specifica `EXCLUDE`. L’impostazione predefinita è vuota, il che significa che non devi escludere alcun gruppo se `AUTO_CREATE_ROLES` è attivo.

 *filter\$1pattern*   
Un’espressione di caratteri UTF-8 valida con il modello da associare ai nomi dei gruppi. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_CREATE_IDENTITY_PROVIDER.html)
Se il *filter\$1pattern* non contiene metacaratteri, allora il modello rappresenta solo la stringa stessa; in questo caso LIKE agisce come l'operatore di uguaglianza.   
*filter\$1pattern* supporta i seguenti caratteri:  
+  Caratteri alfabetici maiuscoli e minuscoli (A-Z e a-z) 
+  Numeri (0-9) 
+  I seguenti caratteri speciali: 

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

## Esempi
<a name="r_CREATE_IDENTITY_PROVIDER-examples"></a>

Nell'esempio seguente viene creato un provider di identità denominato *oauth\$1standard*, con TYPE *azure*, per stabilire una comunicazione con Microsoft Azure Active Directory (AD).

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

Puoi connettere un’applicazione gestita da Centro identità IAM a un cluster con provisioning o un gruppo di lavoro Amazon Redshift serverless esistente. In questo modo hai la possibilità di gestire l’accesso a un database Redshift tramite Centro identità IAM. A tale scopo esegui un comando SQL come l’esempio seguente. L’utente deve essere un Database Administrator.

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

L’ARN dell’applicazione in questo caso identifica l’applicazione gestita a cui connettersi. Per trovarlo, esegui `SELECT * FROM SVV_IDENTITY_PROVIDERS;`.

Per ulteriori informazioni sull'utilizzo di CREATE IDENTITY PROVIDER, inclusi esempi aggiuntivi, consulta la [Native identity provider (IdP) federation for Amazon Redshift (Federazione di gestori dell'identità digitale nativi (IdP) per Amazon Redshift)](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html). Per ulteriori informazioni sulla configurazione di una connessione a Centro identità IAM di Redshift, consulta [Connessione di Redshift a Centro identità IAM per offrire agli utenti un’esperienza di single sign-on](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html).

# CREATE LIBRARY
<a name="r_CREATE_LIBRARY"></a>

Installa una libreria Python che può essere incorporata dagli utenti per la creazione di una funzione definita dall'utente (UDF) con il comando [CREATE FUNCTION](r_CREATE_FUNCTION.md). La dimensione totale delle librerie installate dall'utente non può superare i 100 MB. 

CREATE LIBRARY non può essere eseguito all'interno di un blocco di transazioni (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

Amazon Redshift supporta Python versione 2.7. Per ulteriori informazioni, consultare [www.python.org](https://www.python.org/).

Per ulteriori informazioni, consulta [Esempio: importazione di moduli di libreria Python personalizzati](udf-importing-custom-python-library-modules.md). 

## Privilegi richiesti
<a name="r_CREATE_LIBRARY-privileges"></a>

Di seguito sono elencati i privilegi richiesti per CREATE LIBRARY:
+ Superuser
+ Utenti con il privilegio CREATE LIBRARY o con il privilegio del linguaggio specificato

## Sintassi
<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::<Account AWS-id>:role/<role-name>’ }
}
```

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

OR REPLACE  
Specifica che se una libreria con lo stesso nome è già esistente, la libreria esistente viene sostituita. REPLACE viene sottoposto immediatamente al commit. Se una UDF che dipende dalla libreria viene eseguita contemporaneamente, l'UDF potrebbe non riuscire o restituire risultati imprevisti, anche se è in esecuzione all'interno di una transazione. Devi essere il proprietario o un utente con privilegi avanzati per sostituire una libreria.

 *library\$1name*   
Il nome della libreria da installare. Non è possibile creare una libreria che contiene un modulo con lo stesso nome di un modulo della libreria standard Python o un modulo Python preinstallato in Amazon Redshift. Se una libreria esistente installata dall'utente utilizza lo stesso pacchetto Python della libreria da installare, è necessario eliminare la libreria esistente prima di installare la nuova libreria. Per ulteriori informazioni, consulta [Supporto del linguaggio Python per UDFs](udf-python-language-support.md).

LANGUAGE plpythonu  
Il linguaggio da usare. Python (plpythonu) è l'unico linguaggio supportato. Amazon Redshift supporta Python versione 2.7. Per ulteriori informazioni, consultare [www.python.org](https://www.python.org/).

FROM  
La posizione del file della libreria. È possibile specificare il nome di un oggetto e di un bucket Amazon S3 oppure è possibile specificare un URL per scaricare il file da un sito Web pubblico. La libreria deve essere compressa sotto forma di file `.zip`. Per ulteriori informazioni, consultare [Creazione e installazione di moduli Python](https://docs.python.org/2/library/distutils.html?highlight=distutils#module-distutils) nella documentazione Python.

 https://*file\$1url*   
L'URL per scaricare il file da un sito Web pubblico. L'URL può contenere fino a tre reindirizzamenti. Di seguito è riportato un esempio di un URL.  

```
'https://www.example.com/pylib.zip'
```

 s3://*bucket\$1name/file\$1name*   
Il percorso per un singolo oggetto Amazon S3 che contiene il file della libreria. Di seguito è illustrato un esempio del percorso di un oggetto Amazon S3.  

```
's3://amzn-s3-demo-bucket/my-pylib.zip'
```
Se si specifica un bucket Amazon S3, è necessario anche fornire le credenziali per un utente AWS che dispone dell'autorizzazione per scaricare il file.   
 Se il bucket Amazon S3 non si trova nella stessa AWS regione del cluster Amazon Redshift, devi utilizzare l'opzione REGION per specificare la AWS regione in cui si trovano i dati. Il valore per *aws\$1region deve corrispondere a una AWS regione* elencata nella tabella nella descrizione del parametro per il comando COPY. [REGION](copy-parameters-data-source-s3.md#copy-region)

*authorization*   
Una clausola che indica il metodo che il cluster utilizza per l'autenticazione e l'autorizzazione ad accedere al bucket Amazon S3 contenente il file della libreria. Il cluster deve avere l'autorizzazione ad accedere ad Amazon S3 con le azioni LIST e GET.  
La sintassi per l'autorizzazione è uguale a quella del comando COPY. Per ulteriori informazioni, consulta [Parametri di autorizzazione](copy-parameters-authorization.md).  

```
IAM_ROLE { default | ‘arn:aws:iam::<Account AWS-id>:role/<role-name>’
```
 Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando CREATE LIBRARY.  
L'Amazon Resource Name (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione. Se specifichi IAM\$1ROLE, non è possibile utilizzare ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN o CREDENTIALS.  
Facoltativamente, se il bucket Amazon S3 utilizza la crittografia lato server, fornisci la chiave di crittografia nella stringa credentials-args. Se usi credenziali di sicurezza temporanee, fornisci il token temporaneo nella stringa *credentials-args*.  
Per ulteriori informazioni, consulta [Credenziali di sicurezza temporanee](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials).

 REGION [AS] *aws\$1region*   
La AWS regione in cui si trova il bucket Amazon S3. REGION è obbligatorio quando il bucket Amazon S3 non si trova nella stessa AWS regione del cluster Amazon Redshift. Il valore per *aws\$1region deve corrispondere a una AWS regione* elencata nella tabella nella descrizione del [REGION](copy-parameters-data-source-s3.md#copy-region) parametro per il comando COPY.  
Per impostazione predefinita, CREATE LIBRARY presuppone che il bucket Amazon S3 si trovi nella AWS stessa regione del cluster Amazon Redshift.

## Esempi
<a name="r_CREATE_LIBRARY-examples"></a>

I seguenti due esempi installano il modulo Python [urlparse](https://docs.python.org/2/library/urlparse.html#module-urlparse) che è compresso in un file denominato `urlparse3-1.0.3.zip`. 

Il seguente comando installa una libreria di funzioni definite dall'utente denominata `f_urlparse` da un pacchetto che è stato caricato in un bucket Amazon S3 che si trova nella regione Stati Uniti orientali.

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

L'esempio seguente installa una libreria denominata `f_urlparse` da un file di libreria su un sito Web.



```
create library f_urlparse
language plpythonu
from 'https://example.com/packages/urlparse3-1.0.3.zip';
```

# CREATE MASKING POLICY
<a name="r_CREATE_MASKING_POLICY"></a>

Crea una nuova policy di mascheramento dinamico dei dati per offuscare i dati di un determinato formato. Per ulteriori informazioni sul mascheramento dinamico dei dati, consulta [Mascheramento dinamico dei dati](t_ddm.md).

Una policy di mascheramento può essere creata da utenti con privilegi avanzati e da utenti o ruoli che dispongono del ruolo sys:secadmin.

## Sintassi
<a name="r_CREATE_MASKING_POLICY-synopsis"></a>

```
CREATE MASKING POLICY 
   { policy_name | database_name.policy_name } [IF NOT EXISTS]
   WITH (input_columns)
   USING (masking_expression);
```

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

 *nome\$1policy*   
Nome della policy di mascheramento. La policy di mascheramento non può avere lo stesso nome di un'altra policy di mascheramento già esistente nel database.

database\$1name  
Il nome del database in cui verrà creata la policy. La policy può essere creata sul database connesso o su Amazon Redshift Federated Permissions Catalog.

*input\$1columns*   
Una tupla di nomi di colonne nel formato (col1 type, col2 type...).  
I nomi delle colonne vengono utilizzati come input per l'espressione di mascheramento. I nomi delle colonne non devono necessariamente corrispondere ai nomi delle colonne mascherate, ma i tipi di dati di input e di output devono corrispondere.

*masking\$1expression*  
Espressione SQL utilizzata per trasformare le colonne di destinazione. Può essere scritta utilizzando funzioni di manipolazione dei dati, come le funzioni di manipolazione delle stringhe, o in combinazione con funzioni definite dall'utente scritte in SQL, Python o con AWS Lambda. È possibile includere una tupla di espressioni di colonna per mascherare le policy con più output. Se si utilizza una costante come espressione di mascheramento, è necessario convertirla in modo esplicito su un tipo che corrisponda al tipo di input.  
 È necessario disporre dell'autorizzazione USAGE per tutte le funzioni definite dall'utente utilizzate nell'espressione di mascheramento. 

Per l'utilizzo di CREATE MASKING POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# CREATE MATERIALIZED VIEW
<a name="materialized-view-create-sql-command"></a>

Crea una vista materializzata basata su una o più tabelle Amazon Redshift. Le viste materializzate possono basarsi anche su tabelle esterne create utilizzando Spectrum o una query federata. Per informazioni su Spectrum, vedere [Amazon Redshift Spectrum](c-using-spectrum.md). Per informazioni sulla query federata, vedere [Esecuzione di query su dati con query federate in Amazon Redshift](federated-overview.md).

## Sintassi
<a name="mv_CREATE_MATERIALIZED_VIEW-synopsis"></a>

```
CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query
```

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

BACKUP  
Una clausola che specifica se la vista materializzata deve essere inclusa negli snapshot di cluster automatizzati e manuali.   
Per le viste materializzate che non contengono dati critici, specifica BACKUP NO per risparmiare tempo di elaborazione durante la creazione di snapshot e il ripristino da snapshot e per ridurre lo spazio di archiviazione in Amazon Simple Storage Service. L’impostazione BACKUP NO non ha alcun effetto sulla replica automatica dei dati in altri nodi all’interno del cluster. Pertanto le viste materializzate con BACKUP NO specificato vengono ripristinate in caso di errore del nodo. L'impostazione predefinita è BACKUP YES.

 *table\$1attributes*   
Una clausola che specifica come vengono distribuiti i dati nella vista materializzata, inclusi i seguenti:  
+  Lo stile della distribuzione della vista materializzata, nel formato `DISTSTYLE { EVEN | ALL | KEY }`. Omettendo questa clausola, la modalità di distribuzione è impostata su `EVEN`. Per ulteriori informazioni, consulta [Stili di distribuzione](c_choosing_dist_sort.md).
+ La chiave di distribuzione per la vista materializzata, nel formato `DISTKEY ( distkey_identifier )`. Per ulteriori informazioni, consulta [Indicazione degli stili di distribuzione](t_designating_distribution_styles.md).
+ La chiave di ordinamento per la vista materializzata, nel formato `SORTKEY ( column_name [, ...] )`. Per ulteriori informazioni, consulta [Chiavi di ordinamento](t_Sorting_data.md).

AS *query*  
Una istruzione `SELECT` valida che definisce la vista materializzata e il suo contenuto. Il set di risultati della query definisce le colonne e le righe della vista materializzata. Per informazioni sulle limitazioni durante la creazione di viste materializzate , consultare [Limitazioni](#mv_CREATE_MATERIALIZED_VIEW-limitations).  
Inoltre, specifici costrutti del linguaggio SQL utilizzati nella query determinano se la vista materializzata può essere aggiornata in modo incrementale o completo. Per informazioni sul metodo di aggiornamento, consultare [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md). Per informazioni sulle limitazioni per l'aggiornamento incrementale, consultare [Limitazioni per l'aggiornamento incrementale](materialized-view-refresh-sql-command.md#mv_REFRESH_MARTERIALIZED_VIEW_limitations).  
Se la query contiene un comando SQL che non supporta l'aggiornamento incrementale, Amazon Redshift visualizza un messaggio che indica che la vista materializzata utilizzerà un aggiornamento completo. Il messaggio può essere visualizzato o meno a seconda dell'applicazione client SQL. Controllare la `state` colonna [STV\$1MV\$1INFO](r_STV_MV_INFO.md) per visualizzare il tipo di aggiornamento utilizzato da una vista materializzata.

AUTO REFRESH  
Una clausola che definisce se la vista materializzata deve essere aggiornata automaticamente con le ultime modifiche apportate dalle tabelle di base. Il valore predefinito è `NO`. Per ulteriori informazioni, consulta [Aggiornamento di una vista materializzata](materialized-view-refresh.md).

## Note per l’utilizzo
<a name="mv_CREATE_MARTERIALIZED_VIEW_usage"></a>

Per creare una vista materializzata, è necessario disporre dei seguenti privilegi:
+ Privilegi CREATE per uno schema.
+ Privilegio SELECT a livello di tabella o colonna nelle tabelle di base per creare una vista materializzata. Se si dispone di privilegi a livello di colonna su colonne specifiche, è possibile creare una vista materializzata solo su tali colonne.

 Puoi creare una vista materializzata da un cluster di condivisione dati remoto fornendo il nome del database esterno al. `mv_name` 

## Aggiornamento incrementale per le viste materializzate in un’unità di condivisione dati
<a name="mv_CREATE_MARTERIALIZED_VIEW_datashare"></a>

 Amazon Redshift supporta l’aggiornamento automatico e incrementale per le viste materializzate in un’unità di condivisione dati del consumer quando le tabelle di base sono condivise. L’aggiornamento incrementale è un’operazione in cui Amazon Redshift identifica le modifiche nella tabella o nelle tabelle di base avvenute dopo l’aggiornamento precedente e aggiorna solo i record corrispondenti nella vista materializzata. Questa operazione viene eseguita più rapidamente di un aggiornamento completo e migliora le prestazioni dei carichi di lavoro. Non devi modificare la definizione della vista materializzata per sfruttare l’aggiornamento incrementale. 

Esistono alcune limitazioni per sfruttare l’aggiornamento incrementale con una vista materializzata: 
+ La vista materializzata deve fare riferimento a un solo database, locale o remoto. 
+ L’aggiornamento incrementale è disponibile solo per le nuove viste materializzate. Pertanto devi rimuovere le viste materializzate esistenti e ricrearle per eseguire un aggiornamento incrementale.

Per ulteriori informazioni sulla creazione di viste materializzate in un’unità di condivisione dati, consulta [Utilizzo delle viste nella condivisione dei dati Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/datashare-views), che contiene diversi esempi di query.

## Aggiornamenti DDL a viste materializzate o tabelle di base
<a name="materialized-view-ddl"></a>

Quando si utilizzano viste materializzate in Amazon Redshift, seguire queste note di utilizzo per gli aggiornamenti DDL (Data Definition Language) alle viste materializzate o alle tabelle di base.
+ È possibile aggiungere colonne a una tabella di base senza conseguenze sulle viste materializzate che fanno riferimento a tale tabella di base.
+ Alcune operazioni possono lasciare la vista materializzata in uno stato in cui non può essere assolutamente aggiornata. Esempi sono le operazioni come la ridenominazione o eliminazione di una colonna, la modifica del tipo di una colonna e la modifica del nome di uno schema. Talli viste materializzate possono essere oggetto di query ma non possono essere aggiornate. In tali casi è necessario eliminare e ricreare la vista materializzata 
+ In generale, non è possibile modificare la definizione di una vista materializzata (la sua istruzione SQL).
+ Non è possibile rinominare una vista materializzata. 

## Limitazioni
<a name="mv_CREATE_MATERIALIZED_VIEW-limitations"></a>

Non è possibile definire una vista materializzata che fa riferimento a uno dei seguenti elementi:
+ Viste standard o tabelle e viste di sistema.
+ Tabelle temporanee.
+ Funzioni definite dall'utente
+ La clausola ORDER BY, LIMIT od OFFSET.
+ Riferimenti con associazione tardiva alle tabelle di base. In altre parole, tutte le tabelle di base e le relative colonne referenziate nella query SQL di definizione della vista materializzata devono esistere ed essere valide. 
+ Funzioni applicabili al solo nodo principale: CURRENT\$1SCHEMA, CURRENT\$1SCHEMAS, HAS\$1DATABASE\$1PRIVILEGE, HAS\$1SCHEMA\$1PRIVILEGE, HAS\$1TABLE\$1PRIVILEGE.
+ Non è possibile utilizzare l'opzione AUTO REFRESH YES quando la definizione della vista materializzata include funzioni mutabili o schemi esterni. Non è inoltre possibile utilizzarla quando si definisce una vista materializzata in un'altra vista materializzata.
+ Non è necessario eseguire manualmente [ANALYZE](r_ANALYZE.md) su viste materializzate. Attualmente ciò avviene solo tramite AUTO ANALYZE. Per ulteriori informazioni, consulta [Analisi delle tabelle](t_Analyzing_tables.md).
+ Tabelle protette da RLS o DDM. 
+ La creazione di viste materializzate da cluster di condivisione dati remoti non supporta riferimenti su altre viste materializzate, tabelle Spectrum, tabelle definite in un cluster Redshift diverso e. UDFs Queste sono supportate per la creazione di viste materializzate dal cluster locale (produttore). 

## Esempi
<a name="mv_CREATE_MARTERIALIZED_VIEW_examples"></a>

Nell'esempio seguente viene creata una vista materializzata da tre tabelle di base che vengono unite e aggregate. Ogni riga rappresenta una categoria con il numero di biglietti venduti. Quando si esegue una query sulla visualizzazione materializzata tickets\$1mv, si accede direttamente ai dati precalcolati nella vista materializzata tickets\$1mv.

```
CREATE MATERIALIZED VIEW tickets_mv AS
    select   catgroup,
    sum(qtysold) as sold
    from     category c, event e, sales s
    where    c.catid = e.catid
    and      e.eventid = s.eventid
    group by catgroup;
```

Nell'esempio seguente viene creata una vista materializzata simile all'esempio precedente e viene utilizzata la funzione di aggregazione 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;
```

Nell'esempio seguente viene utilizza una clausola UNION ALL per eseguire il join della tabella `public_sales` di Amazon Redshift e della tabella `spectrum.sales` di Redshift Spectrum per creare una vista materiale `mv_sales_vw`. Per informazioni sul comando CREATE EXTERNAL TABLE per Amazon Redshift Spectrum, consultare [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). La tabella esterna Redshift Spectrum fa riferimento ai dati su 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
```

Nell'esempio seguente viene creata una vista materializzata `mv_fq` basata su una tabella esterna di query federata. Per informazioni sulla query federata, vedere [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)
```

Nell'esempio seguente viene illustrata la definizione di una vista materializzata.

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

 L'esempio seguente mostra come impostare AUTO REFRESH nella definizione della vista materializzata e specificare DISTSTYLE. Innanzitutto, crea una semplice tabella di base. 

```
CREATE TABLE baseball_table (ball int, bat int);
```

Quindi crea una vista materializzata.

```
CREATE MATERIALIZED VIEW mv_baseball DISTSTYLE ALL AUTO REFRESH YES AS SELECT ball AS baseball FROM baseball_table;
```

Ora puoi eseguire una query sulla vista materializzata mv\$1baseball. Per verificare se l'opzione AUTO REFRESH è attivata per una vista materializzata, consulta [STV\$1MV\$1INFO](r_STV_MV_INFO.md).

L'esempio seguente crea una vista materializzata che fa riferimento a una tabella di origine in un altro database. Si presuppone che il database contenente la tabella di origine, database\$1A, si trovi nello stesso cluster o gruppo di lavoro della vista materializzata, creata in database\$1B. (È possibile sostituire i propri database per l'esempio.) Innanzitutto, crea una tabella in database\$1A denominata *cities* con una colonna *cityname*. Imposta il tipo di dati della colonna come VARCHAR. Dopo aver creato la tabella di origine, esegui il seguente comando in database\$1B per creare una vista materializzata la cui origine è la tabella *cities*. Assicurati di specificare il database e lo schema della tabella di origine nella clausola FROM:

```
CREATE MATERIALIZED VIEW cities_mv AS
SELECT  cityname
FROM    database_A.public.cities;
```

Esegui query nella vista materializzata che hai creato. La query recupera i record la cui origine è la tabella *cities* nel database\$1A:

```
select * from cities_mv;
```

Quando esegui l'istruzione SELECT, *cities\$1mv* restituisce i record. I record vengono aggiornati dalla tabella di origine solo quando viene eseguita un'istruzione REFRESH. Inoltre, tieni presente che non puoi aggiornare i record direttamente nella vista materializzata. Per informazioni sull'aggiornamento dei dati in una vista materializzata, consulta [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md).

Per informazioni dettagliate sulla panoramica della vista materializzata e sui comandi SQL utilizzati per aggiornare e rilasciare le visualizzazioni materializzate, vedere i seguenti argomenti:
+ [Viste materializzate in 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**
+ [Prerequisiti](#r_create_model_prereqs)
+ [Privilegi richiesti](#r_simple_create_model-privileges)
+ [Controllo dei costi](#r_create_model_cost)
+ [CREATE MODEL completo](#r_full_create_model)
+ [Parameters](#r_create_model_parameters)
+ [Note per l'utilizzo](r_create_model_usage_notes.md)
+ [Casi d’uso](r_create_model_use_cases.md)

## Prerequisiti
<a name="r_create_model_prereqs"></a>

Prima di utilizzare l'istruzione CREATE MODEL, completare i prerequisiti descritti in [Configurazione del cluster per l'utilizzo di Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup). Di seguito è riportato un riepilogo approfondito dei prerequisiti.
+ Crea un cluster Amazon Redshift con la console di AWS gestione o l'interfaccia a riga di AWS comando (CLI AWS ).
+ Allega la policy AWS Identity and Access Management (IAM) durante la creazione del cluster.
+ Per consentire ad Amazon Redshift e all' SageMaker intelligenza artificiale di assumere il ruolo di interagire con altri servizi, aggiungi la policy di fiducia appropriata al ruolo IAM.

Per maggiori dettagli sul ruolo IAM, sulla policy di attendibilità e su altri prerequisiti, consultare [Configurazione del cluster per l'utilizzo di Amazon Redshift ML](getting-started-machine-learning.md#cluster-setup).

Di seguito, è possibile trovare diversi casi d'uso per l'istruzione CREATE MODEL.
+ [CREATE MODEL semplice](r_create_model_use_cases.md#r_simple_create_model)
+ [CREATE MODEL con guida per l'utente](r_create_model_use_cases.md#r_user_guidance_create_model)
+ [CREA XGBoost modelli con AUTO OFF](r_create_model_use_cases.md#r_auto_off_create_model)
+ [Bring your own model (BYOM) - inferenza locale](r_create_model_use_cases.md#r_byom_create_model)
+ [Bring your own model (BYOM) - inferenza remota](r_create_model_use_cases.md#r_byom_create_model_remote)
+ [CREA MODELLO con K-MEANS](r_create_model_use_cases.md#r_k-means_create_model)
+ [CREATE MODEL completo](#r_full_create_model)

## Privilegi richiesti
<a name="r_simple_create_model-privileges"></a>

Di seguito sono riportati i privilegi richiesti per CREATE MODEL:
+ Superuser
+ Utenti con il privilegio CREATE MODEL
+ Ruoli con il privilegio GRANT CREATE MODEL

## Controllo dei costi
<a name="r_create_model_cost"></a>

 Amazon Redshift ML utilizza le risorse cluster esistenti per creare modelli di previsione, quindi non sono previsti costi aggiuntivi. Tuttavia, si potrebbero avere costi aggiuntivi se si deve ridimensionare il cluster o se si desidera addestrare i propri modelli. Amazon Redshift ML utilizza Amazon SageMaker AI per addestrare i modelli, il che comporta un costo aggiuntivo associato. Esistono modi per controllare i costi aggiuntivi, come la limitazione della quantità massima di tempo che l'addestramento può richiedere o limitando il numero di esempi di addestramento utilizzati per addestrare il modello. Per ulteriori informazioni consulta [Costi per l'utilizzo di Amazon Redshift ML](https://docs.aws.amazon.com/redshift/latest/dg/cost.html). 

## CREATE MODEL completo
<a name="r_full_create_model"></a>

Di seguito viene riportato un riepilogo delle opzioni di base della sintassi di CREATE MODEL.

### Sintassi completa di CREATE MODEL
<a name="r_auto_off-create-model-synposis"></a>

Di seguito è riportata la sintassi completa dell'istruzione CREATE MODEL.

**Importante**  
Quando si crea un modello utilizzando l'istruzione CREATE MODEL, seguire l'ordine delle parole chiave nella sintassi seguente.

```
CREATE MODEL model_name
FROM { table_name | ( select_statement )  | 'job_name' }
[ TARGET column_name ]
FUNCTION function_name [ ( data_type [, ...] ) ] 
[ RETURNS data_type ] 
  -- supported only for BYOM
[ SAGEMAKER 'endpoint_name'[:'model_name']] 
  -- supported only for BYOM remote inference
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
[ AUTO ON / OFF ]
  -- default is AUTO ON
[ MODEL_TYPE { XGBOOST | MLP | LINEAR_LEARNER | KMEANS | FORECAST } ]
  -- not required for non AUTO OFF case, default is the list of all supported types
  -- required for AUTO OFF
[ PROBLEM_TYPE ( REGRESSION | BINARY_CLASSIFICATION | MULTICLASS_CLASSIFICATION ) ]
  -- not supported when AUTO OFF
[ OBJECTIVE ( 'MSE' | 'Accuracy' | 'F1' | 'F1_Macro' | 'AUC' |
             'reg:squarederror' | 'reg:squaredlogerror'| 'reg:logistic'|
             'reg:pseudohubererror' | 'reg:tweedie' | 'binary:logistic' | 'binary:hinge',
             'multi:softmax' | 'RMSE' | 'WAPE' | 'MAPE' | 'MASE' | 'AverageWeightedQuantileLoss' ) ]
  -- for AUTO ON: first 5 are valid
  -- for AUTO OFF: 6-13 are valid
  -- for FORECAST: 14-18 are valid
[ PREPROCESSORS 'string' ]
  -- required for AUTO OFF, when it has to be 'none'
  -- optional for AUTO ON
[ HYPERPARAMETERS { DEFAULT | DEFAULT EXCEPT ( Key 'value' (,...) ) } ]
  -- support XGBoost hyperparameters, except OBJECTIVE
  -- required and only allowed for AUTO OFF
  -- default NUM_ROUND is 100
  -- NUM_CLASS is required if objective is multi:softmax (only possible for AUTO OFF)
 [ SETTINGS (
   S3_BUCKET 'amzn-s3-demo-bucket',  |
    -- required
  TAGS 'string', |
    -- optional
  KMS_KEY_ID 'kms_string', |
    -- optional
  S3_GARBAGE_COLLECT on / off, |
    -- optional, defualt is on.
  MAX_CELLS integer, |
    -- optional, default is 1,000,000
  MAX_RUNTIME integer (, ...) |
    -- optional, default is 5400 (1.5 hours)
  HORIZON integer, |
    -- required if creating a forecast model
  FREQUENCY integer, |
    -- required if creating a forecast model
  PERCENTILES string, |
    -- optional if creating a forecast model
  MAX_BATCH_ROWS integer -- optional for BYOM remote inference
    ) ]
```

## Parameters
<a name="r_create_model_parameters"></a>

model\$1name  
Il nome del modello. Il nome del modello in uno schema deve essere unico.

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1 *'job\$1name'*\$1  
Il nome\$1tabella o la query che specifica i dati di addestramento. Possono essere una tabella esistente nel sistema o una query SELECT compatibile con Amazon Redshift racchiusa tra parentesi, ovvero (). Il risultato della query deve contenere almeno due colonne. 

TARGET *nome\$1colonna*  
Il nome della colonna che diventa la destinazione della previsione. La colonna deve esistere nella clausola FROM. 

FUNCTION *nome\$1funzione* ( *tipo\$1dati* [, ...] )  
Il nome della funzione da creare e i tipi di dati degli argomenti di input. Puoi fornire il nome di uno schema nel database invece del nome di una funzione.

RETURNS *data\$1type*  
Il tipo di dati della funzione del modello da restituire. Il tipo di dati `SUPER` restituito è applicabile solo a BYOM con inferenza remota.

SAGEMAKER *'nome\$1endpoint'*[:*'nome\$1modello'*]  
Il nome dell'endpoint Amazon SageMaker AI. Se il nome dell'endpoint punta a un endpoint multimodello, aggiungere il nome del modello da utilizzare. L'endpoint deve essere ospitato nello Regione AWS stesso cluster Amazon Redshift.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando CREATE MODEL. In alternativa, è possibile specificare un ARN di un ruolo IAM per utilizzare quel ruolo.

[ AUTO ON / OFF ]  
 Attiva o disattiva il rilevamento automatico CREATE MODEL della selezione di preprocessore, algoritmo e iperparametri. Specificare on quando si crea un modello Forecast indica di utilizzare un AutoPredictor, in cui Amazon Forecast applica le combinazioni ottimali di algoritmi a ogni serie temporale del set di dati. 

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1 KMEANS \$1 FORECAST \$1*   
(Facoltativo) Specifica il tipo di modello. Puoi specificare se desideri addestrare un modello di un tipo specifico, come Multilayer Perceptron (MLP) XGBoost, KMEANS o Linear Learner, che sono tutti algoritmi supportati da Amazon AI Autopilot. SageMaker Se non si specifica il parametro, durante l'addestramento vengono ricercati tutti i tipi di modello supportati per trovare il modello migliore. Puoi anche creare un modello di previsione in Redshift ML per creare previsioni accurate di serie temporali.

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(Facoltativo) Specifica il tipo di problema. Se si conosce il tipo di problema, è possibile limitare Amazon Redshift alla ricerca solo del modello migliore di quel tipo di modello specifico. Se non si specifica questo parametro, durante l'addestramento viene rilevato un tipo di problema in base ai dati.

OBIETTIVO ('MSE' \$1 'Precisione' \$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 'MASS' \$1 '') AverageWeightedQuantileLoss  
(Facoltativo) Specifica il nome del parametro dell'obiettivo utilizzato per misurare la qualità predittiva di un sistema di machine learning. Questo parametro è ottimizzato durante l'addestramento per fornire la migliore stima per i valori dei parametri del modello dai dati. Se non si specifica esplicitamente un parametro, il comportamento di default consiste nell'utilizzare automaticamente MSE: per la regressione, F1: per la classificazione binaria, Accuracy: per la classificazione multiclass. Per ulteriori informazioni sugli obiettivi, consulta [Auto MLJob Objective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) nei [parametri delle attività di *riferimento dell'API Amazon SageMaker AI* e Learning nella documentazione](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters) di XGBOOST. I valori RMSE, WAPE, MAPE, MASE e sono applicabili AverageWeightedQuantileLoss solo ai modelli Forecast. Per ulteriori informazioni, consulta l'operazione API [CreateAutoPredictor](https://docs.aws.amazon.com/forecast/latest/dg/API_CreateAutoPredictor.html#forecast-CreateAutoPredictor-request-OptimizationMetric).

 *PREPROCESSORS 'string' *   
(Facoltativo) Specifica alcune combinazioni di preprocessori per determinati set di colonne. Il formato è un elenco di columnSets e le trasformazioni appropriate da applicare a ciascun set di colonne. Amazon Redshift applica tutti i trasformatori di uno specifico elenco di trasformatori a tutte le colonne dell'elenco corrispondente. ColumnSet Ad esempio, per applicare OneHotEncoder con Imputer alle colonne t1 e t2, usa il comando di esempio seguente.  

```
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  
Speciifica se i XGBoost parametri predefiniti vengono utilizzati o sostituiti dai valori specificati dall'utente. I valori devono essere racchiusi tra virgolette singole. Di seguito sono riportati alcuni esempi di parametri e relativi valori predefiniti. XGBoost       
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/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 )  
La clausola S3\$1BUCKET specifica la posizione Amazon S3 utilizzata per archiviare i risultati intermedi.  
(Facoltativo) Il parametro TAGS è un elenco separato da virgole di coppie chiave-valore che puoi utilizzare per etichettare le risorse create in Amazon AI SageMaker e Amazon Forecast. I tag consentono di organizzare le risorse e allocare i costi. I valori nella coppia sono opzionali, quindi puoi creare tag utilizzando il formato `key=value` o semplicemente creando una chiave. Per ulteriori informazioni sui tag in Amazon Redshift, consulta [Panoramica dei tag](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-tagging.html).  
(Facoltativo) KMS\$1KEY\$1ID specifica se Amazon Redshift utilizza la crittografia lato server con una chiave per proteggere i dati inattivi. AWS KMS I dati in transito sono protetti con Secure Sockets Layer (SSL).   
(Facoltativo) S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1 specifica se Amazon Redshift esegue la rimozione di oggetti inutili (garbage collection) sui set di dati risultanti utilizzati per addestrare i modelli e i modelli stessi. Se impostato su OFF, i set di dati risultanti utilizzati per addestrare i modelli e i modelli stessi rimangono in Amazon S3 e possono essere utilizzati per altri scopi. Se impostato su ON, Amazon Redshift elimina gli artefatti in Amazon S3 al termine dell'addestramento. Il valore di default è ON.  
(Facoltativo) MAX\$1CELLS specifica il numero di celle nei dati di addestramento. Questo valore è il prodotto del numero di record (nella query di addestramento o nella tabella) moltiplicato per il numero di colonne. Il valore di default è 1.000.000.  
(Facoltativo) MAX\$1RUNTIME specifica la durata massima dell'addestramento. I processi di addestramento spesso vengono completati prima di questo valore, a seconda delle dimensioni del set di dati. Specifica la durata massima dell'addestramento. Il valore di default è 5.400 (90 minuti).  
HORIZON specifica il numero massimo di previsioni che il modello di previsione può restituire. Una volta addestrato il modello, non è possibile modificare questo numero intero. Questo parametro è obbligatorio se si addestra un modello di previsione.  
FREQUENCY specifica la granularità delle unità di tempo desiderate per le previsioni. Le opzioni disponibili sono `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`. Questo parametro è obbligatorio se si addestra un modello di previsione.  
(Facoltativo) PERCENTILES è una stringa delimitata da virgole che specifica i tipi di previsione utilizzati per addestrare un predittore. I tipi di previsione possono essere quantili da 0,01 a 0,99, con incrementi di 0,01 o superiori. Puoi anche specificare la previsione media con la media. È possibile specificare un massimo di cinque tipi di previsione.

 MAX\$1BATCH\$1ROWS *integer*   
(Facoltativo) Il numero massimo di righe che Amazon Redshift invia in una singola richiesta batch per una singola chiamata SageMaker AI. È supportato solo per BYOM con inferenza remota. Il valore minimo per questo parametro è 1. Il valore massimo è `INT_MAX` o 2.147.483.647. Questo parametro è obbligatorio solo quando sia i tipi di dati di input che quelli restituiti sono *SUPER*. Il valore predefinito è `INT_MAX` o 2.147.483.647. 

# Note per l'utilizzo
<a name="r_create_model_usage_notes"></a>

Durante l'utilizzo di CREATE MODEL, considerare quanto segue:
+ L'istruzione CREATE MODEL opera in modalità asincrona e restituisce i risultati al momento dell'esportazione dei dati di addestramento in Amazon S3. Le fasi rimanenti della formazione in Amazon SageMaker AI avvengono in background. Mentre l'addestramento è in corso, la funzione di inferenza corrispondente è visibile ma non può essere eseguita. È possibile eseguire query su [STV\$1ML\$1MODEL\$1INFO](r_STV_ML_MODEL_INFO.md) per visualizzare lo stato dell'addestramento. 
+ L'addestramento può durare fino a 90 minuti in background, per impostazione predefinita nel modello Auto e può essere esteso. Per annullare l'addestramento, è sufficiente eseguire il comando [DROP MODEL](r_DROP_MODEL.md).
+ Il cluster Amazon Redshift che si utilizza per creare il modello e il bucket Amazon S3 utilizzato per mettere in scena i dati di addestramento e gli artefatti del modello devono trovarsi nella stessa regione AWS .
+ Durante la formazione del modello, Amazon Redshift e SageMaker AI archiviano artefatti intermedi nel bucket Amazon S3 che fornisci. Per impostazione predefinita, Amazon Redshift esegue la garbage collection alla fine dell'operazione CREATE MODEL. Amazon Redshift rimuove gli oggetti da Amazon S3. Per conservare questi artefatti in Amazon S3, impostare l'opzione S3\$1GARBAGE COLLECT OFF.
+ È necessario utilizzare almeno 500 righe nei dati di addestramento forniti nella clausola FROM.
+ Quando si utilizza l'istruzione CREATE MODEL, è possibile specificare fino a 256 colonne di funzionalità (input) nella clausola FROM \$1 table\$1name \$1 (select\$1query) \$1.
+ Per AUTO ON, i tipi di colonna che è possibile utilizzare come set di addestramento sono SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE, BOOLEAN, CHAR, VARCHAR, DATE, TIME, TIMETZ, TIMESTAMP e TIMESTAMPTZ. Per AUTO OFF, i tipi di colonna che è possibile utilizzare come set di addestramento sono SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, DOUBLE e BOOLEAN.
+ Non è possibile utilizzare DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, GEOMETRY, GEOGRAPHY HLLSKETCH, SUPER o VARBYTE come tipo di colonna di destinazione.
+ Per migliorare la precisione del modello, procedere in uno dei seguenti modi:
  + Aggiungere il maggior numero possibile di colonne rilevanti nel comando CREATE MODEL quando si specificano i dati di addestramento nella clausola FROM.
  + Utilizzare un valore maggiore per MAX\$1RUNTIVE e MAX\$1CELLS. Valori maggiori per questo parametro aumentano il costo di addestramento di un modello.
+ L'esecuzione dell'istruzione CREATE MODEL viene restituita non appena i dati di addestramento vengono calcolati ed esportati nel bucket Amazon S3. Dopo questo punto, è possibile controllare lo stato dell'addestramento utilizzando il comando SHOW MODEL. Quando un modello addestrato in background non riesce, è possibile controllare l'errore utilizzando SHOW MODEL. Non è possibile riprovare un modello non riuscito. Utilizzare DROP MODEL per rimuovere un modello non riuscito e crearne uno nuovo. Per ulteriori informazioni su SHOW MODEL, consultare [SHOW MODEL](r_SHOW_MODEL.md).
+ Il BYOM locale supporta lo stesso tipo di modelli supportati da Amazon Redshift ML per i casi non BYOM. Amazon Redshift supporta modelli semplici XGBoost (utilizzando la XGBoost versione 1.0 o successiva), KMEANS senza preprocessori e modelli XGBOOST/MLP/Linear Learner addestrati da Amazon AI Autopilot. SageMaker Supporta quest'ultimo con preprocessori specificati da Autopilot che sono supportati anche da Amazon AI Neo. SageMaker 
+ Se il tuo cluster Amazon Redshift ha un routing avanzato abilitato per il tuo cloud privato virtuale (VPC), assicurati di creare un endpoint VPC Amazon S3 e un endpoint VPC AI SageMaker per il VPC in cui si trova il cluster. Ciò fa sì che il traffico possa essere eseguito attraverso il VPC tra i servizi durante CREATE MODEL. Per ulteriori informazioni, consulta [SageMaker AI Clarify Job Amazon VPC, sottoreti](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-vpc.html#clarify-vpc-job) e gruppi di sicurezza.

# Casi d’uso
<a name="r_create_model_use_cases"></a>

I seguenti casi d'uso dimostrano come utilizzare CREATE MODEL in base alle proprie esigenze.

## CREATE MODEL semplice
<a name="r_simple_create_model"></a>

Di seguito viene riportato un riepilogo delle opzioni di base della sintassi di CREATE MODEL.

### Sintassi di CREATE MODEL semplice
<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 ]
)
```

### Parametri di CREATE MODEL semplice
<a name="r_simple-create-model-parameters"></a>

 *model\$1name*   
Il nome del modello. Il nome del modello in uno schema deve essere unico.

FROM \$1 *nome\$1tabella* \$1 ( *query\$1select* ) \$1  
Il nome\$1tabella o la query che specifica i dati di addestramento. Possono essere una tabella esistente nel sistema o una query SELECT compatibile con Amazon Redshift racchiusa tra parentesi, ovvero (). Il risultato della query deve contenere almeno due colonne. 

TARGET *nome\$1colonna*  
Il nome della colonna che diventa la destinazione della previsione. La colonna deve esistere nella clausola FROM. 

FUNCTION *nome\$1funzione\$1previsione*   
Un valore che specifica il nome della funzione di machine learning di Amazon Redshift che deve essere generata da CREATE MODEL e utilizzata per effettuare previsioni utilizzando questo modello. La funzione viene creata nello stesso schema dell'oggetto modello e può essere sovraccaricata.  
L'apprendimento automatico di Amazon Redshift supporta modelli come i modelli Xtreme Gradient Boosted tree () XGBoost per la regressione e la classificazione.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1  
 Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando CREAT MODEL. In alternativa, è possibile specificare l'ARN di un ruolo IAM per utilizzare quel ruolo.

 *S3\$1BUCKET *'amzn-s3-demo-bucket'**   
Il nome del bucket Amazon S3 creato in precedenza è stato utilizzato per condividere dati e artefatti di addestramento tra Amazon Redshift e AI. SageMaker Amazon Redshift crea una sottocartella in questo bucket prima di scaricare i dati di addestramento. Una volta completato l'addestramento, Amazon Redshift elimina la sottocartella creata e il relativo contenuto. 

MAX\$1CELLS integer   
Il numero massimo di celle da esportare dalla clausola FROM. Il valore di default è 1.000.000.   
Il numero di celle è il prodotto del numero di righe nei dati di addestramento (prodotti dalla tabella o dalla query della clausola FROM) moltiplicato per il numero di colonne. Se il numero di celle nei dati di addestramento è superiore a quello specificato dal parametro max\$1cells, CREATE MODEL sottocampiona i dati di addestramento della clausola FROM per ridurre le dimensioni del set di addestramento sotto MAX\$1CELLS. Consentire set di dati di addestramento più grandi può produrre una maggiore precisione, ma può anche significare che il modello richiede più tempo e costa di più.  
Per ulteriori informazioni sui costi di utilizzo di Amazon Redshift, consultare [Costi per l'utilizzo di Amazon Redshift ML](cost.md).  
Per ulteriori informazioni sui costi associati a vari numeri di cellulare e i dettagli della versione di prova gratuita, consultare [Prezzi di Amazon Redshift](https://aws.amazon.com/redshift/pricing).

## CREATE MODEL con guida per l'utente
<a name="r_user_guidance_create_model"></a>

Di seguito, è possibile trovare una descrizione delle opzioni per CREATE MODEL in aggiunta alle opzioni descritte in [CREATE MODEL semplice](#r_simple_create_model).

Per impostazione predefinita, CREATE MODEL cerca la migliore combinazione di preelaborazione e modello per il set di dati specifico. Potrebbe essere necessario un controllo aggiuntivo o introdurre ulteriori informazioni sul dominio (ad esempio il tipo di problema o l'obiettivo) sul modello. In uno scenario di abbandono del cliente, se il risultato "il cliente non è attivo" è raro, l'obiettivo F1 è spesso preferito all'obiettivo Precisione. Poiché i modelli ad alta precisione potrebbero prevedere "il cliente è attivo" per tutto il tempo, ciò si traduce in un'elevata precisione ma poco valore aziendale. Per informazioni sull'obiettivo F1, consulta [Auto MLJob Objective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) nel *riferimento dell'API Amazon SageMaker AI*.

Quindi il CREATE MODEL segue i suggerimenti sugli aspetti specificati, come l'obiettivo. Allo stesso tempo, CREATE MODEL rileva automaticamente i migliori preprocessori e i migliori iperparametri. 

### Sintassi di CREATE MODEL con guida per l'utente
<a name="r_user_guidance-create-model-synposis"></a>

CREATE MODEL offre una maggiore flessibilità sugli aspetti che è possibile specificare e sugli aspetti che Amazon Redshift rileva 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 (, ...)
)
```

### Parametri di CREATE MODEL con guida per l'utente
<a name="r_user_guidance-create-model-parameters"></a>

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1*   
(Facoltativo) Specifica il tipo di modello. Puoi specificare se desideri addestrare un modello di un tipo specifico XGBoost, come Multilayer Perceptron (MLP) o Linear Learner, che sono tutti algoritmi supportati da Amazon AI Autopilot. SageMaker Se non si specifica il parametro, durante l'addestramento vengono ricercati tutti i tipi di modello supportati per trovare il modello migliore.

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(Facoltativo) Specifica il tipo di problema. Se si conosce il tipo di problema, è possibile limitare Amazon Redshift alla ricerca solo del modello migliore di quel tipo di modello specifico. Se non si specifica questo parametro, durante l'addestramento viene rilevato un tipo di problema in base ai dati.

OBIETTIVO ('MSE' \$1 'Precisione' \$1 'F1' \$1 'F1Macro' \$1 'AUC')  
(Facoltativo) Specifica il nome del parametro dell'obiettivo utilizzato per misurare la qualità predittiva di un sistema di machine learning. Questo parametro è ottimizzato durante l'addestramento per fornire la migliore stima per i valori dei parametri del modello dai dati. Se non si specifica esplicitamente un parametro, il comportamento di default consiste nell'utilizzare automaticamente MSE: per la regressione, F1: per la classificazione binaria, Accuracy: per la classificazione multiclass. Per ulteriori informazioni sugli obiettivi, consulta [Auto MLJob Objective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) nell'*Amazon SageMaker AI API Reference*.

MAX\$1CELLS integer   
(Facoltativo) Specifica il numero di celle nei dati di addestramento. Questo valore è il prodotto del numero di record (nella query di addestramento o nella tabella) moltiplicato per il numero di colonne. Il valore di default è 1.000.000.

MAX\$1RUNTIME integer   
(Facoltativo) Specifica la durata massima dell'addestramento. I processi di addestramento spesso vengono completati prima di questo valore, a seconda delle dimensioni del set di dati. Specifica la durata massima dell'addestramento. Il valore di default è 5.400 (90 minuti).

S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1  
(Facoltativo) Specifica se Amazon Redshift esegue la garbage collection sui set di dati risultanti utilizzati per addestrare i modelli e i modelli stessi. Se impostato su OFF, i set di dati risultanti utilizzati per addestrare i modelli e i modelli stessi rimangono in Amazon S3 e possono essere utilizzati per altri scopi. Se impostato su ON, Amazon Redshift elimina gli artefatti in Amazon S3 al termine dell'addestramento. Il valore di default è ON.

KMS\$1KEY\$1ID 'kms\$1key\$1id'  
(Facoltativo) Specifica se Amazon Redshift utilizza la crittografia lato server con una chiave AWS KMS per proteggere i dati a riposo. I dati in transito sono protetti con Secure Sockets Layer (SSL). 

 *PREPROCESSORS 'string' *   
(Facoltativo) Specifica alcune combinazioni di preprocessori per determinati set di colonne. Il formato è un elenco di columnSets e le trasformazioni appropriate da applicare a ciascun set di colonne. Amazon Redshift applica tutti i trasformatori di uno specifico elenco di trasformatori a tutte le colonne dell'elenco corrispondente. ColumnSet Ad esempio, per applicare OneHotEncoder con Imputer alle colonne t1 e t2, usa il comando di esempio seguente.  

```
CREATE MODEL customer_churn
FROM customer_data
TARGET 'Churn'
FUNCTION predict_churn
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
PROBLEM_TYPE BINARY_CLASSIFICATION
OBJECTIVE 'F1'
PREPROCESSORS '[
...
{"ColumnSet": [
    "t1",
    "t2"
  ],
  "Transformers": [
    "OneHotEncoder",
    "Imputer"
  ]
},
{"ColumnSet": [
    "t3"
  ],
  "Transformers": [
    "OneHotEncoder"
  ]
},
{"ColumnSet": [
    "temp"
  ],
  "Transformers": [
    "Imputer",
    "NumericPassthrough"
  ]
}
]'
SETTINGS (
S3_BUCKET 'amzn-s3-demo-bucket'
)
```

Amazon Redshift supporta i seguenti trasformatori:
+ OneHotEncoder — In genere viene utilizzato per codificare un valore discreto in un vettore binario con un valore diverso da zero. Questo trasformatore è adatto per numerosi modelli di machine learning. 
+ OrdinalEncoder — Codifica i valori discreti in un unico numero intero. Questo trasformatore è adatto per modelli di machine learning specifici, come MLP e Linear Learner. 
+ NumericPassthrough — Trasmette l'input così com'è nel modello.
+ Imputer: riempie i valori mancanti e non i valori numerici (NaN).
+ ImputerWithIndicator — Compila i valori mancanti e i valori NaN. Questo trasformatore crea anche un indicatore di eventuali valori mancanti e compilati.
+ Normalizzatore: normalizza i valori, il che può migliorare le prestazioni di molti algoritmi di machine learning.
+ DateTimeVectorizer — Crea un incorporamento vettoriale, che rappresenta una colonna di tipo di dati datetime che può essere utilizzata nei modelli di machine learning.
+ PCA: proietta i dati in uno spazio dimensionale inferiore per ridurre il numero di funzioni mantenendo al contempo il maggior numero di informazioni possibile.
+ StandardScaler — Standardizza le funzionalità rimuovendo la media e scalando alla varianza unitaria. 
+ MinMax — Trasforma le funzionalità ridimensionando ciascuna funzionalità in base a un determinato intervallo.

Amazon Redshift ML memorizza i trasformatori addestrati e li applica automaticamente come parte della query di previsione. Non è necessario specificarli quando si generano le previsioni dal modello. 

## CREA XGBoost modelli con AUTO OFF
<a name="r_auto_off_create_model"></a>

L'AUTO OFF CREATE MODEL ha generalmente obiettivi diversi da quelli di default CREATE MODEL.

In qualità di utente avanzato che conosce già il tipo di modello desiderato e gli iperparametri da utilizzare durante l'addestramento di questi modelli, è possibile utilizzare CREATE MODEL con l'opzione AUTO OFF per disattivare il rilevamento automatico CREATE MODEL di preprocessori e iperparametri. A tale scopo, specificate esplicitamente il tipo di modello. XGBoost è attualmente l'unico tipo di modello supportato quando AUTO è impostato su OFF. È possibile specificare iperparametri. Amazon Redshift utilizza i valori predefiniti per tutti gli iperparametri specificati. 

### CREATE XGBoost modelli con la sintassi 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 (, ...)
)
```

### CREA XGBoost modelli con parametri AUTO OFF
<a name="r_auto_off-create-model-parameters"></a>

 *AUTO OFF*   
Disattiva il rilevamento automatico CREATE MODEL della selezione di preprocessore, algoritmo e iperparametri.

MODEL\$1TYPE XGBOOST  
Specifica di utilizzare XGBOOST per addestrare il modello. 

OBJECTIVE str  
Specifica un obiettivo riconosciuto dall'algoritmo. Amazon Redshift supporta reg:squarederror, reg:squaredlogerror, reg:logistic, reg:pseudohubererror, reg:tweedie, binary:logistic, binary:cerniera, multi:softmax. Per ulteriori informazioni su questi obiettivi, consultate [Learning task parameters](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters) nella XGBoost documentazione.

HYPERPARAMETERS \$1 DEFAULT \$1 DEFAULT EXCEPT ( key ‘value' (,..) ) \$1  
Speciifica se i XGBoost parametri predefiniti vengono utilizzati o sostituiti dai valori specificati dall'utente. I valori devono essere racchiusi tra virgolette singole. Di seguito sono riportati alcuni esempi di parametri e relativi valori predefiniti. XGBoost       
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_create_model_use_cases.html)

L'esempio seguente prepara i dati per 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;
```

L'esempio seguente crea un XGBoost modello con opzioni avanzate specificate, come MODEL\$1TYPE, OBJECTIVE 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');
```

Nell'esempio seguente viene utilizzata una query di inferenza per prevedere l'età del pesce con un numero di record maggiore di 2500. Utilizza la funzione ml\$1fn\$1abalone\$1xgboost\$1multi\$1predict\$1age creata dal comando precedente. 

```
select ml_fn_abalone_xgboost_multi_predict_age(length_val,
                                                   diameter,
                                                   height,
                                                   whole_weight,
                                                   shucked_weight,
                                                   viscera_weight,
                                                   shell_weight)+1.5 as age
from abalone_xgb where record_number > 2500;
```

## Bring your own model (BYOM) - inferenza locale
<a name="r_byom_create_model"></a>

Amazon Redshift ML supporta l'utilizzo dell'approccio bring your own model (BYOM) nell'inferenza locale.

Di seguito viene riportato un riepilogo delle opzioni per la sintassi di CREATE MODEL per BYOM. Puoi utilizzare un modello addestrato all'esterno di Amazon Redshift con Amazon SageMaker AI per l'inferenza nel database a livello locale in Amazon Redshift.

### Sintassi di CREATE MODEL per l'inferenza locale
<a name="r_local-create-model"></a>

Di seguito viene descritta la sintassi CREATE MODEL per l'inferenza locale.

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

Amazon Redshift attualmente supporta solo modelli pre-addestrati XGBoost, MLP e Linear Learner per BYOM. Puoi importare SageMaker AI Autopilot e modelli addestrati direttamente in Amazon SageMaker AI per l'inferenza locale utilizzando questo percorso. 

#### Parametri di CREATE MODEL per l'inferenza locale
<a name="r_local-create-model-parameters"></a>

 *model\$1name*   
Il nome del modello. Il nome del modello in uno schema deve essere unico.

FROM (*'nome\$1processo'* \$1 *'percorso\$1s3'* )  
Il *job\$1name utilizza un nome* di lavoro Amazon SageMaker AI come input. Il nome del lavoro può essere il nome di un processo di formazione Amazon SageMaker AI o un nome di lavoro di Amazon SageMaker AI Autopilot. Il processo deve essere creato nello stesso account AWS proprietario del cluster Amazon Redshift. Per trovare il nome del lavoro, avvia Amazon SageMaker AI. Nel menu a discesa **Training** (Addestramento), scegliere **Training jobs** (Processi di addestramento).  
*'percorso\$1s3'* specifica la posizione S3 del file di artefatti del modello .tar.gz da utilizzare durante la creazione del modello.

FUNCTION *nome\$1funzione* ( *tipo\$1dati* [, ...] )  
Il nome della funzione da creare e i tipi di dati degli argomenti di input. È possibile fornire un nome dello schema.

RETURNS *data\$1type*  
Il tipo di dati del valore restituito dalla funzione.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando CREATE MODEL.  
L'Amazon Resource Name (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione. 

SETTINGS ( S3\$1BUCKET *'amzn-s3-demo-bucket'*, \$1 KMS\$1KEY\$1ID *'kms\$1string'*)  
La clausola S3\$1BUCKET specifica la posizione Amazon S3 utilizzata per archiviare i risultati intermedi.  
(Facoltativo) La clausola KMS\$1KEY\$1ID specifica se Amazon Redshift utilizza la crittografia lato server con una chiave per proteggere i dati inattivi. AWS KMS I dati in transito sono protetti con Secure Sockets Layer (SSL).  
Per ulteriori informazioni, consulta [CREATE MODEL con guida per l'utente](#r_user_guidance_create_model).

#### Esempio di CREATE MODEL per l'inferenza locale
<a name="r_local-create-model-example"></a>

L'esempio seguente crea un modello che è stato precedentemente addestrato in Amazon SageMaker AI, al di fuori di Amazon Redshift. Poiché il tipo di modello è supportato da Amazon Redshift ML per l'inferenza locale, il seguente CREATE MODEL crea una funzione che può essere utilizzata in locale in Amazon Redshift. Puoi fornire il nome di un lavoro di formazione sull' SageMaker intelligenza artificiale.

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

Dopo aver creato il modello, è possibile utilizzare la funzione *customer\$1churn\$1predict* con i tipi di argomenti specificati per effettuare le previsioni.

## Bring your own model (BYOM) - inferenza remota
<a name="r_byom_create_model_remote"></a>

Amazon Redshift ML supporta anche l'utilizzo dell'approccio bring your own model (BYOM) per l'inferenza remota.

Di seguito viene riportato un riepilogo delle opzioni per la sintassi di CREATE MODEL per BYOM.

### Sintassi di CREATE MODEL per l'inferenza remota
<a name="r_remote-create-model"></a>

Di seguito viene descritta la sintassi di CREATE MODEL per l'inferenza 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)];
```

#### Parametri di CREATE MODEL per l'inferenza remota
<a name="r_remote-create-model-parameters"></a>

 *model\$1name*   
Il nome del modello. Il nome del modello in uno schema deve essere unico.

FUNCTION *nome\$1fn* ( [*tipo\$1dati*] [, ...] )  
Il nome della funzione e i tipi di dati degli argomenti di input. Consulta [Tipi di dati](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html) per l'elenco di tutti i tipi di dati supportati. `Geography`, `geometry` e `hllsketch` non sono supportati.   
Puoi inoltre fornire un nome di funzione all’interno di uno schema utilizzando una notazione in due parti, ad esempio `myschema.myfunction`.

RETURNS *data\$1type*  
Il tipo di dati del valore restituito dalla funzione. Consulta [Tipi di dati](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html) per l'elenco di tutti i tipi di dati supportati. `Geography`, `geometry` e `hllsketch` non sono supportati. 

SAGEMAKER *'nome\$1endpoint'*[:*'nome\$1modello'*]   
Il nome dell'endpoint Amazon SageMaker AI. Se il nome dell'endpoint punta a un endpoint multimodello, aggiungere il nome del modello da utilizzare. L'endpoint deve essere ospitato nella stessa AWS regione e nel Account AWS cluster Amazon Redshift. Per trovare il tuo endpoint, avvia Amazon SageMaker AI. Nel menu a discesa **Inference** (Inferenza), scegliere **Endpoints** (Endpoint).

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando CREATE MODEL. In alternativa, è possibile specificare l'ARN di un ruolo IAM per utilizzare quel ruolo.

MAX\$1BATCH\$1ROWS *integer*  
Il numero massimo di righe che Amazon Redshift invia in una singola richiesta batch per una singola chiamata SageMaker AI. È supportato solo per BYOM con inferenza remota. Il numero effettivo di righe in un batch dipende anche dalla dimensione di input, ma è inferiore o uguale a questo valore. Il valore minimo per questo parametro è 1. Il valore massimo è `INT_MAX` o 2.147.483.647. Questo parametro è obbligatorio solo quando sia i tipi di dati di input che quelli restituiti sono `SUPER`. Il valore predefinito è `INT_MAX` o 2.147.483.647. 

Quando il modello viene distribuito su un endpoint di SageMaker intelligenza artificiale, l' SageMaker intelligenza artificiale crea le informazioni del modello in Amazon Redshift. Esegue quindi l'inferenza attraverso la funzione esterna. È possibile utilizzare il comando SHOW MODEL per visualizzare le informazioni sul modello sul cluster Amazon Redshift.

#### Note di utilizzo di CREATE MODEL per l'inferenza remota
<a name="r_remote-create-model-usage-notes"></a>

Prima di utilizzare CREATE MODEL per l'inferenza remota, considerare quanto segue:
+ L'endpoint deve essere ospitato dallo stesso AWS account proprietario del cluster Amazon Redshift.
+ Assicurati che l'endpoint Amazon SageMaker AI disponga di risorse sufficienti per accogliere le chiamate di inferenza da Amazon Redshift o che l'endpoint SageMaker Amazon AI possa essere ridimensionato automaticamente.
+ Se non utilizzi il tipo di `SUPER` dati come input, il modello accetta solo input nel formato di valori separati da virgole (CSV) che corrisponde a un tipo di contenuto dell'IA. `text/CSV` SageMaker 
+ Se non utilizzi il tipo di dati `SUPER` come input, l’output dei modelli è un singolo valore del tipo specificato al momento della creazione della funzione. L'output è in formato di valori separati da virgole (CSV) tramite un tipo di contenuto in AI. `text/CSV` SageMaker `VARCHAR`i tipi di dati non possono essere racchiusi tra virgolette e non possono contenere nuove righe e ogni output deve essere racchiuso in una nuova riga.
+ I modelli accettano valori null come stringhe vuote.
+ Quando il tipo di dati di input è `SUPER`, è supportato solo un argomento di input. 
+ Se il tipo di dati di input è `SUPER`, anche il tipo di dati restituiti deve essere `SUPER`. 
+ MAX\$1BATCH\$1ROWS è richiesto quando sia i tipi di dati di input che quelli restituiti sono SUPER. 
+ Quando il tipo di dati di input è `SUPER`, il tipo di contenuto dell’invocazione dell’endpoint è `application/json` quando MAX\$1BATCH\$1ROWS è `1` o `application/jsonlines` in tutti gli altri casi. 
+ Quando il tipo di dati restituito è `SUPER`, il tipo di accettazione dell’invocazione dell’endpoint è `application/json` quando MAX\$1BATCH\$1ROWS è `1` o `application/jsonlines` in tutti gli altri casi. 

##### Esempio di CREATE MODEL per l'inferenza remota
<a name="r_remote-create-model-example"></a>

L'esempio seguente crea un modello che utilizza un endpoint SageMaker AI per fare previsioni. Assicurarsi che l'endpoint sia in esecuzione per effettuare previsioni e specificarne il nome nel 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;
```

 L'esempio seguente crea un BYOM con inferenza remota con un modello di modello linguistico di grandi dimensioni (LLM). LLMs ospitati su Amazon SageMaker AI Jumpstart accettano e restituiscono il tipo di `application/json` contenuto e supportano un singolo JSON per chiamata. I tipi di dati di input e restituiti devono essere `SUPER` e MAX\$1BATCH\$1ROWS deve essere impostato su 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);
```

## CREA MODELLO con K-MEANS
<a name="r_k-means_create_model"></a>

Amazon Redshift supporta l'algoritmo K-Means che raggruppa i dati che non sono etichettati. Questo algoritmo risolve i problemi di clustering in cui si desidera individuare i raggruppamenti nei dati. I dati non classificati vengono raggruppati e ripartiti in base alle somiglianze e alle differenze. 

### CREA MODELLO con sintassi 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);
```

### CREA MODELLO con i parametri K-MEANS
<a name="r_k-means-create-model-parameters"></a>

 *AUTO OFF*   
Disattiva il rilevamento automatico CREATE MODEL della selezione di preprocessore, algoritmo e iperparametri.

KMEANS MODEL\$1TYPE  
Specifica di utilizzare XGBOOST per addestrare il modello. 

PREPROCESSORS 'string'  
Specifica alcune combinazioni di preprocessori per determinati set di colonne. Il formato è un elenco di columnSets e le trasformazioni appropriate da applicare a ciascun set di colonne. Amazon Redshift supporta 3 preprocessori K-Means, vale a dire StandardScaler, e. MinMax NumericPassthrough Se non desideri applicare alcuna preelaborazione per K-Means, scegli NumericPassthrough esplicitamente come trasformatore. Per ulteriori informazioni sulla funzionalità di trasformazione delle proprietà, consultare [Parametri di CREATE MODEL con guida per l'utente](#r_user_guidance-create-model-parameters).  
L'algoritmo K-Means utilizza la distanza eucliidea per calcolare la somiglianza. La preelaborazione dei dati garantisce che le caratteristiche del modello rimangano sulla stessa scala e producano risultati affidabili.

HYPERPARAMETERS DEFAULT ECCETTO (K 'val' [,...])  
Specifica se vengono utilizzati i parametri K-Means. È necessario specificare il parametro `K` quando usi l'algoritmo K-Means. Per ulteriori informazioni, consulta [K-Means Hyperparameters](https://docs.aws.amazon.com/sagemaker/latest/dg/k-means-api-config.html) nella *Amazon SageMaker AI* Developer Guide

L'esempio seguente prepara i dati per 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 with Forecast
<a name="r_forecast_model"></a>

I modelli di previsione in Redshift ML utilizzano Amazon Forecast per creare previsioni accurate di serie temporali. In questo modo puoi utilizzare i dati cronologici relativi a un periodo di tempo per fare previsioni su eventi futuri. I casi d'uso più comuni di Amazon Forecast includono l'utilizzo dei dati dei prodotti al dettaglio per decidere i prezzi dell'inventario, i dati sulla quantità di produzione per prevedere la quantità di un articolo da ordinare e i dati sul traffico Web per prevedere il traffico che potrebbe ricevere un server Web. 

 [Quota limits from Amazon Forecast](https://docs.aws.amazon.com/forecast/latest/dg/limits.html) (Limiti di quota di Amazon Forecast) vengono applicati nei modelli di previsione di Amazon Redshift. Ad esempio, il numero massimo di previsioni è 100, ma è regolabile. L'eliminazione di un modello di previsione non elimina automaticamente le risorse associate in Amazon Forecast. Se elimini un cluster Redshift, vengono eliminati anche tutti i modelli associati. 

Tieni presente che i modelli di previsione sono attualmente disponibili solo nelle seguenti regioni:
+ Stati Uniti orientali (Ohio) (us-east-2)
+ Stati Uniti orientali (Virginia settentrionale) (us-east-1)
+ Stati Uniti occidentali (Oregon) (us-west-2)
+ Asia Pacifico (Mumbai) (ap-south-1)
+ Asia Pacifico (Seoul) (ap-northeast-2)
+ Asia Pacifico (Singapore) (ap-southeast-1)
+ Asia Pacifico (Sydney) (ap-southeast-2)
+ Asia Pacifico (Tokyo) (ap-northeast-1)
+ Europa (Francoforte) (eu-central-1)
+ Europa (Irlanda) (eu-west-1)

### CREATE MODEL con sintassi Forecast
<a name="r_forecast_model-synopsis"></a>

```
CREATE [ OR REPLACE ] MODEL forecast_model_name 
FROM { table_name | ( select_query ) } 
TARGET column_name
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>'} 
AUTO ON
MODEL_TYPE FORECAST
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  HORIZON integer,
  FREQUENCY forecast_frequency
  [PERCENTILES '0.1', '0.5', '0.9']
  )
```

### CREATE MODEL con parametri Forecast
<a name="r_forecast_model-parameters"></a>

 *forecast\$1model\$1name*   
Il nome del modello. Il nome del modello deve essere univoco.

FROM \$1 nome\$1tabella \$1 ( query\$1select ) \$1  
Il nome\$1tabella o la query che specifica i dati di addestramento. Può essere una tabella esistente nel sistema o una query SELECT compatibile con Amazon Redshift racchiusa tra parentesi. Il risultato della tabella o della query deve contenere almeno tre colonne: (1) una colonna varchar che specifica il nome della serie temporale. Ogni set di dati può avere più serie temporali, (2) una colonna data/ora e (3) la colonna di destinazione da prevedere. Questa colonna di destinazione deve essere di tipo int o float. Se fornisci un set di dati composto da più di tre colonne, Amazon Redshift presuppone che tutte le colonne aggiuntive facciano parte di una serie temporale correlata. Notare che le serie temporali correlate devono essere di tipo int o float. Per ulteriori informazioni sulle serie temporali correlate, consulta [Using Related Time Series Datasets](https://docs.aws.amazon.com/forecast/latest/dg/related-time-series-datasets.html) (Utilizzo di set di dati relativi alle serie temporali).

TARGET nome\$1colonna  
Il nome della colonna che diventa la destinazione della previsione. La colonna deve esistere nella clausola FROM.

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1  
Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando CREAT MODEL. In alternativa, è possibile specificare un ARN di un ruolo IAM per utilizzare quel ruolo. 

AUTO ON  
Attiva il rilevamento automatico CREATE MODEL della selezione di algoritmo e iperparametri. Specificare on quando si crea un modello Forecast indica di utilizzare un Forecast AutoPredictor, in cui Amazon Forecast applica le combinazioni ottimali di algoritmi a ogni serie temporale del set di dati.

MODEL\$1TYPE FORECAST  
Specifica di utilizzare FORECAST per addestrare il modello.

S3\$1BUCKET 'amzn-s3-demo-bucket'  
Il nome del bucket Amazon Simple Storage Service creato in precedenza e utilizzato per condividere i dati di addestramento e gli artefatti tra Amazon Redshift e Amazon Forecast. Amazon Redshift crea una sottocartella in questo bucket prima di scaricare i dati di addestramento. Una volta completato l'addestramento, Amazon Redshift elimina la sottocartella creata e il relativo contenuto.

HORIZON integer  
Il numero massimo di previsioni che il modello di previsione può restituire. Una volta addestrato il modello, non è possibile modificare questo numero intero.

FREQUENCY forecast\$1frequency  
Specifica la granularità desiderata per le previsioni. Le opzioni disponibili sono `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`. Obbligatorio se stai addestrando un modello di previsione.

Stringa PERCENTILES  
Una stringa delimitata da virgole che specifica i tipi di previsione utilizzati per addestrare un predittore. I tipi di previsione possono essere quantili da 0,01 a 0,99, con incrementi di 0,01 o superiori. Puoi anche specificare la previsione media con la media. È possibile specificare un massimo di cinque tipi di previsione.

L'esempio seguente dimostra come creare un modello di previsione semplice.

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

Dopo aver creato il modello di previsione, puoi creare una nuova tabella con i dati di previsione.

```
CREATE TABLE forecast_model_results as SELECT Forecast(forecast_example)
```

È quindi possibile eseguire query sulla nuova tabella per ottenere previsioni.

```
SELECT * FROM forecast_model_results
```

# CREATE PROCEDURE
<a name="r_CREATE_PROCEDURE"></a>

Crea una nuova procedura archiviata o sostituisce una procedura esistente per il database corrente.

Per maggiori informazioni ed esempi, consulta [Creazione di procedure archiviate in Amazon Redshift](stored-procedure-overview.md).

## Privilegi richiesti
<a name="r_CREATE_PROCEDURE-privileges"></a>

Devi ottenere l’autorizzazione in uno dei seguenti modi per eseguire CREATE OR REPLACE PROCEDURE:
+ Per CREATE PROCEDURE:
  + Superuser
  + Utenti con i privilegi CREATE e USAGE per lo schema in cui viene creata la stored procedure
+ Per REPLACE PROCEDURE:
  + Superuser
  + Proprietario della procedura

## Sintassi
<a name="r_CREATE_PROCEDURE-synopsis"></a>

```
CREATE [ OR REPLACE ] PROCEDURE sp_procedure_name  
  ( [ [ argname ] [ argmode ] argtype [, ...] ] )
[ NONATOMIC ]
AS $$
  procedure_body
$$ LANGUAGE plpgsql
[ { SECURITY INVOKER | SECURITY DEFINER } ]
[ SET configuration_parameter { TO value | = value } ]
```

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

 OR REPLACE   
Una clausola che specifica che se una procedura con stesso nome e tipi di dati degli argomenti di input o firma è già esistente, la procedura esistente viene sostituita. Puoi sostituire una procedura solo con una nuova che definisce un set identico di tipi di dati.   
Se definisci una funzione con lo stesso nome di una procedura esistente, ma con una firma diversa, verrà creata una nuova procedura. Ossia, il nome della procedura viene sottoposto a overload. Per ulteriori informazioni, consulta [Overload dei nomi delle procedure](stored-procedure-naming.md#stored-procedure-overloading-name). 

 *sp\$1procedure\$1name*   
Il nome della procedura. Se specifichi un nome di schema (come **myschema.myprocedure**), la procedura viene creata utilizzando lo schema specificato. Altrimenti, la procedura viene creata nello schema corrente. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).   
Consigliamo di assegnare un prefisso `sp_` ai nomi di tutte le procedure archiviate. Amazon Redshift riserva il prefisso `sp_` solo per le procedure archiviate. Utilizzando il prefisso `sp_`, si assicura che il nome della procedura archiviata non sia in conflitto con alcun nome di procedura archiviata o funzione integrate di Amazon Redshift esistente o futuro. Per ulteriori informazioni, consulta [Denominazione delle stored procedure](stored-procedure-naming.md).  
Puoi definire più di una procedura con lo stesso nome se i tipi di dati per gli argomenti di input o le firme sono diversi. Ossia, in questo caso il nome della procedura viene sottoposto a overload. Per ulteriori informazioni, consulta [Overload dei nomi delle procedure](stored-procedure-naming.md#stored-procedure-overloading-name)

*[argname] [ argmode] argtype*   
Elenco di nomi di argomento, modalità di argomento e tipi di dati. È obbligatorio solo il tipo di dati. Il nome e la modalità sono opzionali e la loro posizione può essere scambiata.  
La modalità dell'argomento può essere IN, OUT o INOUT. Il valore predefinito è IN.  
Puoi utilizzare gli argomenti OUT e INOUT per restituire uno o più valori dalla chiamata di una procedura. Se sono presenti argomenti OUT o INOUT, la chiamata della procedura restituisce una riga di risultati contenente *n* colonne, dove *n* è il numero totale di argomenti OUT o INOUT.  
Gli argomenti INOUT sono contemporaneamente argomenti di input e output. Gli *argomenti di input* includono sia argomenti IN che INOUT, mentre gli *argomenti di output* includono sia argomenti OUT che INOUT.  
Gli argomenti OUT non sono specificati come parte dell'istruzione CALL. Specifica gli argomenti INOUT nell'istruzione CALL della procedura archiviata. Gli argomenti INOUT possono essere utili durante la trasmissione e la restituzione dei valori da una chiamata nidificata e anche durante la restituzione di un `refcursor`. Per ulteriori informazioni sui tipi `refcursor`, consultare [Cursori](c_PLpgSQL-statements.md#r_PLpgSQL-cursors).  
I tipi di dati dell'argomento possono essere qualsiasi tipo di dati Amazon Redshift standard. Inoltre, un tipo di dati dell'argomento può essere `refcursor`.  
Puoi specificare un massimo di 32 argomenti di input e un massimo di 32 argomenti di output. 

AS \$1\$1 *procedure\$1body* \$1\$1   
Un costrutto che racchiude la procedura da eseguire. Le parole chiavi letterali AS \$1\$1 e \$1\$1 sono obbligatorie.  
Amazon Redshift richiede di racchiudere l'istruzione nella procedura utilizzando un formato chiamato dollar quoting. Qualsiasi elemento all'interno dell'inquadramento viene trasmesso esattamente com'è. Non è necessario impostare il carattere escape per i caratteri speciali, poiché il contenuto della stringa è scritto letteralmente.  
Con *dollar quoting, *utilizzi una coppia di simboli del dollaro (\$1\$1) per indicare l'inizio e la fine dell'istruzione da eseguire, come mostrato nell'esempio seguente.  

```
$$ my statement $$
```
Facoltativamente, tra i segni del dollaro in ciascuna coppia, puoi specificare una stringa per aiutare a identificare l'istruzione. La stringa che utilizzi deve essere uguale sia all'inizio che alla fine delle coppie dell'inquadramento. Questa stringa effettua la distinzione tra lettere maiuscole e minuscole e segue gli stessi vincoli di un identificatore senza virgolette, tranne per il fatto che non può contenere segni di dollaro. Gli esempi seguenti utilizzano la stringa test.  

```
$test$ my statement $test$
```
Questa sintassi è inoltre utile per il dollar quoting nidificato. Per ulteriori informazioni sul dollar quoting, consultare l'argomento relativo alle costanti di stringa racchiuse tra simboli del dollaro nella sezione relativa alla [struttura lessicale](https://www.postgresql.org/docs/9.0/sql-syntax-lexical.html) della documentazione di PostgreSQL.

 *procedure\$1body*   
Un insieme di dichiarazioni valide. PL/pgSQL PL/pgSQL le istruzioni integrano i comandi SQL con costrutti procedurali, tra cui espressioni cicliche e condizionali, per controllare il flusso logico. La maggior parte dei comandi SQL può essere utilizzato nel corpo della procedura, includendo il linguaggio DML (Data Modification Language) come COPY, UNLOAD e INSERT, e il linguaggio DDL (Data Definition Language) come CREATE TABLE. Per ulteriori informazioni, consulta [Riferimento al linguaggio PL/pgSQL](c_pl_pgSQL_reference.md). 

LANGUAGE *plpgsql*  
Valore di un linguaggio. Specifica `plpgsql`. Devi disporre dell'autorizzazione per l'utilizzo nel linguaggio per usare `plpgsql`. Per ulteriori informazioni, consulta [GRANT](r_GRANT.md). 

NONATOMIC  
Crea la procedura archiviata in una modalità di transazione NONATOMIC. La modalità NONATOMIC esegue automaticamente il commit delle istruzioni all'interno della procedura. Inoltre, quando si verifica un errore all'interno della procedura NONATOMIC, l'errore non viene generato nuovamente se viene gestito da un blocco di eccezioni. Per ulteriori informazioni, consultare [Gestione delle transazioni](stored-procedure-transaction-management.md) e [RAISE](c_PLpgSQL-statements.md#r_PLpgSQL-messages-errors).  
Quando si definisce una procedura archiviata `NONATOMIC`, considerare quanto segue:  
+ Quando si annidano le chiamate di procedura archiviata, tutte le procedure devono essere create nella stessa modalità di transazione.
+ Le opzioni `SECURITY DEFINER` e `SET configuration_parameter` non sono supportate quando si crea una procedura in modalità NONATOMIC.
+ Qualsiasi cursore che è aperto (esplicitamente o implicitamente) viene chiuso automaticamente quando viene eseguito un commit implicito. Pertanto, è necessario aprire una transazione esplicita prima di iniziare un ciclo di cursori per garantire che non venga eseguito il commit implicito di qualsiasi codice SQL all'interno dell'iterazione del ciclo.

SECURITY INVOKER \$1 SECURITY DEFINER  
L'opzione `SECURITY DEFINER` non è supportata quando è specificato `NONATOMIC`.  
Modalità di sicurezza con cui la procedura determina i privilegi di accesso alla procedura in fase di runtime. La procedura deve disporre dell'autorizzazione ad accedere agli oggetti di database sottostanti.   
Per la modalità SECURITY INVOKER, la procedura utilizza i privilegi dell'utente che la chiama. L'utente deve disporre di autorizzazioni esplicite per gli oggetti di database sottostanti. L'impostazione predefinita è SECURITY INVOKER.  
Per la modalità SECURITY DEFINER, la procedura utilizza i privilegi del proprietario. Il proprietario della procedura è definito come l'utente proprietario della procedura in fase di esecuzione, che non è necessariamente l'utente che ha definito inizialmente la procedura. L'utente che chiama la procedura necessita dei privilegi di esecuzione per la procedura, ma non dei privilegi relativi agli oggetti sottostanti. 

SET configuration\$1parameter \$1 TO value \$1 = value \$1  
Queste opzioni non sono supportate quando è specificato `NONATOMIC`.  
La clausola SET implica l'impostazione del parametro `configuration_parameter` specificato sul valore indicato quando viene immessa la procedura. Questa clausola quindi ripristina `configuration_parameter` sul suo valore precedente all'uscita della procedura. 

## Note per l'utilizzo
<a name="r_CREATE_PROCEDURE-usage"></a>

Se una procedura archiviata è stata creata utilizzando l'opzione SECURITY DEFINER, quando si richiama la funzione CURRENT\$1USER dall'interno della procedura archiviata, Amazon Redshift restituisce il nome utente del proprietario della procedura archiviata.

## Esempi
<a name="r_CREATE_PROCEDURE-examples"></a>

**Nota**  
Se, durante l'esecuzione di questi esempi, hai riscontrato un errore simile a:  

```
ERROR: 42601: [Amazon](500310) unterminated dollar-quoted string at or near "$$
```
Per informazioni, consultare [Panoramica delle procedure archiviate in Amazon Redshift](stored-procedure-create.md). 

L'esempio seguente crea una procedura con due parametri di input.

```
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 si scrivono le stored procedure, si consiglia di attenersi a una best practice per proteggere i valori sensibili:   
 Non eseguire la codifica fissa delle informazioni sensibili nella logica delle procedure archiviate. Ad esempio, non assegnare una password utente in un'istruzione CREATE USER nel corpo di una procedura archiviata. Ciò rappresenta un rischio per la sicurezza, poiché i valori con codifica fissa possono essere registrati come metadati dello schema nelle tabelle del catalogo. È invece consigliabile passare i valori sensibili, ad esempio le password, come argomenti alla procedura archiviata, mediante parametri.   
Per ulteriori informazioni sulle procedure archiviate, consulta [CREATE PROCEDURE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_PROCEDURE.html) e [Creazione di procedure archiviate in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-overview.html). Per ulteriori informazioni sulle tabelle di catalogo, consulta [Tabelle di catalogo di sistema](https://docs.aws.amazon.com/redshift/latest/dg/c_intro_catalog_views.html).

L'esempio seguente crea una procedura con un parametro IN, un parametro OUT e un parametro 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;
```

Nell’esempio seguente viene creata una procedura che utilizza il parametro `SECURITY DEFINER`. Questa procedura viene eseguita con i privilegi dell’utente proprietario della procedura.

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

Nell’esempio seguente viene creata una procedura che utilizza il parametro `SECURITY INVOKER`. Questa procedura viene eseguita con i privilegi dell’utente che esegue la procedura.

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_invoker()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY INVOKER;
```

# CREATE RLS POLICY
<a name="r_CREATE_RLS_POLICY"></a>

Crea una nuova policy di sicurezza a livello di riga per fornire un accesso granulare agli oggetti del database.

Una policy può essere creata da superuser e utenti o ruoli che dispongono del ruolo sys:secadmin.

## Sintassi
<a name="r_CREATE_RLS_POLICY-synopsis"></a>

```
CREATE RLS POLICY { policy_name | database_name.policy_name }
[ WITH (column_name data_type [, ...]) [ [AS] relation_alias ] ]
USING ( using_predicate_exp )
```

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

 *nome\$1policy*   
Il nome della policy .

database\$1name  
Il nome del database in cui verrà creata la politica. La policy può essere creata sul database connesso o su un database che supporta le autorizzazioni federate di Amazon Redshift.

WITH (*nome\$1colonna tipo\$1dati [, ...]*)   
Specifica i valori per *nome\$1colonna* e *tipo\$1dati* riferiti alle colonne delle tabelle a cui è collegata la policy.   
Puoi omettere la clausola WITH solo se la policy RLS non fa riferimento ad alcuna colonna di tabelle a cui è collegata la policy.

AS *alias\$1relazione*  
Specifica un alias facoltativo per la tabella a cui verrà collegata la policy RLS.

USING (* using\$1predicate\$1exp *)  
Specifica un filtro applicato alla clausola WHERE della query. Amazon Redshift applica un predicato di policy prima dei predicati utente a livello di query. Ad esempio, **current\$1user = ‘joe’ and price > 10** limita Joe a visualizzare solo i record con un prezzo superiore a 10 USD.

Per l'utilizzo di CREATE RLS POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Note per l'utilizzo
<a name="r_CREATE_RLS_POLICY-usage"></a>

Quando lavori con l'istruzione CREATE RLS POLICY, tieni presente quanto segue:
+ Amazon Redshift supporta filtri che possono far parte di una clausola WHERE di una query.
+ Tutte le policy collegate a una tabella devono essere state create con lo stesso alias di tabella.
+ Devi utilizzare le istruzioni GRANT e REVOKE per concedere e revocare esplicitamente le autorizzazioni SELECT alle policy RLS che fanno riferimento alle tabelle di ricerca. Una tabella di ricerca è un oggetto tabella utilizzato all'interno di una definizione di policy. Per ulteriori informazioni, consultare [GRANT](r_GRANT.md) e [REVOKE](r_REVOKE.md). 
+ La sicurezza a livello di riga di Amazon Redshift non supporta i seguenti tipi di oggetto all'interno di una definizione di policy: tabelle di catalogo, relazioni tra database, tabelle esterne, viste regolari, viste con associazione tardiva, tabelle con policy RLS attivate e tabelle temporanee.

## Esempi
<a name="r_CREATE_RLS_POLICY-examples"></a>

Nell’esempio seguente viene creata una policy RLS denominata policy\$1concerts. Questa policy si applica a una colonna VARCHAR(10) denominata catgroup e imposta il filtro USING per restituire solo le righe in cui il valore di catgroup è `'Concerts'`.

```
CREATE RLS POLICY policy_concerts
WITH (catgroup VARCHAR(10))
USING (catgroup = 'Concerts');
```

Per un end-to-end esempio di utilizzo delle politiche RLS, consulta. [Esempio di sicurezza a livello di riga end-to-end](t_rls-example.md)

# CREATE ROLE
<a name="r_CREATE_ROLE"></a>

Crea un nuovo ruolo personalizzato che è una raccolta di autorizzazioni. Per un elenco di ruoli Amazon Redshift definiti dal sistema, consulta [Ruoli definiti dal sistema di Amazon Redshift](r_roles-default.md). Esegui una query su [SVV\$1ROLES](r_SVV_ROLES.md) per visualizzare i ruoli attualmente creati nel cluster o nel gruppo di lavoro.

È prevista una quota per il numero di ruoli che è possibile creare. Per ulteriori informazioni, consulta [Quote e limiti in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) nella *Guida alla gestione di Amazon Redshift*.

## Autorizzazioni richieste
<a name="r_CREATE_ROLE-privileges"></a>

Di seguito sono riportati i privilegi richiesti per CREATE ROLE.
+ Superuser
+ Utenti con il privilegio CREATE ROLE

## Sintassi
<a name="r_CREATE_ROLE-synopsis"></a>

```
CREATE ROLE role_name
[ EXTERNALID external_id ]
```

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

*role\$1name*  
Il nome del ruolo. Il nome del ruolo deve essere univoco e non può essere uguale a nessun nome utente. Il nome di un ruolo non può essere una parola riservata.  
Un utente con privilegi avanzati o normale con il privilegio CREATE ROLE può creare ruoli. Un utente che non è un utente con privilegi avanzati ma che a cui è stato concesso USAGE al ruolo WITH GRANT OPTION e il privilegio ALTER può concedere questo ruolo a chiunque.

EXTERNALID *external\$1id*  
L'identificativo del ruolo, associato a un provider di identità. Per ulteriori informazioni, consulta [Native identity provider (IdP) federation for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html) (Federazione di provider di identità nativi (IdP) per Amazon Redshift).

## Esempi
<a name="r_CREATE_ROLE-examples"></a>

L'esempio seguente crea un ruolo `sample_role1`.

```
CREATE ROLE sample_role1;
```

L'esempio seguente crea un ruolo `sample_role1` con un ID esterno associato a un provider di identità.

```
CREATE ROLE sample_role1 EXTERNALID "ABC123";
```

# CREATE SCHEMA
<a name="r_CREATE_SCHEMA"></a>

Definisce un nuovo schema per il database corrente.

## Privilegi richiesti
<a name="r_CREATE_SCHEMA-privileges"></a>

Di seguito sono riportati i privilegi richiesti per CREATE SCHEMA:
+ Superuser
+ Utenti con il privilegio CREATE SCHEMA

## Sintassi
<a name="r_CREATE_SCHEMA-synopsis"></a>

```
CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION username ]
           [ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ]

CREATE SCHEMA AUTHORIZATION username[ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ] ]
```

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

 IF NOT EXISTS   
Clausola che indica che se lo schema specificato esiste già, il comando non deve apportare modifiche e deve restituire un messaggio che lo schema esiste, piuttosto che terminare con un errore.  
Questa clausola è utile durante lo scripting, quindi lo script ha esito positivo se CREATE SCHEMA tenta di creare uno schema già esistente.

 *schema\$1name*   
Nome del nuovo schema. Il nome dello schema non può essere `PUBLIC`. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).  
L'elenco di schemi nel parametro di configurazione [search\$1path](r_search_path.md) determina la precedenza degli oggetti con nome identico quando a cui viene fatto riferimento senza nome di schema.

AUTHORIZATION   
Clausola che concede la proprietà a un utente specificato.

 *username*   
Nome del proprietario dello schema.

 *schema\$1element*   
Definizione per uno o più oggetti da creare all'interno dello schema.

QUOTA  
La quantità massima di spazio su disco che lo schema specificato può utilizzare. Questo spazio è l'utilizzo del disco collettivo. Include tutte le tabelle permanenti, viste materializzate sotto lo schema specificato e copie duplicate di tutte le tabelle con distribuzione ALL su ciascun nodo di calcolo. La quota dello schema non tiene conto delle tabelle temporanee create come parte di uno spazio dei nomi temporaneo o di uno schema.   
Per visualizzare le quote dello schema configurate, consultare [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md).  
Per visualizzare i record in cui le quote dello schema sono state superate, consultare [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md).  
Amazon Redshift converte il valore selezionato in megabyte. Il gigabyte è l'unità di misura predefinita quando non si specifica un valore.  
Per impostare e modificare una quota dello schema, è necessario essere un utente con privilegi avanzati del database. Un utente che non è un utente con privilegi avanzati ma che dispone dell'autorizzazione CREATE SCHEMA può creare uno schema con una quota definita. Quando si crea uno schema senza definire una quota, lo schema ha una quota illimitata. Quando si imposta la quota al di sotto del valore corrente utilizzato dallo schema, Amazon Redshift non consente ulteriori operazioni di importazione finché non si libera spazio su disco. Un'istruzione DELETE elimina i dati da una tabella e lo spazio su disco viene liberato solo quando viene eseguita l'istruzione VACUUM.   
Amazon Redshift controlla ogni transazione alla ricerca di violazioni delle quote prima di eseguire il commit della transazione. Amazon Redshift controlla le dimensioni (lo spazio su disco utilizzato da tutte le tabelle in uno schema) di ogni schema modificato rispetto alla quota impostata. Poiché il controllo di violazione di quota si verifica alla fine di una transazione, il limite di dimensioni può superare temporaneamente la quota all'interno di una transazione prima del commit. Quando una transazione supera la quota, Amazon Redshift interrompe la transazione, vieta le successive operazioni di importazione e ripristina tutte le modifiche fino a quando non si libera spazio su disco. A causa delle operazioni VACUUM e pulizia interna che avvengono in background, è possibile che uno schema non sia pieno nel momento in cui si controlla lo schema dopo una transazione interrotta.   
In via eccezionale, Amazon Redshift ignora la violazione della quota e in alcuni casi esegue il commit delle transazioni. Amazon Redshift esegue questa operazione per le transazioni che consistono esclusivamente in una o più delle seguenti istruzioni in cui non è presente un'istruzione di importazione INSERT o COPY nella stessa transazione:  
+ DELETE
+ TRUNCATE
+ VACUUM
+ DROP TABLE
+ ALTER TABLE APPEND solo quando si spostano i dati dallo schema completo a un altro schema non completo

 *SENZA LIMITI*   
Amazon Redshift non impone limiti alla crescita della dimensione totale dello schema.

## Limits
<a name="r_CREATE_SCHEMA-limit"></a>

Amazon Redshift applica i seguenti limiti per gli schemi.
+ Un massimo di 9900 schemi per database.

## Esempi
<a name="r_CREATE_SCHEMA-examples"></a>

L'esempio seguente crea uno schema denominato US\$1SALES e assegna la proprietà all'utente DWUSER.

```
create schema us_sales authorization dwuser;
```

L'esempio seguente crea uno schema denominato US\$1SALES, assegna la proprietà all'utente DWUSER e imposta la quota su 50 GB.

```
create schema us_sales authorization dwuser QUOTA 50 GB;
```

Per visualizzare il nuovo schema, eseguire una query sulla tabella del catalogo PG\$1NAMESPACE come mostrato di seguito.

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

L'esempio seguente crea lo schema US\$1SALES oppure non esegue nulla e restituisce un messaggio se lo schema esiste già.

```
create schema if not exists us_sales;
```

# CREATE TABLE
<a name="r_CREATE_TABLE_NEW"></a>

Crea una nuova tabella nel database corrente. Definire un elenco di colonne, ognuna delle quali contiene dati di un tipo distinto. Il proprietario della tabella è l'emittente del comando CREATE TABLE.

## Privilegi richiesti
<a name="r_CREATE_TABLE-privileges"></a>

Di seguito sono riportati i privilegi richiesti per CREATE TABLE:
+ Superuser
+ Utenti con il privilegio CREATE TABLE

## Sintassi
<a name="r_CREATE_TABLE_NEW-synopsis"></a>

```
CREATE [ [LOCAL ] { TEMPORARY | TEMP } ] TABLE
[ IF NOT EXISTS ] table_name
( { column_name data_type [column_attributes] [ column_constraints ]
  | table_constraints
  | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }
  [, ... ]  )
[ BACKUP { YES | NO } ]
[table_attributes]

where column_attributes are:
  [ DEFAULT default_expr ]
  [ IDENTITY ( seed, step ) ]
  [ GENERATED BY DEFAULT AS IDENTITY ( seed, step ) ]
  [ ENCODE encoding ]
  [ DISTKEY ]
  [ SORTKEY ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]

and column_constraints are:
  [ { NOT NULL | NULL } ]
  [ { UNIQUE  |  PRIMARY KEY } ]
  [ REFERENCES reftable [ ( refcolumn ) ] ]

and table_constraints  are:
  [ UNIQUE ( column_name [, ... ] ) ]
  [ PRIMARY KEY ( column_name [, ... ] )  ]
  [ FOREIGN KEY (column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]


and table_attributes are:
  [ DISTSTYLE { AUTO | EVEN | KEY | ALL } ]
  [ DISTKEY ( column_name ) ]
  [ [COMPOUND | INTERLEAVED ] SORTKEY ( column_name [,...]) |  [ SORTKEY AUTO ] ]
  [ ENCODE AUTO ]
```

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

LOCAL   
Opzionale. Sebbene questa parola chiave sia accettata nell'istruzione, non ha alcun effetto in Amazon Redshift.

TEMPORARY \$1 TEMP   
Parola chiave che crea una tabella temporanea visibile solo all'interno della sessione corrente. La tabella viene automaticamente eliminata alla fine della sessione in cui è stata creata. La tabella temporanea può avere lo stesso nome di una tabella permanente. La tabella temporanea viene creata in uno schema separato, specifico per la sessione. Non puoi specificare un nome per questo schema. Questo schema temporaneo diventa il primo schema nel percorso di ricerca, quindi la tabella temporanea ha la precedenza sulla tabella permanente a meno che non si qualifichi il nome della tabella con il nome dello schema per accedere alla tabella permanente. Per ulteriori informazioni sugli schemi e sulla precedenza, consultare [search\$1path](r_search_path.md).  
Per impostazione predefinita, gli utenti del database hanno l'autorizzazione di creare tabelle temporanee tramite la loro appartenenza automatica al gruppo PUBLIC. Per negare questo privilegio a un utente, revoca il privilegio TEMP dal gruppo PUBLIC e quindi concedi esplicitamente il privilegio TEMP solo a utenti o gruppi specifici di utenti.

IF NOT EXISTS  
Clausola che indica che se la tabella specificata esiste già, il comando non deve apportare modifiche e deve restituire un messaggio che indica che la tabella esiste, piuttosto che terminare con un errore. Tenere presente che la tabella esistente potrebbe non essere come quella che sarebbe stata creata, per il confronto viene utilizzato solo il nome della tabella.  
Questa clausola è utile durante lo scripting, quindi lo script ha esito positivo se CREATE TABLE tenta di creare una tabella già esistente.

 *table\$1name*   
Nome della tabella da creare.  
Se specifichi un nome di tabella che inizia con "\$1", la tabella viene creata come tabella temporanea. Di seguito è riportato un esempio:  

```
create table #newtable (id int);
```
È anche possibile fare riferimento alla tabella con il carattere '\$1 '. Esempio:   

```
select * from #newtable;
```
La lunghezza massima per il nome della tabella è 127 byte; i nomi più lunghi vengono troncati a 127 byte. Puoi utilizzare caratteri multibyte UTF-8 fino a un massimo di quattro byte. Amazon Redshift applica una quota del numero di tabelle per cluster per tipo di nodo, comprese le tabelle temporanee definite dall'utente e le tabelle temporanee create da Amazon Redshift durante l'elaborazione delle query o la manutenzione del sistema. Facoltativamente, puoi qualificare il nome della tabella con il nome dello schema e del database. Nell'esempio seguente, il nome del database è `tickit`, il nome dello schema è `public` e il nome della tabella è `test`.   

```
create table tickit.public.test (c1 int);
```
Se il database o lo schema non esiste, la tabella non viene creata e l'istruzione restituisce un errore. Non è possibile creare tabelle o viste nei database di sistema `template0`, `template1`, `padb_harvest` o `sys:internal`.  
Se viene specificato un nome dello schema, la nuova tabella viene creata in quello schema (presupponendo che il creatore abbia accesso allo schema). Il nome della tabella deve essere un nome univoco per lo schema. Se non viene specificato alcuno schema, la tabella viene creata utilizzando lo schema del database corrente. Se stai creando una tabella temporanea, non puoi specificare un nome schema perché le tabelle temporanee esistono in uno schema speciale.  
Più tabelle temporanee con lo stesso nome possono esistere contemporaneamente nello stesso database se vengono create in sessioni separate perché le tabelle sono assegnate a schemi diversi. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

 *column\$1name*   
Nome di una colonna da creare nella nuova tabella. La lunghezza massima per il nome della colonna è 127 byte; i nomi più lunghi vengono troncati a 127 byte. Puoi utilizzare caratteri multibyte UTF-8 fino a un massimo di quattro byte. Il numero massimo di colonne che puoi definire in una singola tabella è 1.600. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).  
Se stai creando una "tabella di grandi dimensioni", assicurati che il tuo elenco di colonne non superi i limiti della larghezza delle righe per i risultati intermedi durante i carichi e l'elaborazione delle query. Per ulteriori informazioni, consulta [Note per l'utilizzo](#r_CREATE_TABLE_usage).

 *data\$1type*   
Tipo dei dati della colonna da creare. Per le colonne CHAR e VARCHAR, puoi utilizzare la parola chiave MAX invece di dichiarare una lunghezza massima. MAX imposta la lunghezza massima a 4.096 byte per CHAR o a 65.535 byte per VARCHAR. La dimensione massima di un oggetto di tipo GEOMETRY è di 1.048.447 byte.  
Per informazioni sui tipi di dati supportati da Amazon Redshift, consultare [Tipi di dati](c_Supported_data_types.md).

DEFAULT *default\$1expr*   <a name="create-table-default"></a>
Clausola che assegna un valore di dati predefinito per la colonna. Il tipo di dati di *default\$1expr* deve corrispondere al tipo di dati della colonna. Il valore DEFAULT deve essere un'espressione senza variabili. Le sottoquery, i riferimenti incrociati ad altre colonne della tabella corrente e le funzioni definite dall'utente non sono consentiti.  
L'espressione *default\$1expr* è utilizzata in qualsiasi operazione INSERT che non specifica un valore per la colonna. Se non viene specificato alcun valore predefinito, il valore predefinito per la colonna è null.  
Se un'operazione COPY con un elenco di colonne definito omette una colonna che ha un valore DEFAULT, il comando COPY inserisce il valore di *default\$1expr*.

IDENTITY(*seed*, *step*)   <a name="identity-clause"></a>
Clausola che specifica che la colonna è una colonna IDENTITY. Una colonna IDENTITY contiene valori univoci generati automaticamente. Il tipo di dati per una colonna IDENTITY deve essere INT o BIGINT.   
Quando aggiungi righe utilizzando un'istruzione `INSERT` o `INSERT INTO [tablename] VALUES()`, questi valori iniziano con il valore specificato come *seed* e si incrementano del numero specificato come *step*.   
Quando carichi la tabella utilizzando un'istruzione `INSERT INTO [tablename] SELECT * FROM` o `COPY`, i dati vengono caricati in parallelo e distribuiti alle sezioni del nodo. Per essere certi che i valori di identità siano univoci, Amazon Redshift salta un numero di valori al momento della creazione dei valori di identità. I valori di identità sono univoci, ma l'ordine potrebbe non corrispondere a quello nel file sorgente. 

GENERATED BY DEFAULT AS IDENTITY(*seed*, *step*)   <a name="identity-generated-bydefault-clause"></a>
Clausola che specifica che la colonna è una colonna IDENTITY predefinita e consente di assegnare automaticamente un valore univoco alla colonna. Il tipo di dati per una colonna IDENTITY deve essere INT o BIGINT. Quando aggiungi righe senza valori, questi valori iniziano con il valore specificato come *seed* e si incrementano del numero specificato come *step*. Per informazioni su come i valori vengono generati, consulta [IDENTITY](#identity-clause).  
Inoltre, durante INSERT, UPDATE o COPY pè possibile fornire un valore senza EXPLICIT\$1IDS. Amazon Redshift utilizza tale valore per inserirlo nella colonna di identità invece di utilizzare il valore generato dal sistema. Il valore può essere un duplicato, un valore minore del seed o un valore compreso tra valori di step. Amazon Redshift non controlla l'univocità dei valori nella colonna. A condizione che il valore non influenzi il prossimo valore generato dal sistema.  
Se è richiesta l'univocità nella colonna, non aggiungere un valore duplicato. Aggiungere, invece, un valore univoco che è minore del seed o compreso tra valori di step.
Tenere presente quanto segue riguardo le colonne di identità predefinite:   
+ Le colonne di identità predefinite sono NON NULL. Non è possibile inserire NULL.
+ Per inserire un valore generato in una colonna di identità predefinita, utilizzare la parola chiave `DEFAULT`. 

  ```
  INSERT INTO tablename (identity-column-name) VALUES (DEFAULT);
  ```
+ I valori di sostituzione di una colonna di identità predefinita non influenzano il successivo valore generato. 
+ Non puoi aggiungere una colonna di identità predefinita con l'istruzione ALTER ADD COLUMN. 
+ Puoi aggiungere una colonna di identità predefinita con l'istruzione ALTER TABLE APPEND. 

ENCODE *encoding*   
La codifica della compressione per una colonna. ENCODE AUTO è l'impostazione di default per le tabelle. Amazon Redshift gestisce automaticamente la codifica di compressione per tutte le colonne della tabella. Se si specifica la codifica di compressione per qualsiasi colonna della tabella, la tabella non è più impostata su ENCODE AUTO. Amazon Redshift non gestisce più automaticamente la codifica di compressione per tutte le colonne della tabella. È possibile specificare l'opzione ENCODE AUTO per la tabella per consentire ad Amazon Redshift di gestire automaticamente la codifica di compressione per tutte le colonne della tabella.  
  
Amazon Redshift assegna automaticamente una codifica di compressione iniziale alle colonne per le quali la codifica di compressione non si specifica come segue:  
+ Per impostazione predefinita, tutte le colonne nelle tabelle temporanee vengono assegnate alla compressione RAW.
+ Le colonne definite come chiavi di ordinamento vengono assegnate alla compressione RAW.
+ Alle colonne definite come tipi di dati BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY o GEOGRAPHY viene assegnata la compressione di tipo RAW.
+ Alle colonne definite come SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ viene assegnata la compressione. AZ64
+ Le colonne definite come CHAR, VARCHAR o VARBYTE sono assegnate alla compressione LZO.
Se non vuoi che una colonna venga compressa, specifica esplicitamente la codifica RAW.
 Sono supportate le seguenti [compression encodings](c_Compression_encodings.md#compression-encoding-list):  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (nessuna compressione)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD

DISTKEY  
Parola chiave che specifica che la colonna è la chiave di distribuzione per la tabella. Solo una colonna in una tabella può essere la chiave di distribuzione. Puoi utilizzare la parola chiave DISTKEY dopo il nome di una colonna o come parte della definizione della tabella utilizzando la sintassi DISTKEY (*column\$1name*). Entrambi i metodi hanno lo stesso effetto. Per ulteriori informazioni, vedi il parametro DISTSTYLE più avanti in questo argomento.  
Il tipo di dati di una colonna chiave di distribuzione può essere: BOOLEAN, REAL, DOUBLE PRECISION, SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ, CHAR o VARCHAR.

SORTKEY  
Parola chiave che specifica che la colonna è la chiave di ordinamento per la tabella. Quando vengono caricati nella tabella, i dati vengono ordinati in base a una o più colonne designate come chiavi di ordinamento. Puoi utilizzare la parola chiave SORTKEY dopo il nome di una colonna per specificare una chiave di ordinamento a colonna singola oppure puoi specificare una o più colonne come colonne chiave di ordinamento per la tabella utilizzando la sintassi SORTKEY (*column\$1name* [, ...]). Solo le chiavi di ordinamento composte vengono create con questa sintassi.  
Puoi definire un massimo di 400 colonne SORTKEY per tabella.  
Il tipo di dati di una colonna della chiave di ordinamento può essere: BOOLEAN, REAL, DOUBLE PRECISION, SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ, CHAR o VARCHAR.

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
Una clausola che specifica se la stringa di ricerca o il confronto per la colonna fa distinzione o meno tra maiuscole e minuscole. Il valore di default corrisponde alla stessa configurazione corrente della distinzione tra maiuscole e minuscole del database.  
COLLATE è supportato solo su tipi di dati basati su stringhe, inclusi CHAR, VARCHAR e valori di stringa all'interno delle colonne SUPER. Per i dettagli sull'interrogazione dei dati SUPER senza distinzione tra maiuscole e minuscole, vedere. [Interrogazione senza distinzione tra maiuscole e min](query-super.md#case-insensitive-super-queries)  
Per informazioni sul confronto di database, utilizzare il comando seguente:  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE e CS sono intercambiabili e producono gli stessi risultati. Allo stesso modo CASE\$1INSENSITIVE e CI sono intercambiabili e producono gli stessi risultati.

NOT NULL \$1 NULL   
NOT NULL specifica che la colonna non può contenere valori null. NULL, il valore predefinito, specifica che la colonna accetta valori nulli. Le colonne IDENTITY sono dichiarate NOT NULL per impostazione predefinita.

UNIQUE  
Parola chiave che specifica che la colonna può contenere solo valori univoci. Il comportamento del vincolo di tabella univoco è uguale a quello dei vincoli di colonna, con la possibilità di estendersi su più colonne. Per definire un vincolo di tabella univoco, utilizza la sintassi UNIQUE ( *column\$1name* [, ... ] ).  
I vincoli univoci sono informativi e non vengono applicati dal sistema.

PRIMARY KEY  
Parola chiave che specifica che la colonna è la chiave primaria per la tabella. È possibile definire solo una colonna come chiave primaria utilizzando una definizione di colonna. Per definire un vincolo di tabella con una chiave primaria a più colonne, utilizza la sintassi PRIMARY KEY ( *column\$1name* [, ... ] ).  
L'identificazione di una colonna come chiave primaria fornisce i metadati relativi alla progettazione dello schema. Una chiave primaria implica che altre tabelle possono fare affidamento su questo set di colonne come identificatore univoco per le righe. È possibile specificare una chiave primaria per una tabella, sia come vincolo di colonna sia come vincolo di tabella. Il vincolo di chiave primaria deve nominare un set di colonne diverso da altri set di colonne nominati da qualsiasi vincolo univoco definito per la stessa tabella.  
Le colonne PRIMARY KEY sono anche definite come NOT NULL.  
I vincoli della chiave primaria sono solo informativi. Non vengono applicati dal sistema, ma vengono utilizzati dal pianificatore.

References *reftable* [ ( *refcolumn* ) ]  
Clausola che specifica un vincolo di chiave esterna che implica che la colonna deve contenere solo valori che corrispondono ai valori nella colonna di riferimento di alcune righe della tabella di riferimento. Le colonne di riferimento devono essere le colonne di un vincolo di chiave primaria o univoco nella tabella di riferimento.   
 I vincoli della chiave esterna sono solo informativi. Non vengono applicati dal sistema, ma vengono utilizzati dal pianificatore. 

LIKE *parent\$1table* [ \$1 INCLUDING \$1 EXCLUDING \$1 DEFAULTS ]   <a name="create-table-like"></a>
Clausola che specifica una tabella esistente da cui la nuova tabella copia automaticamente i nomi delle colonne, i tipi di dati e i vincoli NOT NULL. La nuova tabella e la tabella padre vengono disassociate e tutte le modifiche apportate alla tabella padre non vengono applicate alla nuova tabella. Le espressioni predefinite per le definizioni delle colonne copiate vengono copiate solo se è specificato INCLUDING DEFAULTS. Il comportamento predefinito consiste nell'escludere le espressioni predefinite, in modo che tutte le colonne della nuova tabella abbiano valori predefiniti null.   
Le tabelle create con l'opzione LIKE non ereditano i vincoli di chiave primaria ed esterna. Lo stile di distribuzione, le chiavi di ordinamento e le proprietà BACKUP e NULL vengono ereditate dalle tabelle LIKE, ma non è possibile impostarle in modo esplicito nell'istruzione CREATE TABLE ... Istruzione LIKE.

BACKUP \$1 YES \$1 NO \$1   <a name="create-table-backup"></a>
Clausola che specifica se la tabella deve essere inclusa negli snapshot di cluster automatizzati e manuali.   
Per le tabelle come le tabelle di gestione temporanea che non contengono dati critici, specificare BACKUP NO per risparmiare tempo di elaborazione durante la creazione di snapshot e il ripristino da snapshot e per ridurre lo spazio di archiviazione in Amazon Simple Storage Service. L’impostazione BACKUP NO non ha alcun effetto sulla replica automatica dei dati in altri nodi all’interno del cluster. Pertanto le tabelle con BACKUP NO specificato vengono ripristinate in caso di errore del nodo. L'impostazione predefinita è BACKUP YES.  
Le tabelle senza backup non sono supportate per i cluster con RA3 provisioning e i gruppi di lavoro Serverless Amazon Redshift. Una tabella contrassegnata come senza backup in un RA3 cluster o in un gruppo di lavoro senza server viene trattata come una tabella permanente di cui verrà sempre eseguito il backup durante l'acquisizione di un'istantanea e sempre ripristinata durante il ripristino da un'istantanea. Per evitare i costi legati agli snapshot per le tabelle senza backup, troncale prima di acquisire uno snapshot.

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
Parola chiave che definisce lo stile di distribuzione dei dati per l'intera tabella. Amazon Redshift distribuisce le righe di una tabella nei nodi di calcolo a seconda dello stile di distribuzione specificato per la tabella. Il valore predefinito è AUTO.  
Lo stile di distribuzione selezionato per le tabelle influisce sulle prestazioni generali del database. Per ulteriori informazioni, consulta [Distribuzione dei dati per l’ottimizzazione delle query](t_Distributing_data.md). Gli stili di distribuzione possibili sono i seguenti:  
+ AUTO: Amazon Redshift assegna uno stile di distribuzione ottimale basato sui dati della tabella. Ad esempio, se viene specificato lo stile di distribuzione AUTO, Amazon Redshift assegna inizialmente la distribuzione ALL a una tabella di piccole dimensioni. Quando le dimensioni della tabella aumentano, Amazon Redshift potrebbe modificare lo stile di distribuzione in KEY, scegliendo la chiave primaria (o una colonna della chiave primaria composita) come DISTKEY. Se le dimensioni della tabella aumentano e nessuna delle colonne è adatta per essere utilizzata come DISTKEY, Amazon Redshift modifica lo stile di distribuzione in EVEN. La modifica dello stile di distribuzione avviene in background con un impatto minimo sulle query degli utenti. 

  Per visualizzare lo stile di distribuzione applicato a una tabella, eseguire una query sulla tabella del catalogo di sistema PG\$1CLASS. Per ulteriori informazioni, consulta [Visualizzazione degli stili di distribuzione](viewing-distribution-styles.md). 
+ EVEN: i dati della tabella sono distribuiti uniformemente tra i nodi di un cluster in una distribuzione round robin. IDs Le righe vengono utilizzate per determinare la distribuzione e su ogni nodo viene distribuito all'incirca lo stesso numero di righe. 
+ KEY: i dati sono distribuiti dai valori nella colonna DISTKEY. Quando imposti le colonne di unione delle tabelle di unione come chiavi di distribuzione, le righe di unione di entrambe le tabelle sono collocate nei nodi di calcolo. Quando i dati sono collocati, l'ottimizzatore può eseguire i join in modo più efficiente. Se specifichi DISTSTYLE KEY, devi nominare una colonna DISTKEY per la tabella o come parte della definizione della colonna. Per ulteriori informazioni, vedi il precedente parametro DISTKEY in questo argomento.
+  ALL: copia dell'intera tabella viene distribuita a ogni nodo. Questo stile di distribuzione garantisce che tutte le righe richieste per ogni join siano disponibili su ogni nodo, ma moltiplica i requisiti di storage e aumenta i tempi di caricamento e manutenzione per la tabella. La distribuzione ALL può migliorare i tempi di esecuzione quando viene utilizzata con determinate tabelle di dimensioni in cui la distribuzione KEY non è appropriata, ma i miglioramenti delle prestazioni devono essere confrontati con i costi di manutenzione. 

DISTKEY ( *column\$1name* )  
Vincolo che specifica che la colonna da usare come chiave di distribuzione per la tabella. Puoi utilizzare la parola chiave DISTKEY dopo il nome di una colonna o come parte della definizione della tabella utilizzando la sintassi DISTKEY (*column\$1name*). Entrambi i metodi hanno lo stesso effetto. Per ulteriori informazioni, vedi il precedente parametro DISTSTYLE in questo argomento.

[COMPOUND \$1 INTERLEAVED ] SORTKEY (* nome\$1colonna* [,...]) \$1 [ SORTKEY AUTO ]  
Specifica una o più chiavi di ordinamento per la tabella. Quando vengono caricati nella tabella, i dati vengono ordinati in base alle colonne designate come chiavi di ordinamento. Puoi utilizzare la parola chiave SORTKEY dopo il nome di una colonna per specificare una chiave di ordinamento a colonna singola oppure puoi specificare una o più colonne come colonne chiave di ordinamento per la tabella utilizzando la sintassi `SORTKEY (column_name [ , ... ] )`.   
È possibile specificare facoltativamente lo stile di ordinamento COMPOUND o INTERLEAVED. Se si specifica SORTKEY con colonne, l'impostazione di default è COMPOSE. Per ulteriori informazioni, consulta [Chiavi di ordinamento](t_Sorting_data.md).  
Se non si specifica alcuna opzione per le chiavi di ordinamento, il valore di default è AUTO.  
È possibile definire un massimo di 400 colonne COMPOUND SORTKEY o 8 colonne INTERLEAVED SORTKEY per tabella.     
AUTO  
Specifica che Amazon Redshift assegna una chiave di ordinamento ottimale basata sui dati della tabella. Ad esempio, se viene specificata la chiave di ordinamento AUTO, Amazon Redshift inizialmente non assegna alcuna chiave di ordinamento a una tabella. Se Amazon Redshift determina che una chiave di ordinamento migliorerà le prestazioni delle query, Amazon Redshift potrebbe modificare la chiave di ordinamento della tabella. L'ordinamento effettivo della tabella viene eseguito dall'ordinamento automatico della tabella. Per ulteriori informazioni, consulta [Ordinamento automatico delle tabelle](t_Reclaiming_storage_space202.md#automatic-table-sort).   
Amazon Redshift non modifica le tabelle con chiavi di ordinamento o di distribuzione esistenti. Con un'eccezione, se una tabella ha una chiave di distribuzione che non è mai stata utilizzata in un JOIN, la chiave potrebbe essere modificata se Amazon Redshift determina che esiste una chiave migliore.   
Per visualizzare la chiave di ordinamento di una tabella, eseguire una query sulla vista del catalogo di sistema SVV\$1TABLE\$1INFO. Per ulteriori informazioni, consulta [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md). Per visualizzare i suggerimenti di Amazon Redshift Advisor per le tabelle, eseguire una query sulla vista del catalogo di sistema SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS. Per ulteriori informazioni, consulta [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md). Per visualizzare le azioni intraprese da Amazon Redshift, eseguire una query sulla vista del catalogo di sistema SVL\$1AUTO\$1WORKER\$1ACTION. Per ulteriori informazioni, consulta [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md).   
COMPOUND  
Specifica che i dati sono ordinati utilizzando una chiave composta costituita da tutte le colonne elencate, nell'ordine in cui sono elencate. Una chiave di ordinamento composta è più utile quando una query esegue la scansione delle righe in base all'ordine delle colonne di ordinamento. I vantaggi in termini di prestazioni dell'ordinamento con una chiave composta diminuiscono quando le query si basano su colonne di ordinamento secondarie. Puoi definire un massimo di 400 colonne COMPOUND SORTKEY per tabella.   
INTERLEAVED  
Specifica che i dati sono ordinati utilizzando una chiave di ordinamento "interlacciato". È possibile specificare un massimo di otto colonne per una chiave di ordinamento "interlacciato".   
L'ordinamento "interlacciato" fornisce uguale peso a ciascuna colonna, o sottoinsieme di colonne, nella chiave di ordinamento, quindi le query non dipendono dall'ordine delle colonne nella chiave di ordinamento. Quando una query utilizza una o più colonne di ordinamento secondarie, l'ordinamento "interlacciato" migliora in modo significativo le prestazioni delle query. L'ordinamento "interlacciato" comporta un piccolo costo generale per il caricamento dei dati e le operazioni di vacuum.   
Non utilizzare una chiave di ordinamento "interlacciato" su colonne con attributi monotonicamente crescenti, come colonne di identità, date o timestamp.

ENCODE AUTO   
Consente ad Amazon Redshift di regolare automaticamente il tipo di codifica per tutte le colonne della tabella per ottimizzare le prestazioni delle query. ENCODE AUTO conserva i tipi di codifica iniziali specificati durante la creazione della tabella. Quindi, se Amazon Redshift determina che un nuovo tipo di codifica può migliorare le prestazioni delle query, Amazon Redshift può modificare il tipo di codifica delle colonne della tabella. ENCODE AUTO è l'impostazione di default se non si specifica un tipo di codifica in nessuna colonna della tabella.

UNIQUE ( *column\$1name* [,...] )  
Vincolo che specifica che un gruppo di una o più colonne di una tabella può contenere solo valori univoci. Il comportamento del vincolo di tabella univoco è uguale a quello dei vincoli di colonna, con la possibilità di estendersi su più colonne. Nel contesto dei vincoli univoci, i valori null non sono considerati uguali. Ogni vincolo di tabella univoco deve denominare un insieme di colonne diverso dal set di colonne denominato da qualsiasi altro vincolo di chiave univoco o primario definito per la tabella.   
 I vincoli univoci sono informativi e non vengono applicati dal sistema. 

PRIMARY KEY ( *column\$1name* [,...] )  
Vincolo che specifica che una colonna o un numero di colonne di una tabella può contenere solo valori non null univoci (non duplicati). L'identificazione di un set di colonne come chiave primaria fornisce anche i metadati relativi alla progettazione dello schema. Una chiave primaria implica che altre tabelle possono fare affidamento su questo set di colonne come identificatore univoco per le righe. È possibile specificare una chiave primaria per una tabella, sia come vincolo di una singola colonna sia come vincolo di tabella. Il vincolo di chiave primaria deve nominare un set di colonne diverso da altri set di colonne nominati da qualsiasi vincolo univoco definito per la stessa tabella.   
 I vincoli della chiave primaria sono solo informativi. Non vengono applicati dal sistema, ma vengono utilizzati dal pianificatore. 

FOREIGN KEY ( *column\$1name* [, ... ] ) REFERENCES *reftable* [ ( *refcolumn* ) ]   
Vincolo che specifica un vincolo di chiave esterna, che richiede che un gruppo di una o più colonne della nuova tabella contenga solo valori che corrispondono a quelli nelle colonne di riferimento di alcune righe della tabella di riferimento. Se *refcolumn* viene omesso, viene usata la chiave primaria di *reftable*. Le colonne di riferimento devono essere le colonne di un vincolo di chiave primaria o univoco nella tabella di riferimento.  
I vincoli della chiave esterna sono solo informativi. Non vengono applicati dal sistema, ma vengono utilizzati dal pianificatore.

## Note per l'utilizzo
<a name="r_CREATE_TABLE_usage"></a>

In modo univoco, le limitazioni della chiave esterna e della chiave primaria sono solo a livello informativo e *non vengono applicate da Amazon Redshift* quando si popola una tabella. Ad esempio, se si inseriscono dati in una tabella con dipendenze, l'inserimento può avere esito positivo anche se viola il vincolo. Tuttavia, la chiave esterna e quella primaria vengono utilizzate come suggerimenti di pianificazione. Queste dovrebbero essere dichiarate se il processo ETL o altri processi nell'applicazione applicano la loro integrità. Per informazioni su come eliminare una tabella con dipendenze, consultare [DROP TABLE](r_DROP_TABLE.md).

### Limiti e quote
<a name="r_CREATE_TABLE_usage-limits"></a>

Quando crei una tabella, considera i seguenti limiti.
+ Esiste un limite per il numero massimo di tabelle in un cluster per tipo di nodo. Per ulteriori informazioni, consulta [Limiti](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) nella *Guida alla gestione di Amazon Redshift*. 
+ Il numero massimo di caratteri per un nome di tabella è 127. 
+ Il numero massimo di colonne che puoi definire in una singola tabella è 1.600. 
+ Il numero massimo di colonne SORTKEY che puoi definire in una singola tabella è 400. 

### Riepilogo delle impostazioni a livello di colonna e delle impostazioni a livello di tabella
<a name="r_CREATE_TABLE_usage-summary_of_settings"></a>

 Diversi attributi e impostazioni possono essere impostati a livello di colonna o a livello di tabella. In alcuni casi, l'impostazione di un attributo o vincolo a livello di colonna o a livello di tabella ha lo stesso effetto. In altri casi, producono risultati diversi. 

 Il seguente elenco riepiloga le impostazioni a livello di colonna e a livello di tabella: 

DISTKEY  
Non vi è alcuna differenza in termini di effetti se impostati a livello di colonna o a livello di tabella.   
Se DISTKEY è impostato, a livello di colonna o a livello di tabella, DISTSTYLE deve essere impostato su KEY o non impostato affatto. DISTSTYLE può essere impostato solo a livello di tabella. 

SORTKEY  
Se impostato a livello di colonna, SORTKEY deve essere una singola colonna. Se SORTKEY è impostato a livello di tabella, una o più colonne possono costituire una chiave di ordinamento composto o "interlacciato" composto. 

COLLATE CASE\$1SENSITIVE \$1 COLLATE CASE\$1INSENSITIVE  
Amazon Redshift non supporta la modifica della configurazione della distinzione tra maiuscole e minuscole per una colonna. Quando aggiungi una nuova colonna alla tabella, Amazon Redshift utilizza il valore predefinito per la distinzione tra maiuscole e minuscole. Amazon Redshift non supporta la parola chiave COLLATE quando si aggiunge una nuova colonna.  
Per informazioni su come creare i database mediante il confronto di database, consultare [CREATE DATABASE](r_CREATE_DATABASE.md).  
Per ulteriori informazioni sulla funzione COLLATE, consultare [Funzione COLLATE](r_COLLATE.md).

UNIQUE  
A livello di colonna, una o più chiavi possono essere impostate su UNIQUE; il vincolo UNIQUE si applica a ciascuna colonna singolarmente. Se UNIQUE è impostato a livello di tabella, una o più colonne possono costituire un vincolo UNIQUE composito. 

PRIMARY KEY  
Se impostato a livello di colonna, PRIMARY KEY deve essere una singola colonna. Se PRIMARY KEY è impostato a livello di tabella, una o più colonne possono costituire una chiave primaria. 

FOREIGN KEY  
Non vi è alcuna differenza in termini di effetti se FOREIGN KEY è impostato a livello di colonna o a livello di tabella. A livello di colonna, la sintassi è semplicemente `REFERENCES` *reftable* [ ( *refcolumn* )]. 

### Distribuzione dei dati in arrivo
<a name="r_CREATE_TABLE_usage-distribution-of-incoming-data"></a>

Quando lo schema di distribuzione dell'hash dei dati in arrivo corrisponde a quello della tabella di destinazione, non è necessaria alcuna distribuzione fisica dei dati quando i dati vengono caricati. Ad esempio, se una chiave di distribuzione è impostata per la nuova tabella e i dati vengono inseriti da un'altra tabella che viene distribuita sulla stessa colonna chiave, i dati vengono caricati in posizione, utilizzando gli stessi nodi e sezioni. Tuttavia, se le tabelle di origine e di destinazione sono entrambe impostate sulla distribuzione EVEN, i dati vengono ridistribuiti nella tabella di destinazione.

### Tabelle estese
<a name="r_CREATE_TABLE_usage-wide-tables"></a>

Potrebbe essere possibile creare una tabella molto ampia ma non essere in grado di eseguire l'elaborazione della query, come le istruzioni INSERT o SELECT, sulla tabella. La larghezza massima di una tabella con colonne a larghezza fissa, come CHAR, è 64 KB - 1 (o 65535 byte). Se la tabella include le colonne VARCHAR, può avere una larghezza dichiarata più ampia senza restituire un errore poiché le colonne VARCHARS non contribuiscono con la loro larghezza dichiarata completa al limite calcolato di elaborazione della query. Il limite effettivo di elaborazione della query con le colonne VARCHAR varierà in base a una serie di fattori.

Se una tabella è troppo ampia per l'inserimento o la selezione, ricevi il seguente errore.

```
ERROR:  8001
DETAIL:  The combined length of columns processed in the SQL statement
exceeded the query-processing limit of 65535 characters (pid:7627)
```

## Esempi
<a name="r_CREATE_TABLE_usage-examples"></a>

Per esempi che mostrano come utilizzare il comando CREATE TABLE, consulta l'argomento [Esempi](r_CREATE_TABLE_examples.md).

# Esempi
<a name="r_CREATE_TABLE_examples"></a>

I seguenti esempi dimostrano vari attributi di colonna e tabella nelle istruzioni CREATE TABLE di Amazon Redshift. Per ulteriori informazioni su CREATE TABLE, incluse le definizioni dei parametri, consulta [CREATE TABLE](r_CREATE_TABLE_NEW.md).

Molti esempi utilizzano tabelle e dati del set di dati di esempio *TICKIT*. Per ulteriori informazioni, consulta [Database di esempio](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html).

 È possibile aggiungere un prefisso al nome della tabella con il nome del database e il nome dello schema in un comando CREATE TABLE. Ad esempio, `dev_database.public.sales`. Il nome del database deve essere il database a cui si è connessi. Qualsiasi tentativo di creare oggetti di database in un altro database restituisce un errore di operazione non valida.

## Creazione di una tabella con una chiave di distribuzione, una chiave di ordinamento composta e una compressione
<a name="r_CREATE_TABLE_examples-create-a-table-with-distribution-key"></a>

L'esempio seguente crea una tabella SALES nel database TICKIT con compressione definita per più colonne. LISTID è dichiarato come chiave di distribuzione e LISTID e SELLERID sono dichiarati come una chiave di ordinamento composto a più colonne. Anche i vincoli della chiave primaria e della chiave esterna sono definiti per la tabella. Prima di creare la tabella nell'esempio, potrebbe essere necessario aggiungere un vincolo UNIQUE a ogni colonna a cui fa riferimento una chiave esterna, se i vincoli non esistono.

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

I risultati sono i seguenti:

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

Nell'esempio seguente viene creata la tabella t1 con una colonna col1 senza distinzione tra maiuscole e minuscole.

```
create table T1 (
  col1 Varchar(20) collate case_insensitive
 );
            
insert into T1 values ('bob'), ('john'), ('Tom'), ('JOHN'), ('Bob');
```

Esecuzione di query sulla tabella:

```
select * from T1 where col1 = 'John';
   
col1
------
 john
 JOHN
(2 rows)
```

## Creazione di una tabella usando una chiave di ordinamento interlacciato
<a name="CREATE_TABLE_NEW-create-a-table-using-interleaved-sortkey"></a>

L'esempio seguente crea la tabella CUSTOMER con una chiave di ordinamento "interlacciato".

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

## Creazione di una tabella utilizzando IF NOT EXISTS
<a name="CREATE_TABLE_NEW-create-a-table-using-if-not-exists"></a>

 L'esempio seguente crea la tabella CITIES oppure non esegue nulla e restituisce un messaggio se lo schema esiste già:

```
create table if not exists cities(
cityid integer not null,
city varchar(100) not null,
state char(2) not null);
```

## Creazione di una tabella con distribuzione ALL
<a name="CREATE_TABLE_NEW-create-a-table-with-all-distribution"></a>

 L'esempio seguente crea la tabella VENUE con la distribuzione ALL. 

```
create table venue(
venueid smallint not null,
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid))
diststyle all;
```

## Creazione di una tabella con distribuzione EVEN
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-even-distribution"></a>

Il seguente esempio crea una tabella chiamata MYEVENT con tre colonne. 

```
create table myevent(
eventid int,
eventname varchar(200),
eventcity varchar(30))
diststyle even;
```

La tabella è distribuita in modo uniforme e non è ordinata. La tabella non ha colonne DISTKEY o SORTKEY dichiarate. 

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

## Creazione di una tabella temporanea simile a un'altra tabella
<a name="r_CREATE_TABLE_NEW-create-a-temporary-table-that-is-like-another-table"></a>

Nell'esempio seguente viene creata una tabella temporanea denominata TEMPEVENT che eredita le colonne dalla tabella EVENT. 

```
create temp table tempevent(like event); 
```

Questa tabella eredita anche gli attributi DISTKEY e SORTKEY della tabella padre: 

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

## Creazione di una tabella con una colonna IDENTITY
<a name="r_CREATE_TABLE_NEW-create-a-table-with-an-identity-column"></a>

Nell'esempio seguente viene creata una tabella denominata VENUE\$1IDENT che ha una colonna IDENTITY denominata VENUEID. Questa colonna inizia con 0 e incrementa di 1 per ogni record. VENUEID è anche dichiarato come chiave primaria della tabella. 

```
create table venue_ident(venueid bigint identity(0, 1),
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid));
```

## Creazione di una tabella con una colonna IDENTITY predefinita
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-identity-column"></a>

L'esempio seguente crea una tabella denominata `t1`. Questa tabella contiene una colonna IDENTITY denominata `hist_id` e una colonna IDENTITY predefinita denominata `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)
);
```

L'inserimento di una riga nella tabella mostra che entrambi i valori `hist_id` e `base_id` vengono generati. 

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

L'inserimento di una seconda riga mostra che viene generato il valore predefinito per `base_id`.

```
INSERT INTO T1 (base_id, business_key, some_field) values (DEFAULT, 'B','MNOP');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
```

L'inserimento di una terza riga mostra che il valore per `base_id` non deve essere univoco.

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

## Creazione di una tabella con valori di colonna DEFAULT
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-column-values"></a>

L'esempio seguente crea una tabella CATEGORYDEF che dichiara i valori predefiniti per ogni colonna: 

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

## Opzioni DISTSTYLE, DISTKEY e SORTKEY
<a name="r_CREATE_TABLE_NEW-diststyle-distkey-and-sortkey-options"></a>

L'esempio seguente mostra come funzionano le opzioni DISTKEY, SORTKEY e DISTSTYLE. In questo esempio, COL1 è la chiave di distribuzione; pertanto, lo stile di distribuzione deve essere impostato su KEY o non impostato. Per impostazione predefinita, la tabella non dispone della chiave di ordinamento e quindi non è ordinata: 

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

Nell'esempio seguente, la stessa colonna è definita come la chiave di distribuzione e la chiave di ordinamento. Di nuovo, lo stile di distribuzione deve essere impostato su KEY o non impostato. 

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

Nell'esempio seguente, nessuna colonna è impostata come chiave di distribuzione, COL2 è impostata come chiave di ordinamento e lo stile di distribuzione è impostato su 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
```

Nell'esempio seguente, lo stile di distribuzione è impostato su EVEN e nessuna chiave di ordinamento è definita esplicitamente, quindi la tabella è distribuita in modo uniforme ma non è ordinata. 

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

## Creazione di una tabella con l'opzione ENCODE AUTO
<a name="r_CREATE_TABLE_NEW-create-a-table-with-encode-option"></a>

L'esempio seguente crea la tabella `t1` con codifica di compressione automatica. ENCODE AUTO è l'impostazione di default per le tabelle quando non si specifica un tipo di codifica in nessuna colonna.

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

L'esempio seguente crea la tabella `t2` con codifica di compressione automatica specificando ENCODE AUTO.

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

L'esempio seguente crea la tabella `t3` con codifica di compressione automatica specificando ENCODE AUTO. La colonna `c0` è definita con un tipo di codifica iniziale di DELTA. Amazon Redshift può modificare la codifica se un'altra codifica fornisce migliori prestazioni delle query.

```
create table t3(c0 int encode delta, c1 varchar) encode auto;
```

L'esempio seguente crea la tabella `t4` con codifica di compressione automatica specificando ENCODE AUTO. La colonna `c0` è definita con una codifica iniziale di DELTA e la colonna `c1` è definita con una codifica iniziale di LZO. Amazon Redshift può modificare queste codifiche se altre codifiche forniscono prestazioni di query migliori.

```
create table t4(c0 int encode delta, c1 varchar encode lzo) encode auto;
```

# CREATE TABLE AS
<a name="r_CREATE_TABLE_AS"></a>

**Topics**
+ [Sintassi](#r_CREATE_TABLE_AS-synopsis)
+ [Parameters](#r_CREATE_TABLE_AS-parameters)
+ [Note per l'utilizzo di CTAS](r_CTAS_usage_notes.md)
+ [Esempi di CTAS](r_CTAS_examples.md)

Crea una nuova tabella in base a una query. Il proprietario di questa tabella è l'utente che invia il comando.

La nuova tabella viene caricata con i dati definiti dalla query nel comando. Le colonne della tabella hanno nomi e tipi di dati associati alle colonne di output della query. Il comando CREATE TABLE AS (CTAS) crea una nuova tabella e valuta la query per caricare la nuova tabella.

## Sintassi
<a name="r_CREATE_TABLE_AS-synopsis"></a>

```
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ]
TABLE table_name
[ ( column_name [, ... ] ) ]
[ BACKUP { YES | NO } ]
[ table_attributes ]
AS query

where table_attributes are:
[ DISTSTYLE { AUTO | EVEN | ALL | KEY } ]
[ DISTKEY( distkey_identifier ) ]
[ [ COMPOUND | INTERLEAVED ] SORTKEY( column_name [, ...] ) ]
```

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

LOCAL   
Sebbene questa parola chiave opzionale sia accettata nell'istruzione, non ha alcun effetto in Amazon Redshift.

TEMPORARY \$1 TEMP   
Crea una tabella temporanea. La tabella temporanea viene automaticamente eliminata alla fine della sessione in cui è stata creata.

 *table\$1name*   
Nome della tabella da creare.  
Se specifichi un nome di tabella che inizia con "\$1", la tabella viene creata come tabella temporanea. Ad esempio:  

```
create table #newtable (id) as select * from oldtable;
```
La lunghezza massima per il nome della tabella è 127 byte; i nomi più lunghi vengono troncati a 127 byte. Amazon Redshift applica una quota del numero di tabelle per cluster per tipo di nodo. Il nome della tabella può essere qualificato con il nome del database e dello schema, come mostra la tabella seguente.  

```
create table tickit.public.test (c1) as select * from oldtable;
```
Nell'esempio seguente, `tickit` è il nome del database e `public` è il nome dello schema. Se il database o lo schema non esiste, l'istruzione restituisce un errore.  
Se viene specificato un nome dello schema, la nuova tabella viene creata in quello schema (presupponendo che il creatore abbia accesso allo schema). Il nome della tabella deve essere un nome univoco per lo schema. Se non viene specificato alcuno schema, la tabella viene creata utilizzando lo schema del database corrente. Se stai creando una tabella temporanea, non puoi specificare un nome schema perché le tabelle temporanee esistono in uno schema speciale.  
Più tabelle temporanee con lo stesso nome possono esistere contemporaneamente nello stesso database se vengono create in sessioni separate. Queste tabelle sono assegnate a schemi diversi.

 *column\$1name*   
Nome di una colonna nella nuova tabella. Se non vengono forniti nomi di colonne, i nomi delle colonne vengono presi dai nomi delle colonne di output della query. I nomi di colonna predefiniti vengono utilizzati per le espressioni. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

BACKUP \$1 YES \$1 NO \$1   
Clausola che specifica se la tabella deve essere inclusa negli snapshot di cluster automatizzati e manuali.   
Per le tabelle come le tabelle di gestione temporanea che non contengono dati critici, specificare BACKUP NO per risparmiare tempo di elaborazione durante la creazione di snapshot e il ripristino da snapshot e per ridurre lo spazio di archiviazione in Amazon Simple Storage Service. L'impostazione BACKUP NO non ha alcun effetto sulla replica automatica dei dati in altri nodi all'interno del cluster, pertanto le tabelle con BACKUP NO specificato vengono ripristinate in caso di errore del nodo. L'impostazione predefinita è BACKUP YES.  
Le tabelle senza backup non sono supportate per i cluster con RA3 provisioning e i gruppi di lavoro Serverless Amazon Redshift. Una tabella contrassegnata come senza backup in un RA3 cluster o in un gruppo di lavoro senza server viene trattata come una tabella permanente di cui verrà sempre eseguito il backup durante l'acquisizione di un'istantanea e sempre ripristinata durante il ripristino da un'istantanea. Per evitare i costi legati agli snapshot per le tabelle senza backup, troncale prima di acquisire uno snapshot.

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
Parola chiave che definisce lo stile di distribuzione dei dati per l'intera tabella. Amazon Redshift distribuisce le righe di una tabella nei nodi di calcolo a seconda dello stile di distribuzione specificato per la tabella. Il valore di default è DISTSTYLE AUTO.  
Lo stile di distribuzione selezionato per le tabelle influisce sulle prestazioni generali del database. Per ulteriori informazioni, consulta [Distribuzione dei dati per l’ottimizzazione delle query](t_Distributing_data.md).  
+ AUTO: Amazon Redshift assegna uno stile di distribuzione ottimale basato sui dati della tabella. Per visualizzare lo stile di distribuzione applicato a una tabella, eseguire una query sulla tabella del catalogo di sistema PG\$1CLASS. Per ulteriori informazioni, consulta [Visualizzazione degli stili di distribuzione](viewing-distribution-styles.md). 
+ EVEN: i dati della tabella sono distribuiti uniformemente tra i nodi di un cluster in una distribuzione round robin. IDs Le righe vengono utilizzate per determinare la distribuzione e su ogni nodo viene distribuito all'incirca lo stesso numero di righe. Questo è metodo di distribuzione predefinito.
+ KEY: i dati sono distribuiti dai valori nella colonna DISTKEY. Quando imposti le colonne di unione delle tabelle di unione come chiavi di distribuzione, le righe di unione di entrambe le tabelle sono collocate nei nodi di calcolo. Quando i dati sono collocati, l'ottimizzatore può eseguire i join in modo più efficiente. Se specifichi DISTSTYLE KEY, devi nominare una colonna DISTKEY.
+  ALL: copia dell'intera tabella viene distribuita a ogni nodo. Questo stile di distribuzione garantisce che tutte le righe richieste per ogni join siano disponibili su ogni nodo, ma moltiplica i requisiti di storage e aumenta i tempi di caricamento e manutenzione per la tabella. La distribuzione ALL può migliorare i tempi di esecuzione quando viene utilizzata con determinate tabelle di dimensioni in cui la distribuzione KEY non è appropriata, ma i miglioramenti delle prestazioni devono essere confrontati con i costi di manutenzione. 

DISTKEY (*column*)  
Specifica un nome di colonna o un numero di posizione per la chiave di distribuzione. Utilizza il nome specificato nell'elenco delle colonne facoltativo per la tabella o l'elenco di selezione della query. In alternativa, utilizzare un numero di posizione, in cui la prima colonna selezionata è 1, la seconda è 2 e così via. Solo una colonna in una tabella può essere la chiave di distribuzione:  
+ Se dichiari una colonna come colonna DISTKEY, DISTSTYLE deve essere impostato su KEY o non impostato affatto.
+ Se non dichiari una colonna DISTKEY, puoi impostare DISTSTYLE su EVEN.
+ Se non specifichi DISTKEY o DISTSTYLE, CTAS determina lo stile di distribuzione per la nuova tabella in base al piano di query per la clausola SELECT. Per ulteriori informazioni, consulta [Ereditarietà di attributi di colonna e tabella](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes).
Puoi definire la stessa colonna della chiave di distribuzione e della chiave di ordinamento. Questo approccio tende ad accelerare i join quando la colonna in questione è una colonna di join nella query.

[ COMPOUND \$1 INTERLEAVED ] SORTKEY ( *column\$1name* [, ... ] )  
Specifica una o più chiavi di ordinamento per la tabella. Quando vengono caricati nella tabella, i dati vengono ordinati in base alle colonne designate come chiavi di ordinamento.   
È possibile specificare facoltativamente lo stile di ordinamento COMPOUND o INTERLEAVED. L'impostazione predefinita è COMPOUND. Per ulteriori informazioni, consulta [Chiavi di ordinamento](t_Sorting_data.md).  
È possibile definire un massimo di 400 colonne COMPOUND SORTKEY o 8 colonne INTERLEAVED SORTKEY per tabella.   
Se non specifichi SORTKEY, CTAS determina le chiavi di ordinamento per la nuova tabella in base al piano di query per la clausola SELECT. Per ulteriori informazioni, consulta [Ereditarietà di attributi di colonna e tabella](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes).    
COMPOUND  
Specifica che i dati sono ordinati utilizzando una chiave composta costituita da tutte le colonne elencate, nell'ordine in cui sono elencate. Una chiave di ordinamento composta è più utile quando una query esegue la scansione delle righe in base all'ordine delle colonne di ordinamento. I vantaggi in termini di prestazioni dell'ordinamento con una chiave composta diminuiscono quando le query si basano su colonne di ordinamento secondarie. Puoi definire un massimo di 400 colonne COMPOUND SORTKEY per tabella.   
INTERLEAVED  
Specifica che i dati sono ordinati utilizzando una chiave di ordinamento "interlacciato". È possibile specificare un massimo di otto colonne per una chiave di ordinamento "interlacciato".   
L'ordinamento "interlacciato" fornisce uguale peso a ciascuna colonna, o sottoinsieme di colonne, nella chiave di ordinamento, quindi le query non dipendono dall'ordine delle colonne nella chiave di ordinamento. Quando una query utilizza una o più colonne di ordinamento secondarie, l'ordinamento "interlacciato" migliora in modo significativo le prestazioni delle query. L'ordinamento "interlacciato" comporta un piccolo costo generale per il caricamento dei dati e le operazioni di vacuum. 

AS *query*   
Qualsiasi query (istruzione SELECT) supportata da Amazon Redshift.

# Note per l'utilizzo di CTAS
<a name="r_CTAS_usage_notes"></a>

## Limits
<a name="r_CTAS_usage_notes-limits"></a>

Amazon Redshift applica una quota del numero di tabelle per cluster per tipo di nodo. 

Il numero massimo di caratteri per un nome di tabella è 127. 

Il numero massimo di colonne che puoi definire in una singola tabella è 1.600. 

## Ereditarietà di attributi di colonna e tabella
<a name="r_CTAS_usage_notes-inheritance-of-column-and-table-attributes"></a>

Le tabelle CREATE TABLE AS (CTAS) non ereditano vincoli, colonne di identità, valori di colonna predefiniti o la chiave primaria dalla tabella da cui sono stati creati. 

Non è possibile specificare le codifiche di compressione delle colonne per le tabelle CTAS. Amazon Redshift assegna automaticamente la codifica della compressione come segue:
+ Le colonne definite come chiavi di ordinamento vengono assegnate alla compressione RAW.
+ Alle colonne definite come tipi di dati BOOLEAN, REAL, DOUBLE PRECISION, GEOMETRY o GEOGRAPHY viene assegnata la compressione di tipo RAW.
+ Alle colonne definite come SMALLINT, INTEGER, BIGINT, DECIMAL, DATE, TIME, TIMETZ, TIMESTAMP o TIMESTAMPTZ viene assegnata la compressione. AZ64 
+ Le colonne definite come CHAR, VARCHAR o VARBYTE sono assegnate alla compressione LZO.

Per ulteriori informazioni, consultare [Codifiche di compressione](c_Compression_encodings.md) e [Tipi di dati](c_Supported_data_types.md). 

Per assegnare esplicitamente le codifiche di colonna, utilizza [CREATE TABLE](r_CREATE_TABLE_NEW.md).

CTAS determina lo stile di distribuzione e la chiave di ordinamento per la nuova tabella in base al piano di query per la clausola SELECT. 

Per le query complesse, come le query che includono join, aggregazioni, una clausola order by o una clausola limit, CTAS tenta di scegliere al meglio lo stile di distribuzione ottimale e la chiave di ordinamento in base al piano di query. 

**Nota**  
Per le prestazioni ottimali con set di dati di grandi dimensioni o query complesse, consigliamo di eseguire il test utilizzando set di dati tipici.

Spesso puoi prevedere quale chiave di distribuzione e chiave di ordinamento viene scelta da CTAS esaminando il piano di query per vedere quali colonne, se presenti, l'ottimizzatore di query sceglie per l'ordinamento e la distribuzione dei dati. Se il nodo superiore del piano di query è una semplice scansione sequenziale da una singola tabella (XN Seq Scan), in genere CTAS utilizza lo stile di distribuzione e la chiave di ordinamento della tabella di origine. Se il nodo principale del piano di query è qualcosa di diverso da una scansione sequenziale (come XN Limit, XN Sort, XN HashAggregate e così via), CTAS fa del suo meglio per scegliere lo stile di distribuzione e la chiave di ordinamento ottimali in base al piano di query.

Ad esempio, supponiamo di creare cinque tabelle utilizzando i seguenti tipi di clausole SELECT:
+ Una semplice istruzione select 
+ Una clausola limit 
+ Una clausola order by usando LISTID 
+ Una clausola order by usando QTYSOLD 
+ Una funzione di aggregazione SUM con una clausola group by.

I seguenti esempi mostrano il piano di query per ciascuna istruzione 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)
```

Per visualizzare la chiave di distribuzione e la chiave di ordinamento per ogni tabella, eseguire una query sulla tabella del catalogo di sistema PG\$1TABLE\$1DEF, come illustrato di seguito. 

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

La tabella seguente riepiloga i risultati. Per semplicità, vengono omessi i dettagli relativi a costi, righe e larghezza dal piano explain.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_CTAS_usage_notes.html)

Puoi specificare in modo lo stile di distribuzione e la chiave di ordinamento nell'istruzione CTAS. Ad esempio, la seguente istruzione crea una tabella utilizzando la distribuzione EVEN e specifica SALESID come chiave di ordinamento.

```
create table sales_disteven
diststyle even
sortkey (salesid)
as
select eventid, venueid, dateid, eventname
from event;
```

## Codifica di compressione
<a name="r_CTAS_usage_notes_encoding"></a>

ENCODE AUTO è l'impostazione predefinita per le tabelle. Amazon Redshift gestisce automaticamente la codifica di compressione per tutte le colonne della tabella.

## Distribuzione dei dati in arrivo
<a name="r_CTAS_usage_notes-distribution-of-incoming-data"></a>

Quando lo schema di distribuzione dell'hash dei dati in arrivo corrisponde a quello della tabella di destinazione, non è necessaria alcuna distribuzione fisica dei dati quando i dati vengono caricati. Ad esempio, se una chiave di distribuzione è impostata per la nuova tabella e i dati vengono inseriti da un'altra tabella che viene distribuita sulla stessa colonna chiave, i dati vengono caricati in posizione, utilizzando gli stessi nodi e sezioni. Tuttavia, se le tabelle di origine e di destinazione sono entrambe impostate sulla distribuzione EVEN, i dati vengono ridistribuiti nella tabella di destinazione. 

## Operazioni ANALYZE automatiche
<a name="r_CTAS_usage_notes-automatic-analyze-operations"></a>

Amazon Redshift analizza automaticamente le tabelle create con i comandi CTAS. Non è necessario eseguire il comando ANALYZE su queste tabelle quando vengono create per la prima volta. Se le modifichi, devi analizzarle come fai per le altre tabelle. 

# Esempi di CTAS
<a name="r_CTAS_examples"></a>

Il seguente esempio crea una tabella chiamata EVENT\$1BACKUP per la tabella EVENT:

```
create table event_backup as select * from event;
```

La tabella risultante eredita le chiavi di distribuzione e ordinamento dalla tabella 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
```

Il seguente comando crea una nuova tabella chiamata EVENTDISTSORT selezionando quattro colonne dalla tabella EVENT. La nuova tabella viene distribuita da EVENTID e ordinata per EVENTID e DATEID: 

```
create table eventdistsort
distkey (1)
sortkey (1,3)
as
select eventid, venueid, dateid, eventname
from event;
```

Il risultato è illustrato di seguito.

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

Puoi creare esattamente la stessa tabella utilizzando i nomi delle colonne per le chiavi di distribuzione e ordinamento. Ad esempio:

```
create table eventdistsort1
distkey (eventid)
sortkey (eventid, dateid)
as
select eventid, venueid, dateid, eventname
from event;
```

La seguente istruzione applica la distribuzione uniforme alla tabella ma non definisce una chiave di ordinamento esplicita. 

```
create table eventdisteven
diststyle even
as
select eventid, venueid, dateid, eventname
from event;
```

La tabella non eredita la chiave di ordinamento dalla tabella EVENT (EVENTID) perché la distribuzione EVEN è specificata per la nuova tabella. La nuova tabella non ha la chiave di ordinamento e la chiave di distribuzione. 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdisteven';

column    |          type          | encoding | distkey | sortkey
----------+------------------------+----------+---------+---------
eventid   | integer                | none     | f       | 0
venueid   | smallint               | none     | f       | 0
dateid    | smallint               | none     | f       | 0
eventname | character varying(200) | none     | f       | 0
```

La seguente istruzione applica la distribuzione uniforme e definisce una chiave di ordinamento: 

```
create table eventdistevensort diststyle even sortkey (venueid)
as select eventid, venueid, dateid, eventname from event;
```

 La tabella risultante ha una chiave di ordinamento ma non una chiave di distribuzione. 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistevensort';

column    |          type          | encoding | distkey | sortkey
----------+------------------------+----------+---------+-------
eventid   | integer                | none     | f       | 0
venueid   | smallint               | none     | f       | 1
dateid    | smallint               | none     | f       | 0
eventname | character varying(200) | none     | f       | 0
```

La seguente istruzione ridistribuisce la tabella EVENT su una colonna chiave diversa dai dati in entrata che sono ordinati sulla colonna EVENTID e non definisce la colonna SORTKEY e quindi la tabella non è ordinata. 

```
create table venuedistevent distkey(venueid)
as select * from event;
```

Il risultato è illustrato di seguito. 

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

# CREARE UN MODELLO
<a name="r_CREATE_TEMPLATE"></a>

Crea modelli riutilizzabili per comandi Amazon Redshift come. [COPY](r_COPY.md) I modelli memorizzano i parametri di uso comune a cui è possibile fare riferimento in più esecuzioni di comandi, migliorando la coerenza e riducendo la specificazione manuale dei parametri.

I modelli eliminano la necessità di specificare ripetutamente gli stessi parametri di formattazione in più operazioni, mentre i percorsi di origine, le tabelle di destinazione e l'autorizzazione possono variare tra le operazioni.

## Privilegi richiesti
<a name="r_CREATE_TEMPLATE-privileges"></a>

Per creare un modello, è necessario disporre di uno dei seguenti elementi:
+ Privilegi di superutente
+ Autorizzazione CREATE sullo schema in cui si desidera creare il modello o autorizzazione CREATE con ambito sugli schemi del database in cui si desidera creare il modello

## Sintassi
<a name="r_CREATE_TEMPLATE-synopsis"></a>

```
CREATE [ OR REPLACE ] TEMPLATE [database_name.][schema_name.]template_name
FOR COPY [ AS ]
[ [ FORMAT ] [ AS ] data_format ]
[ parameter [ argument ] [ , ... ] ];
```

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

 *O SOSTITUISCI*   
Se nel database e nello schema specificati esiste già un modello con lo stesso nome, il modello esistente viene sostituito. È possibile sostituire un modello solo con un nuovo modello che definisca lo stesso tipo di operazione, ad esempio COPY. È necessario disporre dei privilegi necessari per sostituire un modello.

*database\$1name*  
(Facoltativo) Il nome del database in cui verrà creato il modello. Se non viene specificato, il modello viene creato nel database corrente.  
Se il database o lo schema non esiste, il modello non viene creato e l'istruzione restituisce un errore. Non è possibile creare modelli nei database di sistema `template0``template1`,`padb_harvest`, o`sys:internal`.

*schema\$1name*  
(Facoltativo) Il nome dello schema in cui verrà creato il modello. Se non viene specificato, il modello viene creato nello schema corrente.  
Se viene fornito un nome di schema, il nuovo modello viene creato in quello schema (presupponendo che il creatore abbia accesso allo schema). Il nome del modello deve essere un nome univoco per quello schema.

*nome\$1modello*  
Il nome del modello da creare. Facoltativamente, il nome del modello può essere qualificato con il nome del database e dello schema. Nell'esempio seguente, il nome del database è`demo_database`, il nome dello schema è `demo_schema` e il nome del modello è`test`. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).  

```
CREATE TEMPLATE demo_database.demo_schema.test FOR COPY AS CSV;
```

COPY  
Specifica il tipo di comando Redshift per il quale viene creato il modello. Attualmente è supportato solo il comando COPY.

[[FORMAT] [AS] *data\$1format*]   
Si tratta di un parametro facoltativo. Questo specifica il formato dei dati per le operazioni COPY.

[*parametro* [argomento]]  
Qualsiasi parametro valido per il comando redshift specificato.  
Ad esempio, i modelli per il comando COPY possono includere:  
+ [Parametri del formato dei dati](copy-parameters-data-format.md)
+ [Parametri di compressione dei file](copy-parameters-file-compression.md)
+ [Parametri di conversione dei dati](copy-parameters-data-conversion.md)
+ [Operazioni di caricamento dati](copy-parameters-data-load.md)
Per un elenco completo dei parametri supportati, vedere [COPY](r_COPY.md) command.

### Note per l’utilizzo
<a name="create_template-usage-notes"></a>
+ Per impostazione predefinita, tutti gli utenti hanno i privilegi CREATE e USAGE nello schema PUBLIC. Per impedire agli utenti di creare oggetti nello schema PUBLIC di un database, utilizza il comando REVOKE per rimuovere tale privilegio.
+ Quando un parametro esiste sia nel modello che nel comando, il parametro del comando ha la precedenza.
+ I modelli sono oggetti di database e seguono le regole standard di denominazione e autorizzazione degli oggetti Redshift. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).
+ I modelli non possono contenere le specifiche del file manifesto per [COPY](r_COPY.md) il comando.

### Limitazioni
<a name="create_template-limitations"></a>
+ È necessario specificare almeno un parametro durante la creazione di un modello.
+ Parametri esclusi: i parametri specifici del comando come i percorsi di origine, le tabelle di destinazione, le credenziali di autorizzazione e le specifiche dei file manifesto non possono essere inclusi nei modelli. Questi parametri devono essere specificati nel comando effettivo.
+ Numero massimo di modelli per cluster: è possibile creare un massimo di 1.000 modelli per cluster. Questo limite si applica al numero totale di modelli in tutti i database e gli schemi del cluster.
+ Riferimenti tra database: non è possibile fare riferimento ai modelli tra database.
+ Condivisione dei dati: i modelli non possono essere inclusi nelle condivisioni di dati. I modelli devono essere creati separatamente in ogni cluster in cui sono necessari.

## Esempi
<a name="r_CREATE_TEMPLATE-examples"></a>

L'esempio seguente crea un modello per il comando COPY 

```
CREATE TEMPLATE test_schema.demo_template
FOR COPY
AS
FORMAT JSON 'auto'
NULL AS ''
MAXERROR 100;
```

Usa [MOSTRA MODELLO](r_SHOW_TEMPLATE.md) per ottenere la definizione del modello:

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

 Interroga la vista [SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md) del sistema per ottenere maggiori dettagli su un modello. 

```
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": ""
}
```

# CREA UTENTE
<a name="r_CREATE_USER"></a>

Crea un nuovo utente del database. Gli utenti del database possono recuperare dati, eseguire comandi ed eseguire altre operazioni in un database, a seconda dei loro privilegi e ruoli. Per eseguire questo comando, è necessario essere un utente con privilegi avanzati del database.

## Privilegi richiesti
<a name="r_CREATE_USER-privileges"></a>

Di seguito sono riportati i privilegi richiesti per CREATE USER:
+ Superuser
+ Utenti con il privilegio CREATE USER

## Sintassi
<a name="r_CREATE_USER-synopsis"></a>

```
CREATE USER name [ WITH ]
PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ option [ ... ] ]

where option can be:

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| IN GROUP groupname [, ... ]
| VALID UNTIL 'abstime'
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit
| EXTERNALID external_id
```

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

 *name*   
Il nome dell'utente da creare. Il nome utente non può essere `PUBLIC`. Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md).

WITH  
Parola chiave facoltativa. WITH viene ignorato da Amazon Redshift

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
Imposta la password dell'utente.   
Per impostazione predefinita, gli utenti possono modificare le proprie password, a meno che la password non sia disabilitata. Per disabilitare la password di un utente, specifica DISABLE. Quando la password di un utente è disabilitata, la password viene eliminata dal sistema e l'utente può accedere solo utilizzando credenziali utente temporanee AWS Identity and Access Management (IAM). Per ulteriori informazioni, consultare la sezione relativa [all'utilizzo dell'autenticazione IAM per generare le credenziali dell'utente del database](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html). Solo un utente con privilegi avanzati può abilitare o disabilitare le password. Non puoi disabilitare la password di un utente con privilegi avanzati. Per abilitare una password, esegui [ALTER USER](r_ALTER_USER.md) e specifica una password.  
È possibile specificare la password in testo non crittografato, come stringa MD5 hash o come stringa SHA256 hash.   
 Quando avvii un nuovo cluster utilizzando l'API o Amazon Redshift Console di gestione AWS AWS CLI, devi fornire una password di testo non crittografato per l'utente iniziale del database. Puoi modificare la password successivamente utilizzando [ALTER USER](r_ALTER_USER.md). 
Per il testo in chiaro, la password deve soddisfare i seguenti vincoli:  
+ La lunghezza deve essere compresa tra 8 e 64 caratteri.
+ Deve contenere almeno una lettera maiuscola, una lettera minuscola e un numero.
+ Può utilizzare qualsiasi carattere ASCII (codice ASCII da 33 a 126) tranne ' (virgolette singole), " (virgolette doppie), \$1, / o @.
Come alternativa più sicura al passaggio del parametro di password CREATE USER come testo non crittografato, puoi specificare un MD5 hash di una stringa che include la password e il nome utente.   
Quando specificate una stringa MD5 hash, il comando CREATE USER verifica la presenza di una stringa MD5 hash valida, ma non convalida la parte della stringa relativa alla password. In questo caso è possibile creare una password, ad esempio una stringa vuota, che non puoi utilizzare per accedere al database.
Per specificare una MD5 password, procedi nel seguente modo:   

1. Concatenare la password e il nome utente. 

   Ad esempio, per la password `ez` e l'utente `user1`, la stringa concatenata è `ezuser1`. 

1. Converti la stringa concatenata in una stringa hash di 32 MD5 caratteri. È possibile utilizzare qualsiasi MD5 utilità per creare la stringa hash. L'esempio seguente utilizza Amazon Redshift [MD5 funzione](r_MD5.md) e l'operatore di concatenazione (\$1\$1) per restituire una stringa hash di 32 caratteri. MD5 

   ```
   select md5('ez' || 'user1');
                           
   md5
   --------------------------------
   153c434b4b77c89e6b94f12c5393af5b
   ```

1. *Concatena '`md5`' davanti alla stringa hash e fornisci la stringa concatenata come argomento MD5 md5hash.*

   ```
   create user user1 password 'md5153c434b4b77c89e6b94f12c5393af5b';
   ```

1. Accedi al database utilizzando le credenziali di accesso. 

   Per questo esempio, accedere come `user1` con la password `ez`. 
Un'altra alternativa sicura è quella di specificare un hash SHA-256 di una stringa di password; oppure è possibile fornire il proprio digest SHA-256 valido e il sale a 256 bit utilizzati per creare il digest.  
+ Digest — L'output di una funzione di hashing.
+ Salt - Dati generati casualmente combinati con la password per ridurre i pattern nell'output della funzione di hashing.

```
'sha256|Mypassword'
```

```
'sha256|digest|256-bit-salt'
```
Nell'esempio seguente, Amazon Redshift genera e gestisce il salt.   

```
CREATE USER admin PASSWORD 'sha256|Mypassword1';
```
Nell'esempio seguente vengono forniti un digest SHA-256 valido e un salt a 256 bit utilizzati per creare il digest.  
Per specificare una password e impostarne l'hash con il tuo salt, segui questi passaggi:  

1. Crea un salt a 256 bit. È possibile ottenere un salt utilizzando qualsiasi generatore di stringhe esadecimali che restituisce una stringa lunga 64 caratteri. In questo esempio, il salt è `c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6`. 

1.  Usa la funzione FROM\$1HEX per convertire il tuo salt in binario. Questo perché la funzione richiede la rappresentazione binaria del sale. SHA2 Vedi la seguente istruzione. 

   ```
   SELECT FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6');
   ```

1.  Usa la funzione CONCAT per aggiungere il salt alla password. In questo esempio, la password è `Mypassword1`. Vedi la seguente istruzione. 

   ```
   SELECT CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6'));
   ```

1. Utilizzate la SHA2 funzione per creare un digest dalla combinazione di password e salt. Vedi la seguente istruzione.

   ```
   SELECT SHA2(CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6')), 0);
   ```

1.  Crea l'utente utilizzando il digest e il salt dei passaggi precedenti. Vedi la seguente istruzione. 

   ```
   CREATE USER admin PASSWORD 'sha256|821708135fcc42eb3afda85286dee0ed15c2c461d000291609f77eb113073ec2|c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6';
   ```

1. Accedi al database utilizzando le credenziali di accesso.

    Per questo esempio, accedere come `admin` con la password `Mypassword1`.
Se imposti una password in testo semplice senza specificare la funzione di hashing, viene generato un MD5 digest utilizzando il nome utente come sale. 

CREATEDB \$1 NOCREATEDB   
L'opzione CREATEDB consente al nuovo utente di creare database. Il valore predefinito è NOCREATEDB.

CREATEUSER \$1 NOCREATEUSER   
L'opzione CREATEUSER crea un utente con privilegi avanzati con tutti i privilegi del database, incluso CREATE USER. L'impostazione predefinita è NOCREATEUSER. Per ulteriori informazioni, consulta [Utenti con privilegi avanzati](r_superusers.md).

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="create-user-syslog-access"></a>
Una clausola che specifica il livello di accesso che l'utente ha per tabelle e viste di sistema di Amazon Redshift.   
Gli utenti normali che dispongono dell’autorizzazione SYSLOG ACCESS RESTRICTED possono visualizzare solo le righe generate da tale utente nelle tabelle e nelle viste di sistema visibili all’utente. Il valore predefinito è RESTRICTED.   
Gli utenti con privilegi normali che dispongono dell’autorizzazione SYSLOG ACCESS UNRESTRICTED possono visualizzare tutte le righe nelle tabelle e nelle viste di sistema visibili all’utente, incluse quelle generate da un altro utente. UNRESTRICTED non fornisce un accesso regolare all'utente alle tabelle visibili agli utenti con privilegi avanzati. Solo gli utenti con privilegi avanzati possono vedere le tabelle visibili agli utenti con privilegi avanzati.   
Concedere all'utente un accesso illimitato alle tabelle di sistema offre all'utente la visibilità dei dati generati da altri utenti. Ad esempio, STL\$1QUERY e STL\$1QUERYTEXT contengono il testo completo delle istruzioni INSERT, UPDATE e DELETE, che potrebbero contenere dati sensibili generati dall'utente. 
Tutte le righe in SVV\$1TRANSACTIONS sono visibili per tutti gli utenti.   
Per ulteriori informazioni, consulta [Visibilità dei dati nelle tabelle e nelle viste di sistema](cm_chap_system-tables.md#c_visibility-of-data).

IN GROUP *groupname*   
Specifica il nome di un gruppo esistente a cui appartiene l'utente. Possono essere elencati più nomi di gruppi.

VALID UNTIL *abstime*   
L'opzione VALID UNTIL imposta un tempo assoluto dopo il quale la password dell'utente non è più valida. Per impostazione predefinita, la password non ha limiti di tempo.

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
Numero massimo di connessioni di database che l'utente può aprire contemporaneamente. Il limite non viene applicato per gli utente con privilegi avanzati. Utilizza la parola chiave UNLIMITED per consentire il numero massimo di connessioni simultanee. È possibile che venga applicato anche un limite al numero di connessioni per ciascun database. Per ulteriori informazioni, consulta [CREATE DATABASE](r_CREATE_DATABASE.md). Il valore predefinito è UNLIMITED. Per visualizzare le connessioni correnti, eseguire una query sulla vista di sistema [STV\$1SESSIONS](r_STV_SESSIONS.md).  
Se si applicano entrambi i limiti di connessione utente e database, deve essere disponibile uno slot di connessione inutilizzato che rientra in entrambi i limiti quando un utente tenta di connettersi.

SESSION TIMEOUT *limite*  
Il tempo massimo (in secondi) in cui una sessione rimane inattiva o inutilizzata. L'intervallo è compreso tra 60 secondi (un minuto) e 1.728.000 secondi (20 giorni). Se per l'utente non è impostato alcun timeout di sessione, verrà applicata l'impostazione del cluster. Per ulteriori informazioni, consulta [Quote e limiti in Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html) nella *Guida alla gestione di Amazon Redshift*.  
Quando si imposta il timeout della sessione, viene applicato solo alle nuove sessioni.  
Per visualizzare informazioni sulle sessioni utente attive, tra cui l'ora di inizio, il nome utente e il timeout della sessione, eseguire una query sulla vista di sistema [STV\$1SESSIONS](r_STV_SESSIONS.md). Per visualizzare le informazioni sulla cronologia delle sessioni utente, eseguire una query sulla vista [STL\$1SESSIONS](r_STL_SESSIONS.md). Per recuperare informazioni sugli utenti del database, inclusi i valori di timeout della sessione, eseguire una query sulla vista [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md).

EXTERNALID *external\$1id*  
L'identificativo dell'utente, associato a un provider di identità. L'utente deve avere la password disabilitata. Per ulteriori informazioni, consulta [Native identity provider (IdP) federation for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html) (Federazione di provider di identità nativi (IdP) per Amazon Redshift).

### Note per l’utilizzo
<a name="create_user-usage-notes"></a>

Per impostazione predefinita, tutti gli utenti hanno i privilegi CREATE e USAGE nello schema PUBLIC. Per impedire agli utenti di creare oggetti nello schema PUBLIC di un database, utilizza il comando REVOKE per rimuovere tale privilegio.

Quando si utilizza l'autenticazione IAM per creare credenziali utente del database, puoi creare un utente con privilegi avanzati in grado di accedere solo utilizzando credenziali temporanee. Non è possibile disabilitare la password di un superutente, ma è possibile creare una password sconosciuta utilizzando una stringa hash generata casualmente. MD5 

```
create user iam_superuser password 'md5A1234567890123456780123456789012' createuser;
```

Il caso di un *nome utente* racchiuso tra virgolette doppie è sempre conservato indipendentemente dall'impostazione dell'opzione di configurazione `enable_case_sensitive_identifier`. Per ulteriori informazioni, consulta [enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md).

## Esempi
<a name="r_CREATE_USER-examples"></a>

Il seguente comando crea un utente denominato dbuser, con la password "abcD1234", i privilegi di creazione del database e un limite di connessione di 30.

```
create user dbuser with password 'abcD1234' createdb connection limit 30;
```

 Eseguire una query sulla tabella di catalogo PG\$1USER\$1INFO per visualizzare i dettagli su un utente del database. 

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

Nell'esempio seguente, la password dell'account è valida fino al 10 giugno 2017.

```
create user dbuser with password 'abcD1234' valid until '2017-06-10';
```

 L'esempio seguente crea un utente con una password che rispetta la distinzione tra lettere maiuscole e minuscole che contiene caratteri speciali.

```
create user newman with password '@AbC4321!';
```

 Per utilizzare una barra rovesciata ('\$1') nella MD5 password, evita la barra rovesciata inserendo una barra rovesciata nella stringa di origine. Nell'esempio seguente viene creato un utente denominato `slashpass` con una singola barra rovesciata ('`\`') come password. 

```
select md5('\\'||'slashpass');
         
md5
--------------------------------
0c983d1a624280812631c5389e60d48c
```

Creazione di un utente con la password md5.

```
create user slashpass password 'md50c983d1a624280812631c5389e60d48c';
```

Nell'esempio seguente viene creato un utente denominato `dbuser` con un timeout di sessione inattiva impostato su 120 secondi.

```
CREATE USER dbuser password 'abcD1234' SESSION TIMEOUT 120;
```

L'esempio seguente crea un utente denominato `bob`. Lo spazio dei nomi è `myco_aad`. Si tratta solo di un esempio, Per eseguire correttamente il comando, è necessario disporre di un provider di identità registrato. Per ulteriori informazioni, consulta [Native identity provider (IdP) federation for Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html) (Federazione di provider di identità nativi (IdP) per Amazon Redshift).

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

# CREATE VIEW
<a name="r_CREATE_VIEW"></a>

Crea una vista in un database. La vista non è materializzata fisicamente, la query che definisce la vista viene eseguita ogni volta che vi si fa riferimento in una query. Per creare una vista con una tabella esterna, includi la clausola WITH NO SCHEMA BINDING.

Per creare una vista standard, devi accedere alle tabelle o alle viste sottostanti. Per eseguire una query su una vista standard, devi selezionare le autorizzazioni per la vista, ma non quelle per le tabelle sottostanti. Nel caso in cui crei una vista che fa riferimento a una tabella o a una vista in un altro schema o a una vista materializzata, potrebbero essere necessarie autorizzazioni aggiuntive. Per eseguire una query su una vista con associazione tardiva, devi selezionare le autorizzazioni per la vista con associazione tardiva stessa. Assicurati inoltre che il proprietario della vista con associazione tardiva disponga dei privilegi di selezione per gli oggetti di riferimento (tabelle, viste o funzioni definite dall’utente). Per ulteriori informazioni sulle viste con associazione tardiva, consulta [Note per l'utilizzo](#r_CREATE_VIEW_usage_notes).

## Autorizzazioni richieste
<a name="r_CREATE_VIEW-privileges"></a>

Per utilizzare CREATE VIEW, è necessaria una delle seguenti autorizzazioni.
+ Per creare una vista con CREATE [OR REPLACE] VIEW:
  + Superuser
  + Utenti con l’autorizzazione CREATE [ REPLACE ] VIEW
+ Per sostituire una vista esistente con CREATE OR REPLACE VIEW:
  + Superuser
  + Utenti con l’autorizzazione CREATE [ OR REPLACE ] VIEW
  + Proprietario della visualizzazione

Se un utente desidera accedere a una vista che incorpora una funzione definita dall’utente, l’utente deve disporre dell’autorizzazione EXECUTE per tale funzione.

## Sintassi
<a name="r_CREATE_VIEW-synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]
```

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

OR REPLACE   
Se esiste già una vista con lo stesso nome, la vista viene sostituita. Puoi sostituire una vista solo con una nuova query che genera un set identico di colonne, usando gli stessi nomi di colonna e tipi di dati. CREATE OR REPLACE VIEW blocca le operazioni di lettura e scrittura della vista fino al completamento dell'operazione.  
Quando una vista viene sostituita, vengono mantenute le altre proprietà, ad esempio la proprietà e i privilegi concessi. 

 *name*   
Nome della vista. Se viene specificato un nome schema (come `myschema.myview`), la vista viene creata utilizzando lo schema specificato. Altrimenti, la vista viene creata nello schema corrente. Il nome della vista deve essere diverso dal nome di qualsiasi altra vista o tabella nello stesso schema.   
Se specifichi un nome di vista che inizia con "\$1", la vista viene creata come vista temporanea visibile solo nella sessione corrente.  
Per ulteriori informazioni sui nomi validi, consultare [Nomi e identificatori](r_names.md). Non è possibile creare tabelle o viste nei database di sistema template0, template1, padb\$1harvest o sys:internal.

 *column\$1name*   
Elenco facoltativo di nomi da utilizzare per le colonne nella vista. Se non vengono specificati nomi di colonne, i nomi delle colonne vengono ricavati dalla query. Il numero massimo di colonne che puoi definire in una singola vista è 1.600.

 *query*   
Query (sotto forma di istruzione SELECT) che valuta una tabella. Questa tabella definisce le colonne e le righe nella vista. 

 WITH NO SCHEMA BINDING   
Clausola che specifica che la vista non è vincolata agli oggetti del database sottostante, come le tabelle e le funzioni definite dall'utente. Di conseguenza, non esiste alcuna dipendenza tra la vista e gli oggetti a cui fa riferimento. Puoi creare una vista anche se gli oggetti di riferimento non esistono. Poiché non esiste alcuna dipendenza, è possibile rimuovere o modificare un oggetto di riferimento senza influire sulla vista. Amazon Redshift non controlla le dipendenze finché non viene interrogata la vista. Le espressioni di tabelle comuni ricorsive non sono supportate con le viste con associazione tardiva. Per visualizzare i dettagli sulle viste con associazione tardiva, esegui la funzione [PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS](PG_GET_LATE_BINDING_VIEW_COLS.md).  
Quando includi la clausola WITH NO SCHEMA BINDING, le tabelle e le viste a cui si fa riferimento nell'istruzione SELECT devono essere qualificate con un nome schema. Lo schema deve esistere quando viene creata la vista, anche se la tabella di riferimento non esiste. Ad esempio, la seguente istruzione restituisce un errore.   

```
create view myevent as select eventname from event
with no schema binding;
```
La seguente istruzione viene eseguita normalmente.  

```
create view myevent as select eventname from public.event
with no schema binding;
```

**Nota**  
Non puoi eseguire operazioni di aggiornamento, inserimento o eliminazione da una vista. 

## Note per l'utilizzo
<a name="r_CREATE_VIEW_usage_notes"></a>



### Viste con associazione tardiva
<a name="r_CREATE_VIEW_late-binding-views"></a>

Una vista con associazione tardiva non controlla gli oggetti del database sottostante, come le tabelle e altre viste, finché non viene eseguita la query sulla vista. Di conseguenza, puoi modificare o rimuovere gli oggetti sottostanti senza rimuovere e ricreare la vista. Se rimuovi gli oggetti sottostanti, le query sulla vista con associazione tardiva avranno esito negativo. Se la query sulla vista con associazione tardiva fa riferimento a colonne nell'oggetto sottostante che non sono presenti, la query avrà esito negativo. 

 Se rimuovi e quindi ricrei una vista o una tabella sottostante di una vista con associazione tardiva, il nuovo oggetto viene creato con le autorizzazioni di accesso predefinite. Potrebbe essere necessario concedere le autorizzazioni agli oggetti sottostanti per gli utenti che eseguono query sulla vista. 

Per creare una vista con associazione tardiva, includi la clausola WITH NO SCHEMA BINDING. Nell'esempio seguente viene creato una vista senza associazione di schema. 

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

L'esempio seguente mostra che puoi modificare una tabella sottostante senza ricreare la vista. 

```
alter table event rename column eventname to title;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | title         | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

È possibile fare riferimento alle tabelle esterne di Amazon Redshift Spectrum solo in una vista con associazione tardiva. Un'applicazione delle viste con associazione tardiva è quella di eseguire la query sulle tabelle Amazon Redshift e Redshift Spectrum. Ad esempio, è possibile utilizzare il comando [UNLOAD](r_UNLOAD.md) per archiviare i dati meno recenti in Amazon S3. Quindi, creare una tabella esterna Redshift Spectrum che fa riferimento ai dati in Amazon S3 e una vista che esegue le query su entrambe le tabelle. Nell'esempio seguente viene utilizza una clausola UNION ALL per eseguire il join alla tabella `SALES` di Amazon Redshift e alla tabella `SPECTRUM.SALES` di Redshift Spectrum.

```
create view sales_vw as
select * from public.sales
union all
select * from spectrum.sales
with no schema binding;
```

Per ulteriori informazioni sulla creazione di tabelle esterne di Redshift Spectrum, inclusa la tabella `SPECTRUM.SALES`, vedi [Nozioni di base su Amazon Redshift Spectrum](c-getting-started-using-spectrum.md).

**Importante**  
Quando crei una vista standard da una vista con associazione tardiva, la definizione della vista standard contiene la definizione della vista con associazione tardiva al momento della creazione della vista standard, incluso il proprietario della vista con associazione tardiva. Se apporti una modifica alla vista con associazione tardiva sottostante, tali modifiche non vengono utilizzate nella vista standard finché non ricrei la vista standard. Pertanto, quando esegui query sulla vista standard, vengono utilizzati sempre la definizione della vista con associazione tardiva e il proprietario della vista con associazione tardiva per il controllo delle autorizzazioni al momento della creazione della vista standard.

Per aggiornare la vista standard in modo che faccia riferimento alla definizione più recente della vista con associazione tardiva, esegui CREATE OR REPLACE VIEW con la definizione iniziale utilizzata per creare la vista standard.

Di seguito è riportato un esempio di creazione di una vista standard da una vista con associazione tardiva.

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

Tieni presente che la vista con associazione tardiva, come illustrata nell'istruzione DDL per la vista standard, viene definita al momento della creazione della vista standard e non verrà aggiornata con le modifiche apportate successivamente alla vista con associazione tardiva.

## Esempi
<a name="r_CREATE_VIEW-examples"></a>

I comandi di esempio utilizzano un set di oggetti e dati di esempio chiamato database *TICKIT*. Per ulteriori informazioni, consulta [Database di esempio](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html).

Il seguente comando crea una vista chiamata *myevent* da una tabella chiamata EVENT. 

```
create view myevent as select eventname from event
where eventname = 'LeAnn Rimes';
```

Il seguente comando crea una vista chiamata *myuser* da una tabella chiamata USERS. 

```
create view myuser as select lastname from users;
```

Il seguente comando crea o sostituisce una vista chiamata *myuser* da una tabella chiamata USERS. 

```
create or replace view myuser as select lastname from users;
```

Nell'esempio seguente viene creato una vista senza associazione di schema. 

```
create view myevent as select eventname from public.event
with no schema binding;
```

# DEALLOCATE
<a name="r_DEALLOCATE"></a>

Annulla l'allocazione di un'istruzione preparata. 

## Sintassi
<a name="r_DEALLOCATE-synopsis"></a>

```
DEALLOCATE [PREPARE] plan_name
```

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

PREPARE   
Questa parola chiave è facoltativa e viene ignorata. 

 *plan\$1name*   
Il nome dell'istruzione preparata di cui annullare l'allocazione. 

## Note per l'utilizzo
<a name="r_DEALLOCATE_usage_notes"></a>

DEALLOCATE viene utilizzato per annullare l'allocazione di un'istruzione SQL preparata in precedenza. Se non annulli esplicitamente l'allocazione di un'istruzione preparata, l'allocazione viene annullata al termine della sessione corrente. Per ulteriori informazioni sulle istruzioni preparate, consultare [PREPARE](r_PREPARE.md).

## Vedi anche
<a name="r_DEALLOCATE-see-also"></a>

 [EXECUTE](r_EXECUTE.md), [PREPARE](r_PREPARE.md) 

# DECLARE
<a name="declare"></a>

Definisce un nuovo cursore. Utilizza un cursore per recuperare poche righe alla volta dal set di risultati di una query più grande. 

Quando viene recuperata la prima riga di un cursore, l'intero set di risultati si materializza sul nodo principale, in memoria o sul disco, se necessario. A causa del potenziale impatto negativo sulle prestazioni dell'utilizzo dei cursori con set di risultati di grandi dimensioni, si consiglia di utilizzare approcci alternativi laddove possibile. Per ulteriori informazioni, consulta [Considerazioni sulle prestazioni quando si utilizzano i cursori](#declare-performance).

Devi dichiarare un cursore all'interno di un blocco di transazione. È possibile aprire un solo cursore alla volta per sessione. 

Per ulteriori informazioni, consultare [FETCH](fetch.md), [CLOSE](close.md).

## Sintassi
<a name="declare-synopsis"></a>

```
DECLARE cursor_name CURSOR FOR query
```

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

*cursor\$1name*   
Nome del nuovo cursore. 

 *query*   
Istruzione SELECT che popola il cursore.

## Note per l'utilizzo di DECLARE CURSOR
<a name="declare-usage"></a>

Se l'applicazione client utilizza una connessione ODBC e la query crea un set di risultati che è troppo grande per rientrare nella memoria, puoi eseguire il flusso del set di risultati all'applicazione client utilizzando un cursore. Quando usi un cursore, l'intero set di risultati si materializza sul nodo principale e il client può recuperare i risultati in modo incrementale. 

**Nota**  
Per abilitare i cursori in ODBC per Microsoft Windows, abilitare l'opzione **Usa dichiara/recupera** nel DSN ODBC utilizzato per Amazon Redshift. Si consiglia di impostare la dimensione della cache ODBC, utilizzando il campo **Cache Size (Dimensione cache)** nella finestra di dialogo delle opzioni del DSN ODBC su 4.000 o un valore superiore sui cluster a più nodi per ridurre al minimo i round trip. Su un cluster a nodo singolo, imposta la dimensione della cache su 1.000.

A causa del potenziale impatto negativo sulle prestazioni dell'utilizzo dei cursori, si consiglia di utilizzare approcci alternativi laddove possibile. Per ulteriori informazioni, consulta [Considerazioni sulle prestazioni quando si utilizzano i cursori](#declare-performance).

I cursori Amazon Redshift sono supportati con le seguenti limitazioni:
+ È possibile aprire un solo cursore alla volta per sessione. 
+ I cursori devono essere utilizzati all'interno di una transazione (BEGIN … END). 
+ La dimensione massima dei set di risultati cumulativi per tutti i cursori è vincolata in base al tipo di nodo del cluster. Se sono necessari set di risultati più grandi, puoi ridimensionare una configurazione di nodo XL o 8XL.

  Per ulteriori informazioni, consulta [Vincoli del cursore](#declare-constraints). 

## Vincoli del cursore
<a name="declare-constraints"></a>

Quando viene recuperata la prima riga di un cursore, l'intero set di risultati si materializza sul nodo principale. Se il set di risultati non rientra in memoria, viene scritto sul disco in base alle necessità. Per proteggere l'integrità del nodo principale, Amazon Redshift applica i vincoli sulla dimensione di tutti i set di risultati del cursore, in base al tipo di nodo del cluster.

La tabella seguente mostra le dimensioni massime del set di risultati totali per ciascun tipo di nodo del cluster. Le dimensioni massime del set di risultati sono espresse in megabyte.


| Tipo di nodo | Dimensioni massime del set di risultati per cluster (MB) | 
| --- | --- | 
|   Più nodi DC2 Large   | 192.000 | 
|   Nodo singolo DC2 Large   | 8.000 | 
|   DC2 Nodi multipli 8XL   | 3.200.000 | 
|   RA3 16XL nodi multipli   | 14.400.000 | 
|   RA3 4 nodi multipli XL   | 3.200.000 | 
|   RA3 Nodi multipli XLPLUS   | 1.000.000 | 
|   RA3 XLPLUS a nodo singolo   | 64.000 | 
|   RA3 Nodi multipli LARGE   | 240.000 | 
|   RA3 Nodo singolo LARGE   | 8.000 | 
| Amazon Redshift Serverless | 150.000 | 

Per visualizzare la configurazione del cursore attivo per un cluster, eseguire una query sulla tabella di sistema [STV\$1CURSOR\$1CONFIGURATION](r_STV_CURSOR_CONFIGURATION.md) come utente con privilegi avanzati. Per visualizzare lo stato dei cursori attivi, esegui la query sulla tabella di sistema [STV\$1ACTIVE\$1CURSORS](r_STV_ACTIVE_CURSORS.md). Un utente può vedere solo le righe dei propri cursori, ma un utente con privilegi avanzati può visualizzare tutti i cursori.

## Considerazioni sulle prestazioni quando si utilizzano i cursori
<a name="declare-performance"></a>

Poiché i cursori materializzano l'intero set di risultati sul nodo principale prima di iniziare a restituire i risultati al client, l'utilizzo di cursori con set di risultati molto grandi può avere un impatto negativo sulle prestazioni. Ti consigliamo pertanto di non utilizzare i cursori con set di risultati molto grandi. In alcuni casi, ad esempio quando l'applicazione utilizza una connessione ODBC, i cursori potrebbero essere l'unica soluzione attuabile. Se possibile, consigliamo di utilizzare queste alternative:
+ Usa [UNLOAD](r_UNLOAD.md) per esportare una tabella di grandi dimensioni. Quando si utilizza UNLOAD, i nodi di calcolo lavorano in parallelo per trasferire i dati direttamente nei file di dati in Amazon Simple Storage Service. Per ulteriori informazioni, consulta [Scaricamento dei dati in Amazon Redshift](c_unloading_data.md). 
+ Imposta il parametro relativo alle dimensioni di recupero JDBC nell'applicazione client. Se utilizzi una connessione JDBC e riscontri out-of-memory errori sul lato client, puoi consentire al client di recuperare i set di risultati in batch più piccoli impostando il parametro JDBC fetch size. Per ulteriori informazioni, consulta [Impostazione del parametro delle dimensioni del recupero JDBC](set-the-JDBC-fetch-size-parameter.md). 

## Esempi di DECLARE CURSOR
<a name="declare-example"></a>

L'esempio seguente dichiara un cursore denominato LOLLAPALOOZA per selezionare le informazioni di vendita per l'evento Lollapalooza e quindi recupera le righe dal set di risultati utilizzando il cursore:

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

L'esempio seguente esegue un loop su un refcursor con tutti i risultati di una tabella:

```
CREATE TABLE tbl_1 (a int, b int);
INSERT INTO tbl_1 values (1, 2),(3, 4);

CREATE OR REPLACE PROCEDURE sp_cursor_loop() AS $$
DECLARE
    target record;
    curs1 cursor for select * from tbl_1;
BEGIN
    OPEN curs1;
    LOOP
        fetch curs1 into target;
        exit when not found;
        RAISE INFO 'a %', target.a;
    END LOOP;
    CLOSE curs1;
END;
$$ LANGUAGE plpgsql;

CALL sp_cursor_loop();
         
SELECT message 
   from svl_stored_proc_messages 
   where querytxt like 'CALL sp_cursor_loop()%';
         
  message
----------
      a 1
      a 3
```

# DELETE
<a name="r_DELETE"></a>

Elimina le righe dalle tabelle.

**Nota**  
Le dimensioni massime per una istruzione SQL è di 16 MB.

## Sintassi
<a name="r_DELETE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] { table_name | materialized_view_name }
    [ { USING } table_name, ... ]
    [ WHERE condition ]
```

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

Clausola WITH  
Clausola facoltativa che ne specifica uno o più. *common-table-expressions* Per informazioni, consulta [Clausola WITH](r_WITH_clause.md). 

FROM  
La parola chiave FROM è facoltativa eccetto quando la clausola USING è specificata. Le istruzioni `delete from event;` e `delete event;` sono operazioni equivalenti che rimuovono tutte le righe della tabella EVENT.  
Per eliminare tutte le righe da una tabella, usa il comando [TRUNCATE](r_TRUNCATE.md) sulla tabella. TRUNCATE è molto più efficiente di DELETE e non richiede VACUUM e ANALYZE. Tuttavia, tieni presente che TRUNCATE esegue il commit della transazione in cui viene eseguito.

 *table\$1name*   
Tabella temporanea o persistente. Solo il proprietario della tabella o un utente con il privilegio DELETE sulla tabella può eliminare le righe dalla tabella.  
Prendi in considerazione l'utilizzo del comando TRUNCATE per le operazioni di eliminazione rapida non qualificate su tabelle di grandi dimensioni; vedi [TRUNCATE](r_TRUNCATE.md).  
Dopo aver eliminato un numero elevato di righe da una tabella:  
+ Applica l'operazione di vacuum alla tabella per recuperare spazio di memorizzazione e riordinare le righe.
+ Analizza la tabella per aggiornare le statistiche del pianificatore di query.

 *materialized\$1view\$1name*   
Una vista materializzata. L'istruzione DELETE funziona su una vista materializzata utilizzata per [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md). Solo il proprietario della vista materializzata o un utente con privilegio DELETE sulla vista materializzata può eliminare righe dalla vista materializzata.  
Non puoi eseguire DELETE su una vista materializzata per l'importazione dati in streaming con una policy di sicurezza a livello di riga (RLS) che non prevede l'autorizzazione IGNORE RLS concessa all'utente. C'è un'eccezione: se all'utente che esegue l'operazione DELETE è stata concessa la licenza IGNORE RLS, l'operazione viene eseguita correttamente. Per ulteriori informazioni, consulta [Proprietà e gestione delle policy RLS](https://docs.aws.amazon.com/redshift/latest/dg/t_rls_ownership.html).

USING *table\$1name*, ...  
La parola chiave USING viene utilizzata per introdurre un elenco di tabelle quando si fa riferimento a tabelle aggiuntive nella condizione della clausola WHERE. Ad esempio, la seguente istruzione elimina tutte le righe dalla tabella EVENT che soddisfano la condizione di join sulle tabelle EVENT e SALES. La tabella SALES deve essere esplicitamente citata nell'elenco FROM:  

```
delete from event using sales where event.eventid=sales.eventid;
```
Se ripeti il nome della tabella di destinazione nella clausola USING, l'operazione DELETE esegue un self join. Puoi utilizzare una sottoquery nella clausola WHERE anziché la sintassi USING come metodo alternativo per scrivere la stessa query.

WHERE *condition*   
Clausola facoltativa che limita l'eliminazione delle righe a quelle che corrispondono alla condizione. Ad esempio, la condizione può essere una restrizione su una colonna, una condizione di join o una condizione basata sul risultato di una query. La query può fare riferimento a tabelle diverse da quella di destinazione del comando DELETE. Ad esempio:  

```
delete from t1
where col1 in(select col2 from t2);
```
Se non viene specificata alcuna condizione, vengono eliminate tutte le righe della tabella.

## Note per l’utilizzo
<a name="r_DELETE-usage"></a>
+ Le operazioni DELETE mantengono blocchi esclusivi quando vengono eseguite sulle viste materializzate in streaming di Amazon Redshift connesse a uno dei seguenti elementi:
  +  Un flusso di dati Amazon Kinesis 
  +  Un argomento Streaming gestito da Amazon per Apache Kafka 
  +  Un flusso esterno supportato, ad esempio un argomento Confluent Cloud Kafka 

  Per ulteriori informazioni, consulta [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md).

## Esempi
<a name="r_DELETE-examples"></a>

Elimina tutte le righe dalla tabella CATEGORY:

```
delete from category;
```

Elimina le righe con valori CATID compresi tra 0 e 9 dalla tabella CATEGORY:

```
delete from category
where catid between 0 and 9;
```

Elimina le righe dalla tabella LISTING i cui valori SELLERID non esistono nella tabella SALES:

```
delete from listing
where listing.sellerid not in(select sales.sellerid from sales);
```

Le due query seguenti eliminano entrambe una riga dalla tabella CATEGORY, in base a un join alla tabella EVENT e a un'ulteriore limitazione sulla colonna CATID:

```
delete from category
using event
where event.catid=category.catid and category.catid=9;
```

```
delete from category
where catid in
(select category.catid from category, event
where category.catid=event.catid and category.catid=9);
```

La seguente query elimina tutte le righe dalla vista materializzata `mv_cities`. Il nome della vista materializzata in questo esempio è un esempio:

```
delete from mv_cities;
```

# DESC DATASHARE
<a name="r_DESC_DATASHARE"></a>

Visualizza un elenco di oggetti di database all'interno di una unità di condivisione dati che vengono aggiunti tramite ALTER DATASHARE. Amazon Redshift visualizza i nomi, i database, gli schemi e i tipi di tabelle, viste e funzioni. 

Puoi trovare informazioni aggiuntive sugli oggetti dell’unità di condivisione dati utilizzando le viste di sistema. Per ulteriori informazioni, consulta [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).

## Sintassi
<a name="r_DESC_DATASHARE-synopsis"></a>

```
DESC DATASHARE datashare_name [ OF [ ACCOUNT account_id ] NAMESPACE namespace_guid ]
```

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

 *datashare\$1name*   
Il nome dell'unità di condivisione dati. 

NAMESPACE *namespace\$1guid*   
Un valore che specifica lo spazio dei nomi utilizzato dalla unità di condivisione dati. Quando si esegue DESC DATASHARE come amministratore del cluster consumer, è necessario specificare il parametro NAMESPACE per visualizzare le unità di condivisione dati in ingresso.

ACCOUNT *account\$1id*  
Un valore che specifica l'account a cui appartiene l'unità di condivisione dati.

## Note per l'utilizzo
<a name="r_DESC_DATASHARE-usage"></a>

In qualità di amministratore di account consumer, quando esegui DESC DATASHARE per visualizzare le condivisioni di dati in entrata all'interno dell'account, specifica l'opzione NAMESPACE. AWS Quando esegui DESC DATASHARE per visualizzare le condivisioni di dati in entrata tra gli account, specifica le opzioni ACCOUNT e NAMESPACE. AWS 

## Esempi
<a name="r_DESC_DATASHARE-examples"></a>

L'esempio seguente mostra le informazioni per le unità di condivisione dati in uscita in un cluster producer.

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

L'esempio seguente mostra le informazioni per le unità di condivisione dati in entrata in un cluster producer.

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

Visualizza le informazioni relative a un provider di identità. Solo un utente con privilegi avanzati può descrivere un provider di identità.

## Sintassi
<a name="r_DESC_IDENTITY_PROVIDER-synopsis"></a>

```
DESC IDENTITY PROVIDER identity_provider_name
```

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

 *identity\$1provider\$1name*   
Il nome del provider di identità.

## Esempio
<a name="r_DESC_IDENTITY_PROVIDER-examples"></a>

Nell'esempio seguente vengono visualizzate informazioni sul provider di identità.

```
DESC IDENTITY PROVIDER azure_idp;
```

Output di esempio.

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

Scollega da una colonna una policy di mascheramento dinamico dei dati già collegata. Per ulteriori informazioni sul mascheramento dinamico dei dati, consulta [Mascheramento dinamico dei dati](t_ddm.md).

Una policy di mascheramento può essere scollegata da utenti con privilegi avanzati e da utenti o ruoli che dispongono del ruolo sys:secadmin.

## Sintassi
<a name="r_DETACH_MASKING_POLICY-synopsis"></a>

```
DETACH MASKING POLICY
{
  policy_name ON table_name
  | database_name.policy_name ON database_name.schema_name.table_name
}
( output_column_names )
FROM { user_name | ROLE role_name | PUBLIC };
```

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

 *nome\$1policy*   
Nome della policy di mascheramento da scollegare.

database\$1name  
Il nome del database in cui vengono create la politica e la relazione. La politica e la relazione devono trovarsi sullo stesso database. Il database può essere il database connesso o un database che supporta le autorizzazioni federate di Amazon Redshift.

schema\$1name  
Il nome dello schema a cui appartiene la relazione.

 *table\$1name*   
Nome della tabella da cui scollegare policy di mascheramento.

*output\$1column\$1names*   
Nomi delle colonne a cui è stata collegata la policy di mascheramento.

*user\$1name*   
Nome dell'utente a cui è stata collegata la policy di mascheramento.  
È possibile impostare solo uno tra user\$1name, role\$1name e PUBLIC in una singola istruzione DETACH MASKING POLICY.

*role\$1name*   
Nome del ruolo a cui è stata collegata la policy di mascheramento.  
È possibile impostare solo uno tra user\$1name, role\$1name e PUBLIC in una singola istruzione DETACH MASKING POLICY.

*PUBLIC*   
Mostra che la policy è stata collegata a tutti gli utenti nella tabella.  
È possibile impostare solo uno tra user\$1name, role\$1name e PUBLIC in una singola istruzione DETACH MASKING POLICY.

Per l'utilizzo di DETACH MASKING POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di Amazon](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html) Redshift.

# DETACH RLS POLICY
<a name="r_DETACH_RLS_POLICY"></a>

Scollegamento di una policy di sicurezza a livello di riga su una tabella da uno o più utenti o ruoli.

Una policy può essere scollegata da superuser e utenti o ruoli che dispongono del ruolo `sys:secadmin`.

## Sintassi
<a name="r_DETACH_RLS_POLICY-synopsis"></a>

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

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

 *nome\$1policy*   
Il nome della policy .

database\$1name  
Il nome del database in cui vengono create la politica e la relazione. La politica e la relazione devono trovarsi sullo stesso database. Il database può essere il database connesso o un database che supporta le autorizzazioni federate di Amazon Redshift.

schema\$1name  
Il nome dello schema a cui appartiene la relazione.

table\$1name  
La relazione a cui è collegata la policy di sicurezza a livello di riga.

FROM \$1 *nome\$1utente* \$1 ROLE *nome\$1ruolo* \$1 PUBLIC\$1 [, ...]  
Specifica se la policy è scollegata da uno o più utenti o ruoli specificati. 

Per l'utilizzo di DETACH RLS POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di Amazon](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html) Redshift.

## Note per l'utilizzo
<a name="r_DETACH_RLS_POLICY-usage"></a>

Quando lavori con l'istruzione DETACH RLS POLICY, tieni presente quanto segue:
+ Puoi scollegare una policy da una relazione, un utente, un ruolo o un pubblico.

## Esempi
<a name="r_DETACH_RLS_POLICY-examples"></a>

Nell'esempio seguente, una policy su una tabella viene scollegata da un ruolo.

```
DETACH RLS POLICY policy_concerts ON tickit_category_redshift FROM ROLE analyst, ROLE dbadmin;
```

# DROP DATABASE
<a name="r_DROP_DATABASE"></a>

Rimuovi un database. 

Non è possibile eseguire DROP DATABASE all'interno di un blocco di transazione (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

## Sintassi
<a name="r_DROP_DATABASE-synopsis"></a>

```
DROP DATABASE database_name [ FORCE ]
```

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

 *database\$1name*   
Nome del database da rimuovere Non puoi rilasciare i database dev, padb\$1harvest, template0, template1 o sys:internal e non puoi rilasciare il database corrente.  
Per rimuovere un database esterno, elimina lo schema esterno. Per ulteriori informazioni, consulta [DROP SCHEMA](r_DROP_SCHEMA.md).

 FORCE   
Quando specifichi FORCE, DROP DATABASE tenta di terminare le connessioni attive prima di rimuovere il database. Se tutte le connessioni attive terminano correttamente entro un timeout, l’interruzione procede. Se non tutte le connessioni terminano, il comando genera un errore.

## Note sull'utilizzo di DROP DATABASE
<a name="r_DROP_DATABASE_usage"></a>

Durante l'utilizzo dell'istruzione DROP DATABASE, considera quando segue:
+ In generale, consigliamo di non rimuovere un database che contiene una unità di condivisione dati AWS Data Exchange utilizzando l'istruzione DROP DATASHARE. Se lo si farà, i Account AWS che hanno accesso all'unità di condivisione dati perderanno l'accesso. L'esecuzione di questo tipo di alterazione può violare i termini del prodotto dei dati in AWS Data Exchange.

  L'esempio seguente mostra un errore quando un database contenente un'unità unità di condivisione dati AWS Data Exchange viene eliminata.

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

  Per consentire l'eliminazione del database, impostare la variabile seguente ed eseguire nuovamente l'istruzione DROP DATABASE.

  ```
  SET datashare_break_glass_session_var to 'ce8d280c10ad41';
  ```

  ```
  DROP DATABASE test_db;
  ```

  In questo caso, Amazon Redshift genera un valore casuale una tantum per impostare la variabile di sessione per consentire DROP DATASHARE per un database che contiene un'unità di condivisione dati AWS Data Exchange .

## Esempi
<a name="r_DROP_DATABASE-examples"></a>

L'esempio seguente rimuove un database denominato TICKIT\$1TEST: 

```
drop database tickit_test;
```

# DROP DATASHARE
<a name="r_DROP_DATASHARE"></a>

Elimina una unità di condivisione dati. Questo comando è irreversibile.

Solo un utente con privilegi avanzati o il proprietario di una unità di condivisione dati può eliminare una unità di condivisione dati.

## Privilegi richiesti
<a name="r_DROP_DATASHARE-privileges"></a>

Di seguito sono riportati i privilegi richiesti per DROP DATASHARE:
+ Superuser
+ Utenti con il privilegio DROP DATASHARE
+ Proprietario dell'unità di condivisione dati

## Sintassi
<a name="r_DROP_DATASHARE-synopsis"></a>

```
DROP DATASHARE datashare_name;
```

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

 *datashare\$1name*   
Il nome dell'unità di condivisione dati da rimuovere.

## Note per l'utilizzo di DROP DATASHARE
<a name="r_DROP_DATASHARE_usage"></a>

Durante l'utilizzo dell'istruzione DROP DATABASE, considera quando segue:
+ In generale, ti consigliamo di non eliminare un datashare utilizzando l'istruzione DROP DATASHARE. AWS Data Exchange Se lo fai, chi ha accesso al Account AWS datashare perde l'accesso. L'esecuzione di questo tipo di alterazione può violare i termini del prodotto dei dati in AWS Data Exchange.

  L'esempio seguente mostra un errore quando un AWS Data Exchange datashare viene eliminato.

  ```
  DROP DATASHARE salesshare;
  ERROR:  Drop of ADX-managed datashare salesshare requires session variable datashare_break_glass_session_var to be set to value '620c871f890c49'
  ```

  Per consentire l'eliminazione di un AWS Data Exchange datashare, impostate la variabile seguente ed eseguite nuovamente l'istruzione DROP DATASHARE.

  ```
  SET datashare_break_glass_session_var to '620c871f890c49';
  ```

  ```
  DROP DATASHARE salesshare;
  ```

  In questo caso, Amazon Redshift genera un valore casuale una tantum per impostare la variabile di sessione in modo da consentire DROP DATASHARE per un datashare. AWS Data Exchange 

## Esempi
<a name="r_DROP_DATASHARE-examples"></a>

Nell'esempio seguente viene rimossa un'unità di condivisione dati denominata `salesshare`.

```
DROP DATASHARE salesshare;
```

# DROP EXTERNAL VIEW
<a name="r_DROP_EXTERNAL_VIEW"></a>

Rilascia una vista esterna dal database. Il rilascio di una vista esterna la rimuove da tutti i motori SQL, come Amazon Athena e Amazon EMR Spark, a cui è associata. Questo comando non può essere annullato. Per ulteriori informazioni sulle viste del Catalogo dati, consulta [Viste del AWS Glue Data Catalog](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html).

## Sintassi
<a name="r_DROP_EXTERNAL_VIEW-synopsis"></a>

```
DROP EXTERNAL VIEW schema_name.view_name [ IF EXISTS ]
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
```

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

 *schema\$1name.view\$1name*   
Lo schema allegato al AWS Glue database, seguito dal nome della vista.

IF EXISTS  
Rilascia la vista solo se esiste.

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
La notazione dello schema da usare per il rilascio della vista. È possibile specificare di utilizzare il AWS Glue Data Catalog, un database Glue creato dall'utente o uno schema esterno creato dall'utente. Per ulteriori informazioni, consulta [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).

 *query\$1definition*   
La definizione della query SQL che Amazon Redshift esegue per alterare la vista.

## Esempi
<a name="r_DROP_EXTERNAL_VIEW-examples"></a>

L'esempio seguente rilascia una vista del catalogo dati denominata 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>

Rimuove una funzione definita dall'utente (UDF, user-defined function) dal database. La firma della funzione o l'elenco dei tipi di dati dell'argomento devono essere specificati perché possono esistere più funzioni con lo stesso nome ma diverse firme. Non è possibile rimuovere una funzione integrata di Amazon Redshift.

Questo comando è irreversibile.

## Privilegi richiesti
<a name="r_DROP_FUNCTION-privileges"></a>

Di seguito sono elencati i privilegi richiesti per DROP FUNCTION:
+ Superuser
+ Utenti con il privilegio DROP FUNCTION
+ Proprietario della funzione

## Sintassi
<a name="r_DROP_FUNCTION-synopsis"></a>

```
DROP FUNCTION name
( [arg_name] arg_type   [, ...] )
[ CASCADE | RESTRICT ]
```

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

 *name*   
Il nome della funzione da rimuovere.

 *arg\$1name*   
Il nome di un argomento di input. DROP FUNCTION ignora i nomi degli argomenti perché sono necessari solo i tipi di dati dell'argomento per determinare l'identità della funzione.

 *arg\$1type*   
Tipo di dati dell'argomento di input. Puoi fornire un elenco separato da virgole con un massimo di 32 tipi di dati.

 CASCADE   
Parola chiave che specifica di rimuovere automaticamente gli oggetti che dipendono dalla funzione, come le viste.   
Per creare una vista che non dipende da una funzione, includi la clausola WITH NO SCHEMA BINDING nella definizione della vista. Per ulteriori informazioni, consulta [CREATE VIEW](r_CREATE_VIEW.md).

 RESTRICT   
Parola chiave che specifica che se un oggetto dipende dalla funzione, non rimuove la funzione e restituisce un messaggio. Questa operazione costituisce l'impostazione predefinita.

## Esempi
<a name="r_DROP_FUNCTION-examples"></a>

L'esempio seguente rimuove la funzione denominata `f_sqrt`:

```
drop function f_sqrt(int);
```

Per rimuovere una funzione con dipendenze, utilizza l'opzione CASCADE, come mostrato nell'esempio seguente:

```
drop function f_sqrt(int)cascade;
```

# DROP GROUP
<a name="r_DROP_GROUP"></a>

Elimina un gruppo di utenti. Questo comando è irreversibile. Questo comando non elimina i singoli utenti in un gruppo.

Vedi DROP USER per eliminare un singolo utente.

## Sintassi
<a name="r_DROP_GROUP-synopsis"></a>

```
DROP GROUP name
```

## Parametro
<a name="r_DROP_GROUP-parameter"></a>

 *name*   
Nome del gruppo di utenti da eliminare.

## Esempio
<a name="r_DROP_GROUP-example"></a>

L’esempio seguente elimina il gruppo di utenti `guests`:

```
DROP GROUP guests;
```

Non puoi rimuovere un gruppo se il gruppo ha privilegi su un oggetto. Se tenti di rimuovere un gruppo di questo tipo, verrà restituito il seguente errore.

```
ERROR: group "guests" can't be dropped because the group has a privilege on some object
```

Se il gruppo dispone dei privilegi per un oggetto, devi revocarli prima di rimuovere il gruppo. Per trovare gli oggetti per i quali il gruppo `guests` dispone dei privilegi, utilizza l’esempio seguente. Per ulteriori informazioni sulla vista di metadati utilizzata nell’esempio, consulta [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         |
+----------------+---------------+---------------+---------------+
```

L'esempio seguente revoca tutti i privilegi su tutte le tabelle nello schema `public` dal gruppo di utenti `guests` e quindi rimuove il gruppo.

```
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM GROUP guests;
DROP GROUP guests;
```

# DROP IDENTITY PROVIDER
<a name="r_DROP_IDENTITY_PROVIDER"></a>

Elimina un provider di identità. Questo comando è irreversibile. Solo un utente con privilegi avanzati può eliminare un provider di identità.

## Sintassi
<a name="r_DROP_IDENTITY_PROVIDER-synopsis"></a>

```
DROP IDENTITY PROVIDER identity_provider_name [ CASCADE ]
```

## Parametri
<a name="r_DROP_IDENTITY_PROVIDER-parameter"></a>

 *identity\$1provider\$1name*   
Il nome del provider di identità da eliminare.

 CASCADE   
Elimina utenti e ruoli collegati al provider di identità, quando questo viene eliminato.

## Esempio
<a name="r_DROP_IDENTITY_PROVIDER-example"></a>

L'esempio seguente elimina il provider di identità *oauth\$1provider*.

```
DROP IDENTITY PROVIDER oauth_provider;
```

Se si elimina il provider di identità, alcuni utenti potrebbero non essere in grado di accedere o utilizzare gli strumenti client configurati per utilizzare il provider di identità.

# DROP LIBRARY
<a name="r_DROP_LIBRARY"></a>

Rimuove una libreria Python personalizzata dal database. Solo il proprietario della libreria o un utente con privilegi avanzati può rimuovere una libreria. 

DROP LIBRARY non può essere eseguito all'interno di un blocco di transazioni (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

Questo comando è irreversibile. Il comando DROP LIBRARY viene immediatamente sottoposto al commit. Se una UDF che dipende dalla libreria viene eseguita contemporaneamente, l'UDF potrebbe non riuscire anche se è in esecuzione all'interno di una transazione.

Per ulteriori informazioni, consulta [CREATE LIBRARY](r_CREATE_LIBRARY.md). 

## Privilegi richiesti
<a name="r_DROP_LIBRARY-privileges"></a>

Di seguito sono elencati i privilegi richiesti per DROPLIBRARY:
+ Superuser
+ Utenti con il privilegio DROP LIBRARY
+ Proprietario della libreria

## Sintassi
<a name="r_DROP_LIBRARY-synopsis"></a>

```
DROP LIBRARY library_name
```

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

 *library\$1name*   
Nome della libreria.

# DROP MASKING POLICY
<a name="r_DROP_MASKING_POLICY"></a>

Elimina una policy di mascheramento dinamico dei dati da tutti i database. Non è possibile eliminare una policy di mascheramento ancora collegata a una o più tabelle. Per ulteriori informazioni sul mascheramento dinamico dei dati, consulta [Mascheramento dinamico dei dati](t_ddm.md).

Una policy di mascheramento può essere eliminata da utenti con privilegi avanzati e da utenti o ruoli che dispongono del ruolo sys:secadmin.

## Sintassi
<a name="r_DROP_MASKING_POLICY-synopsis"></a>

```
DROP MASKING POLICY { policy_name | database_name.policy_name };
```

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

 *nome\$1policy*   
Nome della policy di mascheramento da eliminare.

database\$1name  
Il nome del database da cui eliminare la policy. Il database può essere il database connesso o un database che supporta le autorizzazioni federate di Amazon Redshift.

Per l'utilizzo di DROP MASKING POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

# DROP MODEL
<a name="r_DROP_MODEL"></a>

Rimuove un modello dal database. Solo il proprietario del modello o un utente con privilegi avanzati può rimuovere un modello. 

DROP MODEL elimina anche tutte le funzioni di previsione associate derivate da questo modello, tutti gli artefatti di Amazon Redshift correlati al modello e tutti i dati Amazon S3 relativi al modello. Mentre il modello è ancora in fase di addestramento in Amazon SageMaker AI, DROP MODEL annullerà tali operazioni.

Questo comando è irreversibile. Il comando DROP MODEL esegue immediatamente il commit.

## Autorizzazioni richieste
<a name="r_DROP_MODEL-privileges"></a>

Di seguito sono riportate le autorizzazioni richieste per DROP MODEL:
+ Superuser
+ Utenti con autorizzazione DROP MODEL
+ Proprietario del modello
+ Proprietario dello schema

## Sintassi
<a name="r_DROP_MODEL-synopsis"></a>

```
DROP MODEL [ IF EXISTS ] model_name
```

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

 *IF EXISTS*   
Una clausola che indica che se lo schema specificato esiste già, il comando non deve apportare modifiche e deve restituire un messaggio che lo schema esiste.

 *model\$1name*   
Il nome del modello. Il nome del modello in uno schema deve essere unico.

## Esempi
<a name="r_DROP_MODEL-examples"></a>

L'esempio seguente rimuove il modello demo\$1ml.customer\$1churn.

```
DROP MODEL demo_ml.customer_churn
```

# DROP MATERIALIZED VIEW
<a name="materialized-view-drop-sql-command"></a>

Elimina una vista materializzata

Per ulteriori informazioni sulle viste materializzate, consultare [Viste materializzate in Amazon Redshift](materialized-view-overview.md).

## Sintassi
<a name="mv_DROP_MATERIALIZED_VIEW-synopsis"></a>

```
DROP MATERIALIZED VIEW [ IF EXISTS ] mv_name [, ... ] [ CASCADE | RESTRICT ]
```

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

IF EXISTS  
Una clausola che specifica di verificare se esiste la vista materializzata denominata. Se la vista materializzata non esiste, il comando `DROP MATERIALIZED VIEW` restituisce un messaggio di errore. Questa clausola è utile all'interno degli script, per evitare che lo script fallisca in caso di eliminazione di una vista materializzata inesistente.

*mv\$1name*  
Il nome della vista materializzata da eliminare.

CASCADE  
Una clausola che indica di rimuovere automaticamente gli oggetti che dipendono dalla vista materializzata, come altre viste.

RESTRICT  
Una clausola che indica di non rimuovere la vista materializzata se sono presenti oggetti che dipendono da essa. Questa è l’impostazione predefinita.

## Note per l'utilizzo
<a name="mv_DROP_MATERIALIZED_VIEW-usage"></a>

Solo il proprietario di una vista materializzata può utilizzare `DROP MATERIALIZED VIEW` su quella vista. Un utente con privilegi avanzati o un utente a cui sono stati specificamente concessi i privilegi DROP possono costituire un'eccezione.

Quando scrivi un'istruzione drop per una vista materializzata ed esiste una vista con un nome corrispondente, viene generato un errore che indica di utilizzare DROP VIEW. Si verifica un errore anche nel caso in cui si utilizza `DROP MATERIALIZED VIEW IF EXISTS`.

## Esempio
<a name="mv_DROP_MATERIALIZED_VIEW-examples"></a>

Nell'esempio seguente viene eseguita l'eliminazione della vista materializzata `tickets_mv`.

```
DROP MATERIALIZED VIEW tickets_mv;
```

# DROP PROCEDURE
<a name="r_DROP_PROCEDURE"></a>

Rilascia una procedura. Per rilasciare una procedura, sono necessari sia il nome della procedura che i tipi di dati dell'argomento di input (firma). Facoltativamente, puoi includere i tipi di dati dell'argomento completi, inclusi gli argomenti OUT. Per trovare la firma di una procedura, utilizza il comando [SHOW PROCEDURE](r_SHOW_PROCEDURE.md). Per ulteriori informazioni sulle firme delle procedure, consulta [PG\$1PROC\$1INFO](r_PG_PROC_INFO.md).

## Privilegi richiesti
<a name="r_DROP_PROCEDURE-privileges"></a>

Di seguito sono riportati i privilegi richiesti per DROP PROCEDURE:
+ Superuser
+ Utenti con il privilegio DROP PROCEDURE
+ Proprietario della procedura

## Sintassi
<a name="r_DROP_PROCEDURE-synopsis"></a>

```
DROP PROCEDURE sp_name ( [ [ argname ] [ argmode ] argtype [, ...] ] )
```

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

 *sp\$1name*   
Il nome della procedura da rimuovere. 

 *argname*   
Il nome di un argomento di input. DROP PROCEDURE ignora i nomi degli argomenti, poiché sono necessari solo i tipi di dati dell'argomento per determinare l'identità della funzione. 

 *argmode*   
La modalità di un argomento, che può essere IN, OUT o INOUT. Gli argomenti OUT sono facoltativi in quanto non vengono utilizzati per individuare una procedura archiviata. 

 *argtype*   
Tipo di dati dell'argomento di input. Per un elenco dei tipi di dati supportati, consultare [Tipi di dati](c_Supported_data_types.md). 

## Esempi
<a name="r_DROP_PROCEDURE-examples"></a>

L'esempio seguente rilascia una procedura archiviata denominata `quarterly_revenue`.

```
DROP PROCEDURE quarterly_revenue(volume INOUT bigint, at_price IN numeric,result OUT int);
```

# DROP RLS POLICY
<a name="r_DROP_RLS_POLICY"></a>

Elimina una policy di sicurezza a livello di riga per tutte le tabelle in tutti i database.

Una policy può essere eliminata da superuser e utenti o ruoli che dispongono del ruolo sys:secadmin.

## Sintassi
<a name="r_DROP_RLS_POLICY-synopsis"></a>

```
DROP RLS POLICY [ IF EXISTS ] 
{ policy_name | database_name.policy_name }
[ CASCADE | RESTRICT ]
```

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

 *IF EXISTS*   
Una clausola che indica se la policy specificata esiste già.

 *nome\$1policy*   
Il nome della policy .

database\$1name  
Il nome del database da cui eliminare la policy. Il database può essere il database connesso o un database che supporta le autorizzazioni federate di Amazon Redshift.

 *CASCADE*   
Una clausola che indica di scollegare automaticamente la policy da tutte le tabelle collegate prima di eliminarla.

 *RESTRICT*   
Una clausola che indica di non eliminare la policy quando viene collegata ad alcune tabelle. Questa è l’impostazione predefinita.

Per l'utilizzo di DROP RLS POLICY su Amazon Redshift Federated Permissions Catalog, [consulta Gestire il controllo degli accessi con le autorizzazioni federate di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html).

## Esempi
<a name="r_DROP_RLS_POLICY-examples"></a>

Nell'esempio seguente viene eliminata la policy di sicurezza a livello di riga.

```
DROP RLS POLICY policy_concerts;
```

# DROP ROLE
<a name="r_DROP_ROLE"></a>

Rimuove un ruolo da un database. Solo il proprietario del ruolo che ha creato il ruolo, un utente con l'opzione WITH ADMIN o un utente con privilegi avanzati può eliminare un ruolo.

Non è possibile eliminare un ruolo concesso a un utente o un altro ruolo dipendente da questo ruolo.

## Privilegi richiesti
<a name="r_DROP_ROLE-privileges"></a>

Di seguito sono riportati i privilegi richiesti per DROP ROLE:
+ Superuser
+ Proprietario del ruolo che è l'utente che ha creato il ruolo o un utente a cui è stato concesso il ruolo con il privilegio WITH ADMIN OPTION.

## Sintassi
<a name="r_DROP_ROLE-synopsis"></a>

```
DROP ROLE role_name [ FORCE | RESTRICT ] 
```

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

*role\$1name*  
Il nome del ruolo.

[ FORCE \$1 RESTRICT ]  
L'impostazione predefinita è RESTRICT. Amazon Redshift genera un errore quando si tenta di eliminare un ruolo che ha ereditato un altro ruolo. Usa FORCE per rimuovere tutte le assegnazioni del ruolo, se esistenti. 

## Esempi
<a name="r_DROP_ROLE-examples"></a>

L'esempio seguente rimuove il ruolo `sample_role`.

```
DROP ROLE sample_role FORCE;
```

L'esempio seguente tenta di eliminare il ruolo sample\$1role1 concesso a un utente con l'opzione RESTRICT di default.

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

Per eliminare correttamente il sample\$1role1 concesso a un utente, utilizza l'opzione FORCE.

```
DROP ROLE sample_role1 FORCE;
```

L'esempio seguente tenta di eliminare il ruolo sample\$1role2 che ha un altro ruolo dipendente da esso con l'opzione RESTRICT di default.

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

Per eliminare correttamente il sample\$1role2, da cui dipende un altro ruolo, utilizza l'opzione FORCE.

```
DROP ROLE sample_role2 FORCE;
```

# DROP SCHEMA
<a name="r_DROP_SCHEMA"></a>

Elimina uno schema. Per uno schema esterno, puoi anche rimuovere il database esterno associato allo schema. Questo comando è irreversibile.

## Privilegi richiesti
<a name="r_DROP_SCHEMA-privileges"></a>

Di seguito sono riportati i privilegi richiesti per DROP SCHEMA:
+ Superuser
+ Proprietario dello schema
+ Utenti con il privilegio DROP SCHEMA

## Sintassi
<a name="r_DROP_SCHEMA-synopsis"></a>

```
DROP SCHEMA [ IF EXISTS ] name [, ...]
[ DROP EXTERNAL DATABASE ]
[ CASCADE | RESTRICT ]
```

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

IF EXISTS  
Clausola che indica che se lo schema specificato non esiste, il comando non deve apportare modifiche e deve restituire un messaggio che lo schema non esiste, piuttosto che terminare con un errore.  
Questa clausola è utile durante lo scripting, quindi lo script ha esito positivo se DROP SCHEMA viene eseguito su uno schema inesistente.

 *name*   
Nomi degli schemi da rimuovere. Puoi specificare diversi nomi di schema separati da virgole.

 DROP EXTERNAL DATABASE   
Una clausola che indica che se uno schema esterno è stato rimosso, devi rimuovere il database esterno associato allo schema esterno, se esiste. Se non esiste alcun database esterno, il comando restituisce un messaggio che dichiara che non esiste alcun database esterno. Se vengono rimossi più schemi esterni, tutti i database associati agli schemi specifici vengono eliminati.   
Se un database esterno contiene oggetti dipendenti come le tabelle, includi l'opzione CASCADE per rimuovere gli oggetti dipendenti.   
Quando rimuovi un database esterno, il database viene rimosso anche per altri schemi associati al database. Vengono anche rimosse le tabelle definite in altri schemi esterni tramite il database.   
DROP EXTERNAL DATABASE non supporta i database esterni archiviati in un metastore HIVE. 

CASCADE  
Parola chiave che indica di rimuovere automaticamente tutti gli oggetti nello schema. Se viene specificato DROP EXTERNAL DATABASE, anche tutti gli oggetti nel database esterno vengono rimossi.

RESTRICT  
Parola chiave che indica di non eliminare uno schema o database esterno se contiene oggetti. Questa operazione costituisce l'impostazione predefinita.

## Esempio
<a name="r_DROP_SCHEMA-example"></a>

L'esempio seguente elimina uno schema denominato S\$1SALES. Questo esempio utilizza RESTRICT come meccanismo di sicurezza in modo che lo schema non venga eliminato se contiene oggetti. In questo caso, è necessario eliminare gli oggetti dello schema prima di eliminare lo schema.

```
drop schema s_sales restrict;
```

L'esempio seguente elimina uno schema denominato S\$1SALES e tutti gli oggetti che dipendono da tale schema.

```
drop schema s_sales cascade;
```

L'esempio seguente rimuove lo schema S\$1SALES se esiste oppure non esegue nulla e restituisce un messaggio se non esiste.

```
drop schema if exists s_sales;
```

L'esempio seguente elimina uno schema esterno denominato S\$1SPECTRUM e il database esterno a esso associato. Questo esempio utilizza RESTRICT in modo che lo schema e il database non vengano eliminati se contengono oggetti. In questo caso, è necessario eliminare gli oggetti dipendenti prima di eliminare lo schema e il database.

```
drop schema s_spectrum drop external database restrict;
```

L'esempio seguente elimina più schemi e i database esterni a essi associati, insieme agli oggetti dipendenti. 

```
drop schema s_sales, s_profit, s_revenue drop external database cascade;
```

# DROP TABLE
<a name="r_DROP_TABLE"></a>

Rimuove una tabella da un database. 

Se stai tentando di svuotare una tabella di righe, senza rimuovere la tabella, utilizza il comando DELETE o TRUNCATE. 

DROP TABLE rimuove i vincoli esistenti sulla tabella di destinazione. È possibile rimuovere più tabelle con un singolo comando DROP TABLE. 

Non è possibile eseguire DROP TABLE con una tabella esterna all'interno di una transazione (BEGIN … END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md).

Per trovare un esempio in cui il privilegio DROP è concesso a un gruppo, consultare GRANT [Esempi](r_GRANT-examples.md).

## Privilegi richiesti
<a name="r_DROP_TABLE-privileges"></a>

Di seguito sono riportati i privilegi richiesti per DROP TABLE:
+ Superuser
+ Utenti con il privilegio DROP TABLE
+ Il proprietario della tabella con il privilegio USAGE sullo schema

## Sintassi
<a name="r_DROP_TABLE-synopsis"></a>

```
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
```

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

IF EXISTS  
Clausola che indica che se la tabella specificata non esiste, il comando non deve apportare modifiche e deve restituire un messaggio che la tabella non esiste, piuttosto che terminare con un errore.  
Questa clausola è utile durante lo scripting, quindi lo script ha esito positivo se DROP TABLE viene eseguito su una tabella inesistente.

 *name*   
Nome della tabella da rimuovere. 

CASCADE  
Clausola che indica di rimuovere automaticamente gli oggetti che dipendono dalla tabella, come le viste.  
Per creare una vista che non dipende da altri oggetti del database, come viste e tabelle, includi la clausola WITH NO SCHEMA BINDING nella definizione della vista. Per ulteriori informazioni, consulta [CREATE VIEW](r_CREATE_VIEW.md).

RESTRICT   
Clausola che indica di non eliminare la tabella se sono presenti oggetti che dipendono da essa. Questa operazione costituisce l'impostazione predefinita.

## Esempi
<a name="r_DROP_TABLE-examples"></a>

 **Rimozione di una tabella senza dipendenze** 

L'esempio seguente crea e rimuove una tabella denominata FEEDBACK che non ha dipendenze: 

```
create table feedback(a int);

drop table feedback;
```

 Se una tabella contiene colonne a cui fanno riferimento le viste o altre tabelle, Amazon Redshift visualizza un messaggio come il seguente. 

```
Invalid operation: cannot drop table feedback because other objects depend on it
```

 **Rimozione simultanea di due tabelle** 

Il seguente set di comandi crea una tabella FEEDBACK e una tabella BUYERS e quindi elimina entrambe le tabelle con un singolo comando: 

```
create table feedback(a int);

create table buyers(a int);

drop table feedback, buyers;
```

 **Rimozione di una tabella con una dipendenza** 

Le seguenti operazioni mostrano come rimuovere una tabella denominata FEEDBACK utilizzando l'opzione CASCADE. 

Innanzitutto, crea una semplice tabella denominata FEEDBACK utilizzando il comando CREATE TABLE: 

```
create table feedback(a int);
```

 Quindi, utilizza il comando CREATE VIEW per creare una vista denominata FEEDBACK\$1VIEW che si basa sulla tabella FEEDBACK: 

```
create view feedback_view as select * from feedback;
```

 L'esempio seguente rimuove la tabella FEEDBACK e rimuove anche la vista FEEDBACK\$1VIEW, perché FEEDBACK\$1VIEW dipende dalla tabella FEEDBACK: 

```
drop table feedback cascade;
```

 **Visualizzazione delle dipendenze per una tabella** 

Per restituire le dipendenze per la tabella, utilizza l'esempio seguente. Sostituisci *my\$1schema* e con il tuo schema e la tua tabella. *my\$1table* 

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

Per eliminare *my\$1table* e le relative dipendenze, utilizzate l'esempio seguente. Questo esempio restituisce anche tutte le dipendenze per la tabella che è stata rilasciata.

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

 **Rimozione di una tabella utilizzando IF EXISTS** 

L'esempio seguente rimuove la tabella FEEDBACK se esiste oppure non esegue nulla e restituisce un messaggio se non esiste: 

```
drop table if exists feedback;
```

# RILASCIA UN MODELLO
<a name="r_DROP_TEMPLATE"></a>

Elimina un modello da un database.

## Privilegi richiesti
<a name="r_DROP_TEMPLATE-privileges"></a>

Per eliminare un modello, è necessario disporre di uno dei seguenti:
+ Privilegi di superutente
+ Privilegio DROP TEMPLATE e privilegio USAGE sullo schema contenente il modello

## Sintassi
<a name="r_DROP_TEMPLATE-synopsis"></a>

```
DROP TEMPLATE [database_name.][schema_name.]template_name;
```

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

 *database\$1name*   
(Facoltativo) Il nome del database in cui viene creato il modello. Se non viene specificato, viene utilizzato il database corrente. 

 *schema\$1name*   
(Facoltativo) Il nome dello schema in cui viene creato il modello. Se non viene specificato, il modello viene cercato nel percorso di ricerca corrente. 

 *nome\$1modello*   
Il nome del modello da rimuovere. Nell'esempio seguente, il nome del database è`demo_database`, il nome dello schema è `demo_schema` e il nome del modello è`test`.  

```
DROP TEMPLATE demo_database.demo_schema.test;
```

## Esempi
<a name="r_DROP_TEMPLATE-examples"></a>

L'esempio seguente elimina il modello test\$1template dallo schema corrente:

```
DROP TEMPLATE test_template;
```

L'esempio seguente elimina il modello test\$1template dallo schema test\$1schema:

```
DROP TEMPLATE test_schema.test_template;
```

# DROP USER
<a name="r_DROP_USER"></a>

Rimuove un utente da un database. È possibile rimuovere più utenti con un singolo comando DROP USER. Per eseguire questo comando, devi essere un utente con privilegi avanzati del database o disporre dell’autorizzazione DROP USER.

## Sintassi
<a name="r_DROP_USER-synopsis"></a>

```
DROP USER [ IF EXISTS ] name [, ... ]
```

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

IF EXISTS  
Clausola che stabilisce che se l'utente specificato non esiste, il comando non deve apportare modifiche e deve restituire un messaggio indicante che l'utente non esiste, piuttosto che terminare con un errore.  
Questa clausola è utile durante lo scripting, in modo che lo script abbia esito positivo se DROP USER viene eseguito su un utente inesistente.

 *name*   
Nome dell'utente da rimuovere. Puoi specificare più utenti, usando una virgola per separare ciascun nome dal successivo.

## Note per l'utilizzo
<a name="r_DROP_USER-notes"></a>

Non puoi eliminare l'utente denominato `rdsdb` o l'utente amministratore del database che in genere è denominato `awsuser` o `admin`.

Non puoi rimuovere un utente se questo possiede un oggetto di database, come uno schema, un database, una tabella o una vista oppure se l'utente ha privilegi su un database, una tabella, una colonna o un gruppo. Se tenti di rimuovere un utente di questo tipo, verrà restituito uno dei seguenti errori.

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

Per istruzioni dettagliate su come trovare gli oggetti di proprietà di un utente del database, consulta [How do I resolve the "user cannot be dropped" error in Amazon Redshift?](https://repost.aws/knowledge-center/redshift-user-cannot-be-dropped) (Come risolvere l'errore "l'utente non può essere eliminato" in Amazon Redshift?) nel *Knowledge Center*.

**Nota**  
Amazon Redshift controlla solo il database corrente prima di rimuovere un utente. DROP USER non restituisce un errore se l'utente possiede oggetti di database o ha privilegi su oggetti in un altro database. Se rimuovi un utente proprietario di oggetti in un altro database, il proprietario di tali oggetti viene modificato in 'unknown'. 

Se un utente è proprietario di un oggetto, prima rimuovi l'oggetto o passa la proprietà a un altro utente prima di rimuovere l'utente originale. Se l'utente ha i privilegi per un oggetto, revoca i privilegi prima di rimuovere l'utente. L'esempio seguente mostra come rimuovere un oggetto, modificare la proprietà e revocare i privilegi prima di rimuovere l'utente.

```
drop database dwdatabase;
alter schema dw owner to dwadmin;
revoke all on table dwtable from dwuser;
drop user dwuser;
```

## Esempi
<a name="r_DROP_USER-examples"></a>

L'esempio seguente rimuove un utente chiamato paulo:

```
drop user paulo;
```

L'esempio seguente rimuove due utenti, paulo e martha:

```
drop user paulo, martha;
```

L'esempio seguente rimuove l'utente paulo, se esiste, oppure non viene eseguita alcuna operazione e viene restituito un messaggio se l'utente è inesistente:

```
drop user if exists paulo;
```

# DROP VIEW
<a name="r_DROP_VIEW"></a>

Rimuove una vista dal database. È possibile rimuovere più viste con un singolo comando DROP VIEW. Questo comando è irreversibile.

## Privilegi richiesti
<a name="r_DROP_VIEW-privileges"></a>

Di seguito sono riportati i privilegi richiesti per DROP VIEW:
+ Superuser
+ Utenti con il privilegio DROP VIEW
+ Proprietario della visualizzazione

## Sintassi
<a name="r_DROP_VIEW-synopsis"></a>

```
DROP VIEW [ IF EXISTS ] name [, ... ] [ CASCADE | RESTRICT ] 
```

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

IF EXISTS  
Clausola che indica che se la vista specificata non esiste, il comando non deve apportare modifiche e deve restituire un messaggio che la vista non esiste, piuttosto che terminare con un errore.  
Questa clausola è utile durante lo scripting, quindi lo script ha esito positivo se DROP VIEW viene eseguito su una vista inesistente.

 *name*   
Nome della vista da rimuovere.

CASCADE  
Clausola che indica di rimuovere automaticamente gli oggetti che dipendono dalla vista, come altre viste.  
Per creare una vista che non dipende da altri oggetti del database, come viste e tabelle, includi la clausola WITH NO SCHEMA BINDING nella definizione della vista. Per ulteriori informazioni, consulta [CREATE VIEW](r_CREATE_VIEW.md).  
Tieni presente che se includi CASCADE e il numero di oggetti del database rimossi è pari o superiore a dieci, è possibile che il client del database non elenchi tutti gli oggetti rimossi nei risultati di riepilogo. In genere ciò è dovuto al fatto che gli strumenti del client SQL hanno limitazioni predefinite per i risultati restituiti.

RESTRICT  
Clausola che indica di non eliminare la vista se sono presenti oggetti che dipendono da essa. Questa operazione costituisce l'impostazione predefinita.

## Esempi
<a name="r_DROP_VIEW-examples"></a>

L'esempio seguente rimuove la vista denominata *event*:

```
drop view event;
```

Per rimuovere una vista con dipendenze, utilizza l'opzione CASCADE. Ad esempio, supponiamo di iniziare con una tabella denominata EVENT. Creiamo quindi la vista eventview della tabella EVENT, usando il comando CREATE VIEW, come mostrato nel seguente esempio: 

```
create view eventview as
select dateid, eventname, catid
from event where catid = 1;
```

Ora creiamo una seconda vista chiamata *myeventview*, che si basa sulla prima vista *eventview*:

```
create view myeventview as
select eventname, catid
from eventview where eventname <> ' ';
```

A questo punto, sono state create due viste: *eventview* e *myeventview*.

La vista *myeventview* è una vista figlio con *eventview* come padre.

Per eliminare la vista *eventview*, il comando da usare è il seguente: 

```
drop view eventview;
```

Tieni presente che se esegui il comando in questo caso, viene restituito il seguente errore:

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

Per rimediare, emettere il seguente comando (come suggerito nel messaggio di errore): 

```
drop view eventview cascade;
```

A questo punto la rimozione delle due viste *eventview* e *myeventview* è stata completata.

Nell'esempio seguente viene rimossa la vista *eventview* se esiste oppure non viene eseguita alcuna operazione e viene restituito un messaggio se non esiste:

```
drop view if exists eventview;
```

# END
<a name="r_END"></a>

Esegue il commit della transazione corrente. Esegue esattamente la stessa funzione del comando COMMIT.

Per una documentazione più dettagliata, consultare [COMMIT](r_COMMIT.md).

## Sintassi
<a name="r_END-synopsis"></a>

```
END [ WORK | TRANSACTION ]
```

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

WORK  
Parola chiave facoltativa.

TRANSACTION  
Parola chiave facoltativa; WORK e TRANSACTION sono sinonimi.

## Esempi
<a name="r_END-examples"></a>

Gli esempi seguenti terminano tutti il blocco della transazione ed eseguono il commit della transazione:

```
end;
```

```
end work;
```

```
end transaction;
```

Dopo uno di questi comandi, Amazon Redshift termina il blocco della transazione ed esegue il commit delle modifiche.

# EXECUTE
<a name="r_EXECUTE"></a>

Esegue un'istruzione preparata in precedenza. 

## Sintassi
<a name="r_EXECUTE-synopsis"></a>

```
EXECUTE plan_name [ (parameter [, ...]) ]
```

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

 *plan\$1name*   
Il nome dell'istruzione da preparare. 

 *parameter*   
Il valore effettivo di un parametro dell'istruzione preparata. Deve essere un'espressione che restituisce un valore di un tipo compatibile con il tipo di dati specificato per questa posizione del parametro nel comando PREPARE che ha creato l'istruzione preparata. 

## Note per l'utilizzo
<a name="r_EXECUTE_usage_notes"></a>

EXECUTE viene utilizzato per eseguire un'istruzione preparata in precedenza. Poiché le istruzioni preparate esistono solo per la durata di una sessione, l'istruzione preparata deve essere stata creata da un'istruzione PREPARE eseguita in precedenza nella sessione corrente. 

Se la precedente istruzione PREPARE ha specificato alcuni parametri, un set di parametri compatibile deve essere passato all'istruzione EXECUTE, altrimenti Amazon Redshift restituisce un errore. A differenza delle funzioni, le istruzioni preparate non vengono sovraccaricate in base al tipo o al numero di parametri specificati; il nome di un'istruzione preparata deve essere univoco all'interno di una sessione del database. 

Quando viene emesso un comando EXECUTE per l'istruzione preparata, Amazon Redshift può facoltativamente rivedere il piano di esecuzione della query (per migliorare le prestazioni in base ai valori dei parametri specificati) prima di eseguire l'istruzione preparata. Inoltre, per ogni nuova esecuzione di un'istruzione preparata, Amazon Redshift può rivedere nuovamente il piano di esecuzione della query in base ai diversi valori dei parametri specificati con l'istruzione EXECUTE. Per esaminare il piano di esecuzione della query che Amazon Redshift ha scelto per qualsiasi istruzione EXECUTE specificata, utilizzare il comando [EXPLAIN](r_EXPLAIN.md). 

Per esempi e ulteriori informazioni sulla creazione e sull'uso delle istruzioni preparate, vedi [PREPARE](r_PREPARE.md). 

## consultare anche
<a name="r_EXECUTE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [PREPARE](r_PREPARE.md) 

# EXPLAIN
<a name="r_EXPLAIN"></a>

Mostra il piano di esecuzione per l'istruzione di una query senza eseguire la query. Per informazioni sul flusso di lavoro di analisi delle query, consulta [Flusso di lavoro dell'analisi di query](c-query-analysis-process.md).

## Sintassi
<a name="r_EXPLAIN-synopsis"></a>

```
EXPLAIN [ VERBOSE ] query
```

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

VERBOSE   
Visualizza il piano di query completo anziché solo un riepilogo.

 *query*   
Istruzione di query da spiegare. La query può essere un'istruzione SELECT, INSERT, CREATE TABLE AS, UPDATE o DELETE.

## Note per l'utilizzo
<a name="r_EXPLAIN-usage-notes"></a>

Le prestazioni di EXPLAIN sono talvolta influenzate dal tempo necessario per creare le tabelle temporanee. Ad esempio, una query che utilizza l'ottimizzazione dell'espressione secondaria comune richiede che vengano create e analizzate le tabelle temporanee per restituire l'output di EXPLAIN. Il piano di query dipende dallo schema e dalle statistiche delle tabelle temporanee. Pertanto, il comando EXPLAIN per questo tipo di query potrebbe impiegare più tempo del previsto.

Puoi utilizzare EXPLAIN solo per i seguenti comandi:
+ SELECT
+ SELECT INTO
+ CREATE TABLE AS
+ INSERT
+ UPDATE
+ DELETE

Il comando EXPLAIN avrà esito negativo se lo si utilizza per altri comandi SQL, ad esempio operazioni di database o DDL (Data Definition Language).

I costi unitari relativi all'output EXPLAIN vengono utilizzati da Amazon Redshift per scegliere un piano di query. Amazon Redshift confronta le dimensioni delle varie stime delle risorse per determinare il piano.

## Pianificazione di query e fasi di esecuzione
<a name="r_EXPLAIN-query-planning-and-execution-steps"></a>

Il piano di esecuzione per una istruzione di query Amazon Redshift specifica suddivide l'esecuzione e il calcolo di una query in una sequenza discreta di fasi e operazioni di tabella che alla fine produce un set di risultati finali per la query. Per informazioni sulla pianificazione di query, consultare [Elaborazione query](c-query-processing.md).

La seguente tabella fornisce un riepilogo delle fasi che Amazon Redshift può utilizzare nello sviluppo di un piano di esecuzione per qualsiasi query inviata dall'utente per l'esecuzione.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_EXPLAIN.html)

## Utilizzo di EXPLAIN per RLS
<a name="r_EXPLAIN-RLS"></a>

Se una query contiene una tabella soggetta a politiche di sicurezza a livello di riga (RLS), EXPLAIN visualizza un nodo RLS speciale. SecureScan Amazon Redshift registra anche lo stesso tipo di nodo nella tabella di sistema STL\$1EXPLAIN. EXPLAIN non rivela il predicato RLS che si applica a dim\$1tbl. Il tipo di SecureScan nodo RLS serve da indicatore del fatto che il piano di esecuzione contiene operazioni aggiuntive invisibili all'utente corrente.

L'esempio seguente illustra un nodo 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)
```

Per consentire un'analisi completa dei piani di query soggetti a RLS, Amazon Redshift offre le autorizzazioni di sistema EXPLAIN RLS. Gli utenti a cui è stata concessa questa autorizzazione possono esaminare piani di query completi che includono anche predicati RLS. 

L'esempio seguente illustra un Seq Scan aggiuntivo sotto il SecureScan nodo RLS che include anche il predicato della policy 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)
```

Sebbene l'autorizzazione EXPLAIN RLS sia concessa a un utente, Amazon Redshift registra il piano di query completo, inclusi i predicati RLS, nella tabella di sistema STL\$1EXPLAIN. Le query che vengono eseguite mentre questa autorizzazione non è concessa verranno registrate senza interni RLS. La concessione o la rimozione dell'autorizzazione EXPLAIN RLS non modificherà ciò che Amazon Redshift ha registrato su STL\$1EXPLAIN per le query precedenti.

### Relazioni Redshift protette da AWS Lake Formation-RLS
<a name="r_EXPLAIN_RLS-LF"></a>

L'esempio seguente illustra un SecureScan nodo LF, che è possibile utilizzare per visualizzare le relazioni Lake Formation-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)
```

## Esempi
<a name="r_EXPLAIN-examples"></a>

**Nota**  
Per questi esempi, l'output di esempio potrebbe variare a seconda della configurazione di Amazon Redshift.

L'esempio seguente restituisce il piano di query per una query che seleziona EVENTID, EVENTNAME, VENUEID e VENUENAME dalle tabelle 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)
```

L'esempio seguente restituisce il piano di query per la stessa query con output dettagliato:

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

L'esempio seguente restituisce il piano di query per un'istruzione 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 le righe usando un cursore. Per informazioni sulla dichiarazione di un cursore, vedi [DECLARE](declare.md).

FETCH recupera le righe in base alla posizione corrente nel cursore. Quando viene creato un cursore, viene posizionato prima della prima riga. Dopo un FETCH, il cursore viene posizionato sull'ultima riga recuperata. Se FETCH va oltre la fine delle righe disponibili, ad esempio a seguito di un FETCH ALL, il cursore viene lasciato posizionato dopo l'ultima riga. 

FORWARD 0 recupera la riga corrente senza spostare il cursore, ossia recupera la riga recuperata più recentemente. Se il cursore è posizionato prima della prima riga o dopo l'ultima riga, non viene restituita alcuna riga. 

Quando viene recuperata la prima riga di un cursore, l'intero set di risultati si materializza sul nodo principale, in memoria o sul disco, se necessario. A causa del potenziale impatto negativo sulle prestazioni dell'utilizzo dei cursori con set di risultati di grandi dimensioni, si consiglia di utilizzare approcci alternativi laddove possibile. Per ulteriori informazioni, consulta [Considerazioni sulle prestazioni quando si utilizzano i cursori](declare.md#declare-performance).

Per ulteriori informazioni, consultare [DECLARE](declare.md), [CLOSE](close.md). 

## Sintassi
<a name="fetch-synopsis"></a>

```
FETCH [ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor
```

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

NEXT  
Recupera la riga successiva. Questa è l’impostazione predefinita.

ALL  
Recupera tutte le righe rimanenti. Equivalente a FORWARD ALL. ALL non è supportato per i cluster a nodo singolo.

FORWARD [ *count* \$1 ALL ]   
Recupera le successive *numero* righe o tutte le righe rimanenti. `FORWARD 0` recupera la riga corrente. Per i cluster a nodo singolo, il valore massimo per il numero è `1000`. FORWARD ALL non è supportato per i cluster a nodo singolo. 

*cursor*   
Nome del nuovo cursore. 

## Esempio di FETCH
<a name="fetch-example"></a>

L'esempio seguente dichiara un cursore denominato LOLLAPALOOZA per selezionare le informazioni di vendita per l'evento Lollapalooza e quindi recupera le righe dal set di risultati utilizzando il cursore:

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

Definisce le autorizzazioni di accesso per un utente o un ruolo.

Le autorizzazioni includono opzioni di accesso come la possibilità di leggere i dati in tabelle e viste, scrivere dati, creare ed eliminare tabelle. Utilizza questo comando per assegnare autorizzazioni specifiche per una tabella, un database, uno schema, una funzione, una procedura, una lingua o una colonna. Per revocare le autorizzazioni da un oggetto di database, utilizzare il comando [REVOKE](r_REVOKE.md). 

Le autorizzazioni includono anche le seguenti opzioni di accesso producer dell'unità di condivisione dati:
+  Assegnazione dell'accesso dell'unità di condivisione dati agli spazi dei nomi e agli account consumer. 
+  Assegnazione dell'autorizzazione a modificare un'unità di condivisione dati aggiungendo o rimuovendo oggetti dell'unità di condivisione dati. 
+  Assegnazione dell'autorizzazione a condividere un'unità di condivisione dati aggiungendo o rimuovendo spazi dei nomi consumer dell'unità di condivisione dati. 

Le opzioni di accesso consumer dell'unità di condivisione dati sono le seguenti:
+ Assegnazione dell'accesso completo degli utenti ai database creati da un'unità di condivisione dati o a schemi esterni che fanno riferimento a tali database.
+ Assegnazione delle autorizzazioni degli utenti a livello di oggetto per i database creati da un'unità di condivisione dati, come avviene per gli oggetti di database locali. Per assegnare questo livello di autorizzazione, è necessario utilizzare la clausola WITH PERMISSIONS durante la creazione di un database dall'unità di condivisione dati. Per ulteriori informazioni, consulta [CREATE DATABASE](r_CREATE_DATABASE.md).

Per ulteriori informazioni sulle autorizzazioni dell'unità di condivisione dati, consulta [Autorizzazioni disponibili per le unità di condivisione dati](permissions-datashares.md).

Le autorizzazioni includono anche il seguente Amazon Redshift Federated Permissions Catalog:
+ Concessione di autorizzazioni a livello di tabella a utenti e ruoli.
+ Concessione di autorizzazioni granulari a livello di colonna per tabelle, viste e viste materializzate.
+ Concessione di autorizzazioni mirate a utenti e ruoli.
+ Concessione di autorizzazioni a livello di database su Amazon Redshift Federated Permissions Catalog.

Per ulteriori informazioni sulla gestione delle autorizzazioni su Amazon Redshift Federated Permissions Catalog, consulta. [Gestione del controllo degli accessi nel catalogo di autorizzazioni federate di Amazon RedshiftConcedi/Revoca](federated-permissions-managing-access.md) [Per ulteriori informazioni sulle grant/revoke sintassi supportate da Amazon Redshift Federated Permissions Catalog, consulta Grant/Revoke.](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html#federated-permissions-managing-access-grant-revoke)

Le autorizzazioni includono anche il privilegio CONNECT per gli utenti federati. AWS IAM Identity Center Questo privilegio consente agli amministratori di controllare l'accesso degli utenti tramite autorizzazioni granulari per ogni gruppo di lavoro o cluster Amazon Redshift in cui sono abilitate le autorizzazioni federate di Amazon Redshift. L'amministratore di Amazon Redshift può specificare quali utenti o gruppi AWS IAM Identity Center federati hanno accesso per connettersi direttamente al gruppo di lavoro Amazon Redshift, fornendo un controllo granulare sull'accesso degli utenti a ciascun gruppo di lavoro o cluster. AWS IAM Identity Center 

È anche possibile assegnare ruoli per gestire le autorizzazioni del database e controllare cosa possono fare gli utenti in relazione ai propri dati. Definendo i ruoli e assegnando ruoli agli utenti, è possibile limitare le operazioni che tali utenti possono intraprendere, ad esempio limitando gli utenti ai soli comandi CREATE TABLE e INSERT. Per ulteriori informazioni sul comando CREATE ROLE, consulta [CREATE ROLE](r_CREATE_ROLE.md). Amazon Redshift ha alcuni ruoli definiti dal sistema che è possibile utilizzare anche per concedere autorizzazioni specifiche ai propri utenti. Per ulteriori informazioni, consulta [Ruoli definiti dal sistema di Amazon Redshift](r_roles-default.md).

Per quanto riguarda e autorizzazioni, è possibile solo GRANT o REVOKE USAGE in uno schema esterno per gli utenti di database e gruppi di utenti che utilizzano la sintassi ON SCHEMA. Quando utilizzi ON EXTERNAL SCHEMA con AWS Lake Formation, puoi concedere e revocare solo le autorizzazioni a un ruolo (IAM). AWS Identity and Access Management Per un elenco delle autorizzazioni richieste, consulta la sintassi.

Per le procedure archiviate, l'unica autorizzazione che si può concedere è EXECUTE.

Non è possibile eseguire GRANT (su una risorsa esterna) all'interno di un blocco di transazione (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

Per vedere quali autorizzazioni sono state concesse agli utenti per un database, usa [HAS\$1DATABASE\$1PRIVILEGE](r_HAS_DATABASE_PRIVILEGE.md). Per vedere quali autorizzazioni sono state concesse agli utenti per uno schema, usa [PRIVILEGIO DELLO SCHEMA HAS](r_HAS_SCHEMA_PRIVILEGE.md). Per vedere quali autorizzazioni sono state concesse agli utenti per una tabella, usa [HAS\$1TABLE\$1PRIVILEGE](r_HAS_TABLE_PRIVILEGE.md). 

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

### Concessione di autorizzazioni a livello di colonna per le tabelle
<a name="grant-column-level"></a>

Di seguito è riportata la sintassi per le autorizzazioni a livello di colonna su tabelle e viste di Amazon Redshift.

```
GRANT { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }

     TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Concessione delle autorizzazioni ASSUMEROLE
<a name="grant-assumerole-permissions"></a>

Di seguito è riportata la sintassi per le autorizzazioni ASSUMEROLE concesse a utenti e gruppi con un ruolo specificato. Per iniziare a utilizzare il privilegio ASSUMEROLE, consultare [Note di utilizzo per la concessione dell'autorizzazione 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 } [, ...]
```

### Concessione di autorizzazioni per l'integrazione di Redshift Spectrum con Lake Formation
<a name="grant-spectrum-integration-with-lf-syntax"></a>

Di seguito è riportata la sintassi per l'integrazione di Redshift Spectrum con Lake Formation. 

```
GRANT { SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    TO { { IAM_ROLE iam_role } [, ...] | PUBLIC } [ WITH GRANT OPTION ]

GRANT { { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]
```

### Concessione delle autorizzazioni per l'unità di condivisione dati
<a name="grant-datashare-syntax"></a>

**Autorizzazioni dell'unità di condivisione dati sul lato producer**  
Di seguito è riportata la sintassi per l'utilizzo di GRANT per assegnare le autorizzazioni ALTER o SHARE a un utente o un ruolo. L'utente può modificare l'unità di condivisione dati con l'autorizzazione ALTER o assegnare l'utilizzo a un consumer con l'autorizzazione SHARE. ALTER e SHARE sono le uniche autorizzazioni che è possibile assegnare a utenti e gruppi di utenti per un'unità di condivisione dati.

```
GRANT { ALTER | SHARE } ON DATASHARE datashare_name
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

Di seguito è riportata la sintassi per l'utilizzo di GRANT per le autorizzazioni per l'utilizzo dell'unità di condivisione dati su Amazon Redshift. Si concede l'accesso a una unità di condivisione dati a un consumer utilizzando l'autorizzazione USAGE. Non è possibile concedere questa autorizzazione agli utenti o ai gruppi di utenti. Questa autorizzazione inoltre non supporta WITH GRANT OPTION per l'istruzione GRANT. Solo gli utenti o i gruppi di utenti con autorizzazione SHARE precedentemente concessa loro PER l'unità di condivisione dati possono eseguire questo tipo di istruzione GRANT.

```
GRANT USAGE
    ON DATASHARE datashare_name
    TO NAMESPACE 'namespaceGUID' | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]
```

Di seguito è riportato un esempio di come concedere l'autorizzazione per l'utilizzo di un'unità di condivisione dati a un account Lake Formation.

```
GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '123456789012' VIA DATA CATALOG;
```

**Autorizzazioni dell'unità di condivisione dati sul lato consumer**  
Di seguito è riportata la sintassi per le autorizzazioni di utilizzo per la condivisione dei dati GRANT per un database o uno schema specifico creato da una unità di condivisione dati. 

Le ulteriori autorizzazioni richieste per l'accesso dei consumer a un database creato da un'unità di condivisione dati variano a seconda che il comando CREATE DATABASE utilizzato per creare il database dall'unità di condivisione dati includa o meno la clausola WITH PERMISSIONS. Per ulteriori informazioni sul comando CREATE DATABASE con la clausola WITH PERMISSIONS, consulta [CREATE DATABASE](r_CREATE_DATABASE.md).

**Database creati senza la clausola WITH PERMISSIONS**  
Quando assegni l'autorizzazione USAGE per un database creato da un'unità di condivisione dati senza la clausola WITH PERMISSIONS, non è necessario fornire separatamente le autorizzazioni per gli oggetti nel database condiviso. Le entità a cui è fornito l'utilizzo dei database creati dall'unità di condivisione dati senza la clausola WITH PERMISSIONS hanno automaticamente accesso a tutti gli oggetti del database.

**Database creati con la clausola WITH PERMISSIONS**  
Quando assegni USAGE per un database condiviso che è stato creato da un'unità di condivisione dati con la clausola WITH PERMISSIONS, alle identità lato consumer devono comunque essere fornite le autorizzazioni pertinenti per gli oggetti del database condiviso per potervi accedere, proprio come si farebbe per le autorizzazioni degli oggetti del database locale. Per assegnare le autorizzazioni agli oggetti di un database creato da un'unità di condivisione dati, utilizza la sintassi in tre parti `database_name.schema_name.object_name`. Per assegnare le autorizzazioni agli oggetti in uno schema esterno che fa riferimento a uno schema condiviso del database condiviso, utilizza la sintassi in due parti `schema_name.object_name`.

```
GRANT USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
    TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Assegnazione delle autorizzazioni con ambito
<a name="grant-scoped-syntax"></a>

Le autorizzazioni con ambito consentono di concedere autorizzazioni a un utente o a un ruolo per tutti gli oggetti di un tipo all’interno di un database o uno schema. Gli utenti e i ruoli con autorizzazioni con ambito dispongono delle autorizzazioni specificate per tutti gli oggetti correnti e futuri all’interno del database o dello schema.

Puoi visualizzare l’ambito delle autorizzazioni con ambito a livello di database in [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md). Puoi visualizzare l’ambito delle autorizzazioni con ambito a livello di schema in [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md).

Per ulteriori informazioni sulle autorizzazioni con ambito, consulta [Autorizzazioni con ambito](t_scoped-permissions.md).

Di seguito è riportata la sintassi per assegnare a utenti e ruoli le autorizzazioni con ambito.

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

Tieni presente che le autorizzazioni con ambito non fanno distinzione tra le autorizzazioni per le funzioni e le procedure. Ad esempio, l’istruzione seguente concede a `bob` l’autorizzazione `EXECUTE` sia per le funzioni che per le procedure nello schema `Sales_schema`.

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

### Concessione delle autorizzazioni di machine learning
<a name="grant-model-syntax"></a>

Di seguito è riportata la sintassi per le autorizzazioni per il modello di machine learning su 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 } [, ...]
```

### Concessione delle autorizzazioni per i ruoli
<a name="grant-roles"></a>

Di seguito è riportata la sintassi per concedere i ruoli in Amazon Redshift.

```
GRANT { ROLE role_name } [, ...] TO { { user_name [ WITH ADMIN OPTION ] } | ROLE role_name }[, ...]
```

Di seguito è riportata la sintassi per concedere le autorizzazioni di sistema per i ruoli su Amazon Redshift. Tieni presente che puoi concedere le autorizzazioni solo ai ruoli, non agli utenti.

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

### Concessione di autorizzazioni esplicative per le policy di sicurezza
<a name="grant-row-level-security"></a>

Di seguito è riportata la sintassi per la concessione delle autorizzazioni che spiega i filtri delle policy di sicurezza di una query nel piano EXPLAIN. Le policy di sicurezza possibili includono le policy di sicurezza a livello di riga e le politiche di mascheramento dinamico dei dati.

```
GRANT EXPLAIN { RLS | MASKING } TO ROLE rolename 
```

Di seguito è riportata la sintassi per concedere le autorizzazioni per aggirare le policy di sicurezza a livello di riga per una query. Questa sintassi non si applica alle politiche di mascheramento dinamico dei dati.

```
GRANT IGNORE RLS TO ROLE rolename 
```

Di seguito è riportata la sintassi per concedere le autorizzazioni per le tabelle di ricerca alla policy di sicurezza specificata. Le policy di sicurezza possibili includono le policy di sicurezza a livello di riga e le politiche di mascheramento dinamico dei dati.

```
GRANT SELECT ON [ TABLE ] table_name [, ...]
TO { RLS | MASKING } POLICY policy_name [, ...]
```

### Concessione delle autorizzazioni di connessione
<a name="grant-connection-permissions"></a>

Di seguito è riportata la sintassi per concedere le autorizzazioni agli utenti (o gruppi) AWS IAM Identity Center federati per connettersi a un gruppo di lavoro/cluster:

```
GRANT CONNECT [ON WORKGROUP]
TO [USER] <prefix>:<username> | ROLE <prefix>:<rolename> | PUBLIC;
```

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

SELECT   <a name="grant-select"></a>
Revoca l'autorizzazione a selezionare i dati da una tabella o una vista utilizzando un'istruzione SELECT. L'autorizzazione SELECT è richiesta anche per fare riferimento ai valori di colonna esistenti per le operazioni UPDATE o DELETE.

INSERT   <a name="grant-insert"></a>
Concede l'autorizzazione a caricare i dati in una tabella utilizzando un'istruzione INSERT o un'istruzione COPY. 

UPDATE   <a name="grant-update"></a>
Concede l'autorizzazione ad aggiornare una colonna della tabella utilizzando un'istruzione UPDATE. Le operazioni UPDATE richiedono anche l'autorizzazione SELECT, perché devono fare riferimento alle colonne della tabella per determinare quali righe aggiornare o per calcolare nuovi valori per le colonne.

DELETE  <a name="grant-delete"></a>
Concede l'autorizzazione a eliminare una riga di dati da una tabella. Le operazioni DELETE richiedono anche il privilegio SELECT, perché devono fare riferimento alle colonne della tabella per determinare quali righe eliminare.

DROP  <a name="grant-drop"></a>
A seconda dell’oggetto del database, concede le seguenti autorizzazioni all’utente o al ruolo:   
+  Per le tabelle, DROP concede l’autorizzazione a rimuovere una tabella o una vista. Per ulteriori informazioni, consulta [DROP TABLE](r_DROP_TABLE.md). 
+  Per i database, DROP concede l’autorizzazione a rimuovere un database. Per ulteriori informazioni, consulta [DROP DATABASE](r_DROP_DATABASE.md). 
+  Per gli schemi, DROP concede l’autorizzazione a rimuovere uno schema. Per ulteriori informazioni, consulta [DROP SCHEMA](r_DROP_SCHEMA.md). 

REFERENCES   <a name="grant-references"></a>
Concede l'autorizzazione a creare un vincolo di chiave esterna. È necessario concedere questa autorizzazione sia sulla tabella a cui si fa riferimento sia sulla tabella che fa riferimento; in caso contrario, l'utente non può creare il vincolo. 

ALTER  <a name="grant-alter"></a>
A seconda dell'oggetto del database, concede le seguenti autorizzazioni all'utente o al gruppo di utenti:   
+ Per le tabelle, ALTER concede l'autorizzazione a modificare una tabella o una vista. Per ulteriori informazioni, consulta [ALTER TABLE](r_ALTER_TABLE.md).
+ Per i database, ALTER concede l'autorizzazione a modificare un database. Per ulteriori informazioni, consulta [ALTER DATABASE](r_ALTER_DATABASE.md).
+ Per gli schemi, ALTER concede l'autorizzazione a modificare uno schema. Per ulteriori informazioni, consulta [ALTER SCHEMA](r_ALTER_SCHEMA.md).
+ Per le tabelle esterne, ALTER concede l'autorizzazione a modificare una tabella in un AWS Glue Data Catalog abilitato per Lake Formation. Questa autorizzazione si applica solo quando si utilizza Lake Formation.

TRUNCATE  <a name="grant-truncate"></a>
Concede l'autorizzazione a troncare una tabella. Senza questa autorizzazione, solo il proprietario di una tabella o un utente con privilegi avanzati può troncare una tabella. Per ulteriori informazioni sul comando TRUNCATE, consulta [TRUNCATE](r_TRUNCATE.md).

ALL [ PRIVILEGES ]   <a name="grant-all"></a>
Concede tutte le autorizzazioni disponibili contemporaneamente all’utente o al ruolo specificato. La parola chiave PRIVILEGES è facoltativa.  
GRANT ALL ON SCHEMA non concede le autorizzazioni CREATE per gli schemi esterni.  
Puoi concedere l'autorizzazione ALL a una tabella in un AWS Glue Data Catalog che è abilitata per Lake Formation. In questo caso, le singole autorizzazioni (come SELECT, ALTER e così via) sono registrate nel catalogo dati.   
 Amazon Redshift non supporta le autorizzazioni RULE e TRIGGER. Per ulteriori informazioni, consulta [Caratteristiche PostgreSQL non supportate](c_unsupported-postgresql-features.md). 

ASSUMEROLE  <a name="assumerole"></a>
Concede l'autorizzazione a eseguire i comandi COPY, UNLOAD, EXTERNAL FUNCTION e CREATE MODEL a utenti, ruoli o gruppi con un ruolo specificato. L'utente, il ruolo o il gruppo assume tale ruolo all'esecuzione del comando specificato. Per iniziare a utilizzare l'autorizzazione ASSUMEROLE, consultare [Note di utilizzo per la concessione dell'autorizzazione ASSUMEROLE](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole).

ON [ TABLE ] *table\$1name*   <a name="grant-on-table"></a>
Concede le autorizzazioni specificate su una tabella o una vista. La parola chiave TABLE è facoltativa. Puoi elencare più tabelle e viste in un'unica istruzione.

ON ALL TABLES IN SCHEMA *schema\$1name*   <a name="grant-all-tables"></a>
Concede le autorizzazioni specificate su tutte le tabelle e le viste nello schema a cui si fa riferimento.

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="grant-column-level-privileges"></a>
Concede le autorizzazioni specificate a utenti, gruppi o PUBLIC sulle colonne specificate della tabella o della vista di Amazon Redshift.

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table-column"></a>
Concede le autorizzazioni specificate a un ruolo IAM nelle colonne indicate della tabella Lake Formation nello schema a cui si fa riferimento.

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table"></a>
Concede le autorizzazioni specificate a un ruolo IAM nelle tabelle Lake Formation indicate dello schema a cui si fa riferimento.

ON EXTERNAL SCHEMA *schema\$1name*   <a name="grant-external-schema"></a>
Concede le autorizzazioni specificate a un ruolo IAM nello schema a cui si fa riferimento.

ON *ruolo\$1iam*   <a name="grant-iam_role"></a>
Concede le autorizzazioni specificate a un ruolo IAM.

TO *username*   <a name="grant-to"></a>
Indica l'utente che riceve le autorizzazioni.

TO IAM\$1ROLE *iam\$1role*   <a name="grant-to-iam-role"></a>
Indica il ruolo IAM che riceve le autorizzazioni.

WITH GRANT OPTION   <a name="grant-with-grant"></a>
Indica che l'utente che riceve le autorizzazioni può a sua volta concedere le stesse autorizzazioni ad altri. WITH GRANT OPTION non può essere concesso a un gruppo o a PUBLIC.

ROLE *role\$1name*   <a name="grant-role"></a>
Concede le autorizzazioni a un ruolo.

GROUP *group\$1name*   <a name="grant-group"></a>
Concede le autorizzazioni a un gruppo di utenti. Può essere un elenco separato da virgole per specificare più gruppi di utenti.

PUBLIC   <a name="grant-public"></a>
Concede le autorizzazioni specificate a tutti gli utenti, inclusi gli utenti creati in un momento successivo. PUBLIC rappresenta un gruppo che include sempre tutti gli utenti. Le autorizzazioni di un singolo utente consistono nella somma delle autorizzazioni concesse a PUBLIC, delle autorizzazioni concesse a tutti i gruppi a cui l'utente appartiene e di tutte le autorizzazioni concesse all'utente singolarmente.  
La concessione di PUBLIC a una EXTERNAL TABLE di Lake Formation implica la concessione dell'autorizzazione al gruppo *everyone* di Lake Formation.

COLLEGA [ON WORKGROUP] A \$1[USER]<prefix>: <username>\$1 ROLE<prefix>: <rolename>\$1 PUBLIC\$1  
Concede l'autorizzazione a connettersi a un gruppo di lavoro o a un cluster a utenti o gruppi AWS IAM Identity Center federati. Il prefisso identifica il provider di identità. Se concessa a PUBLIC, l'autorizzazione si applica a tutti gli utenti AWS IAM Identity Center federati, inclusi gli utenti creati successivamente. Questa autorizzazione è applicabile solo quando le autorizzazioni federate di Amazon Redshift sono abilitate sul gruppo di lavoro o sul cluster.

CREATE   <a name="grant-create"></a>
A seconda dell'oggetto del database, concede le seguenti autorizzazioni all'utente o al gruppo di utenti:  
+ Per i database, CREATE consente agli utenti di creare schemi all'interno del database.
+ Per gli schemi, CREATE consente agli utenti di creare oggetti all'interno di uno schema. Per rinominare un oggetto, l'utente deve avere l'autorizzazione CREATE ed essere il proprietario dell'oggetto da rinominare.
+ CREATE ON SCHEMA non è supportato per gli schemi esterni di Amazon Redshift Spectrum. Per garantire l'utilizzo di tabelle esterne in uno schema esterno, concedi USAGE ON SCHEMA agli utenti che devono accedere. Solo il proprietario di uno schema esterno o di un utente con privilegi avanzati è autorizzato a creare tabelle esterne nello schema esterno. Per trasferire la proprietà di uno schema esterno, utilizza [ALTER SCHEMA](r_ALTER_SCHEMA.md) per cambiare il proprietario. 

TEMPORARY \$1 TEMP   <a name="grant-temporary"></a>
Concede l'autorizzazione a creare tabelle temporanee nel database specificato. Per eseguire query Amazon Redshift Spectrum, l'utente del database deve avere l'autorizzazione per creare tabelle temporanee nel database.   
Per impostazione predefinita, agli utenti è concessa l'autorizzazione di creare tabelle temporanee tramite la loro appartenenza automatica al gruppo PUBLIC. Per rimuovere l'autorizzazione per gli utenti di creare tabelle temporanee, revoca l'autorizzazione TEMP dal gruppo PUBLIC. Quindi concedere esplicitamente l'autorizzazione per creare tabelle temporanee per utenti o gruppi di utenti specifici.

ON DATABASE *db\$1name*   <a name="grant-database"></a>
Concede le autorizzazioni specificate su un database.

USAGE   <a name="grant-usage"></a>
Concede l'autorizzazione USAGE su uno schema specifico che rende gli oggetti in tale schema accessibili agli utenti. Le autorizzazioni per operazioni specifiche su questi oggetti devono essere concesse separatamente (ad esempio, le autorizzazioni SELECT o UPDATE sulle tabelle) per gli schemi Amazon Redshift locali. Per impostazione predefinita, tutti gli utenti dispongono delle autorizzazioni CREATE e USAGE per lo schema PUBLIC.   
 Quando si concede l'autorizzazione USAGE a schemi esterni utilizzando la sintassi ON SCHEMA, non è necessario concedere autorizzazioni per azioni separatamente sugli oggetti nello schema esterno. Le autorizzazioni del catalogo corrispondenti controllano le autorizzazioni granulari per gli oggetti dello schema esterno. 

ON SCHEMA *schema\$1name*   <a name="grant-schema"></a>
Concede le autorizzazioni specificate su uno schema.  
GRANT CREATE ON SCHEMA e l'autorizzazione CREATE in GRANT ALL ON SCHEMA non sono supportati per gli schemi esterni di Amazon Redshift Spectrum. Per garantire l'utilizzo di tabelle esterne in uno schema esterno, concedi USAGE ON SCHEMA agli utenti che devono accedere. Solo il proprietario di uno schema esterno o di un utente con privilegi avanzati è autorizzato a creare tabelle esterne nello schema esterno. Per trasferire la proprietà di uno schema esterno, utilizza [ALTER SCHEMA](r_ALTER_SCHEMA.md) per cambiare il proprietario. 

EXECUTE ON ALL FUNCTIONS IN SCHEMA *schema\$1name*  <a name="grant-all-functions"></a>
Concede le autorizzazioni specificate su tutte le funzioni nello schema a cui si fa riferimento.  
Amazon Redshift non supporta le istruzioni GRANT o REVOKE per le voci integrate pg\$1proc definite nello spazio dei nomi pg\$1catalog. 

EXECUTE ON PROCEDURE *procedure\$1name*   <a name="grant-procedure"></a>
Concede l'autorizzazione EXECUTE su una procedura archiviata specifica. Poiché i nomi delle procedure archiviate possono essere in overload, devi includere l'elenco degli argomenti per la procedura. Per ulteriori informazioni, consulta [Denominazione delle stored procedure](stored-procedure-naming.md).

EXECUTE ON ALL PROCEDURES IN SCHEMA *schema\$1name*  <a name="grant-all-procedures"></a>
Concede le autorizzazione specificate su tutte le procedure archiviate nello schema a cui si fa riferimento.

USAGE ON LANGUAGE *language\$1name*   
Concede l'autorizzazione USAGE per una lingua.   
A partire dal 1° novembre 2025, Amazon Redshift non supporterà più la creazione di nuovi Python. UDFs Python esistente UDFs continuerà a funzionare fino al 30 giugno 2026. A partire dal 1° luglio 2026, Amazon Redshift non supporterà più Python. UDFs Ti consigliamo di migrare il tuo UDFs Python esistente a UDFs Lambda prima del 1° novembre 2025. Per informazioni sulla creazione e l'utilizzo di Lambda UDFs, consulta. [Lambda scalare UDFs](udf-creating-a-lambda-sql-udf.md) [Per informazioni sulla conversione di UDFs Python esistente in UDFs Lambda, consulta il post del blog.](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)
L'autorizzazione USAGE ON LANGUAGE è richiesta per creare funzioni definite dall'utente (UDFs) eseguendo il comando. [CREATE FUNCTION](r_CREATE_FUNCTION.md) Per ulteriori informazioni, consulta [Sicurezza e autorizzazioni delle UDF](udf-security-and-privileges.md).   
È necessaria l'autorizzazione USAGE ON LANGUAGE per creare procedure archiviate eseguendo il comando [CREATE PROCEDURE](r_CREATE_PROCEDURE.md). Per ulteriori informazioni, consulta [Sicurezza e privilegi per le procedure archiviate](stored-procedure-security-and-privileges.md).  
Per Python UDFs, usa. `plpythonu` Per SQL UDFs, usa`sql`. Per le procedure archiviate, usa `plpgsql`.

ON COPY JOB *job\$1name*  <a name="on-copy-job"></a>
Concede le autorizzazioni specificate per un processo di copia.

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]   <a name="grant-for"></a>
Specifica il comando SQL per il quale viene concessa l'autorizzazione. Puoi specificare ALL per concedere l'autorizzazione sulle istruzioni COPY, UNLOAD, EXTERNAL FUNCTION e CREATE MODEL. Questa clausola si applica solo alla concessione dell'autorizzazione ASSUMEROLE.

ALTER  
Concede l'autorizzazione ALTER agli utenti per aggiungere o rimuovere oggetti da una unità di condivisione dati o per impostare la proprietà PUBLICACCESSIBLE. Per ulteriori informazioni, consulta [ALTER DATASHARE](r_ALTER_DATASHARE.md).

SHARE  
Concede autorizzazioni a utenti e gruppi di utenti per aggiungere consumer di dati a una unità di condivisione dati. Questa autorizzazione è necessaria per consentire al particolare consumer (account o spazio dei nomi) di accedere all'unità di condivisione dati dai propri cluster. Il consumatore può essere lo stesso account o un AWS account diverso, con lo stesso spazio dei nomi del cluster o uno diverso, come specificato da un identificatore univoco globale (GUID).

ON DATASHARE *nome\$1unità\$1condivisione\$1dati*   <a name="grant-datashare"></a>
Concede le autorizzazioni specificate sull'unità di condivisione dati a cui si fa riferimento. Per informazioni sulla granularità del controllo degli accessi dei consumer, consultare [Condivisione di dati a diversi livelli in Amazon Redshift](datashare-overview.md#granularity).

USAGE  
Quando USAGE viene concesso a un account consumer o a uno spazio dei nomi all'interno dello stesso account, l'account consumer specifico o lo spazio dei nomi all'interno dell'account potrà accedere all'unità di condivisione dati e gli oggetti dell'unità di condivisione dati saranno in sola lettura. 

TO NAMESPACE 'clusternamespace GUID'  
Indica uno spazio dei nomi nello stesso account in cui i consumer possono ricevere le autorizzazioni specificate per l'unità di condivisione dati. Gli spazi dei nomi utilizzano un GUID alfanumerico a 128 bit.

TO ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
Indica il numero di un altro account i cui consumer possono ricevere le autorizzazioni specificate per l'unità di condivisione dati. Quando si specifica "VIA DATA CATALOG" si sta concedendo l'autorizzazione per l'utilizzo dell'unità di condivisione dati a un account Lake Formation. L'omissione di questo parametro indica che si sta concedendo l'autorizzazione per l'utilizzo a un account proprietario del cluster.

ON DATABASE *nome\$1database\$1condiviso> [, ...]*   <a name="grant-datashare"></a>
Concede le autorizzazioni di utilizzo per il database specificato creato nell'unità di condivisione dati specificata.

ON SCHEMA* schema\$1condiviso*   <a name="grant-datashare"></a>
Concede le autorizzazioni per lo schema specificato creato nell'unità di condivisione dati specificata.

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
Specifica gli oggetti del database a cui assegnare l'autorizzazione. I parametri successivi a IN definiscono l'ambito dell'autorizzazione assegnata.

CREATE MODEL  
Concede l'autorizzazione CREATE MODEL a utenti o gruppi di utenti specifici.

ON MODEL *nome\$1modello*  
Concede l'autorizzazione EXECUTE su un modello specifico. 

ACCESS CATALOG  
Assegna l'autorizzazione a visualizzare i metadati pertinenti degli oggetti a cui il ruolo ha accesso.

\$1 role \$1 [, ...]  
Il ruolo da concedere a un altro ruolo, un utente o PUBLIC.  
PUBLIC rappresenta un gruppo che include sempre tutti gli utenti. Le autorizzazioni di un singolo utente consistono nella somma delle autorizzazioni concesse a PUBLIC, delle autorizzazioni concesse a tutti i gruppi a cui l'utente appartiene e di tutte le autorizzazioni concesse all'utente singolarmente.

TO \$1 \$1 *user\$1name* [ WITH ADMIN OPTION ] \$1 \$1 role \$1[, ...]  
Concede il ruolo specificato a un utente specificato con l'opzione WITH ADMIN OPTION, un altro ruolo o PUBLIC.  
La clausola WITH ADMIN OPTION fornisce le opzioni di amministrazione per tutti i ruoli concessi a tutti gli assegnatari. 

EXPLAIN \$1 RLS \$1 MASKING \$1 TO ROLE *rolename*  
Concede l’autorizzazione a spiegare i filtri delle policy di sicurezza di una query nel piano EXPLAIN a un ruolo. RLS concede l’autorizzazione a spiegare i filtri delle policy di sicurezza a livello di riga. MASKING concede l’autorizzazione a spiegare i filtri delle politiche di mascheramento dinamico dei dati.

IGNORE RLS TO ROLE *rolename*   
Concede a un ruolo l'autorizzazione a escludere le policy di sicurezza a livello di riga per una query.

TO \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
Indica la policy di sicurezza che riceve le autorizzazioni. TO RLS POLICY indica una policy di sicurezza a livello di riga. TO MASKING POLICY indica una politica di mascheramento dinamico dei dati.

## Note per l'utilizzo
<a name="r_GRANT-usage-notes-link"></a>

Per ulteriori informazioni sulle note di utilizzo di GRANT, consulta [Note per l'utilizzo](r_GRANT-usage-notes.md).

## Esempi
<a name="r_GRANT-examples-link"></a>

Per gli esempi di come utilizzare GRANT, consulta [Esempi](r_GRANT-examples.md).

# Note per l'utilizzo
<a name="r_GRANT-usage-notes"></a>

Per concedere i privilegi su un oggetto, è necessario soddisfare uno dei seguenti criteri:
+ Essere il proprietario dell'oggetto.
+ Essere un utente con privilegi avanzati.
+ Avere un privilegio di concessione per l'oggetto e il privilegio.

Ad esempio, il seguente comando consente all'utente HR di eseguire i comandi SELECT sulla tabella dei dipendenti e di concedere e revocare lo stesso privilegio per altri utenti.

```
grant select on table employees to HR with grant option;
```

HR non può concedere privilegi per operazioni diverse da SELECT o su qualsiasi altra tabella rispetto a quella dei dipendenti. 

Ad esempio, il seguente comando consente all'utente HR di eseguire i comandi ALTER sulla tabella dei dipendenti e di concedere e revocare lo stesso privilegio per altri utenti.

```
grant ALTER on table employees to HR with grant option;
```

HR non può concedere privilegi per operazioni diverse da ALTER o su qualsiasi altra tabella che non sia quella dei dipendenti. 

Avere i privilegi su una vista non implica i privilegi sulle tabelle sottostanti. Allo stesso modo, avere i privilegi su uno schema non implica i privilegi sulle tabelle dello schema. Invece, è necessario concedere l'accesso alle tabelle sottostanti in modo esplicito.

Per concedere i privilegi a una AWS Lake Formation tabella, il ruolo IAM associato allo schema esterno della tabella deve disporre dell'autorizzazione a concedere i privilegi alla tabella esterna. L'esempio seguente crea uno schema esterno con un ruolo IAM associato `myGrantor`. Il ruolo IAM `myGrantor` ha l'autorizzazione per concedere le autorizzazioni ad altri. Il comando GRANT utilizza l'autorizzazione del ruolo IAM `myGrantor` associato allo schema esterno per concedere l'autorizzazione al ruolo 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 vengono concessi i privilegi GRANT ALL a un ruolo IAM, i singoli privilegi vengono concessi nel relativo catalogo dati abilitato per Lake Formation. Ad esempio, il seguente GRANT ALL comporta la concessione di privilegi singoli (SELECT, ALTER, DROP, DELETE e INSERT) nella console Lake Formation.

```
grant all
on external table mySchema.mytable
to iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

Gli utenti con privilegi avanzati possono accedere a tutti gli oggetti indipendentemente dai comandi GRANT e REVOKE che impostano i privilegi dell'oggetto.

## Note di utilizzo per il controllo degli accessi a livello di colonna
<a name="r_GRANT-usage-notes-clp"></a>

Le seguenti note di utilizzo si applicano ai privilegi a livello di colonna su tabelle e viste di Amazon Redshift. Queste note descrivono le tabelle; le stesse note si applicano alle viste a meno che non si noti esplicitamente un'eccezione. 
+ Per una tabella Amazon Redshift, è possibile concedere i privilegi SELECT e UPDATE solo a livello di colonna. Per una vista Amazon Redshift, è possibile concedere solo il privilegio SELECT a livello di colonna. 
+ La parola chiave ALL è un sinonimo di privilegi SELECT e UPDATE combinati quando utilizzata nel contesto di una GRANT a livello di colonna in una tabella. 
+ Se non disponi del privilegio SELECT su tutte le colonne di una tabella, l'esecuzione di un'operazione SELECT \$1 restituisce solo le colonne a cui hai accesso. Quando utilizzi una vista, un’operazione SELECT \$1 tenta di accedere a tutte le colonne della vista. Se non disponi dell’autorizzazione ad accedere a tutte le colonne, queste query non riescono e viene visualizzato un errore di autorizzazione negata.
+ SELECT \$1 non si espande solo alle colonne accessibili nei seguenti casi:
  + Non è possibile creare una vista normale con solo colonne accessibili utilizzando SELECT \$1.
  + Non è possibile creare una vista materializzata con solo colonne accessibili utilizzando SELECT \$1.
+ Se si dispone di privilegi SELECT o UPDATE su una tabella o vista e si aggiunge una colonna, si hanno ancora gli stessi privilegi sulla tabella o sulla vista e quindi tutte le relative colonne. 
+ Solo il proprietario di una tabella o un utente con privilegi avanzati possono concedere privilegi a livello di colonna. 
+ La clausola WITH GRANT OPTION non è supportata per i privilegi a livello di colonna.
+ Non è possibile mantenere lo stesso privilegio sia a livello di tabella sia a livello di colonna. Ad esempio, l'utente `data_scientist` non può avere sia il privilegio SELECT nella tabella `employee` sia il privilegio SELECT nella colonna `employee.department`. Considerare i seguenti risultati quando si concede lo stesso privilegio a una tabella e a una colonna all'interno della tabella:
  + Se un utente dispone di un privilegio a livello di tabella su una tabella, la concessione dello stesso privilegio a livello di colonna non ha alcun effetto. 
  + Se un utente dispone di un privilegio a livello di tabella in una tabella, la revoca dello stesso privilegio per una o più colonne della tabella restituisce un errore. Al contrario, revoca il privilegio a livello di tabella. 
  + Se un utente dispone di un privilegio a livello di colonna, la concessione dello stesso privilegio a livello di tabella restituisce un errore. 
  + Se un utente dispone di un privilegio a livello di colonna, la revoca dello stesso privilegio a livello di tabella revoca sia i privilegi di colonna sia di tabella per tutte le colonne della tabella. 
+ Non è possibile concedere privilegi a livello di colonna nelle viste con associazione tardiva.
+ Per creare una vista materializzata, è necessario disporre del privilegio SELECT a livello di tabella nelle tabelle di base. Anche se si dispone di privilegi a livello di colonna su colonne specifiche, non è possibile creare una vista materializzata solo su tali colonne. Tuttavia, è possibile concedere il privilegio SELECT alle colonne di una vista materializzata, in modo simile alle viste normali. 
+ Per cercare le concessioni dei privilegi a livello di colonna, utilizzare la vista [PG\$1ATTRIBUTE\$1INFO](r_PG_ATTRIBUTE_INFO.md) . 

## Note di utilizzo per la concessione dell'autorizzazione ASSUMEROLE
<a name="r_GRANT-usage-notes-assumerole"></a>

Le seguenti note di utilizzo si applicano alla concessione dell'autorizzazione ASSUMEROLE in Amazon Redshift. 

Utilizza l'autorizzazione ASSUMEROLE per controllare le autorizzazioni di accesso del ruolo IAM per gli utenti, i ruoli o i gruppi del database sui comandi quali COPY, UNLOAD, EXTERNAL FUNCTION o CREATE MODEL. Dopo aver concesso l'autorizzazione ASSUMEROLE a un utente, un ruolo o un gruppo per un ruolo IAM, l'utente, il ruolo o il gruppo può assumere tale ruolo all'esecuzione del comando. L'autorizzazione ASSUMEROLE consente di concedere l'accesso ai comandi appropriati in base alle esigenze.

Solo un utente del database con privilegi avanzati può concedere o revocare l'autorizzazione ASSUMEROLE per utenti, ruoli e gruppi. Un utente con privilegi avanzati mantiene sempre l'autorizzazione ASSUMEROLE.

Per abilitare l'utilizzo dell'autorizzazione ASSUMEROLE per utenti, ruoli e gruppi, un utente con privilegi avanzati esegue le due operazioni seguenti:
+ Esegue l'istruzione di seguito una volta nel cluster:

  ```
  revoke assumerole on all from public for all;
  ```
+ Concessione dell'autorizzazione ASSUMEROLE a utenti, ruoli e gruppi per i comandi appropriati.

Quando si concede l'autorizzazione ASSUMEROLE, è possibile specificare il concatenamento dei ruoli nella clausola ON. Per separare i ruoli in una catena di ruoli è possibile utilizzare le virgole, ad esempio `Role1,Role2,Role3`. Se il concatenamento dei ruoli è stato specificato durante la concessione dell'autorizzazione ASSUMEROLE, è necessario specificare la catena di ruoli durante l'esecuzione delle operazioni concesse dall'autorizzazione ASSUMEROLE. Non è possibile specificare singoli ruoli all'interno della catena di ruoli quando si eseguono operazioni concesse dall'autorizzazione ASSUMEROLE. Ad esempio, se a un utente, un ruolo o un gruppo viene concessa la catena di ruoli `Role1,Role2,Role3`, non è possibile specificare solo `Role1` per eseguire le operazioni. 

Se un utente prova a eseguire un'operazione COPY, UNLOAD, EXTERNAL FUNCTION o CREATE MODEL e non gli è stata concessa l'autorizzazione ASSUMEROLE, viene visualizzato un messaggio simile al seguente.

```
ERROR:  User awsuser does not have ASSUMEROLE permission on IAM role "arn:aws:iam::123456789012:role/RoleA" for COPY 
```

Per elencare gli utenti a cui è stato concesso l'accesso ai ruoli IAM e ai comandi tramite l'autorizzazione ASSUMEROLE, consultare [HAS\$1ASSUMEROLE\$1PRIVILEGE](r_HAS_ASSUMEROLE_PRIVILEGE.md). Per elencare i ruoli IAM e le autorizzazioni dei comandi concesse a un utente specifico, consultare [PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER](PG_GET_IAM_ROLE_BY_USER.md). Per elencare gli utenti, i ruoli e i gruppi a cui è stato concesso l'accesso a un ruolo IAM specifico, consulta [PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE](PG_GET_GRANTEE_BY_IAMROLE.md).

## Note di utilizzo per la concessione delle autorizzazioni di machine learning
<a name="r_GRANT-usage-notes-create-model"></a>

Non è possibile concedere o revocare direttamente le autorizzazioni relative a una funzione ML. Una funzione ML appartiene a un modello ML e le autorizzazioni sono controllate tramite il modello. È invece possibile concedere le autorizzazioni relative al modello ML. L'esempio seguente dimostra come concedere le autorizzazioni a tutti gli utenti per eseguire la funzione ML associata al modello `customer_churn`.

```
GRANT EXECUTE ON MODEL customer_churn TO PUBLIC;
```

Puoi anche concedere tutte le autorizzazioni a un utente per il modello ML `customer_churn`.

```
GRANT ALL on MODEL customer_churn TO ml_user;
```

La concessione dell'autorizzazione `EXECUTE` relativa a una funzione ML avrà esito negativo se nello schema è presente una funzione ML, anche se tale funzione ML dispone già dell'autorizzazione `EXECUTE`tramite `GRANT EXECUTE ON MODEL`. Si consiglia di utilizzare uno schema separato quando si utilizza il comando `CREATE MODEL` per mantenere le funzioni ML in uno schema separato. L'esempio seguente mostra come fare.

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

# Esempi
<a name="r_GRANT-examples"></a>

 L'esempio seguente concede all'utente il privilegio SELECT sulla tabella SALES `fred`. 

```
grant select on table sales to fred;
```

L'esempio seguente concede all'utente il privilegio SELECT su tutte le tabelle dello schema QA\$1TICKIT `fred`. 

```
grant select on all tables in schema qa_tickit to fred;
```

L'esempio seguente concede tutti i privilegi dello schema sullo schema QA\$1TICKIT al gruppo di utenti QA\$1USERS. I privilegi dello schema sono CREATE e USAGE. USAGE concede agli utenti l'accesso agli oggetti nello schema, ma non concede i privilegi come INSERT o SELECT su quegli oggetti. Concedere i privilegi a ciascun oggetto separatamente.

```
create group qa_users;
grant all on schema qa_tickit to group qa_users;
```

L'esempio seguente concede tutti i privilegi sulla tabella SALES nello schema QA\$1TICKIT a tutti gli utenti del gruppo QA\$1USERS.

```
grant all on table qa_tickit.sales to group qa_users;
```

L'esempio seguente concede tutti i privilegi sulla tabella SALES nello schema QA\$1TICKIT a tutti gli utenti del gruppo QA\$1USERS e RO\$1USERS.

```
grant all on table qa_tickit.sales to group qa_users, group ro_users;
```

L'esempio seguente concede il privilegio DROP sulla tabella SALES nello schema QA\$1TICKIT a tutti gli utenti del gruppo QA\$1USERS.

```
grant drop on table qa_tickit.sales to group qa_users;>
```

La seguente sequenza di comandi mostra come l'accesso a uno schema non concede privilegi su una tabella nello schema. 

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

La seguente sequenza di comandi mostra come l'accesso a una vista non implica l'accesso alle tabelle sottostanti. L'utente chiamato VIEW\$1USER non può selezionare dalla tabella DATE sebbene a questo utente siano stati concessi tutti i privilegi su VIEW\$1DATE. 

```
create user view_user password 'Abcd1234';
create view view_date as select * from date;
grant all on view_date to view_user;
set session authorization view_user;
select current_user;


current_user
--------------
view_user
(1 row)


select count(*) from view_date;


count
-------
365
(1 row)


select count(*) from date;


ERROR:  permission denied for relation date
```

Nell'esempio seguente vengono concessi privilegi SELECT sulle colonne `cust_name` e `cust_phone` della tabella `cust_profile` all'utente `user1`. 

```
grant select(cust_name, cust_phone) on cust_profile to user1;
```

L'esempio seguente concede il privilegio SELECT sulle colonne `cust_name` e `cust_phone` e il privilegio UPDATE sulla colonna `cust_contact_preference` della tabella `cust_profile` tabella al gruppo `sales_group`. 

```
grant select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile to group sales_group;
```

Nell'esempio seguente viene illustrato l'utilizzo della parola chiave ALL per concedere i privilegi SELECT e UPDATE su tre colonne della tabella `cust_profile` al gruppo `sales_admin`. 

```
grant ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile to group sales_admin;
```

L'esempio seguente concede all'utente `user2` il privilegio SELECT sulla colonna `cust_name` della vista `cust_profile_vw`. 

```
grant select(cust_name) on cust_profile_vw to user2;
```

## Esempi di assegnazione dell'accesso alle unità di condivisione dati
<a name="r_GRANT-examples-datashare"></a>

Gli esempi di seguito riportano le autorizzazioni di utilizzo per la condivisione dei dati GRANT su un database o uno schema specifico creato da una unità di condivisione dati. 

Nell'esempio seguente, un amministratore lato producer assegna l'autorizzazione USAGE dell'unità di condivisione dati `salesshare` allo spazio dei nomi specificato. 

```
GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

Nell'esempio seguente, un amministratore lato consumer assegna l'autorizzazione USAGE di `sales_db` a `Bob`.

```
GRANT USAGE ON DATABASE sales_db TO Bob;
```

Nell'esempio seguente, un amministratore lato consumer assegna l'autorizzazione GRANT USAGE dello schema `sales_schema` al ruolo `Analyst_role`. `sales_schema` è uno schema esterno che fa riferimento a sales\$1db.

```
GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
```

A questo punto, `Bob` e `Analyst_role` possono accedere a tutti gli oggetti del database in `sales_schema` e `sales_db`.

L'esempio seguente mostra l'assegnazione di autorizzazioni aggiuntive per gli oggetti in un database condiviso. Queste autorizzazioni aggiuntive sono necessarie solo se il comando CREATE DATABASE utilizzato per creare il database condiviso includeva la clausola WITH PERMISSIONS. Se il comando CREATE DATABASE non includeva WITH PERMISSIONS, l'assegnazione di USAGE per il database condiviso consente l'accesso completo a tutti gli oggetti in quel database.

```
GRANT SELECT ON sales_db.sales_schema.tickit_sales_redshift to Bob;
```

## Esempi di assegnazione di autorizzazioni con ambito
<a name="r_GRANT-examples-scoped"></a>

L'esempio seguente assegna al ruolo `Sales` l'utilizzo di tutti gli schemi attuali e futuri nel database `Sales_db`.

```
GRANT USAGE FOR SCHEMAS IN DATABASE Sales_db TO ROLE Sales;
```

L'esempio seguente assegna all'utente `alice` l'autorizzazione SELECT per tutte le tabelle correnti e future del database `Sales_db` e assegna ad `alice` l'autorizzazione a fornire ad altri utenti le autorizzazioni con ambito per le tabelle in `Sales_db`.

```
GRANT SELECT FOR TABLES IN DATABASE Sales_db TO alice WITH GRANT OPTION;
```

L'esempio seguente concede all'utente `bob` l'autorizzazione EXECUTE per le funzioni dello schema `Sales_schema`.

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

L'esempio seguente concede al ruolo `Sales` tutte le autorizzazioni per tutte le tabelle dello schema `ShareSchema` del database `ShareDb`. Quando si specifica lo schema, è possibile indicare il database dello schema utilizzando il formato in due parti `database.schema`.

```
GRANT ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema TO ROLE Sales;
```

L'esempio seguente è uguale al precedente. Puoi specificare il database utilizzando la parola chiave `DATABASE` anziché utilizzare un formato in due parti.

```
GRANT ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb TO ROLE Sales;
```

## Esempi di concessione del privilegio ASSUMEROLE
<a name="r_GRANT-examples-assumerole"></a>

Di seguito sono riportati esempi di concessione del privilegio ASSUMEROLE.

Nell'esempio seguente viene illustrata l'istruzione REVOKE che un utente con privilegi avanzati esegue una volta nel cluster per abilitare l'utilizzo del privilegio ASSUMEROLE per utenti e gruppi. Quindi, l'utente con privilegi avanzati concede il privilegio ASSUMEROLE a utenti e gruppi per i comandi appropriati. Per informazioni su come abilitare l'utilizzo del privilegio ASSUMEROLE per utenti e gruppi, consultare [Note di utilizzo per la concessione dell'autorizzazione ASSUMEROLE](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole).

```
revoke assumerole on all from public for all;
```

L'esempio seguente concede il privilegio ASSUMEROLE all'utente `reg_user1` per il ruolo IAM `Redshift-S3-Read` per eseguire operazioni COPY. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-S3-Read'
to reg_user1 for copy;
```

L'esempio seguente concede il privilegio ASSUMEROLE all'utente `reg_user1` per la catena di ruoli IAM `RoleA`, `RoleB` per eseguire operazioni COPY. 

```
grant assumerole
on 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB'
to reg_user1
for unload;
```

Di seguito è riportato un esempio del comando UNLOAD utilizzando la catena di ruoli IAM `RoleA`, `RoleB`.

```
unload ('select * from venue limit 10')
to 's3://companyb/redshift/venue_pipe_'
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

L'esempio seguente concede il privilegio ASSUMEROLE all'utente `reg_user1` per il ruolo IAM `Redshift-Exfunc` per creare funzioni esterne. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-Exfunc'
to reg_user1 for external function;
```

L'esempio seguente concede il privilegio ASSUMEROLE all'utente `reg_user1` per il ruolo IAM `Redshift-model` per creare modelli di machine learning. 

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-ML'
to reg_user1 for create model;
```

## Esempi di concessione dei privilegi ROLE
<a name="r_GRANT-examples-role"></a>

L'esempio seguente concede sample\$1role1 a user1.

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
```

L'esempio seguente concede sample\$1role1 a user1 con l'opzione WITH ADMIN OPTION, imposta la sessione corrente per user1 e user1 concede sample\$1role1 a user2.

```
GRANT ROLE sample_role1 TO user1 WITH ADMIN OPTION;
SET SESSION AUTHORIZATION user1;
GRANT ROLE sample_role1 TO user2;
```

L'esempio seguente concede sample\$1role1 a sample\$1role2.

```
GRANT ROLE sample_role1 TO ROLE sample_role2;
```

L'esempio seguente concede sample\$1role2 a sample\$1role3 e sample\$1role4. Quindi tenta di concedere 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
```

L'esempio seguente concede i privilegi di sistema CREATE USER a sample\$1role1.

```
GRANT CREATE USER TO ROLE sample_role1;
```

L'esempio seguente concede il ruolo definito dal sistema `sys:dba` a user1.

```
GRANT ROLE sys:dba TO user1;
```

L'esempio seguente tenta di concedere sample\$1role3 in una dipendenza circolare 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**
+ [Sintassi](#r_INSERT_30-synopsis)
+ [Parameters](#r_INSERT_30-parameters)
+ [Note per l'utilizzo](#r_INSERT_30_usage_notes)
+ [Esempi di INSERT](c_Examples_of_INSERT_30.md)

Inserisce nuove righe in una tabella. Puoi inserire una singola riga con la sintassi VALUES, più righe con la sintassi VALUES o una o più righe definite dai risultati di una query (INSERT INTO...SELECT).

**Nota**  
Consigliamo l'uso del comando [COPY](r_COPY.md) per caricare grandi quantità di dati. L'utilizzo di singole istruzioni INSERT per popolare una tabella potrebbe essere eccessivamente lento. In alternativa, se i dati esistono già in altre tabelle di database Amazon Redshift, utilizzare INSERT INTO SELECT o [CREATE TABLE AS](r_CREATE_TABLE_AS.md) per migliorare le prestazioni. Per ulteriori informazioni sull'utilizzo del comando COPY per caricare le tabelle, vedi [Caricamento dei dati in Amazon Redshift](t_Loading_data.md).

**Nota**  
Le dimensioni massime per una istruzione SQL è di 16 MB.

## Sintassi
<a name="r_INSERT_30-synopsis"></a>

```
INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
```

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

 *table\$1name*   
Tabella temporanea o persistente. Solo il proprietario della tabella o un utente con il privilegio INSERT sulla tabella può inserire le righe. Se utilizzi la clausola *query* per inserire le righe, devi avere il privilegio SELECT sulle tabelle denominate nella query.   
Utilizza INSERT (tabella esterna) per inserire i risultati di una query SELECT nelle tabelle esistenti nel catalogo esterno. Per ulteriori informazioni, consulta [INSERT (tabella esterna)](r_INSERT_external_table.md).

 *column*   
Puoi inserire i valori in una o più colonne della tabella. Puoi elencare i nomi delle colonne di destinazione in qualsiasi ordine. Se non specifichi un elenco di colonne, i valori da inserire devono corrispondere alle colonne della tabella nell'ordine in cui sono stati dichiarati nell'istruzione CREATE TABLE. Se il numero di valori da inserire è inferiore al numero di colonne nella tabella, vengono caricate le prime *n* colonne.   
Il valore predefinito dichiarato o un valore nullo viene caricato in ogni colonna non elencata (implicitamente o esplicitamente) nell'istruzione INSERT. 

DEFAULT VALUES   
Se alle colonne della tabella sono stati assegnati i valori predefiniti al momento della creazione della tabella, utilizza queste parole chiave per inserire una riga costituita interamente da valori predefiniti. Se le colonne non hanno valori predefiniti, in quelle colonne vengono inseriti i valori null. Se una delle colonne è dichiarata NOT NULL, l'istruzione INSERT restituisce un errore. 

VALUES   
Utilizza questa parola chiave per inserire una o più righe, con ogni riga composta da uno o più valori. L'elenco VALUES per ogni riga deve essere allineato all'elenco delle colonne. Per inserire più righe, utilizza una virgola come delimitatore tra ciascun elenco di espressioni. Non ripetere la parola chiave VALUES. Tutti gli elenchi VALUES per un'istruzione INSERT a più righe devono contenere lo stesso numero di valori. 

 *espressione*   
Un singolo valore o un'espressione che valuta un singolo valore. Ogni valore deve essere compatibile con il tipo di dati della colonna in cui viene inserito. Se possibile, un valore il cui tipo di dati non corrisponde al tipo di dati dichiarato della colonna viene automaticamente convertito in un tipo di dati compatibile. Ad esempio:   
+ Un valore decimale `1.1` è inserito in una colonna INT come `1`. 
+ Un valore decimale `100.8976` è inserito in una colonna DEC(5,2) come `100.90`. 
Puoi convertire esplicitamente un valore in un tipo di dati compatibile includendo la sintassi del cast di tipo nell'espressione. Ad esempio, se la colonna COL1 nella tabella T1 è una colonna CHAR (3):   

```
insert into t1(col1) values('Incomplete'::char(3));
```
L'istruzione inserisce il valore `Inc` nella colonna.   
Per un'istruzione INSERT VALUES a riga singola, puoi utilizzare una sottoquery scalare come espressione. Il risultato della sottoquery viene inserito nella colonna appropriata.   
Le sottoquery non sono supportate come espressioni per le istruzioni INSERT VALUES a più righe. 

DEFAULT   
Usa questa parola chiave per inserire il valore predefinito per una colonna, come definito al momento della creazione della tabella. Se non esiste un valore predefinito per una colonna, viene inserito un valore nullo. Non puoi inserire un valore predefinito in una colonna con un vincolo NOT NULL se tale colonna non ha un valore predefinito esplicito assegnato nell'istruzione CREATE TABLE. 

 *query*   
Inserisci una o più righe nella tabella definendo qualsiasi query. Tutte le righe prodotte dalla query vengono inserite nella tabella. La query deve restituire un elenco di colonne compatibile con le colonne della tabella, ma i nomi delle colonne non devono corrispondere. 

## Note per l'utilizzo
<a name="r_INSERT_30_usage_notes"></a>

**Nota**  
Consigliamo l'uso del comando [COPY](r_COPY.md) per caricare grandi quantità di dati. L'utilizzo di singole istruzioni INSERT per popolare una tabella potrebbe essere eccessivamente lento. In alternativa, se i dati esistono già in altre tabelle di database Amazon Redshift, utilizzare INSERT INTO SELECT o [CREATE TABLE AS](r_CREATE_TABLE_AS.md) per migliorare le prestazioni. Per ulteriori informazioni sull'utilizzo del comando COPY per caricare le tabelle, vedi [Caricamento dei dati in Amazon Redshift](t_Loading_data.md).

Il formato dei dati per i valori inseriti deve corrispondere al formato dei dati specificato dalla definizione CREATE TABLE. 

 Dopo aver inserito un numero elevato di nuove righe in una tabella: 
+ Applica l'operazione di vacuum alla tabella per recuperare spazio di memorizzazione e riordinare le righe. 
+ Analizza la tabella per aggiornare le statistiche del pianificatore di query. 

Quando i valori vengono inseriti nelle colonne DECIMAL e superano la scala specificata, i valori caricati vengono arrotondati all'occorrenza. Per esempio, se un valore di `20.259` viene inserito in una colonna DECIMAL(8,2) il valore che viene memorizzato è `20.26`. 

Puoi inserire in una colonna GENERATED BY DEFAULT AS IDENTITY. Puoi aggiornare colonne definite come GENERATED BY DEFAULT AS IDENTITY con i valori forniti. Per ulteriori informazioni, consulta [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

# Esempi di INSERT
<a name="c_Examples_of_INSERT_30"></a>

La tabella CATEGORY nel database TICKIT contiene le seguenti righe: 

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

 Crea una tabella CATEGORY\$1STAGE con uno schema simile alla tabella CATEGORY, ma definisci i valori predefiniti per le colonne: 

```
create table category_stage
(catid smallint default 0,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');
```

La seguente istruzione INSERT seleziona tutte le righe dalla tabella CATEGORY e le inserisce nella tabella CATEGORY\$1STAGE. 

```
insert into category_stage
(select * from category);
```

Le parentesi che racchiudono la query sono facoltative.

Questo comando inserisce una nuova riga nella tabella CATEGORY\$1STAGE con un valore specificato per ogni colonna nell'ordine: 

```
insert into category_stage values
(12, 'Concerts', 'Comedy', 'All stand-up comedy performances');
```

Puoi anche inserire una nuova riga che combina valori specifici e valori predefiniti: 

```
insert into category_stage values
(13, 'Concerts', 'Other', default);
```

Esegui la seguente query per restituire le righe inserite: 

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

Gli esempi seguenti mostrano alcune istruzioni INSERT VALUES a più righe. Il primo esempio inserisce valori CATID specifici per due righe e valori predefiniti per le altre colonne in entrambe le righe. 

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

Il prossimo esempio inserisce tre righe con varie combinazioni di valori specifici e predefiniti: 

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

La prima serie di VALUES in questo esempio produce gli stessi risultati della specifica di DEFAULT VALUES per un'istruzione INSERT a riga singola.

I seguenti esempi mostrano il comportamento di INSERT quando una tabella ha una colonna IDENTITY. Innanzitutto, crea una nuova versione della tabella CATEGORY, quindi inserisci le righe in essa contenute da CATEGORY: 

```
create table category_ident
(catid int identity not null,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');


insert into category_ident(catgroup,catname,catdesc)
select catgroup,catname,catdesc from category;
```

Non è possibile inserire valori interi specifici nella colonna CATID IDENTITY. I valori delle colonne IDENTITY vengono generati automaticamente.

L'esempio seguente dimostra che le sottoquery non possono essere utilizzate come espressioni in istruzioni INSERT VALUES a più righe: 

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

L'esempio seguente mostra un inserimento in una tabella temporanea popolata con i dati della tabella `venue` utilizzando la clausola `WITH SELECT`. Per ulteriori informazioni sulla tabella `venue`, consulta [Database di esempio](c_sampledb.md).

Per prima cosa, crea la tabella temporanea `#venuetemp`.

```
CREATE TABLE #venuetemp AS SELECT * FROM venue;
```

Elenca le righe nella tabella `#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	
...
```

Inserisci 10 righe duplicate nella tabella `#venuetemp` utilizzando la clausola `WITH SELECT`.

```
INSERT INTO #venuetemp (WITH venuecopy AS (SELECT * FROM venue) SELECT * FROM venuecopy ORDER BY 1 LIMIT 10);
```

Elenca le righe nella tabella `#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 (tabella esterna)
<a name="r_INSERT_external_table"></a>

Inserisce i risultati di una query SELECT in tabelle esterne esistenti su un catalogo esterno AWS Glue, AWS Lake Formation ad esempio for o un metastore Apache Hive. Utilizza lo stesso ruolo AWS Identity and Access Management (IAM) utilizzato per il comando CREATE EXTERNAL SCHEMA per interagire con cataloghi esterni e Amazon S3.

Per le tabelle non partizionate, il comando INSERT (tabella esterna) scrive i dati nella posizione Amazon S3 definita nella tabella, in base alle proprietà della tabella e al formato di file specificati.

Per le tabelle con partizioni, INSERT (tabella esterna) scrive i dati nella posizione Amazon S3 in base alla chiave di partizione specificata nella tabella. Al termine dell'operazione INSERT, inoltre, registra automaticamente le nuove partizioni nel catalogo esterno.

Non è possibile eseguire INSERT (tabella esterna) all'interno di un blocco di transazione (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 

## Sintassi
<a name="r_INSERT_external_table-synopsis"></a>

```
INSERT INTO external_schema.table_name
{ select_statement }
```

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

 *external\$1schema.table\$1name*   
Il nome di uno schema esterno e di una tabella esterna di destinazione esistenti in cui effettuare l'inserimento.

 *select\$1statement*   
Istruzione che inserisce una o più righe nella tabella esterna definendo qualsiasi query. Tutte le righe prodotte dalla query vengono scritte in Amazon S3 in formato testo o Parquet in base alla definizione della tabella. La query deve restituire un elenco di colonne compatibile con i tipi di dati delle colonne nella tabella esterna. Tuttavia, i nomi delle colonne non devono necessariamente corrispondere.

## Note per l'utilizzo
<a name="r_INSERT_external_table_usage_notes"></a>

Il numero di colonne nella query SELECT deve essere uguale alla somma delle colonne di dati e delle colonne di partizione. La posizione e il tipo di dati di ogni colonna di dati devono corrispondere a quelli della tabella esterna. La posizione delle colonne di partizione deve essere alla fine della query SELECT, nello stesso ordine in cui sono state definite nel comando CREATE EXTERNAL TABLE. I nomi delle colonne non devono necessariamente corrispondere.

In alcuni casi, è possibile eseguire il comando INSERT (tabella esterna) su un catalogo dati AWS Glue o un metastore Hive. Nel caso di AWS Glue, il ruolo IAM utilizzato per creare lo schema esterno deve disporre di autorizzazioni di lettura e scrittura su Amazon AWS Glue S3 e. Se utilizzi un AWS Lake Formation catalogo, questo ruolo IAM diventa il proprietario della nuova tabella Lake Formation. Questo ruolo IAM deve disporre almeno delle seguenti autorizzazioni: 
+ Autorizzazione SELECT, INSERT, UPDATE sulla tabella esterna
+ Autorizzazione per la posizione dati sul percorso Amazon S3 della tabella esterna

Per garantire che i nomi file siano univoci, Amazon Redshift utilizza il seguente formato per il nome di ogni file caricato in Amazon S3 per impostazione predefinita. 

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

Un esempio è `20200303_004509_810669_1007_0001_part_00.parquet`.

Quando si esegue il comando INSERT (tabella esterna), considerare quanto segue:
+ Le tabelle esterne con un formato diverso da PARQUET o TEXTFILE non sono supportate.
+ Questo comando supporta le proprietà esistenti della tabella come 'write.parallel', 'write.maxfilesize.mb', 'compression\$1type' e 'serialization.null.format'. Per aggiornare tali valori, eseguire il comando ALTER TABLE SET TABLE PROPERTIES.
+ La proprietà della tabella 'numRows' viene aggiornata automaticamente verso la fine dell'operazione INSERT. La proprietà della tabella deve essere definita o aggiunta alla tabella se già non è stata creata dall'operazione CREATE EXTERNAL TABLE AS.
+ La clausola LIMIT non è supportata nella query SELECT esterna. Usa invece una clausola LIMIT nidificata.
+ È possibile utilizzare la tabella [STL\$1UNLOAD\$1LOG](r_STL_UNLOAD_LOG.md) per tenere traccia dei file scritti su Amazon S3 da ogni operazione INSERT (tabella esterna).
+ Amazon Redshift supporta solo la crittografia standard Amazon S3 per INSERT (tabella esterna).

## Esempi di INSERT (tabella esterna)
<a name="c_Examples_of_INSERT_external_table"></a>

Nell'esempio seguente i risultati dell'istruzione SELECT vengono inseriti nella tabella esterna.

```
INSERT INTO spectrum.lineitem
SELECT * FROM local_lineitem;
```

Nell'esempio seguente i risultati dell'istruzione SELECT vengono inseriti in una tabella esterna partizionata mediante il partizionamento statico. Le colonne di partizione nell'istruzione SELECT sono hardcoded. Le colonne delle partizioni devono trovarsi alla fine della query.

```
INSERT INTO spectrum.customer
SELECT name, age, gender, 'May', 28 FROM local_customer;
```

Nell'esempio seguente i risultati dell'istruzione SELECT vengono inseriti in una tabella esterna partizionata utilizzando il partizionamento dinamico. Le colonne delle partizioni non sono hardcoded. I dati vengono aggiunti automaticamente alle cartelle delle partizioni esistenti o alle nuove cartelle se viene aggiunta una nuova partizione.

```
INSERT INTO spectrum.customer
SELECT name, age, gender, month, day FROM local_customer;
```

# LOCK
<a name="r_LOCK"></a>

Limita l'accesso a una tabella del database. Questo comando è significativo solo quando viene eseguito all'interno di un blocco di transazione.

Il comando LOCK ottiene un blocco a livello di tabella in modalità "ACCESS EXCLUSIVE", in attesa, se necessario, di eventuali blocchi in conflitto da rilasciare. Bloccare esplicitamente una tabella in questo modo fa sì che le letture e le scritture sulla tabella restino in attesa quando vengono tentate da altre transazioni o sessioni. Un blocco esplicito della tabella creato da un utente impedisce temporaneamente a un altro utente di selezionare i dati da quella tabella o di caricare dati in essa. Il blocco viene rilasciato quando la transazione che contiene il comando LOCK viene completata.

I blocchi di tabella meno restrittivi vengono acquisiti implicitamente da comandi che fanno riferimento a tabelle, ad esempio operazioni di scrittura. Ad esempio, se un utente tenta di leggere i dati da una tabella mentre un altro utente sta aggiornando la tabella, i dati letti saranno uno snapshot dei dati che sono già stati sottoposti al commit. (In alcuni casi, le query vengono interrotte in modo anomalo se violano le regole di isolamento serializzabili.) Per informazioni, consulta [Gestione delle operazioni di scrittura simultanee](c_Concurrent_writes.md).

Alcune operazioni DDL, come DROP TABLE e TRUNCATE, creano blocchi esclusivi. Queste operazioni impediscono le letture dei dati.

Se si verifica un conflitto di blocco, Amazon Redshift visualizza un messaggio di errore per avvisare l'utente che ha avviato la transazione in conflitto. La transazione che ha ricevuto il conflitto di blocco viene interrotta. Ogni volta che si verifica un conflitto di blocco, Amazon Redshift scrive una voce nella tabella [STL\$1TR\$1CONFLICT](r_STL_TR_CONFLICT.md).

## Sintassi
<a name="section_r_LOCK-synopsis"></a>

```
LOCK [ TABLE ] table_name [, ...]
```

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

TABLE   
Parola chiave facoltativa.

 *table\$1name*   
Nome della tabella da bloccare. Puoi bloccare più di una tabella utilizzando un elenco di nomi di tabella delimitati da virgole. Non è possibile bloccare le viste. 

## Esempio
<a name="example2"></a>

```
begin;

lock event, sales;

...
```

# MERGE
<a name="r_MERGE"></a>

Unisce in modo condizionale le righe da una tabella di origine a una tabella di destinazione. In genere, ciò può essere ottenuto solo utilizzando separatamente più istruzioni di inserimento, aggiornamento o eliminazione. Per ulteriori informazioni sulle operazioni che MERGE consente di combinare, consulta [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).

## Sintassi
<a name="r_MERGE-synopsis"></a>

```
MERGE INTO target_table 
USING source_table [ [ AS ] alias ] 
ON match_condition 
[ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE }
WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) |
REMOVE DUPLICATES ]
```

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

 *target\$1table*  
La tabella temporanea o permanente in cui si include l'istruzione MERGE.

 *source\$1table*  
La tabella temporanea o permanente che fornisce le righe da unire in *target\$1table*. *source\$1table* può essere anche una tabella Spectrum. 

 *alias*  
Nome alternativo temporaneo per *source\$1table*.  
Questo parametro è facoltativo. Anche il precedente *alias* con AS è facoltativo.

 *match\$1condition*  
Specifica predicati uguali tra la colonna della tabella di origine e la colonna della tabella di destinazione che vengono utilizzati per determinare se le righe in *source\$1table* possono essere abbinate alle righe in *target\$1table*. Se la condizione è soddisfatta, MERGE esegue *matched\$1clause* per quella riga. In caso contrario, MERGE esegue *not\$1matched\$1clause* per quella riga.

WHEN MATCHED  
 Specifica l'operazione da eseguire quando la condizione di corrispondenza tra una riga di origine e una riga di destinazione risulta True. È possibile specificare un'azione UPDATE o un'azione DELETE. 

UPDATE  
 Aggiorna la riga corrispondente in *target\$1table*. Vengono aggiornati solo i valori nel *col\$1name* specificato. 

DELETE  
 Elimina la riga corrispondente in *target\$1table*. 

WHEN NOT MATCHED  
 Specifica l'operazione da eseguire quando la condizione di corrispondenza risulta False o Unknown. È possibile specificare solo l'azione di inserimento INSERT per questa clausola. 

INSERT  
 Inserimenti nelle righe *target\$1table* di *source\$1table* che non corrispondono ad alcuna riga in *target\$1table*, secondo *match\$1condition*. Il *col\$1name* di destinazione può essere elencato in qualsiasi ordine. Se non viene fornito alcun valore *col\$1name*, per impostazione predefinita l'ordine è quello di tutte le colonne della tabella nel loro ordine dichiarato. 

 *nome\$1col*  
Una o più nomi di colonne da modificare. Non includere il nome della tabella quando specifichi la colonna di destinazione.

 *expr*  
L'espressione che definisce il nuovo valore per *col\$1name*.

 REMOVE DUPLICATES  
Specifica che il comando MERGE viene eseguito in modalità semplificata. La modalità semplificata presenta i seguenti requisiti:  
+  *target\$1table* e *source\$1table* devono avere lo stesso numero di colonne, tipi di colonna compatibili e lo stesso ordine di colonne. 
+  Ometti la clausola WHEN e le clausole UPDATE e INSERT dal comando MERGE. 
+  Usa la clausola REMOVE DUPLICATES nel comando MERGE. 
In modalità semplificata, MERGE esegue le seguenti operazioni:  
+  Le righe in *target\$1table* che hanno una corrispondenza in *source\$1table* vengono aggiornate in modo che corrispondano ai valori in *source\$1table*. 
+  Le righe in *source\$1table* che non hanno una corrispondenza in *target\$1table* vengono inserite in *target\$1table*. 
+  Quando più righe in *target\$1table* corrispondono alla stessa riga in *source\$1table*, le righe duplicate vengono rimosse. Amazon Redshift mantiene una riga e la aggiorna. Le righe duplicate che non corrispondono a una riga in *source\$1table* restano invariate. 
L'utilizzo di REMOVE DUPLICATES offre prestazioni migliori rispetto all'utilizzo di WHEN MATCHED e WHEN NOT MATCHED. Consigliamo di utilizzare REMOVE DUPLICATES se *target\$1table* e *source\$1table* sono compatibili e non è necessario conservare le righe duplicate in *target\$1table*.

## Note per l'utilizzo
<a name="r_MERGE_usage_notes"></a>
+ Per eseguire le istruzioni MERGE, devi essere il proprietario sia di *source\$1table* che di *target\$1table* o disporre dell'autorizzazione SELECT per tali tabelle. Inoltre, devi disporre delle autorizzazioni UPDATE, DELETE e INSERT per *target\$1table*, a seconda delle operazioni incluse nell'istruzione MERGE.
+  *target\$1table* non può essere una tabella di sistema, una tabella di catalogo o una tabella esterna. 
+  *source\$1table* e *target\$1table* non possono essere la stessa tabella. 
+  Non è possibile utilizzare la clausola WITH in un'istruzione MERGE. 
+  Le righe in *target\$1table* non possono corrispondere a più righe in *source\$1table*. 

  Considera il seguente esempio:

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

  In entrambe le istruzioni MERGE, l'operazione non riesce perché nella tabella `source` sono presenti più righe con un valore ID di `1`.
+  *match\$1condition* ed *expr* non possono fare riferimento parzialmente a colonne di tipo SUPER. Ad esempio, se l'oggetto di tipo SUPER è un array o una struttura, non puoi usare singoli elementi di quella colonna per *match\$1condition* o *expr*, ma puoi utilizzare l'intera colonna. 

  Considera il seguente esempio:

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

  Per ulteriori informazioni sul tipo SUPER, consulta [Tipo SUPER](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html).
+ Se *source\$1table* è di grandi dimensioni, la definizione delle colonne di join sia da *target\$1table* che da *source\$1table* come chiavi di distribuzione può migliorare le prestazioni.
+ Per utilizzare la clausola REMOVE DUPLICATES, sono necessarie le autorizzazioni SELECT, INSERT e DELETE per *target\$1table*.
+  *source\$1table* può essere una vista o una sottoquery. Di seguito è riportato un esempio di istruzione MERGE in cui *source\$1table* è una sottoquery che rimuove le righe duplicate. 

  ```
  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);
  ```
+ La destinazione non può essere un’origine dati di alcuna sottoquery della stessa istruzione MERGE. Ad esempio, il seguente comando SQL restituisce un errore come ERROR: L'istruzione Source view/subquery in Merge non può fare riferimento alla tabella di destinazione. perché la subquery fa riferimento `target` invece a. `source`

  ```
  MERGE INTO target
  USING (SELECT id, name FROM target GROUP BY 1, 2) as my_source
  ON target.id = my_source.id
  WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name
  WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);
  ```

## Esempi
<a name="sub-examples-merge"></a>

L'esempio seguente crea due tabelle, quindi esegue un'operazione MERGE su di esse, aggiornando le righe corrispondenti nella tabella di destinazione e inserendo righe che prive di corrispondenze. Quindi inserisce un altro valore nella tabella di origine ed esegue un'altra operazione MERGE, questa volta eliminando le righe corrispondenti e inserendo la nuova riga dalla tabella di origine.

Per prima cosa crea e compila le tabelle di origine e destinazione.

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

Quindi, unisci la tabella di origine con la tabella di destinazione, aggiornando la tabella di destinazione con le righe corrispondenti e inserisci le righe della tabella di origine che non hanno alcuna corrispondenza.

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

Tieni presente che le righe con valori ID di 102 e 103 vengono aggiornate in modo che corrispondano ai valori dei nomi della tabella di destinazione. Inoltre, nella tabella di destinazione viene inserita una nuova riga con un valore ID di 104 e il valore del nome Bill.

Quindi, inserisci una nuova riga nella tabella di origine.

```
INSERT INTO source VALUES (105, 'David');

SELECT * FROM source;
 id  |    name
-----+------------
 102 | Tony
 103 | Alice
 104 | Bill
 105 | David
(4 rows)
```

Infine, esegui un'operazione di unione eliminando le righe corrispondenti nella tabella di destinazione e inserendo le righe prive di corrispondenze.

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

Le righe con valori ID di 102, 103 e 104 vengono eliminate dalla tabella di destinazione e una nuova riga con un valore ID di 105 e il valore del nome David viene inserita nella tabella di destinazione.

L’esempio seguente mostra la sintassi semplificata di un comando MERGE che utilizza la clausola 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)
```

L’esempio seguente mostra la sintassi semplificata di un comando MERGE che utilizza la clausola REMOVE DUPLICATES, che rimuove le righe duplicate da *target\$1table* se ci sono righe corrispondenti in *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)
```

Dopo l'esecuzione di MERGE, c'è solo una riga con un valore ID di 23 in *target\$1table*. Poiché non c'era alcuna riga in *source\$1table* con il valore ID 30, le due righe duplicate con valori ID 30 rimangono in *target\$1table*.

## consultare anche
<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>

Prepara un'istruzione per l'esecuzione. 

PREPARE crea un'istruzione preparata. Quando viene eseguita l'istruzione PREPARE, l'istruzione specificata (SELECT, INSERT, UPDATE o DELETE) viene analizzata, riscritta e pianificata. Quando viene emesso un comando EXECUTE per l'istruzione preparata, Amazon Redshift può facoltativamente rivedere il piano di esecuzione della query (per migliorare le prestazioni in base ai valori dei parametri specificati) prima di eseguire l'istruzione preparata. 

## Sintassi
<a name="r_PREPARE-synopsis"></a>

```
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
```

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

 *plan\$1name*   
Nome arbitrario assegnato a questa particolare istruzione preparata. Deve essere univoco all'interno di una singola sessione e successivamente viene utilizzato per eseguire o deallocare un'istruzione precedentemente preparata.

 *datatype*   
Il tipo di dati di un parametro dell'istruzione preparata. Per fare riferimento ai parametri nella stessa istruzione preparata, utilizza 1 \$1, 2 \$1 e così via fino a un massimo di 32.767 \$1.

 *statement *   
Qualsiasi istruzione SELECT, INSERT, UPDATE o DELETE.

## Note per l'utilizzo
<a name="r_PREPARE_usage_notes"></a>

Le istruzioni preparate possono assumere parametri: valori che vengono sostituiti nell'istruzione quando viene eseguita. Per includere i parametri in un'istruzione preparata, fornisci un elenco di tipi di dati nell'istruzione PREPARE e, nell'istruzione da preparare, fai riferimento ai parametri per posizione utilizzando la notazione \$11, \$12, ... Il numero massimo di gruppi di parametri è 32.767. Durante l'esecuzione di un'istruzione, specifica i valori effettivi per tali parametri nell'istruzione EXECUTE. Per ulteriori dettagli, consultare [EXECUTE](r_EXECUTE.md). 

Le istruzioni preparate durano solo per la sessione corrente. Al termine della sessione, l'istruzione preparata viene scartata, quindi deve essere ricreata prima di essere utilizzata di nuovo. Ciò significa anche che una singola istruzione preparata non può essere utilizzata da più client di database simultanei; tuttavia, ogni client può creare la propria istruzione preparata da utilizzare. L'istruzione preparata può essere rimossa manualmente utilizzando il comando DEALLOCATE. 

Le istruzioni preparate offrono il massimo vantaggio in termini di prestazioni quando una singola sessione viene utilizzata per eseguire un numero elevato di istruzioni simili. Come illustrato, per ogni nuova esecuzione di un'istruzione preparata, Amazon Redshift può rivedere nuovamente il piano di esecuzione della query per migliorare le prestazioni in base ai valori dei parametri specificati. Per esaminare il piano di esecuzione della query che Amazon Redshift ha scelto per una specifica istruzione EXECUTE, utilizzare il comando [EXPLAIN](r_EXPLAIN.md). 

Per ulteriori informazioni sulla pianificazione delle query e sulle statistiche raccolte da Amazon Redshift per l'ottimizzazione delle query, consultare il comando [ANALYZE](r_ANALYZE.md). 

## Esempi
<a name="sub-examples-prepare"></a>

Creare una tabella temporanea, preparare l'istruzione INSERT e quindi eseguirla:

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

Preparare un'istruzione SELECT e quindi eseguirla:

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

## consultare anche
<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>

Aggiorna una vista materializzata

Quando crei una vista materializzata, il suo contenuto riflette lo stato della tabella o delle tabelle del database sottostante in quel momento. I dati nella vista materializzata rimangono invariati, anche quando le applicazioni apportano modifiche ai dati nelle tabelle sottostanti.

Per aggiornare i dati in una vista materializzata, è possibile usare l'istruzione `REFRESH MATERIALIZED VIEW` in qualsiasi momento. Eseguendo questa istruzione, Amazon Redshift identifica le modifiche apportate nella tabella o nelle tabelle di base e quindi applica tali modifiche alla vista materializzata.

Per ulteriori informazioni sulle viste materializzate, consultare [Viste materializzate in Amazon Redshift](materialized-view-overview.md).

## Sintassi
<a name="mv_REFRESH_MATERIALIZED_VIEW-synopsis"></a>

```
REFRESH MATERIALIZED VIEW mv_name [ RESTRICT | CASCADE ]
```

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

*mv\$1name*  
Il nome della vista materializzata da aggiornare.

RESTRICT  
Parola chiave facoltativa. Aggiorna la vista materializzata specificata ma non le viste materializzate dipendenti. L’impostazione predefinita se non viene specificato né RESTRICT né CASCADE.

CASCADE  
Parola chiave facoltativa. Aggiorna la vista materializzata specificata e tutte le viste materializzate dipendenti.

## Note per l’utilizzo
<a name="mv_REFRESH_MARTERIALIZED_VIEW_usage"></a>

Solo il proprietario di una vista materializzata può eseguire un'operazione `REFRESH MATERIALIZED VIEW` su tale vista materializzata. Inoltre, il proprietario deve disporre del privilegio SELECT sulle tabelle di base sottostanti per eseguire correttamente il comando `REFRESH MATERIALIZED VIEW`. 

Il comando `REFRESH MATERIALIZED VIEW` viene eseguito come transazione propria. La semantica delle transazioni Amazon Redshift viene seguita per determinare quali dati dalle tabelle di base sono visibili al comando `REFRESH` o quando le modifiche apportate dal comando `REFRESH` sono rese visibili ad altre transazioni in esecuzione in Amazon Redshift.
+ Nel caso di viste materializzate incrementali, `REFRESH MATERIALIZED VIEW` utilizza solo le righe delle tabelle di base per le quali è già stato eseguito il commit. Pertanto, se l'operazione di aggiornamento viene eseguita dopo un'istruzione DML (Data Manipolation Language) nella stessa transazione, le modifiche di tale istruzione DML non sono visibili per l'aggiornamento. 
+ Per un aggiornamento completo di una vista materializzata, `REFRESH MATERIALIZED VIEW` vede tutte le righe della tabella di base visibili alla transazione di aggiornamento, in base alla semantica delle transazioni Amazon Redshift usuale. 
+ A seconda del tipo di argomento di input, Amazon Redshift supporta ancora l'aggiornamento incrementale per le viste materializzate per le seguenti funzioni con tipi di argomenti di input specifici: DATE (timestamp), DATE\$1PART (data, ora, intervallo, time-tz), DATE\$1TRUNC (timestamp, intervallo).
+ L'aggiornamento incrementale è supportato in una vista materializzata in cui la tabella di base si trova in un'unità di condivisione dati.
+ L'aggiornamento delle viste materializzate condivise da cluster di condivisione dati remoti non è supportato per le viste materializzate che contengono riferimenti ad altre viste materializzate, tabelle Spectrum, tabelle definite in un cluster Redshift diverso o. UDFs Tali viste materializzate possono essere aggiornate dal cluster locale (produttore).

Alcune operazioni in Amazon Redshift interagiscono con le viste materializzate. Alcune di queste operazioni potrebbero forzare un'operazione `REFRESH MATERIALIZED VIEW` per ricalcolare completamente la vista materializzata, anche se la query che definisce la vista materializzata utilizza solo le funzionalità SQL idonee per l'aggiornamento incrementale. Ad esempio:
+ Le operazioni vacuum in background potrebbero essere bloccate se le viste materializzate non vengono aggiornate. Dopo un periodo di soglia definito internamente, è possibile eseguire l'operazione di vacuum. Con l'operazione vacuum, tutte le viste materializzate dipendenti vengono contrassegnate come da rielaborare al successivo aggiornamento (anche se sono di tipo incrementale). Per informazioni su VACUUM, vedere [VACUUM](r_VACUUM_command.md). Per ulteriori informazioni sugli eventi e le modifiche allo stato, consultare [STL\$1MV\$1STATE](r_STL_MV_STATE.md).
+ Alcune operazioni avviate dall'utente sulle tabelle di base impongono che una vista materializzata venga rielaborata completamente alla successiva esecuzione dell'operazione REFRESH. Esempi di tali operazioni sono un VACUUM richiamato manualmente, un ridimensionamento classico, un'operazione ALTER DISTKEY, un'operazione ALTER SORTKEY e un'operazione di troncatura. In alcuni casi le operazioni automatiche possono anche comportare il ricalcolo completo di una vista materializzata alla successiva esecuzione di un’operazione REFRESH. Ad esempio, un’operazione di eliminazione del vacuum automatico può causare un ricalcolo completo. Per ulteriori informazioni sugli eventi e le modifiche allo stato, consultare [STL\$1MV\$1STATE](r_STL_MV_STATE.md). 

## Aggiornamento a cascata
<a name="mv_REFRESH_MATERIALIZED_VIEW_cascading"></a>

L'opzione CASCADE aggiorna la vista materializzata specificata e tutte le viste materializzate che ne dipendono, in ordine di dipendenza: la base viene REFRESHed prima della vista in alto (ordinamento MVs topologico). MVs Ciò consente di aggiornare un insieme annidato di viste materializzate con un unico comando.

L’opzione RESTRICT (impostazione predefinita se non viene specificato né RESTRICT né CASCADE) aggiorna solo la vista materializzata specificata.

Quando utilizzi l’opzione CASCADE, si applicano le seguenti regole:
+ Solo il proprietario della vista materializzata o un utente con privilegi avanzati può eseguire il comando `REFRESH MATERIALIZED VIEW ... CASCADE`.
+ Se una qualsiasi delle viste materializzate nella cascata non può essere aggiornata, l’intera operazione a cascata viene interrotta.

La funzionalità di aggiornamento a cascata è supportata solo se annidata su viste materializzate locali e in streaming MVs . Le viste materializzate con altri tipi di sorgenti, come Spectrum o Condivisione dei dati, non sono supportate in modalità a cascata. CASCADE esegue l'aggiornamento in un'unica transazione per tutte le unità annidate. MVs

## Aggiornamento incrementale per le viste materializzate in un’unità di condivisione dati
<a name="mv_REFRESH_MATERIALIZED_VIEW_datashare"></a>

 Amazon Redshift supporta l’aggiornamento automatico e incrementale per le viste materializzate in un’unità di condivisione dati del consumer quando le tabelle di base sono condivise. L’aggiornamento incrementale è un’operazione in cui Amazon Redshift identifica le modifiche nella tabella o nelle tabelle di base avvenute dopo l’aggiornamento precedente e aggiorna solo i record corrispondenti nella vista materializzata. Per ulteriori informazioni su questo comportamento, consulta [CREATE MATERIALIZED VIEW](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html#mv_CREATE_MARTERIALIZED_VIEW_datashare). 

## Limitazioni per l'aggiornamento incrementale
<a name="mv_REFRESH_MARTERIALIZED_VIEW_limitations"></a>

Amazon Redshift attualmente non supporta l'aggiornamento incrementale per le viste materializzate definite con una query utilizzando uno dei seguenti elementi SQL:
+ OUTER JOIN (RIGHT, LEFT o FULL).
+ Operazioni insiemistiche: UNION, INTERSECT, EXCEPT, MINUS
+ UNION ALL quando si verifica in una sottoquery e una funzione di aggregazione o una clausola GROUP BY è presente nella query o la vista materializzata di destinazione contiene una chiave di ordinamento.
+ Le funzioni di aggregazione MEDIAN, PERCENTILE\$1CONT, MAX, MIN, LISTAGG, STDDEV\$1SAMP, STDDEV\$1POP, APPROXIMATE COUNT, APPROXIMATE PERCENTILE e le funzioni di aggregazione bitwise.
**Nota**  
Sono supportate le funzioni di aggregazione COUNT, SUM, MIN, MAX e AVG.
+ Funzioni di aggregazione di tipo DISTINCT, come DISTINCT COUNT, DISTINCT SUM, ecc.
+ Funzioni finestra
+ Query che utilizza tabelle temporanee per l'ottimizzazione delle query, ad esempio l'ottimizzazione delle espressioni secondarie comuni.
+ Sottoquery
+ Tabelle esterne che fanno riferimento ai seguenti formati nella query che definisce la vista materializzata. 
  +  Delta Lake 
  +  Hudi 

  L’aggiornamento incrementale è supportato per le viste materializzate definite con formati diversi da quelli precedenti. Per ulteriori informazioni, consulta [Viste materializzate per le tabelle di data lake esterne in Amazon Redshift SpectrumViste materializzate per le tabelle di data lake esterne](materialized-view-external-table.md). 
+ Funzioni mutabili, come le funzioni data-ora, funzioni RANDOM e funzioni definite dall'utente non stabili.
+ Per le limitazioni relative all’aggiornamento incrementale per le integrazioni Zero-ETL, consulta [Considerazioni sull’utilizzo di integrazioni Zero-ETL con Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl.reqs-lims.html).
+ Accesso alle tabelle da più di un database.

Per ulteriori informazioni sulle limitazioni della vista materializzata, incluso l'effetto di operazioni in background come VACUUM sulle operazioni di aggiornamento della vista materializzata, consulta [Note per l’utilizzo](#mv_REFRESH_MARTERIALIZED_VIEW_usage).

## Esempi
<a name="mv_REFRESH_MARTERIALIZED_VIEW_examples"></a>

Nell'esempio seguente viene eseguito l'aggiornamento della vista materializzata `tickets_mv`.

```
REFRESH MATERIALIZED VIEW tickets_mv;
```

L’esempio seguente aggiorna la vista materializzata `products_mv` e tutte le viste materializzate dipendenti:

```
REFRESH MATERIALIZED VIEW products_mv CASCADE; 
```

# RESET
<a name="r_RESET"></a>

Ripristina il valore predefinito di un parametro di configurazione.

Puoi ripristinare un singolo parametro specificato o tutti i parametri contemporaneamente. Per impostare un parametro su un valore specifico, utilizza il comando [SET](r_SET.md). Per visualizzare il valore corrente di un parametro, utilizza il comando [MOSTRA](r_SHOW.md).

## Sintassi
<a name="r_RESET-synopsis"></a>

```
RESET { parameter_name | ALL }
```

La seguente istruzione imposta il valore di una variabile di contesto di sessione su NULL.

```
RESET { variable_name | ALL }
```

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

 *parameter\$1name*   
Nome del parametro da reimpostare. Per ulteriori informazioni sui parametri, vedi [Modifica della configurazione del server](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings).

ALL   
Reimposta tutti i parametri di runtime, incluse tutte le variabili di contesto di sessione.

*variabile*   
Il nome della variabile da reimpostare Se il valore da REIMPOSTARE è una variabile di contesto di sessione, Amazon Redshift la imposta su NULL.

## Esempi
<a name="r_RESET-examples"></a>

L'esempio seguente reimposta il parametro `query_group` sul valore predefinito: 

```
reset query_group;
```

L'esempio seguente reimposta tutti i parametri di runtime sui valori predefiniti. 

```
reset all;
```

Nell'esempio viene reimpostata la variabile di contesto.

```
RESET app_context.user_id;
```

# REVOKE
<a name="r_REVOKE"></a>

Rimuove i privilegi di accesso, come i privilegi per creare, eliminare o aggiornare tabelle, da un utente o un ruolo.

Per quanto riguarda le autorizzazioni, è possibile usare solo GRANT o REVOKE USAGE su uno schema esterno per gli utenti del database e i ruoli che utilizzano la sintassi ON SCHEMA. Quando si utilizza ON EXTERNAL SCHEMA con AWS Lake Formation, è possibile concedere e revocare solo le autorizzazioni a un ruolo (IAM). AWS Identity and Access Management Per un elenco delle autorizzazioni richieste, consulta la sintassi.

Per le procedure archiviate, USAGE ON LANGUAGE `plpgsql` è concesso a PUBLIC per impostazione predefinita. Per impostazione predefinita, EXECUTE ON PROCEDURE è concesso solo al proprietario e agli utenti con privilegi avanzati.

Specificare nel comando REVOKE le autorizzazioni che si desidera rimuovere. Per concedere le autorizzazioni, utilizzare il comando [GRANT](r_GRANT.md). 

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

### Revoca delle autorizzazioni a livello di colonna per le tabelle
<a name="revoke-column-level"></a>

Di seguito è riportata la sintassi per le autorizzazioni a livello di colonna su tabelle e viste di 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 ]
```

### Revoca delle autorizzazioni ASSUMEROLE
<a name="revoke-assumerole-permissions"></a>

Di seguito è riportata la sintassi per revocare l'autorizzazione ASSUMEROLE da utenti e gruppi con un ruolo specificato. 

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

### Revoca delle autorizzazioni per Redshift Spectrum per Lake Formation
<a name="revoke-spectrum-integration-with-lf-permissions"></a>

Di seguito è riportata la sintassi per l'integrazione di Redshift Spectrum con Lake Formation.

```
REVOKE [ GRANT OPTION FOR ]
{ SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    FROM { IAM_ROLE iam_role } [, ...]

REVOKE [ GRANT OPTION FOR ]
{ { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    FROM { { IAM_ROLE iam_role } [, ...] | PUBLIC }

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    FROM { IAM_ROLE iam_role } [, ...]
```

### Revoca delle autorizzazioni dell'unità di condivisione dati
<a name="revoke-datashare-permissions"></a>

**Autorizzazioni dell'unità di condivisione dati sul lato producer**  
Di seguito è riportata la sintassi per l'utilizzo di REVOKE per rimuovere le autorizzazioni ALTER o SHARE da un utente o un ruolo. L'utente con le autorizzazioni revocate non può più modificare l'unità di condivisione dati o assegnarne l'utilizzo a un consumer. 

```
REVOKE { ALTER | SHARE } ON DATASHARE datashare_name
 FROM { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

Di seguito è riportata la sintassi per l'utilizzo di REVOKE per rimuovere l'accesso di un utente a un'unità di condivisione dati.

```
REVOKE USAGE
 ON DATASHARE datashare_name
 FROM NAMESPACE 'namespaceGUID' [, ...] | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ] [, ...]
```

Di seguito è riportato un esempio per revocare l'autorizzazione di utilizzo di un'unità di condivisione dati a un account Lake Formation.

```
REVOKE USAGE ON DATASHARE salesshare FROM ACCOUNT '123456789012' VIA DATA CATALOG;
```

**Autorizzazioni dell'unità di condivisione dati sul lato consumer**  
Di seguito è riportata la sintassi di REVOKE per le autorizzazioni di utilizzo per la condivisione dei dati su un database o uno schema specifico creato da una unità di condivisione dati. La revoca dell'autorizzazione di utilizzo a un database creato con la clausola WITH PERMISSIONS non revoca le autorizzazioni aggiuntive assegnate a un utente o a un ruolo, incluse quelle a livello di oggetto assegnate agli oggetti sottostanti. Se assegni nuovamente l'autorizzazione di utilizzo all'utente o al ruolo, verranno mantenute tutte le autorizzazioni aggiuntive di cui l'utente o il ruolo disponeva prima della revoca dell'utilizzo.

```
REVOKE USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
 FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### Revoca delle autorizzazioni con ambito
<a name="revoke-scoped-permissions"></a>

Le autorizzazioni con ambito consentono di concedere autorizzazioni a un utente o a un ruolo per tutti gli oggetti di un tipo all’interno di un database o uno schema. Gli utenti e i ruoli con autorizzazioni con ambito dispongono delle autorizzazioni specificate per tutti gli oggetti correnti e futuri all’interno del database o dello schema.

Puoi visualizzare l’ambito delle autorizzazioni con ambito a livello di database in [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md). Puoi visualizzare l’ambito delle autorizzazioni con ambito a livello di schema in [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md).

Per ulteriori informazioni sulle autorizzazioni con ambito, consulta [Autorizzazioni con ambito](t_scoped-permissions.md).

Di seguito è riportata la sintassi per revocare a utenti e ruoli autorizzazioni specifiche. 

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

Tieni presente che le autorizzazioni con ambito non fanno distinzione tra le autorizzazioni per le funzioni e le procedure. Ad esempio, l’istruzione seguente revoca le autorizzazioni `EXECUTE` sia per le funzioni che per le procedure di `bob` nello schema `Sales_schema`. 

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

### Revoca delle autorizzazioni di machine learning
<a name="revoke-model-permissions"></a>

Di seguito è riportata la sintassi per le autorizzazioni per il modello di machine learning su 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 ]
```

### Revoca delle autorizzazioni per i ruoli
<a name="revoke-roles"></a>

Di seguito è riportata la sintassi per revocare le autorizzazioni per i ruoli su Amazon Redshift.

```
REVOKE [ ADMIN OPTION FOR ] { ROLE role_name } [, ...] FROM { user_name } [, ...]
```

```
REVOKE { ROLE role_name } [, ...] FROM { ROLE role_name } [, ...]
```

Di seguito è riportata la sintassi per revocare le autorizzazioni di sistema per i ruoli su 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 } [, ...]
```

### Revoca delle autorizzazioni per le policy di sicurezza
<a name="revoke-role-level"></a>

Di seguito è riportata la sintassi per la revoca delle autorizzazioni che spiega i filtri delle policy di sicurezza di una query nel piano EXPLAIN. Le policy di sicurezza possibili includono le policy di sicurezza a livello di riga e le politiche di mascheramento dinamico dei dati.

```
REVOKE EXPLAIN { RLS | MASKING } FROM ROLE rolename 
```

Di seguito è riportata la sintassi per revocare le autorizzazioni a escludere le policy di sicurezza a livello di riga per una query. 

```
REVOKE IGNORE RLS FROM ROLE rolename 
```

Di seguito è riportata la sintassi per revocare le autorizzazioni SELECT dalla policy di sicurezza specificata. Le policy di sicurezza possibili includono le policy di sicurezza a livello di riga e le politiche di mascheramento dinamico dei dati.

```
REVOKE SELECT ON [ TABLE ] table_name [, ...]
            FROM { RLS | MASKING } POLICY policy_name [, ...]
```

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

GRANT OPTION FOR   
Revoca solo l'opzione per concedere un'autorizzazione specificata ad altri utenti e non revoca l'autorizzazione stessa. Non puoi revocare GRANT OPTION a un gruppo o a PUBLIC.

SELECT   
Revoca l'autorizzazione a selezionare i dati da una tabella o una vista utilizzando un'istruzione SELECT.

INSERT   
Revoca l'autorizzazione a caricare i dati in una tabella utilizzando un'istruzione INSERT o un'istruzione COPY. 

UPDATE   
Revoca l'autorizzazione ad aggiornare una colonna della tabella utilizzando un'istruzione UPDATE. 

DELETE   
Revoca l'autorizzazione a eliminare una riga di dati da una tabella.

REFERENCES   
Revoca l'autorizzazione a creare un vincolo di chiave esterna. È necessario revocare questa autorizzazione sia sulla tabella a cui si fa riferimento, sia sulla tabella che fa da riferimento.

TRUNCATE  
Revoca l'autorizzazione a troncare una tabella. Senza questa autorizzazione, solo il proprietario di una tabella o un utente con privilegi avanzati può troncare una tabella. Per ulteriori informazioni sul comando TRUNCATE, consulta [TRUNCATE](r_TRUNCATE.md).

ALL [ PRIVILEGES ]   
Revoca contemporaneamente tutte le autorizzazioni disponibili per l'utente o il gruppo specificato. La parola chiave PRIVILEGES è facoltativa.  
 Amazon Redshift non supporta le autorizzazioni RULE e TRIGGER. Per ulteriori informazioni, consulta [Caratteristiche PostgreSQL non supportate](c_unsupported-postgresql-features.md). 

ALTER  
A seconda dell'oggetto del database, revoca le seguenti autorizzazioni all'utente o al gruppo di utenti:   
+ Per le tabelle, ALTER revoca l'autorizzazione a modificare una tabella o una vista. Per ulteriori informazioni, consulta [ALTER TABLE](r_ALTER_TABLE.md).
+ Per i database, ALTER revoca l'autorizzazione a modificare un database. Per ulteriori informazioni, consulta [ALTER DATABASE](r_ALTER_DATABASE.md).
+ Per gli schemi, ALTER revoca l'autorizzazione a modificare uno schema. Per ulteriori informazioni, consulta [ALTER SCHEMA](r_ALTER_SCHEMA.md).
+ Per le tabelle esterne, ALTER revoca l'autorizzazione a modificare una tabella in un AWS Glue Data Catalog abilitato per Lake Formation. Questa autorizzazione si applica solo quando si utilizza Lake Formation.

DROP  
A seconda dell’oggetto del database, revoca le seguenti autorizzazioni all’utente o al ruolo:  
+  Per le tabelle, DROP revoca l’autorizzazione a rimuovere una tabella o una vista. Per ulteriori informazioni, consulta [DROP TABLE](r_DROP_TABLE.md). 
+  Per i database, DROP revoca l’autorizzazione a rimuovere un database. Per ulteriori informazioni, consulta [DROP DATABASE](r_DROP_DATABASE.md). 
+  Per gli schemi, DROP revoca l’autorizzazione a rimuovere uno schema. Per ulteriori informazioni, consulta [DROP SCHEMA](r_DROP_SCHEMA.md). 

ASSUMEROLE  <a name="assumerole"></a>
Revoca l'autorizzazione a eseguire i comandi COPY, UNLOAD, EXTERNAL FUNCTION o CREATE MODEL per utenti, ruoli o gruppi con un ruolo specificato. 

ON [ TABLE ] *table\$1name*   
Revoca le autorizzazioni specificate su una tabella o una vista. La parola chiave TABLE è facoltativa.

ON ALL TABLES IN SCHEMA *schema\$1name*   
Revoca le autorizzazioni specificate su tutte le tabelle nello schema a cui si fa riferimento.

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="revoke-column-level-privileges"></a>
Revoca le autorizzazioni specificate da utenti, gruppi o PUBLIC nelle colonne specificate della tabella o della vista Amazon Redshift.

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table-column"></a>
Revoca le autorizzazioni specificate da un ruolo IAM nelle colonne indicate della tabella Lake Formation nello schema a cui si fa riferimento.

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table"></a>
Revoca le autorizzazioni specificate da un ruolo IAM nelle tabelle Lake Formation specificate nello schema a cui si fa riferimento.

ON EXTERNAL SCHEMA *schema\$1name*   <a name="revoke-external-schema"></a>
Revoca le autorizzazioni specificate da un ruolo IAM nello schema a cui si fa riferimento.

FROM IAM\$1ROLE *iam\$1role*   <a name="revoke-from-iam-role"></a>
Indica il ruolo IAM che perde le autorizzazioni.

ROLE *role\$1name*   
Revoca le autorizzazioni dal ruolo specificato.

GROUP *group\$1name*   
Revoca le autorizzazioni al gruppo di utenti specificato.

PUBLIC   
Revoca le autorizzazioni a tutti gli utenti. PUBLIC rappresenta un gruppo che include sempre tutti gli utenti. Le autorizzazioni di un singolo utente consistono nella somma delle autorizzazioni concesse a PUBLIC, delle autorizzazioni concesse a tutti i gruppi a cui l'utente appartiene e di tutte le autorizzazioni concesse all'utente singolarmente.  
La revoca di PUBLIC da una tabella esterna di Lake Formation comporta la revoca dell'autorizzazione al gruppo *everyone* di Lake Formation.

CREATE   
A seconda dell'oggetto del database, revoca le seguenti autorizzazioni all'utente o al gruppo:  
+ Per i database, l'utilizzo della clausola CREATE per REVOKE impedisce agli utenti di creare schemi all'interno del database.
+ Per gli schemi, l'utilizzo della clausola CREATE per REVOKE impedisce agli utenti di creare oggetti all'interno di uno schema. Per rinominare un oggetto, l'utente deve avere l'autorizzazione CREATE ed essere il proprietario dell'oggetto da rinominare. 
Di default, tutti gli utenti dispongono delle autorizzazioni CREATE e USAGE per lo schema PUBLIC di un database.

TEMPORARY \$1 TEMP   
Revoca l'autorizzazione a creare tabelle temporanee nel database specificato.  
Per impostazione predefinita, agli utenti è concessa l'autorizzazione di creare tabelle temporanee tramite la loro appartenenza automatica al gruppo PUBLIC. Per rimuovere l'autorizzazione per qualsiasi utente di creare tabelle temporanee, revoca l'autorizzazione TEMP dal gruppo PUBLIC e quindi concedi esplicitamente l'autorizzazione per creare tabelle temporanee per utenti specifici o gruppi di utenti.

ON DATABASE *db\$1name*   
Revoca le autorizzazioni sul database specificato.

USAGE   
Revoca le autorizzazioni USAGE sugli oggetti all'interno di uno schema specifico, rendendo questi oggetti inaccessibili agli utenti. Le operazioni specifiche su questi oggetti devono essere revocate separatamente (come l'autorizzazione EXECUTE sulle funzioni).  
Di default, tutti gli utenti dispongono delle autorizzazioni CREATE e USAGE per lo schema PUBLIC di un database.

ON SCHEMA *schema\$1name*   
Revoca le autorizzazioni sullo schema specificato. Puoi utilizzare le autorizzazioni dello schema per controllare la creazione delle tabelle; l'autorizzazione CREATE per un database controlla solo la creazione degli schemi.

RESTRICT   
Revoca solo le autorizzazioni che l'utente ha concesso direttamente. Questo comportamento è quello predefinito.

EXECUTE ON PROCEDURE *procedure\$1name*   
Revoca l'autorizzazione EXECUTE su una procedura archiviata specifica. Poiché i nomi delle procedure archiviate possono essere in overload, devi includere l'elenco degli argomenti per la procedura. Per ulteriori informazioni, consulta [Denominazione delle stored procedure](stored-procedure-naming.md).

EXECUTE ON ALL PROCEDURES IN SCHEMA *procedure\$1name*   
Revoca le autorizzazioni specificate su tutte le procedure nello schema a cui si fa riferimento.

USAGE ON LANGUAGE *language\$1name*   
Revoca l'autorizzazione USAGE per una lingua. Per le funzioni definite dall'utente in Python (UDFs), usa. `plpythonu` Per SQL UDFs, usa. `sql` Per le procedure archiviate, usa `plpgsql`.   
Per creare una UDF devi disporre dell'autorizzazione per l'utilizzo nel linguaggio per SQL o `plpythonu` (Python). Per impostazione predefinita, USAGE ON LANGUAGE SQL è concesso a PUBLIC. Tuttavia, devi concedere esplicitamente USAGE ON LANGUAGE PLPYTHONU a utenti o gruppi specifici.   
Per revocare l'utilizzo per SQL, revoca innanzitutto l'utilizzo da PUBLIC. Quindi concedi l'utilizzo di SQL solo agli utenti o ai gruppi specifici autorizzati a creare SQL UDFs. L'esempio seguente revoca l'utilizzo su SQL da PUBLIC, quindi concede l'utilizzo al gruppo di utenti `udf_devs`.   

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```
Per ulteriori informazioni, consulta [Sicurezza e autorizzazioni delle UDF](udf-security-and-privileges.md).   
Per revocare l'utilizzo per le procedure archiviate, revoca innanzitutto l'utilizzo da PUBLIC. Quindi concedi l'utilizzo su `plpgsql` solo a utenti o gruppi specifici autorizzati a creare procedure archiviate. Per ulteriori informazioni, consulta [Sicurezza e privilegi per le procedure archiviate](stored-procedure-security-and-privileges.md). 

ON COPY JOB *job\$1name*  <a name="on-copy-job-revoke"></a>
Revoca le autorizzazioni specificate per un processo di copia.

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]  <a name="revoke-for"></a>
Specifica il comando SQL per il quale viene revocata l'autorizzazione. Puoi specificare ALL per revocare l'autorizzazione sulle istruzioni COPY, UNLOAD, EXTERNAL FUNCTION e CREATE MODEL. Questa clausola si applica solo alla revoca dell'autorizzazione ASSUMEROLE.

ALTER  
Revoca l'autorizzazione ALTER per utenti o gruppi di utenti che consente a coloro che non possiedono una unità di condivisione dati di modificarla. Questa autorizzazione è richiesta per aggiungere o rimuovere oggetti da una unità di condivisione dati o per impostare la proprietà PUBLICACCESSIBLE. Per ulteriori informazioni, consulta [ALTER DATASHARE](r_ALTER_DATASHARE.md).

SHARE  
Revoca le autorizzazioni a utenti e gruppi di utenti per aggiungere consumer a una unità di condivisione dati. La revoca di questa autorizzazione è necessaria per impedire al particolare consumer di accedere all'unità di condivisione dati dai suoi cluster. 

ON DATASHARE *nome\$1unità\$1condivisione\$1dati*  
Concede le autorizzazioni specificate sull'unità di condivisione dati a cui si fa riferimento.

FROM username  
Indica il ruolo IAM che perde le autorizzazioni.

FROM GROUP *nome\$1gruppo*  
Indica il gruppo di utenti che perde le autorizzazioni.

WITH GRANT OPTION  
Indica che l'utente che perde le autorizzazioni può a sua volta revocare le stesse autorizzazioni ad altri. Non è possibile revocare WITH GRANT OPTION per un gruppo o per PUBLIC. 

USAGE  
Quando USAGE viene revocato per un account consumer o uno spazio dei nomi all'interno dello stesso account, l'account consumer specifico o lo spazio dei nomi all'interno dell'account non potrà accedere all'unità di condivisione dati e gli oggetti dell'unità di condivisione dati saranno in sola lettura.   
La revoca dell'autorizzazione USAGE revoca l'accesso a una unità di condivisione dati da parte dei consumer. 

FROM NAMESPACE 'clusternamespace GUID'   
Indica lo spazio dei nomi nello stesso account in cui i consumer perdono le autorizzazioni per l'unità di condivisione dati. Gli spazi dei nomi utilizzano un identificatore univoco globale (GUID) alfanumerico a 128 bit.

FROM ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
Indica il numero di account di un altro account in cui i consumer perdono le autorizzazioni per l'unità di condivisione dati. Specificare 'VIA DATA CATALOG' indica che si sta revocando l'autorizzazione per l'utilizzo del'unità di condivisione dati da un account Lake Formation. L'omissione del numero di account indica che lo si sta revocando dall'account proprietario del cluster.

ON DATABASE *nome\$1database\$1condiviso> [, ...]*   <a name="revoke-datashare"></a>
Revoca le autorizzazioni di utilizzo indicate per il database specificato creato nell'unità di condivisione dati specificata. 

ON SCHEMA* schema\$1condiviso*   <a name="revoke-datashare"></a>
Revoca le autorizzazioni indicate per lo schema specificato creato nell'unità di condivisione dati specificata.

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
Specifica gli oggetti del database a cui revocare l'autorizzazione. I parametri successivi a IN definiscono l'ambito dell'autorizzazione revocata.

CREATE MODEL  
Revoca l'autorizzazione CREATE MODEL per creare modelli di machine learning nel database specificato.

ON MODEL *nome\$1modello*  
Revoca l'autorizzazione EXECUTE per un modello specifico. 

ACCESS CATALOG  
Revoca l'autorizzazione a visualizzare i metadati pertinenti degli oggetti a cui il ruolo ha accesso.

[ ADMIN OPTION FOR ] \$1 role \$1 [, ...]  
Il ruolo che si revoca da un utente specificato che dispone dell'opzione WITH ADMIN OPTION.

FROM \$1 role \$1 [, ...]  
Il ruolo da cui si revoca il ruolo specificato.

EXPLAIN \$1 RLS \$1 MASKING \$1 FROM ROLE *rolename*  
Revoca a un ruolo l’autorizzazione a spiegare i filtri delle policy di sicurezza di una query nel piano EXPLAIN. RLS revoca l’autorizzazione a spiegare i filtri delle policy di sicurezza a livello di riga. MASKING revoca l’autorizzazione a spiegare i filtri delle politiche di mascheramento dinamico dei dati.

IGNORE RLS FROM ROLE *rolename*   
Revoca a un ruolo l’autorizzazione a escludere le policy di sicurezza a livello di riga per una query.

*DA \$1RLS \$1 MASKING\$1 POLICY policy\$1name*  
Indica la policy di sicurezza che perde le autorizzazioni. TO RLS POLICY indica una policy di sicurezza a livello di riga. TO MASKING POLICY indica una politica di mascheramento dinamico dei dati.

## Note per l'utilizzo
<a name="r_REVOKE-usage-notes-link"></a>

Per ulteriori informazioni sulle note di utilizzo di REVOKE, consulta [Note per l'utilizzo](r_REVOKE-usage-notes.md).

## Esempi
<a name="r_REVOKE-examples-link"></a>

Per gli esempi di come utilizzare REVOKE, consulta [Esempi](r_REVOKE-examples.md).

# Note per l'utilizzo
<a name="r_REVOKE-usage-notes"></a>

Per revocare i privilegi a un oggetto, è necessario soddisfare uno dei seguenti criteri:
+ Essere il proprietario dell'oggetto.
+ Essere un utente con privilegi avanzati.
+ Avere un privilegio di concessione per l'oggetto e il privilegio.

  Ad esempio, il seguente comando consente all'utente HR di eseguire i comandi SELECT sulla tabella dei dipendenti e di concedere e revocare lo stesso privilegio per altri utenti.

  ```
  grant select on table employees to HR with grant option;
  ```

  HR non può revocare privilegi per operazioni diverse da SELECT o su qualsiasi altra tabella rispetto a quella dei dipendenti. 

Gli utenti con privilegi avanzati possono accedere a tutti gli oggetti indipendentemente dai comandi GRANT e REVOKE che impostano i privilegi dell'oggetto.

PUBLIC rappresenta un gruppo che include sempre tutti gli utenti. Per impostazione predefinita tutti i membri di PUBLIC hanno i privilegi CREATE e USAGE nello schema PUBLIC. Per limitare le autorizzazioni di qualsiasi utente sullo schema PUBLIC, è necessario prima revocare tutte le autorizzazioni da PUBLIC sullo schema PUBLIC, quindi concedere i privilegi a specifici utenti o gruppi. L'esempio seguente controlla i privilegi di creazione della tabella nello schema PUBLIC.

```
revoke create on schema public from public;
```

Per revocare i privilegi da una tabella Lake Formation, il ruolo IAM associato con lo schema esterno della tabella deve avere l'autorizzazione per revocare i privilegi alla tabella esterna. L'esempio seguente crea uno schema esterno con un ruolo IAM associato `myGrantor`. Il ruolo IAM `myGrantor` ha l'autorizzazione di revocare le autorizzazioni da altri. Il comando REVOKE utilizza l'autorizzazione del ruolo IAM `myGrantor` associato allo schema esterno per revocare l'autorizzazione al ruolo 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 il ruolo IAM dispone anche dell'`ALL`autorizzazione in un AWS Glue Data Catalog account abilitato per Lake Formation, l'`ALL`autorizzazione non viene revocata. Viene revocata solo autorizzazione `SELECT`. È possibile visualizzare le autorizzazioni Lake Formation nella console Lake Formation.

## Note di utilizzo per la revoca dell'autorizzazione ASSUMEROLE
<a name="r_REVOKE-usage-notes-assumerole"></a>

Le seguenti note di utilizzo si applicano alla revoca del privilegio ASSUMEROLE in Amazon Redshift. 

Solo un utente con privilegi avanzati del database può revocare il privilegio ASSUMEROLE per utenti e gruppi. Un utente con privilegi avanzati mantiene sempre il privilegio ASSEMEROLE. 

Per abilitare l'uso del privilegio ASSUMEROLE per utenti e gruppi, un utente con privilegi avanzati esegue l'istruzione riportata una volta nel cluster. Prima di concedere il privilegio ASSUMEROLE a utenti e gruppi, un utente con privilegi avanzati deve eseguire l'istruzione riportata una volta nel cluster. 

```
revoke assumerole on all from public for all;
```

## Note di utilizzo per la revoca delle autorizzazioni di machine learning
<a name="r_REVOKE-usage-notes-create-model"></a>

Non è possibile concedere o revocare direttamente le autorizzazioni relative a una funzione ML. Una funzione ML appartiene a un modello ML e le autorizzazioni sono controllate tramite il modello. È invece possibile revocare le autorizzazioni relative al modello ML. L'esempio seguente dimostra come revocare le autorizzazioni di esecuzione a tutti gli utenti associati al modello `customer_churn`.

```
REVOKE EXECUTE ON MODEL customer_churn FROM PUBLIC;
```

Puoi anche revocare tutte le autorizzazioni a un utente per il modello ML `customer_churn`.

```
REVOKE ALL on MODEL customer_churn FROM ml_user;
```

La concessione o la revoca dell'autorizzazione `EXECUTE` relativa a una funzione ML avrà esito negativo se nello schema è presente una funzione ML, anche se tale funzione ML dispone già dell'autorizzazione `EXECUTE` tramite `GRANT EXECUTE ON MODEL`. Si consiglia di utilizzare uno schema separato quando si utilizza il comando `CREATE MODEL` per mantenere le funzioni ML in uno schema separato. L'esempio seguente mostra come fare.

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

# Esempi
<a name="r_REVOKE-examples"></a>

L'esempio seguente revoca i privilegi INSERT sulla tabella SALES dal gruppo utenti GUESTS. Questo comando impedisce ai membri di GUESTS di caricare i dati nella tabella SALES utilizzando il comando INSERT. 

```
revoke insert on table sales from group guests;
```

L'esempio seguente revoca all'utente il privilegio SELECT su tutte le tabelle dello schema QA\$1TICKIT: `fred`.

```
revoke select on all tables in schema qa_tickit from fred;
```

L'esempio seguente revoca all'utente il privilegio di selezionare da una vista: `bobr`.

```
revoke select on table eventview from bobr;
```

L'esempio seguente revoca il privilegio di creare tabelle temporanee nel database TICKIT a tutti gli utenti:

```
revoke temporary on database tickit from public;
```

L'esempio seguente revoca il privilegio SELECT sulle colonne `cust_name` e `cust_phone` della tabella `cust_profile` all'utente `user1`. 

```
revoke select(cust_name, cust_phone) on cust_profile from user1;
```

L'esempio seguente revoca il privilegio SELECT sulle colonne `cust_name` e `cust_phone` e il privilegio UPDATE sulla colonna `cust_contact_preference` della tabella `cust_profile` dal gruppo `sales_group`. 

```
revoke select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile from group sales_group;
```

Nell'esempio seguente viene illustrato l'utilizzo della parola chiave ALL per revocare i privilegi SELECT e UPDATE su tre colonne della tabella `cust_profile` dal gruppo `sales_admin`. 

```
revoke ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile from group sales_admin;
```

L'esempio seguente revoca il privilegio SELECT nella colonna `cust_name` della vista `cust_profile_vw` dall'utente `user2`. 

```
revoke select(cust_name) on cust_profile_vw from user2;
```

## Esempi di revoca dell'autorizzazione USAGE ai database creati da unità di condivisione dati
<a name="r_REVOKE-examples-datashare"></a>

L'esempio seguente revoca l'accesso all'unità di condivisione dati `salesshare` allo spazio dei nomi `13b8833d-17c6-4f16-8fe4-1a018f5ed00d`.

```
REVOKE USAGE ON DATASHARE salesshare FROM NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

L'esempio seguente revoca l'autorizzazione USAGE per `sales_db` a `Bob`.

```
REVOKE USAGE ON DATABASE sales_db FROM Bob;
```

Nell'esempio seguente REVOKE USAGE revoca l'autorizzazione per `sales_schema` a `Analyst_role`.

```
REVOKE USAGE ON SCHEMA sales_schema FROM ROLE Analyst_role;
```

## Esempi di revoca di autorizzazioni con ambito
<a name="r_REVOKE-examples-scoped"></a>

L'esempio seguente revoca al ruolo `Sales` l'utilizzo di tutti gli schemi attuali e futuri nel database `Sales_db`.

```
REVOKE USAGE FOR SCHEMAS IN DATABASE Sales_db FROM ROLE Sales;
```

L'esempio seguente revoca la possibilità di concedere all'utente `alice` l'autorizzazione SELECT per tutte le tabelle correnti e future del database `Sales_db`. `alice` mantiene l'accesso a tutte le tabelle in `Sales_db`.

```
REVOKE GRANT OPTION SELECT FOR TABLES IN DATABASE Sales_db FROM alice;
```

L'esempio seguente revoca all'utente `bob` l'autorizzazione EXECUTE per le funzioni dello schema `Sales_schema`.

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

L'esempio seguente revoca al ruolo `Sales` tutte le autorizzazioni per tutte le tabelle dello schema `ShareSchema` del database `ShareDb`. Quando si specifica lo schema, è anche possibile indicare il database dello schema utilizzando il formato in due parti `database.schema`.

```
REVOKE ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema FROM ROLE Sales;
```

L'esempio seguente è uguale al precedente. Puoi specificare il database dello schema utilizzando la parola chiave `DATABASE` anziché utilizzare un formato in due parti.

```
REVOKE ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb FROM ROLE Sales;
```

## Esempi di revoca del privilegio ASSUMEROLE
<a name="r_REVOKE-examples-assumerole"></a>

Di seguito sono riportati esempi di revoca del privilegio ASSUMEROLE. 

Un utente con privilegi avanzati deve abilitare l'uso del privilegio ASSUMEROLE per utenti e gruppi eseguendo l'istruzione riportata una volta nel cluster. 

```
revoke assumerole on all from public for all;
```

L'istruzione seguente revoca il privilegio ASSUMEROLE dall'utente reg\$1user1 su tutti i ruoli per tutte le operazioni. 

```
revoke assumerole on all from reg_user1 for all;
```

## Esempi di revoca del privilegio ROLE
<a name="r_REVOKE-examples-role"></a>

L'esempio seguente revoca sample\$1role1 da sample\$1role2.

```
CREATE ROLE sample_role2;
GRANT ROLE sample_role1 TO ROLE sample_role2;
REVOKE ROLE sample_role1 FROM ROLE sample_role2;
```

L'esempio seguente revoca i privilegi di sistema da user1.

```
GRANT ROLE sys:DBA TO user1;
REVOKE ROLE sys:DBA FROM user1;
```

L'esempio seguente revoca sample\$1role1 e sample\$1role2 da 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;
```

L'esempio seguente revoca sample\$1role2 con l'opzione ADMIN OPTION da 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;
```

L'esempio seguente revoca sample\$1role1 e sample\$1role2 da 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;
```

Nell'esempio seguente vengono revocati i privilegi di sistema CREATE SCHEMA e DROP SCHEMA a sample\$1role1.

```
GRANT CREATE SCHEMA, DROP SCHEMA TO ROLE sample_role1;
REVOKE CREATE SCHEMA, DROP SCHEMA FROM ROLE sample_role1;
```

# ROLLBACK
<a name="r_ROLLBACK"></a>

Interrompe la transazione corrente ed elimina tutti gli aggiornamenti apportati da quella transazione.

Questo comando esegue la stessa funzione del comando [ABORT](r_ABORT.md).

## Sintassi
<a name="r_ROLLBACK-synopsis"></a>

```
ROLLBACK [ WORK | TRANSACTION ]
```

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

WORK  
Parola chiave facoltativa. Questa parola chiave non è supportata all'interno di una procedura archiviata. 

TRANSACTION  
Parola chiave facoltativa. WORK e TRANSACTION sono sinonimi. Nessuno dei due è supportato all'interno d una procedura archiviata. 

Per informazioni sull'utilizzo di ROLLBACK all'interno di una procedura guidata, consultare [Gestione delle transazioni](stored-procedure-transaction-management.md). 

## Esempio
<a name="r_ROLLBACK-example"></a>

L'esempio seguente crea una tabella quindi avvia una transazione in cui i dati vengono inseriti nella tabella. Il comando ROLLBACK esegue quindi il rollback dell'inserimento dei dati per lasciare vuota la tabella.

Il seguente comando crea una tabella di esempio chiamata MOVIE\$1GROSS:

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

Il prossimo set di comandi avvia una transazione che inserisce due righe di dati nella tabella:

```
begin;

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

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

Successivamente, il seguente comando seleziona i dati dalla tabella per mostrare che è stato inserito:

```
select * from movie_gross;
```

L'output del comando mostra che entrambe le righe sono inserite:

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

Questo comando esegue ora il rollback delle modifiche dei dati dove è iniziata la transazione:

```
rollback;
```

Selezionando i dati dalla tabella ora mostra una tabella vuota:

```
select * from movie_gross;

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

# SELECT
<a name="r_SELECT_synopsis"></a>

Restituisce le righe da tabelle, viste e funzioni definite dall'utente. 

**Nota**  
Le dimensioni massime per una istruzione SQL è di 16 MB.

## Sintassi
<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**
+ [Sintassi](#r_SELECT_synopsis-synopsis)
+ [Clausola WITH](r_WITH_clause.md)
+ [Elenco SELECT](r_SELECT_list.md)
+ [EXCLUDE column\$1list](r_EXCLUDE_list.md)
+ [Clausola FROM](r_FROM_clause30.md)
+ [Clausola WHERE](r_WHERE_clause.md)
+ [Clausola GROUP BY](r_GROUP_BY_clause.md)
+ [Clausola HAVING](r_HAVING_clause.md)
+ [Clausola QUALIFY](r_QUALIFY_clause.md)
+ [UNION, INTERSECT ed EXCEPT](r_UNION.md)
+ [Clausola ORDER BY](r_ORDER_BY_clause.md)
+ [Clausola CONNECT BY](r_CONNECT_BY_clause.md)
+ [Esempi di sottoquery](r_Subquery_examples.md)
+ [Sottoquery correlate](r_correlated_subqueries.md)

# Clausola WITH
<a name="r_WITH_clause"></a>

Una clausola WITH è una clausola facoltativa che precede l'elenco SELECT in una query. La clausola WITH definisce uno o più *common\$1table\$1expression*. Ogni espressione comune di tabella (CTE) definisce una tabella temporanea, che è simile a una definizione di vista. È possibile fare riferimento a queste tabelle temporanee nella clausola FROM. Vengono utilizzati solo durante l'esecuzione della query a cui appartengono. Ogni CTE nella clausola WITH specifica un nome di tabella, un elenco facoltativo di nomi di colonna e un'espressione di query che restituisce una tabella (un'istruzione SELECT). Quando si fa riferimento al nome della tabella temporanea nella clausola FROM della stessa espressione di query che la definisce, la CTE è ricorsiva. 

Le sottoquery della clausola WITH sono un modo efficace per definire le tabelle che possono essere utilizzate durante l'esecuzione di una singola query. In ogni caso, è possibile ottenere gli stessi risultati utilizzando le sottoquery nel corpo principale dell'istruzione SELECT, ma le sottoquery della clausola WITH potrebbero essere più semplici da scrivere e leggere. Ove possibile, le sottoquery della clausola WITH che sono referenziate più volte sono ottimizzate come sottoespressioni comuni; vale a dire, potrebbe essere possibile valutare una sottoquery WITH una volta e riutilizzarne i risultati. Tieni presente che le sottoespressioni comuni non sono limitate a quelle definite nella clausola WITH.

## Sintassi
<a name="r_WITH_clause-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
```

dove *common\$1table\$1expression* può essere non ricorsivo o ricorsivo. Di seguito è riportata la forma non ricorsiva: 

```
CTE_table_name [ ( column_name [, ...] ) ] AS ( query )
```

Di seguito è riportata la forma ricorsiva di *common\$1table\$1expression*:

```
CTE_table_name (column_name [, ...] ) AS ( recursive_query )
```

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

 RECURSIVE   
Parola chiave che identifichi la query come CTE ricorsiva. Questa parola chiave è obbligatoria se *common\$1table\$1expression* definito nella clausola WITH è ricorsivo. È possibile specificare la parola chiave RECURSIVE una sola volta, immediatamente dopo la parola chiave WITH, anche quando la clausola WITH contiene più ricorsive. CTEs In generale, una CTE ricorsiva è una sottoquery UNION ALL con due parti. 

 *common\$1table\$1expression*   
Definisce una tabella temporanea a cui è possibile fare riferimento nella [Clausola FROM](r_FROM_clause30.md) e viene utilizzato solo durante l'esecuzione della query a cui appartiene. 

 *CTE\$1table\$1name*   
Nome univoco per una tabella temporanea che definisce i risultati di una sottoquery della clausola WITH. Non puoi utilizzare nomi duplicati in una singola clausola WITH. A ogni sottoquery deve essere assegnato un nome di tabella a cui è possibile fare riferimento nella [Clausola FROM](r_FROM_clause30.md).

 *column\$1name*   
 Un elenco facoltativo di nomi di colonna di output per la sottoquery della clausola WITH, separati da virgole. Il numero dei nomi di colonna specificati deve essere uguale o inferiore al numero delle colonne definite dalla sottoquery. Per una CTE non ricorsiva, *column\$1name* è facoltativo. Per una CTE ricorsiva, *column\$1name* è obbligatorio.

 *query*   
 Qualsiasi query SELECT supportata da Amazon Redshift. Per informazioni, consultare [SELECT](r_SELECT_synopsis.md). 

 *recursive\$1query*   
Una query UNION ALL costituita da due sottoquery SELECT:  
+ La prima sottoquery SELECT non ha un riferimento ricorsivo allo stesso *CTE\$1table\$1name*. Restituisce un set di risultati che è il seed iniziale della ricorsione. Questa parte è chiamata membro iniziale o membro del seed.
+ La seconda sottoquery SELECT fa riferimento allo stesso *CTE\$1table\$1name* nella sua clausola FROM. Questo è chiamato membro ricorsivo. La *recursive\$1query* contiene una condizione WHERE per terminare la *ecursive\$1query*. 

## Note per l'utilizzo
<a name="r_WITH_clause-usage-notes"></a>

Puoi utilizzare una clausola WITH nelle seguenti istruzioni SQL: 
+ SELECT 
+ SELECT INTO
+ CREATE TABLE AS
+ CREATE VIEW
+ DECLARE
+ EXPLAIN
+ INSERT INTO...SELECT 
+ PREPARE
+ UPDATE (all'interno di una sottoquery di una clausola WHERE; non è possibile definire una CTE ricorsiva nella sottoquery. La CTE ricorsiva deve precedere la clausola UPDATE.)
+ DELETE

Se la clausola FROM di una query che contiene una clausola WITH non fa riferimento a nessuna delle tabelle definite dalla clausola WITH, la clausola WITH viene ignorata e la query viene eseguita normalmente.

A una tabella definita da una sottoquery della clausola WITH è possibile fare riferimento solo nell'ambito della query SELECT avviata dalla clausola WITH. Ad esempio, puoi fare riferimento a una tabella di questo tipo nella clausola FROM di una sottoquery nell'elenco SELECT, nella clausola WHERE o nella clausola HAVING. Non puoi utilizzare una clausola WITH in una sottoquery e fare riferimento alla tabella nella clausola FROM della query principale o un'altra sottoquery. Questo modello di query genera un messaggio di errore nel formato `relation table_name doesn't exist` per la tabella della clausola WITH.

Non puoi specificare un'altra clausola WITH all'interno di una sottoquery della clausola WITH.

Non puoi creare riferimenti alle tabelle definite dalle sottoquery della clausola WITH. Ad esempio, la seguente query restituisce un errore a causa del riferimento in avanti alla tabella W2 nella definizione della tabella W1: 

```
with w1 as (select * from w2), w2 as (select * from w1)
select * from sales;
ERROR:  relation "w2" does not exist
```

Una sottoquery della clausola WITH non può consistere in un'istruzione SELECT INTO; tuttavia, è possibile utilizzare una clausola WITH in un'istruzione SELECT INTO.

## Espressioni di tabella comuni ricorsive
<a name="r_WITH_clause-recursive-cte"></a>

Una *espressione di tabella comune (CTE)* ricorsiva è una CTE che fa riferimento a sé stessa. Una CTE ricorsiva è utile per eseguire query su dati gerarchici, ad esempio organigrammi che mostrano relazioni di reporting tra dipendenti e responsabili. Per informazioni, consultare [Esempio: CTE ricorsiva](#r_WITH_clause-recursive-cte-example).

Un altro uso comune è una distinta base multilivello, quando un prodotto è costituito da molti componenti e ogni componente è costituito a sua volta da altri componenti o sottoinsiemi.

Assicurarsi di limitare la profondità di ricorsione includendo una clausola WHERE nella seconda sottoquery SELECT della query ricorsiva. Per un esempio, consultare [Esempio: CTE ricorsiva](#r_WITH_clause-recursive-cte-example). In caso contrario, può verificarsi un errore simile a quello riportato di seguito.
+ `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` è un parametro che imposta il numero massimo di righe che un CTE ricorsivo può restituire per evitare cicli di ricorsione infiniti. Si consiglia di non modificarlo con un valore superiore a quello predefinito. In questo modo si evita che infiniti problemi di ricorsione nelle query occupino uno spazio eccessivo nel cluster.

 È possibile specificare un ordinamento e limitare il risultato della CTE ricorsiva. È possibile includere opzioni di raggruppamento e distinte sul risultato finale della CTE ricorsiva.

Non è possibile specificare un'altra clausola WITH RECURSIVE all'interno di una sottoquery. Il membro *recursive\$1query* non può includere una clausola order by o limit. 

## Esempi
<a name="r_WITH_clause-examples"></a>

L'esempio seguente mostra il caso più semplice possibile di una query che contiene una clausola WITH. La query WITH denominata VENUECOPY seleziona tutte le righe dalla tabella VENUE. La query principale a sua volta seleziona tutte le righe da VENUECOPY. La tabella VENUECOPY esiste solo per la durata di questa query. 

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

L'esempio seguente mostra una clausola WITH che produce due tabelle, denominate VENUE\$1SALES e TOP\$1VENUES. La seconda tabella della query WITH seleziona dalla prima. A sua volta, la clausola WHERE del blocco di query principale contiene una sottoquery che vincola la tabella 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)
```

I seguenti due esempi illustrano le regole per l'ambito dei riferimenti di tabella basati sulle sottoquery della clausola WITH. La prima query viene eseguita, ma la seconda non riesce con un errore previsto. La prima query contiene la sottoquery clausola WITH all'interno dell'elenco SELECT della query principale. Alla tabella definita dalla clausola WITH (HOLIDAYS) si fa riferimento nella clausola FROM della sottoquery nell'elenco SELECT: 

```
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join date on sales.dateid=date.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;

caldate   | daysales | dec25sales
-----------+----------+------------
2008-12-25 | 70402.00 |   70402.00
2008-12-31 | 12678.00 |   70402.00
(2 rows)
```

La seconda query non riesce perché tenta di fare riferimento alla tabella HOLIDAYS nella query principale e nella sottoquery elenco SELECT. I riferimenti della query principale sono fuori ambito. 

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

## Esempio: CTE ricorsiva
<a name="r_WITH_clause-recursive-cte-example"></a>

Di seguito è riportato un esempio di CTE ricorsiva che restituisce i dipendenti che riportano direttamente o indirettamente a John. La query ricorsiva contiene una clausola WHERE per limitare la profondità di ricorsione a meno di 4 livelli.

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

Di seguito è riportato il risultato della query.

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

Di seguito è riportato un organigramma per il dipartimento di John.

![\[Diagramma dell'organigramma per il dipartimento di John.\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/images/org-chart.png)


# Elenco SELECT
<a name="r_SELECT_list"></a>

**Topics**
+ [Sintassi](#r_SELECT_list-synopsis)
+ [Parameters](#r_SELECT_list-parameters)
+ [Note per l'utilizzo](#r_SELECT_list_usage_notes)
+ [Esempi](#r_SELECT_list-examples)

L'elenco SELECT assegna un nome a colonne, funzioni ed espressioni che la query deve restituire. L'elenco rappresenta l'output della query. 

Per ulteriori informazioni sulle funzioni SQL, consulta [Informazioni di riferimento sulle funzioni SQL](c_SQL_functions.md). Per ulteriori informazioni sulle espressioni, consulta [Espressioni condizionali](c_conditional_expressions.md).

## Sintassi
<a name="r_SELECT_list-synopsis"></a>

```
SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
```

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

TOP *number*   
TOP accetta come argomento un integer positivo che definisce il numero di righe che vengono restituite al client. Il comportamento con la clausola TOP è uguale al comportamento con la clausola LIMIT. A differenza del set di righe, il numero di righe restituito è fisso. Per restituire un set coerente di righe, utilizza TOP o LIMIT insieme a una clausola ORDER BY. 

ALL   
Parola chiave ridondante che definisce il comportamento predefinito se non specifichi DISTINCT. `SELECT ALL *` è identico a `SELECT *` (seleziona tutte le righe per tutte le colonne e conserva i duplicati). 

DISTINCT   
Opzione che elimina le righe duplicate dal set di risultati, in base ai valori corrispondenti in una o più colonne.   
Se l’applicazione prevede l’utilizzo di chiavi esterne o chiavi primarie non valide, alcune query potrebbero restituire risultati sbagliati. Ad esempio, una query SELECT DISTINCT potrebbe restituire righe doppie se la chiave primaria non contiene tutti valori univoci. Per ulteriori informazioni, consulta [Definizione di limitazioni delle tabelle](https://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html).

\$1 (asterisco)   
Restituisce l'intero contenuto della tabella (tutte le colonne e tutte le righe). 

 *espressione*   
Espressione formata da una o più colonne presenti nelle tabelle a cui fa riferimento la query. Un'espressione può contenere funzioni SQL. Ad esempio:   

```
avg(datediff(day, listtime, saletime))
```

AS *column\$1alias*   
Nome temporaneo per la colonna che viene utilizzata nel set di risultati finale. La parola chiave AS è facoltativa. Ad esempio:   

```
avg(datediff(day, listtime, saletime)) as avgwait
```
Se non specifichi un alias per un'espressione che non è un semplice nome di colonna, il set di risultati applica un nome predefinito a quella colonna.   
L'alias viene riconosciuto subito dopo essere stato definito nell'elenco di destinazione. Puoi utilizzare un alias in altre espressioni definite successivamente nello stesso elenco di destinazione. Nell'esempio seguente viene descritto quanto segue.   

```
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
```
Il vantaggio del riferimento alias laterale è che non devi ripetere l'espressione con alias quando crei espressioni più complesse nello stesso elenco di destinazione. Quando Amazon Redshift analizza questo tipo di riferimento, gli alias definiti precedentemente vengono posti in linea. Se esiste una colonna con lo stesso nome definita nella clausola `FROM` come espressione con alias precedente, la colonna nella clausola `FROM` ha la priorità. Ad esempio, nella query precedente se è presente una colonna denominata "probability" nella tabella raw\$1data, la "probability" nella seconda espressione nell'elenco di destinazione fa riferimento a tale colonna invece che al nome alias "probability". 

## Note per l'utilizzo
<a name="r_SELECT_list_usage_notes"></a>

TOP è un'estensione SQL e costituisce un'alternativa al comportamento di LIMIT. Non puoi utilizzare TOP e LIMIT nella stessa query.

## Esempi
<a name="r_SELECT_list-examples"></a>

L'esempio seguente restituisce 10 righe dalla tabella SALES. Sebbene la query utilizzi la clausola TOP, restituisce comunque un set di righe non prevedibile perché non è specificata alcuna clausola ORDER BY:

```
select top 10 *
from sales;
```

La seguente query è funzionalmente equivalente, ma utilizza una clausola LIMIT invece di una clausola TOP:

```
select *
from sales
limit 10;
```

Il seguente esempio restituisce le prime 10 righe dalla tabella SALES mediante la clausola TOP, ordinate in base alla colonna QTYSOLD in ordine 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)
```

Il seguente esempio restituisce i primi due valori QTYSOLD e SELLERID dalla tabella SALES, ordinati in base alla colonna QTYSOLD:

```
select top 2 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
(2 rows)
```

L'esempio seguente mostra l'elenco di gruppi di categorie distinti dalla tabella 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)
```

L'esempio seguente restituisce il set distinto di numeri delle settimane per dicembre 2008. Senza la clausola DISTINCT, l'istruzione restituirebbe 31 righe o una per ogni giorno del mese.

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

EXCLUDE column\$1list assegna un nome alle colonne escluse dai risultati della query. L’utilizzo dell’opzione EXCLUDE è utile quando è necessario escludere solo un sottoinsieme di colonne da una tabella *ampia*, ovvero una tabella che contiene molte colonne. 

**Topics**
+ [Sintassi](#r_EXCLUDE_list-synopsis)
+ [Parameters](#r_EXCLUDE_list-parameters)
+ [Esempi](#r_EXCLUDE_list-examples)

## Sintassi
<a name="r_EXCLUDE_list-synopsis"></a>

```
EXCLUDE column_list
```

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

 *column\$1list*   
Un elenco separato da virgola di uno o più nomi di colonne presenti nelle tabelle a cui fa riferimento la query. Facoltativamente *column\$1list* può essere racchiuso tra parentesi. Nell’elenco di esclusione dei nomi di colonna sono supportati solo i nomi di colonna, non le espressioni (come `upper(col1)`) o l’asterisco (\$1).  

```
column-name, ... | ( column-name, ... )
```
Esempio:   

```
SELECT * EXCLUDE col1, col2 FROM tablea;
```

```
SELECT * EXCLUDE (col1, col2) FROM tablea;
```

## Esempi
<a name="r_EXCLUDE_list-examples"></a>

Gli esempi seguenti utilizzano la tabella SALES che contiene le colonne: salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission e saletime. Per ulteriori informazioni sulla tabella SALES, consulta [Database di esempio](c_sampledb.md).

L’esempio seguente restituisce righe della tabella SALES, ma esclude la colonna 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	
...
```

L’esempio seguente restituisce righe della tabella SALES, ma esclude le colonne 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	
...
```

L’esempio seguente crea una vista che restituisce le righe della tabella SALES, ma esclude la colonna 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	
...
```

L’esempio seguente seleziona solo le colonne che non sono escluse in una tabella temporanea.

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

# Clausola FROM
<a name="r_FROM_clause30"></a>

La clausola FROM in una query elenca i riferimenti di tabella (tabelle, viste e sottoquery) da cui vengono selezionati i dati. Se sono elencati più riferimenti tabella, è necessario unire le tabelle, utilizzando la sintassi appropriata nella clausola FROM o nella clausola WHERE. Se non vengono specificati criteri di join, il sistema elabora la query come cross-join (prodotto cartesiano). 

**Topics**
+ [Sintassi](#r_FROM_clause30-synopsis)
+ [Parameters](#r_FROM_clause30-parameters)
+ [Note per l'utilizzo](#r_FROM_clause_usage_notes)
+ [Esempi PIVOT e UNPIVOT](r_FROM_clause-pivot-unpivot-examples.md)
+ [Esempi di JOIN](r_Join_examples.md)
+ [Esempi di UNNEST](r_FROM_clause-unnest-examples.md)

## Sintassi
<a name="r_FROM_clause30-synopsis"></a>

```
FROM table_reference [, ...]
```

dove *table\$1reference* è una delle opzioni seguenti: 

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

*table\$1alias* facoltativo può essere utilizzato per assegnare nomi temporanei a tabelle e riferimenti a tabelle complessi e, se lo desideri, anche alle relative colonne, come segue: 

```
[ AS ] alias [ ( column_alias [, ...] ) ]
```

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

 *with\$1subquery\$1table\$1name*   
Tabella definita da una sottoquery nella [Clausola WITH](r_WITH_clause.md). 

 *table\$1name*   
Nome di una tabella o vista. 

 *alias*   
Nome alternativo temporaneo per una tabella o vista. L'alias è obbligatorio per una tabella derivata da una sottoquery. In altri riferimenti di tabella, gli alias sono facoltativi. La parola chiave AS è sempre facoltativa. Gli alias di tabella forniscono una comoda scelta rapida per identificare le tabelle in altre parti di una query, come nella clausola WHERE. Ad esempio:   

```
select * from sales s, listing l
where s.listid=l.listid
```

 *column\$1alias*   
Un'espressione semplice che restituisce un valore. 

 *subquery*   
Espressione della query che restituisce una tabella. La tabella esiste solo per la durata della query e in genere le viene assegnato un nome o un *alias*; tuttavia l'alias non è obbligatorio. Puoi anche definire i nomi delle colonne per le tabelle che derivano da sottoquery. L'assegnazione degli alias alle colonne è importante quando vuoi unire i risultati delle sottoquery ad altre tabelle e quando vuoi selezionare o vincolare tali colonne altrove nella query.   
Una sottoquery può contenere una clausola ORDER BY, ma questa potrebbe non avere alcun effetto se non viene specificata una clausola LIMIT o OFFSET. 

NATURAL   
Definisce un join che utilizza automaticamente tutte le coppie di colonne con lo stesso nome nelle due tabelle come colonne di unione. La condizione di join esplicita non è obbligatoria. Ad esempio, se le tabelle CATEGORY ed EVENT hanno entrambe le colonne denominate CATID, un join naturale di tali tabelle è un join sulle rispettive colonne CATID.   
Se viene specificato un join NATURAL ma non esistono coppie di colonne con nome identico nelle tabelle da unire, la query viene impostata automaticamente su un cross-join. 

 *join\$1type*   
Specifica uno dei seguenti tipi di join:   
+ [INNER] JOIN 
+ LEFT [OUTER] JOIN 
+ RIGHT [OUTER] JOIN 
+ FULL [OUTER] JOIN 
+ CROSS JOIN 
I cross-join sono join non qualificati; restituiscono il prodotto cartesiano delle due tabelle.   
I join inner e outer sono join qualificati. Sono qualificati in modo implicito (in join naturali) con la sintassi ON o USING nella clausola FROM o con una condizione della clausola WHERE.   
Un inner join restituisce solo le righe corrispondenti, in base alla condizione di join o all'elenco delle colonne di join. Un outer join restituisce tutte le righe che l'inner join equivalente restituirebbe, più le righe non corrispondenti dalla tabella "left", dalla tabella "right" o da entrambe le tabelle. La tabella di sinistra è la tabella elencata per prima e la tabella di destra è la seconda tabella nell'elenco. Le righe non corrispondenti contengono valori NULL per riempire gli spazi vuoti nelle colonne di output. 

ON *join\$1condition*   
Tipo di specifica del join in cui le colonne di unione vengono dichiarate come una condizione che segue la parola chiave ON. Ad esempio:   

```
sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
```

USING ( *join\$1column* [, ...] )   
Tipo di specifica del join in cui le colonne di unione vengono elencate tra parentesi. Se vengono specificate più colonne di unione, queste sono delimitate da virgole. La parola chiave USING deve precedere l'elenco. Esempio:   

```
sales join listing
using (listid,eventid)
```

PIVOT  
Ruota l'output da righe a colonne, allo scopo di rappresentare i dati tabulari in un formato di facile lettura. L'output è rappresentato orizzontalmente su più colonne. PIVOT è simile a una query GROUP BY con un'aggregazione, utilizzando un'espressione aggregata per specificare un formato di output. Tuttavia, a differenza di GROUP BY, i risultati vengono restituiti in colonne anziché in righe.  
Per gli esempi di query con PIVOT e UNPIVOT consulta [Esempi PIVOT e UNPIVOT](r_FROM_clause-pivot-unpivot-examples.md).

UNPIVOT  
*Rotazione delle colonne in righe con UNPIVOT*: l’operatore UNPIVOT trasforma le colonne dei risultati, di una tabella di input o dei risultati delle query, in righe, per facilitare la lettura dell’output. UNPIVOT combina i dati delle colonne di input in due colonne di risultato: una colonna del nome e una colonna di valore. La colonna del nome contiene i nomi delle colonne dell'input, come voci di riga. La colonna dei valori contiene i valori delle colonne di input, ad esempio i risultati di un'aggregazione. Ad esempio, il numero di articoli in varie categorie.  
*Annullamento della rotazione di oggetti con UNPIVOT (SUPER)*: puoi eseguire l’annullamento della rotazione di oggetti, dove *expression* è un’espressione a SUPER cha fa riferimento a un’altra voce della clausola FROM. Per ulteriori informazioni, consulta [Nidificazione di oggetti](query-super.md#unpivoting). Sono inoltre disponibili esempi che mostrano come eseguire query sui dati semistrutturati, come i dati in formato JSON.

*super\$1expression*  
Un’espressione SUPER valida. Amazon Redshift restituisce una riga per ogni valore nell’attributo specificato. Per ulteriori informazioni sul tipo di dati SUPER, consulta [Tipo SUPER](r_SUPER_type.md). Per ulteriori informazioni sui valori SUPER non annidati, consulta [Annullamento di query](query-super.md#unnest).

*nome\$1attributo*  
Il nome di un attributo nell’espressione SUPER.

*index\$1alias*  
Alias per l’indice che indica la posizione del valore nell’espressione SUPER.

UNNEST  
Espande una struttura annidata, in genere un array SUPER, in colonne contenenti gli elementi non annidati. Per ulteriori informazioni sull’annullamento dell’annidamento dei dati SUPER, consulta [Query sui dati semistrutturati](query-super.md). Per alcuni esempi, consulta [Esempi di UNNEST](r_FROM_clause-unnest-examples.md). 

*unnested\$1column\$1name*  
Il nome della colonna contenente gli elementi non annidati. 

UNNEST ... WITH OFFSET  
Aggiunge una colonna di offset all’output non annidato, con l’offset che rappresenta l’indice a base zero di ogni elemento dell’array. Questa variante è utile quando desideri visualizzare la posizione degli elementi all’interno di un array. Per ulteriori informazioni sull’annullamento dell’annidamento dei dati SUPER, consulta [Query sui dati semistrutturati](query-super.md). Per alcuni esempi, consulta [Esempi di UNNEST](r_FROM_clause-unnest-examples.md). 

*offset\$1column\$1name*  
Un nome personalizzato per la colonna di offset che consente di definire in modo esplicito come la colonna dell’indice apparirà nell’output. Questo parametro è facoltativo. Per impostazione predefinita, il nome della colonna di offset è `offset_col`. 

## Note per l'utilizzo
<a name="r_FROM_clause_usage_notes"></a>

Le colonne di unione devono avere tipi di dati comparabili. 

Un join NATURAL o USING conserva solo una di ciascuna coppia di colonne di unione nel set di risultati intermedi. 

Un join con la sintassi ON mantiene entrambe le colonne di unione nel set di risultati intermedi. 

consultare anche [Clausola WITH](r_WITH_clause.md). 

# Esempi PIVOT e UNPIVOT
<a name="r_FROM_clause-pivot-unpivot-examples"></a>

PIVOT e UNPIVOT sono parametri della clausola FROM che ruotano rispettivamente l'output della query da righe a colonne e da colonne a righe. Rappresentano i risultati delle query tabulari in un formato facile da leggere. Gli esempi seguenti utilizzano dati e query di prova per mostrare come utilizzarli.

Per ulteriori informazioni su questi e altri parametri, consulta [Clausola FROM](https://docs.aws.amazon.com/redshift/latest/dg/r_FROM_clause30.html).

## Esempi PIVOT
<a name="r_FROM_clause-pivot-examples"></a>

Impostare la tabella di esempio e i dati e utilizzarli per eseguire le query di esempio successive.

```
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 su `partname` con un'aggregazione `AVG` su`price`.

```
SELECT *
FROM (SELECT partname, price FROM part) PIVOT (
    AVG(price) FOR partname IN ('prop', 'rudder', 'wing')
);
```

La query restituisce i seguenti risultati:

```
  prop   |  rudder  |  wing
---------+----------+---------
 10.33   | 2.71     | 11.50
```

Nell'esempio precedente, i risultati vengono trasformati in colonne. L'esempio seguente mostra una query `GROUP BY` che restituisce i prezzi medi in righe anziché in colonne.

```
SELECT partname, avg(price)
FROM (SELECT partname, price FROM part)
WHERE partname IN ('prop', 'rudder', 'wing')
GROUP BY partname;
```

La query restituisce i seguenti risultati:

```
 partname |  avg
----------+-------
 prop     | 10.33
 rudder   |  2.71
 wing     | 11.50
```

Un esempio `PIVOT` con `manufacturer` come colonna implicita.

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) FOR quality IN (1, 2, NULL)
);
```

La query restituisce i seguenti risultati:

```
 manufacturer      | 1  | 2  | null
-------------------+----+----+------
 local parts co    | 1  | 1  |  1
 big parts co      | 1  | 1  |  1
 small parts co    | 1  | 0  |  2
```

 Le colonne della tabella di input che non sono referenziate nella definizione `PIVOT` sono aggiunte implicitamente alla tabella dei risultati. Questo è il caso della colonna `manufacturer` dell'esempio precedente. L'esempio dimostra anche che `NULL` è un valore valido per l'operatore `IN`. 

`PIVOT` nell'esempio precedente restituisce informazioni simili a quelle della seguente query, che include `GROUP BY`. La differenza è che `PIVOT` restituisce il valore `0` per colonna `2` e il produttore `small parts co`. La query `GROUP BY` non contiene una riga corrispondente. Nella maggior parte dei casi `PIVOT` inserisce `NULL` se una riga non contiene dati di input per una determinata colonna. Tuttavia, l'aggregato di conteggio non restituisce `NULL` e `0` viene utilizzato come valore predefinito.

```
SELECT manufacturer, quality, count(*)
FROM (SELECT quality, manufacturer FROM part)
WHERE quality IN (1, 2) OR quality IS NULL
GROUP BY manufacturer, quality
ORDER BY manufacturer;
```

La query restituisce i seguenti risultati:

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

 L'operatore PIVOT accetta alias opzionali sull'espressione aggregata e su ciascun valore per l'operatore `IN`. Usa gli alias per personalizzare i nomi delle colonne. Se non esiste un alias aggregato, solo gli alias dell'elenco `IN`. In caso contrario, l'alias aggregato viene aggiunto al nome della colonna con un trattino di sottolineatura per separare i nomi. 

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) AS count FOR quality IN (1 AS high, 2 AS low, NULL AS na)
);
```

La query restituisce i seguenti risultati:

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

Imposta la tabella e i dati di esempio seguenti e utilizzali per eseguire le query di esempio successive. I dati rappresentano le date di prenotazione di una raccolta di hotel.

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

 In questa query di esempio, i record delle prenotazioni vengono conteggiati per fornire il totale ogni settimana. La data di fine di ogni settimana diventa un nome di colonna.

```
SELECT * FROM
    (SELECT
       booking_id,
       (date_trunc('week', booking_date::date) + '5 days'::interval)::date as enddate,
       hotel_code AS "hotel code"
FROM bookings
) PIVOT (
    count(booking_id) FOR enddate IN ('2023-02-04','2023-02-11','2023-02-18') 
);
```

La query restituisce i seguenti risultati:

```
 hotel code | 2023-02-04  | 2023-02-11 | 2023-02-18
------------+-------------+------------+----------
 FOREST_L   |           3 |          2 |        1
 DESERT_S   |           4 |          3 |        2
 OCEAN_WV   |           3 |          3 |        3
 CITY_BLD   |           3 |          1 |        2
```

 Amazon Redshift non supporta l'uso di CROSSTAB per il passaggio in più colonne. È tuttavia possibile modificare i dati delle righe nelle colonne, in modo simile a un'aggregazione con PIVOT, utilizzando una query simile alla seguente. Usa gli stessi dati delle prenotazioni dell'esempio precedente.

```
SELECT 
  booking_date,
  MAX(CASE WHEN hotel_code = 'FOREST_L' THEN 'forest is booked' ELSE '' END) AS FOREST_L,
  MAX(CASE WHEN hotel_code = 'DESERT_S' THEN 'desert is booked' ELSE '' END) AS DESERT_S,
  MAX(CASE WHEN hotel_code = 'OCEAN_WV' THEN 'ocean is booked' ELSE '' END)  AS OCEAN_WV
FROM bookings
GROUP BY booking_date
ORDER BY booking_date asc;
```

La query di esempio restituisce le date di prenotazione elencate accanto a una breve frase che indica quali hotel sono prenotati.

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

Di seguito sono riportate le note di utilizzo per `PIVOT`:
+ `PIVOT`può essere applicato a tabelle, sottoquery ed espressioni di tabella comuni (). CTEs `PIVOT`non può essere applicato a nessuna `JOIN` espressione, ricorsiva CTEs o espressione. `PIVOT` `UNPIVOT` Inoltre non sono supportate le espressioni non annidate `SUPER` e le tabelle annidate di Redshift Spectrum.
+  `PIVOT` supporta `COUNT`, `SUM`, `MIN`, `MAX` e le funzioni aggregate `AVG`. 
+ L'espressione aggregata `PIVOT` deve essere una chiamata di una funzione di aggregazione supportata. Le espressioni complesse sopra l'aggregato non sono supportate. Gli argomenti aggregati non possono contenere riferimenti a tabelle diverse dalla tabella di input `PIVOT`. Anche i riferimenti correlati a una query principale non sono supportati. L'argomento aggregato può contenere sottoquery. Questi possono essere correlati internamente o sulla tabella di input `PIVOT`.
+  I valori della lista `PIVOT IN` non possono essere riferimenti di colonna o sottoquery. Ogni valore deve essere compatibile con la colonna di riferimento `FOR`. 
+  Se i valori della lista `IN` non hanno alias, `PIVOT` genera nomi di colonne predefiniti. Per i valori `IN` costanti come 'abc' o 5 il nome di colonna predefinito è la costante stessa. Per qualsiasi espressione complessa, il nome della colonna è un nome predefinito Amazon Redshift standard, ad esempio `?column?`. 

## Esempi di UNPIVOT
<a name="r_FROM_clause-unpivot-examples"></a>

Impostare i dati di esempio e utilizzarli per eseguire le query di esempio successive.

```
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` sulle colonne di input rosso, verde e blu.

```
SELECT *
FROM (SELECT red, green, blue FROM count_by_color) UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

La query restituisce i seguenti risultati:

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |  23
 blue  |   7
 blue  |  40
```

Per impostazione predefinita,i valori `NULL` nella colonna di input vengono ignorati e non producono una riga di risultato. 

L'esempio seguente mostra `UNPIVOT` con `INCLUDE NULLS`.

```
SELECT *
FROM (
    SELECT red, green, blue
    FROM count_by_color
) UNPIVOT INCLUDE NULLS (
    cnt FOR color IN (red, green, blue)
);
```

Di seguito è riportato l'output risultante.

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |
 green |  23
 blue  |   7
 blue  |  40
 blue  |
```

Se il parametro `INCLUDING NULLS` è impostato,i valori di input `NULL` generano righe dei risultati.

`The following query shows UNPIVOT` con `quality` come colonna implicita.

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

La query restituisce i seguenti risultati:

```
 quality | color | cnt
---------+-------+-----
 high    | red   |  15
 normal  | red   |  35
 low     | red   |  10
 high    | green |  20
 low     | green |  23
 high    | blue  |   7
 normal  | blue  |  40
```

Le colonne della tabella di input a cui non si fa riferimento nella definizione `UNPIVOT` vengono aggiunte implicitamente alla tabella dei risultati. Nell'esempio, questo è il caso della colonna `quality`.

L'esempio seguente mostra `UNPIVOT` con alias per i valori nell'elenco `IN`.

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red AS r, green AS g, blue AS b)
);
```

La query precedente restituisce i seguenti risultati:

```
 quality | color | cnt
---------+-------+-----
 high    | r     |  15
 normal  | r     |  35
 low     | r     |  10
 high    | g     |  20
 low     | g     |  23
 high    | b     |   7
 normal  | b     |  40
```

L'operatore `UNPIVOT` accetta alias opzionali su ciascuno valore di elenco `IN`. Ogni alias fornisce la personalizzazione dei dati in ciascuna colonna `value`.

Di seguito sono riportate le note di utilizzo per `UNPIVOT`.
+ `UNPIVOT`può essere applicato a tabelle, sottoquery ed espressioni di tabella comuni (). CTEs `UNPIVOT`non può essere applicato a nessuna `JOIN` espressione, ricorsiva CTEs o espressione. `PIVOT` `UNPIVOT` Inoltre non sono supportate le espressioni non annidate `SUPER` e le tabelle annidate di Redshift Spectrum.
+ L'elenco `UNPIVOT IN` deve contenere solo i riferimenti alle colonne della tabella di input. Le colonne dell'elenco `IN` devono avere un tipo comune con cui sono tutte compatibili. La colonna valore `UNPIVOT` ha questo tipo comune. La colonna del nome `UNPIVOT` è di tipo `VARCHAR`.
+ Se un valore di elenco `IN` non ha un alias, `UNPIVOT` utilizza il nome della colonna come valore predefinito.

# Esempi di JOIN
<a name="r_Join_examples"></a>

Una clausola SQL JOIN viene utilizzata per combinare i dati di due o più tabelle in base a campi comuni. I risultati potrebbero cambiare o meno a seconda del metodo di join specificato. Per ulteriori informazioni sulla sintassi di una clausola JOIN, consulta [Parameters](r_FROM_clause30.md#r_FROM_clause30-parameters). 

Gli esempi seguenti utilizzano i dati dai dati di esempio `TICKIT`. Per ulteriori informazioni sullo schema di database, consulta [Database di esempio](c_sampledb.md). Per informazioni su come caricare i dati di esempio, consulta [Caricamento dei dati](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html) nella *Guida alle operazioni di base di Amazon Redshift*.

La seguente query è un inner join (senza la parola chiave JOIN) tra la tabella LISTING e la tabella SALES, in cui il LISTID della tabella LISTING è compreso tra 1 e 5. Questa query corrisponde ai valori della colonna LISTID nella tabella LISTING (la tabella di sinistra) e SALES (la tabella di destra). I risultati mostrano che LISTID 1, 4 e 5 corrispondono ai criteri.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing, sales
where listing.listid = sales.listid
and listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La seguente query è un outer join. Gli outer join sinistro e destro mantengono i valori da una delle tabelle unite quando non viene trovata alcuna corrispondenza nell'altra tabella. Le tabelle sinistra e destra sono la prima e la seconda tabella elencate nella sintassi. I valori NULL vengono utilizzati per riempire gli "spazi vuoti" nel set di risultati. Questa query corrisponde ai valori della colonna LISTID nella tabella LISTING (la tabella di sinistra) e SALES (la tabella di destra). I risultati mostrano che LISTIDs 2 e 3 non hanno portato ad alcuna vendita.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing left outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La seguente query è un outer join. Questa query corrisponde ai valori della colonna LISTID nella tabella LISTING (la tabella di sinistra) e SALES (la tabella di destra). I risultati mostrano che LISTIDs 1, 4 e 5 corrispondono ai criteri.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing right outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La seguente query è un fullr join. I full join mantengono i valori da una delle tabelle unite quando non viene trovata alcuna corrispondenza nell'altra tabella. Le tabelle sinistra e destra sono la prima e la seconda tabella elencate nella sintassi. I valori NULL vengono utilizzati per riempire gli "spazi vuoti" nel set di risultati. Questa query corrisponde ai valori della colonna LISTID nella tabella LISTING (la tabella di sinistra) e SALES (la tabella di destra). I risultati mostrano che LISTIDs 2 e 3 non hanno portato ad alcuna vendita.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La seguente query è un full join. Questa query corrisponde ai valori della colonna LISTID nella tabella LISTING (la tabella di sinistra) e SALES (la tabella di destra). Nei risultati vengono visualizzate solo le righe che non comportano vendite (LISTIDs 2 e 3).

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
and (listing.listid IS NULL or sales.listid IS NULL)
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     2 | NULL   | NULL
     3 | NULL   | NULL
```

Di seguito è riportato un esempio di inner join con la clausola ON. In questo caso, le righe NULL non vengono restituite.

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

La seguente query è un cross join o un join cartesiano della tabella LISTING e della tabella SALES con un predicato per limitare i risultati. Questa query corrisponde ai valori delle colonne LISTID nella tabella SALES e nella tabella LISTING per LISTIDs 1, 2, 3, 4 e 5 in entrambe le tabelle. I risultati mostrano che 20 righe soddisfano i criteri.

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

Di seguito è riportato un esempio di join naturale tra due tabelle. In questo caso, le colonne listid, sellerid, eventid e dateid hanno nomi e tipi di dati identici in entrambe le tabelle e quindi vengono utilizzate come colonne di join. I risultati sono limitati a cinque righe.

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

Di seguito è riportato un esempio di join tra due tabelle con la clausola USING. In questo caso, le colonne listid e eventid vengono utilizzate come colonne di join. I risultati sono limitati a cinque righe.

```
select listid, listing.sellerid, eventid, listing.dateid, numtickets
from listing join sales
using (listid, eventid)
order by 1
limit 5;

listid | sellerid | eventid | dateid | numtickets
-------+----------+---------+--------+-----------
1      | 36861    | 7872    | 1850   | 10
4      | 8117     | 4337    | 1970   | 8
5      | 1616     | 8647    | 1963   | 4
5      | 1616     | 8647    | 1963   | 4
6      | 47402    | 8240    | 2053   | 18
```

La seguente query è un inner join di due sottoquery della clausola FROM. La query trova il numero di biglietti venduti e invenduti per diverse categorie di eventi (concerti e spettacoli). Queste sottoquery della clausola FROM sono sottoquery *table* e possono restituire più colonne e righe.

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

# Esempi di UNNEST
<a name="r_FROM_clause-unnest-examples"></a>

UNNEST è un parametro della clausola FROM che espande i dati annidati in colonne che contengono gli elementi non annidati dei dati. Per informazioni sull’annullamento dell’annidamento, consulta [Query sui dati semistrutturati](query-super.md).

L'istruzione seguente crea e popola la `orders` tabella, che contiene una `products` colonna contenente matrici di prodotti. IDs Gli esempi in questa sezione utilizzano i dati di esempio riportati in questa tabella. 

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

Di seguito sono riportati alcuni esempi di annullamento dell’annullamento delle query con i dati di esempio utilizzando la sintassi PartiQL.

## Annullamento dell’annidamento di un array senza una colonna OFFSET
<a name="r_FROM_clause-unnest-examples-no-offset"></a>

La seguente query annulla l’annidamento degli array SUPER nella colonna dei prodotti, in cui ogni riga rappresenta un articolo dell’ordine in `order_id`.

```
SELECT o.order_id, unnested_products.product
FROM orders o, UNNEST(o.products) AS unnested_products(product);

 order_id |                                                           product                                                           
----------+-----------------------------------------------------------------------------------------------------------------------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}}
(3 rows)
```

La seguente query trova il prodotto più costoso in ciascun ordine.

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

## Annullamento dell’annidamento di un array con una colonna OFFSET implicita
<a name="r_FROM_clause-unnest-examples-implicit-offset"></a>

La seguente query utilizza il parametro `UNNEST ... WITH OFFSET` per mostrare la posizione a base zero di ogni prodotto all’interno del relativo array di ordini.

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

Poiché l’istruzione non specifica un alias per la colonna offset, per impostazione predefinita Amazon Redshift le assegna il nome `offset_col`.

## Annullamento dell’annidamento di un array con una colonna di OFFSET esplicita
<a name="r_FROM_clause-unnest-examples-explicit-offset"></a>

La seguente query utilizza il parametro `UNNEST ... WITH OFFSET` anche per mostrare i prodotti all’interno degli array degli ordini. La differenza tra questa query rispetto alla query dell’esempio precedente è che nomina esplicitamente la colonna di offset con l’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)
```

# Clausola WHERE
<a name="r_WHERE_clause"></a>

La clausola WHERE contiene le condizioni che possono unire tabelle o applicare predicati alle colonne nelle tabelle. Le tabelle possono inner join utilizzando la sintassi appropriata nella clausola WHERE o nella clausola FROM. I criteri degli outer join devono essere specificati nella clausola FROM. 

## Sintassi
<a name="r_WHERE_clause-synopsis"></a>

```
[ WHERE condition ]
```

## *condizione*
<a name="r_WHERE_clause-synopsis-condition"></a>

Qualsiasi condizione di ricerca con un risultato booleano, ad esempio una condizione di join o un predicato su una colonna della tabella. I seguenti esempi sono condizioni di join valide: 

```
sales.listid=listing.listid
sales.listid<>listing.listid
```

I seguenti esempi sono condizioni valide sulle colonne delle tabelle: 

```
catgroup like 'S%'
venueseats between 20000 and 50000
eventname in('Jersey Boys','Spamalot')
year=2008
length(catdesc)>25
date_part(month, caldate)=6
```

Le condizioni possono essere semplici o complesse; per le condizioni complesse, puoi utilizzare le parentesi per isolare le unità logiche. Nell'esempio seguente, la condizione di join è racchiusa tra parentesi. 

```
where (category.catid=event.catid) and category.catid in(6,7,8)
```

## Note per l'utilizzo
<a name="r_WHERE_clause_usage_notes"></a>

Puoi utilizzare gli alias nella clausola WHERE per fare riferimento alle espressioni di elenco selezionate. 

Non puoi limitare i risultati delle funzioni di aggregazione nella clausola WHERE; utilizza la clausola HAVING per questo scopo. 

Le colonne che sono limitate nella clausola WHERE devono derivare dai riferimenti di tabella nella clausola FROM. 

## Esempio
<a name="r_SELECT_synopsis-example"></a>

La seguente query utilizza una combinazione di diverse restrizioni della clausola WHERE, inclusa una condizione di join per le tabelle SALES ed EVENT, un predicato sulla colonna EVENTNAME e due predicati sulla colonna 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)
```

# Outer join di tipo Oracle nella clausola WHERE
<a name="r_WHERE_oracle_outer"></a>

Per la compatibilità con Oracle, Amazon Redshift supporta l'operatore outer join Oracle (\$1) nelle condizioni di join della clausola WHERE. Questo operatore è destinato all'uso solo nella definizione delle condizioni di outer join; non provare a usarlo in altri contesti. Altri usi di questo operatore sono silenziosamente ignorati nella maggior parte dei casi. 

Un outer join restituisce tutte le righe che l'inner join equivalente restituirebbe, più le righe non corrispondenti da una o entrambe le tabelle. Nella clausola FROM, puoi specificare gli outer join sinistro, destro e completo. Nella clausola WHERE, puoi specificare solo gli outer join destro. 

Per unire le tabelle TABLE1 TABLE2 e restituire righe non corrispondenti da TABLE1 (un left outer join), specificate `TABLE1 LEFT OUTER JOIN TABLE2` nella clausola FROM o applicate l'operatore (\$1) a tutte le colonne di unione dalla TABLE2 clausola WHERE. Per tutte le righe in TABLE1 cui non sono presenti righe corrispondenti TABLE2, il risultato della query contiene valori null per tutte le espressioni dell'elenco selezionato che contengono colonne da. TABLE2 

Per ottenere lo stesso comportamento per tutte le righe in TABLE2 cui non sono presenti righe corrispondenti TABLE1, specificate `TABLE1 RIGHT OUTER JOIN TABLE2` nella clausola FROM o applicate l'operatore (\$1) a tutte le colonne unite dalla TABLE1 clausola WHERE. 

## Sintassi di base
<a name="r_WHERE_oracle_outer-basic-syntax"></a>

```
[ WHERE {
[ table1.column1 = table2.column1(+) ]
[ table1.column1(+) = table2.column1 ]
}
```

La prima condizione è equivalente a: 

```
from table1 left outer join table2
on table1.column1=table2.column1
```

La seconda condizione è equivalente a: 

```
from table1 right outer join table2
on table1.column1=table2.column1
```

**Nota**  
La sintassi qui mostrata copre il caso semplice di un equijoin su una coppia di colonne di unione. Tuttavia, sono validi anche altri tipi di condizioni di confronto e più coppie di colonne di unione. 

Ad esempio, la seguente clausola WHERE definisce un outer join su due coppie di colonne. L'operatore (\$1) deve essere collegato alla stessa tabella in entrambe le condizioni: 

```
where table1.col1 > table2.col1(+)
and table1.col2 = table2.col2(+)
```

## Note per l'utilizzo
<a name="r_WHERE_oracle_outer_usage_notes"></a>

Se possibile, utilizza la sintassi OUTER JOIN della clausola FROM standard anziché l'operatore (\$1) nella clausola WHERE. Le query che contengono l'operatore (\$1) sono soggette alle seguenti regole: 
+ Puoi utilizzare solo l'operatore (\$1) nella clausola WHERE e solo in riferimento alle colonne di tabelle o viste. 
+ Non puoi applicare l'operatore (\$1) alle espressioni. Tuttavia, un'espressione può contenere colonne che utilizzano l'operatore (\$1). Ad esempio, la seguente condizione di join restituisce un errore di sintassi: 

  ```
  event.eventid*10(+)=category.catid
  ```

  Tuttavia, la seguente condizione di join è valida: 

  ```
  event.eventid(+)*10=category.catid
  ```
+ Non puoi utilizzare l'operatore (\$1) in un blocco di query che contiene anche la sintassi di join della clausola FROM. 
+ Se due tabelle sono unite in più condizioni di join, è necessario utilizzare l'operatore (\$1) in tutte o in nessuna di queste condizioni. Un join con stili di sintassi misti viene eseguito come inner join, senza avvertenza. 
+ L'operatore (\$1) non produce un outer join se si aggiunge una tabella nella query esterna con una tabella risultante da una query interna. 
+ Per utilizzare l'operatore (\$1) nell'outer join di una tabella su se stessa, è necessario definire gli alias di tabella nella clausola FROM e farvi riferimento nella condizione di join: 

  ```
  select count(*)
  from event a, event b
  where a.eventid(+)=b.catid;
  
  count
  -------
  8798
  (1 row)
  ```
+ Non puoi combinare una condizione di join che contiene l'operatore (\$1) con una condizione OR o una condizione IN. Ad esempio: 

  ```
  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.
  ```
+  In una clausola WHERE con l'outer join di più di due tabelle, l'operatore (\$1) può essere applicato solo una volta a una determinata tabella. Nell'esempio seguente, alla tabella SALES non si può fare riferimento con l'operatore (\$1) in due join successivi. 

  ```
  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 la condizione outer-join della clausola WHERE confronta una colonna from TABLE2 con una costante, applica l'operatore (\$1) alla colonna. Se non si include l'operatore, le righe unite dall'esterno from, che contengono valori null per la colonna con restrizioni TABLE1, vengono eliminate. Vedi di seguito la sezione Esempi. 

## Esempi
<a name="r_WHERE_oracle_outer-examples"></a>

La seguente query di join specifica un outer join sinistro delle tabelle SALES e LISTING sulle rispettive colonne LISTID: 

```
select count(*)
from sales, listing
where sales.listid = listing.listid(+);

count
--------
172456
(1 row)
```

La seguente query equivalente produce lo stesso risultato ma utilizza la sintassi di join della clausola FROM: 

```
select count(*)
from sales left outer join listing on sales.listid = listing.listid;

count
--------
172456
(1 row)
```

La tabella SALES non contiene i record di tutti gli elenchi della tabella LISTING perché non tutti gli elenchi restituiscono vendite. La seguente query con gli outer join di SALES e LISTING restituisce le righe da LISTING anche quando la tabella SALES non restituisce le vendite per un determinato ID elenco. Le colonne PRICE e COMM, derivate dalla tabella SALES, contengono valori null nel set di risultati per le righe non corrispondenti. 

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

Tieni presente che quando viene utilizzato l'operatore join della clausola WHERE, non ha importanza l'ordine delle tabelle nella clausola FROM. 

Un esempio di una condizione outer join più complessa nella clausola WHERE è il caso in cui la condizione consiste in un confronto tra due colonne di tabella *e* un confronto con una costante: 

```
where category.catid=event.catid(+) and eventid(+)=796;
```

L'operatore (\$1) viene utilizzato in due punti: prima nel confronto di uguaglianza tra le tabelle e poi nella condizione di confronto per la colonna EVENTID. Il risultato di questa sintassi è la conservazione delle righe di outer join quando viene valutata la limitazione su EVENTID. Se rimuovi l'operatore (\$1) dalla restrizione EVENTID, la query considera questa limitazione come un filtro e non come parte della condizione di outer join. A loro volta, le righe dell'outer join che contengono valori null per EVENTID vengono eliminate dal set di risultati. 

Ecco una query completa che illustra questo 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)
```

La query equivalente con la sintassi della clausola FROM è la seguente: 

```
select catname, catgroup, eventid
from category left join event
on category.catid=event.catid and eventid=796;
```

Se rimuovi il secondo operatore (\$1) dalla versione della clausola WHERE di questa query, viene restituita solo una riga (la riga dove `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)
```

# Clausola GROUP BY
<a name="r_GROUP_BY_clause"></a>

La clausola GROUP BY identifica le colonne di raggruppamento per la query. Viene utilizzata per raggruppare le righe in una tabella che hanno gli stessi valori in tutte le colonne elencate. L’ordine in cui sono elencate le colonne non è importante. Il risultato è combinare ogni set di righe con valori comuni in un’unica riga di gruppo che rappresenta tutte le righe del gruppo. Utilizza una clausola GROUP BY per eliminare la ridondanza nell’output e calcolare gli aggregati che si applicano ai gruppi. Le colonne di raggruppamento devono essere dichiarate quando la query calcola gli aggregati con le funzioni standard, ad esempio SUM, AVG e COUNT. Per ulteriori informazioni, consulta [Funzioni di aggregazione](c_Aggregate_Functions.md).

## Sintassi
<a name="r_GROUP_BY_clause-syntax"></a>

```
[ GROUP BY  expression [, ...] | ALL | aggregation_extension  ]
```

dove *aggregation\$1extension* è uno dei seguenti:

```
GROUPING SETS ( () | aggregation_extension [, ...] ) |
ROLLUP ( expr [, ...] ) |
CUBE ( expr [, ...] )
```

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

 *espressione*  
L'elenco di colonne o espressioni deve corrispondere all'elenco di espressioni non aggregate dell'elenco di selezione della query. A titolo illustrativo, prendi in considerazione la query semplice riportata di seguito.  

```
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)
```
In questa query, l'elenco di selezione è composto da due espressioni di aggregazione. La prima utilizza la funzione SUM e la seconda utilizza la funzione COUNT. Le restanti due colonne, LISTID ed EVENTID, devono essere dichiarate come colonne di raggruppamento.  
Le espressioni nella clausola GROUP BY possono anche fare riferimento all'elenco di selezione usando numeri ordinali. A titolo illustrativo, l'esempio precedente potrebbe essere abbreviato come segue.  

```
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 di raggruppare in base a tutte le colonne specificate nell’elenco SELECT a eccezione di quelle aggregate. Ad esempio, considera la seguente query che raggruppa in base a `col1` e `col2` senza doverle specificare singolarmente nella clausola GROUP BY. La colonna `col3` è l’argomento della funzione `SUM` e quindi non è raggruppata.  

```
SELECT col1, col2 sum(col3) FROM testtable GROUP BY ALL
```
Se ESCLUDI una colonna nell’elenco SELECT, la clausola GROUP BY ALL non raggruppa i risultati in base a tale colonna specifica.  

```
SELECT * EXCLUDE col3 FROM testtable GROUP BY ALL
```

 * *aggregation\$1extension* *   
È possibile utilizzare le estensioni di aggregazione GROUPING SETS, ROLLUP e CUBE per eseguire il lavoro di più operazioni GROUP BY in una singola istruzione. Per ulteriori informazioni sulle estensioni di aggregazione e sulle funzioni correlate, consulta [Estensioni di aggregazione](r_GROUP_BY_aggregation-extensions.md). 

## Esempi
<a name="r_GROUP_BY_clause-examples"></a>

Gli esempi seguenti utilizzano la tabella SALES che contiene le colonne: salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission e saletime. Per ulteriori informazioni sulla tabella SALES, consulta [Database di esempio](c_sampledb.md).

La query di esempio seguente raggruppa i gruppi in base a `salesid` e `listid` senza doverli specificare singolarmente nella clausola GROUP BY. La colonna `qtysold` è l’argomento della funzione `SUM` e quindi non è raggruppata.

```
SELECT salesid, listid, sum(qtysold) FROM sales GROUP BY ALL;

salesid | listid  | sum
--------+---------+------
33095   | 36572   | 2	
88268   | 100813  | 4	
110917  | 127048  | 1	
...
```

La query di esempio seguente esclude diverse colonne nell’elenco SELECT, pertanto GROUP BY ALL raggruppa solo 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 	
...
```

# Estensioni di aggregazione
<a name="r_GROUP_BY_aggregation-extensions"></a>

Amazon Redshift supporta estensioni di aggregazione per eseguire il lavoro di più operazioni GROUP BY in un'unica istruzione.

 Gli esempi di estensioni di aggregazione utilizzano la tabella `orders`, che contiene i dati di vendita di un'azienda di elettronica. Per creare gli `orders`, procedi come segue.

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

 Calcola uno o più set di raggruppamento in una singola istruzione. Un set di raggruppamento è l'insieme di una singola clausola GROUP BY, un set di 0 o più colonne in base al quale è possibile raggruppare il set di risultati di una query. GROUP BY GROUPING SETS equivale all'esecuzione di una query UNION ALL su un set di risultati raggruppato in colonne diverse. Ad esempio, GROUP BY GROUP SETS((a), (b)) è equivalente a GROUP BY a UNION ALL GROUP BY b. 

 L'esempio seguente restituisce il costo dei prodotti nella tabella degli ordini raggruppati in base alle categorie dei prodotti e al tipo di prodotti venduti. 

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

 Presuppone una gerarchia in cui le colonne precedenti sono considerate le colonne padri delle colonne successive. ROLLUP raggruppa i dati in base alle colonne fornite, restituendo righe di subtotali aggiuntive che rappresentano i totali in tutti i livelli di colonne di raggruppamento, oltre alle righe raggruppate. Ad esempio, puoi utilizzare GROUP BY ROLLUP((a), (b)) per restituire un set di risultati raggruppato prima per a, poi per b supponendo che b sia una sottosezione di a. ROLLUP restituisce anche una riga con l'intero set di risultati senza colonne di raggruppamento. 

GROUP BY ROLLUP((a), (b)) è equivalente a GROUP BY GROUPING SETS((a,b), (a), ()). 

L'esempio seguente restituisce il costo dei prodotti nella tabella degli ordini raggruppati prima per categoria e poi per prodotto, con product come sezione della 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>

 Raggruppa i dati in base alle colonne fornite, restituendo righe di subtotali aggiuntive che rappresentano i totali in tutti i livelli di colonne di raggruppamento, oltre alle righe raggruppate. CUBE restituisce le stesse righe di ROLLUP, ma aggiunge ulteriori righe di subtotali per ogni combinazione di colonne di raggruppamento non previste da ROLLUP. Ad esempio, è possibile utilizzare GROUP BY CUBE((a), (b)) per restituire un set di risultati raggruppato prima per a, poi per b, supponendo che b sia una sottosezione di a, quindi solo per b. CUBE restituisce anche una riga con l'intero set di risultati senza colonne di raggruppamento.

GROUP BY CUBE((a), (b)) è equivalente a GROUP BY GROUPING SETS((a, b), (a), (b), ()). 

L'esempio seguente restituisce il costo dei prodotti nella tabella degli ordini raggruppati prima per categoria e poi per prodotto, con product come sezione della categoria. A differenza dell'esempio precedente per ROLLUP, l'istruzione restituisce risultati per ogni combinazione di colonne di raggruppamento. 

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

## *Funzioni GROUPING/GROUPING\$1ID*
<a name="r_GROUP_BY_aggregation-extentions-grouping"></a>

 ROLLUP e CUBE aggiungono valori NULL al set di risultati per indicare le righe di subtotali. Ad esempio, GROUP BY ROLLUP((a), (b)) restituisce una o più righe con un valore NULL nella colonna di raggruppamento b per indicare che si tratta di subtotali dei campi nella colonna di raggruppamento a. Questi valori NULL servono solo a soddisfare il formato delle tuple restituite.

 Quando si eseguono operazioni GROUP BY con ROLLUP e CUBE su relazioni che memorizzano i valori NULL, è possibile produrre set di risultati con righe che sembrano avere colonne di raggruppamento identiche. Tornando all'esempio precedente, se la colonna di raggruppamento b contiene un valore NULL memorizzato, GROUP BY ROLLUP((a), (b)) restituisce una riga con un valore NULL nella colonna di raggruppamento b che non è un subtotale. 

 Per distinguere tra i valori NULL creati da ROLLUP e CUBE e i valori NULL memorizzati nelle tabelle stesse, è possibile utilizzare la funzione GROUPING o il relativo alias GROUPING\$1ID. GROUPING accetta un singolo set di raggruppamento come argomento e per ogni riga del set di risultati restituisce un valore di 0 o 1 bit corrispondente alla colonna di raggruppamento in quella posizione, quindi converte tale valore in un numero intero. Se il valore in quella posizione è un valore NULL creato da un'estensione di aggregazione, GROUPING restituisce 1. Restituisce 0 per tutti gli altri valori, inclusi i valori NULL memorizzati.

 Ad esempio, GROUPING(category, product) può restituire i seguenti valori per una determinata riga, a seconda dei valori della colonna di raggruppamento per quella riga. Ai fini di questo esempio, tutti i valori NULL nella tabella sono creati da un'estensione di aggregazione.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_GROUP_BY_aggregation-extensions.html)

Le funzioni di GROUPING vengono mostrate nella parte dell'elenco SELECT della query nel seguente formato.

```
SELECT ... [GROUPING( expr )...] ...
  GROUP BY ... {CUBE | ROLLUP| GROUPING SETS} ( expr ) ...
```

L'esempio seguente è analogo all'esempio precedente per CUBE, ma con l'aggiunta di funzioni GROUPING per i relativi set di raggruppamento.

```
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 parziali*
<a name="r_GROUP_BY_aggregation-extentions-partial"></a>

 È possibile eseguire operazioni ROLLUP e CUBE con solo una parte dei subtotali. 

 La sintassi per le operazioni parziali di ROLLUP e CUBE è la seguente.

```
GROUP BY expr1, { ROLLUP | CUBE }(expr2, [, ...])
```

Qui, la clausola GROUP BY crea solo righe di subtotali a livello di *expr2* e successivi.

Gli esempi seguenti mostrano le operazioni parziali di ROLLUP e CUBE nella tabella degli ordini, raggruppate in base allo stato di usato o meno di un prodotto; le operazioni di ROLLUP e CUBE vengono quindi eseguite nelle colonne della categoria e del prodotto.

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

Poiché la colonna dei prodotti usati non è inclusa nelle operazioni ROLLUP e CUBE, non esiste una riga totale complessiva che includa tutte le altre righe. 

## *Raggruppamento concatenato*
<a name="r_GROUP_BY_aggregation-extentions-concat"></a>

 È possibile concatenare più SETS/ROLLUP/CUBE clausole GROUPING per calcolare diversi livelli di subtotali. I raggruppamenti concatenati restituiscono il prodotto cartesiano dei set di raggruppamento forniti. 

 La sintassi per concatenare le clausole GROUPING è la seguente. SETS/ROLLUP/CUBE

```
GROUP BY {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...]),
         {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...])[, ...]
```

L'esempio seguente mostra come un piccolo raggruppamento concatenato possa produrre un notevole set di risultati finali.

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

## *Raggruppamento nidificato*
<a name="r_GROUP_BY_aggregation-extentions-nested"></a>

 *È possibile utilizzare le SETS/ROLLUP/CUBE operazioni GROUPING come espr GROUPING SETS per formare un raggruppamento annidato.* Il sottoraggruppamento all'interno dei GROUPING SETS nidificati viene appiattito. 

 La sintassi per il raggruppamento nidificato è la seguente:

```
GROUP BY GROUPING SETS({ROLLUP|CUBE|GROUPING SETS}(expr[, ...])[, ...])
```

Analizza l’esempio seguente.

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

È importante notare che, poiché sia ROLLUP(category) che CUBE(product, pre\$1owned) contengono il set di raggruppamento (), la riga che rappresenta il totale complessivo viene duplicata.

## *Note per l'utilizzo*
<a name="r_GROUP_BY_aggregation-extensions-usage-notes"></a>
+ La clausola GROUP BY supporta fino a 64 set di raggruppamento. Nel caso di ROLLUP e CUBE o di una combinazione di GROUPING SETS, ROLLUP e CUBE, questa limitazione si applica al numero implicito di set di raggruppamento. Ad esempio, GROUP BY CUBE((a), (b)) conta per 4 set di raggruppamento, non 2.
+ Non è possibile utilizzare le costanti come colonne di raggruppamento quando si utilizzano le estensioni di aggregazione.
+ Non è possibile creare un set di raggruppamento che contiene colonne duplicate.

# Clausola HAVING
<a name="r_HAVING_clause"></a>

La clausola HAVING applica una condizione al set di risultati raggruppati intermedi restituiti da una query.

## Sintassi
<a name="r_HAVING_clause-synopsis"></a>

```
[ HAVING condition ]
```

Ad esempio, puoi limitare i risultati di una funzione SUM:

```
having sum(pricepaid) >10000
```

La condizione HAVING viene applicata dopo che tutte le condizioni della clausola WHERE sono state applicate e le operazioni GROUP BY sono state completate.

La condizione stessa assume lo stesso formato di qualsiasi condizione della clausola WHERE.

## Note per l'utilizzo
<a name="r_HAVING_clause_usage_notes"></a>
+ Qualsiasi colonna a cui viene fatto riferimento in una condizione della clausola HAVING deve essere una colonna di raggruppamento o una colonna che fa riferimento al risultato di una funzione di aggregazione.
+ In una clausola HAVING, non è possibile specificare:
  + Un numero ordinale che fa riferimento a una voce di elenco selezionata. Solo le clausole GROUP BY e ORDER BY accettano numeri ordinali.

## Esempi
<a name="r_HAVING_clause-examples"></a>

La seguente query calcola le vendite totali dei biglietti per tutti gli eventi in base al nome, quindi elimina gli eventi in cui le vendite totali erano inferiori a \$1800.000. La condizione HAVING viene applicata ai risultati della funzione di aggregazione nell'elenco di selezione: `sum(pricepaid)`.

```
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(pricepaid) > 800000
order by 2 desc, 1;

eventname        |    sum
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
```

La seguente query calcola un set di risultati simile. In questo caso, tuttavia, la condizione HAVING viene applicata a un'aggregazione che non è specificata nell'elenco di selezione: `sum(qtysold)`. Gli eventi che non hanno venduto più di 2.000 biglietti sono stati eliminati dal risultato finale.

```
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(qtysold) >2000
order by 2 desc, 1;

eventname        |    sum
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
Chicago          |  790993.00
Spamalot         |  714307.00
```

La seguente query calcola le vendite totali dei biglietti per tutti gli eventi in base al nome, quindi elimina gli eventi in cui le vendite totali erano inferiori a \$1800.000. La condizione HAVING viene applicata ai risultati della funzione di aggregazione nell’elenco di selezione con l’alias `pp` per `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
```

# Clausola QUALIFY
<a name="r_QUALIFY_clause"></a>

La clausola QUALIFY filtra i risultati di una funzione finestra calcolata in precedenza in base alle condizioni di ricerca specificate dall'utente. È possibile utilizzare la clausola per applicare condizioni di filtro al risultato di una funzione finestra senza utilizzare una sottoquery.

È simile alla [clausola HAVING](https://docs.aws.amazon.com/redshift/latest/dg/r_HAVING_clause.html), che applica una condizione per filtrare ulteriormente le righe di una clausola WHERE. La differenza tra QUALIFY e HAVING è che i risultati filtrati dalla clausola QUALIFY potrebbero essere basati sul risultato dell'esecuzione delle funzioni finestra sui dati. Puoi utilizzare entrambe le clausole QUALIFY e HAVING in un'unica query.

## Sintassi
<a name="r_QUALIFY-synopsis"></a>

```
QUALIFY condition
```

**Nota**  
Se utilizzi la clausola QUALIFY direttamente dopo la clausola FROM, il nome della relazione FROM deve avere un alias specificato prima della clausola QUALIFY.

## Esempi
<a name="r_QUALIFY-examples"></a>

Gli esempi in questa sezione utilizzano i dati di esempio riportati di seguito.

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

L'esempio seguente mostra come trovare i due articoli più costosi venduti dopo le 12:00 di ogni giorno.

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

È quindi possibile trovare l’ultimo articolo venduto ogni giorno.

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

L’esempio seguente restituisce gli stessi risultati dell’ultima query, ovvero l’ultimo articolo venduto ogni giorno, ma non utilizza la clausola 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 ed EXCEPT
<a name="r_UNION"></a>

**Topics**
+ [Sintassi](#r_UNION-synopsis)
+ [Parameters](#r_UNION-parameters)
+ [Ordine di valutazione degli operatori di definizione](#r_UNION-order-of-evaluation-for-set-operators)
+ [Note per l'utilizzo](#r_UNION-usage-notes)
+ [Query UNION di esempio](c_example_union_query.md)
+ [Query UNION ALL di esempio](c_example_unionall_query.md)
+ [Query INTERSECT di esempio](c_example_intersect_query.md)
+ [Query EXCEPT di esempio](c_Example_MINUS_query.md)

Gli *operatori di definizione* UNION, INTERSECT ed EXCEPT vengono utilizzati per confrontare e unire i risultati di due espressioni di query separate. Ad esempio, se vuoi sapere quali utenti di un sito web sono sia acquirenti che venditori ma i loro nomi utente sono memorizzati in colonne o tabelle separate, puoi trovare *l'intersezione* di questi due tipi di utenti. Se vuoi sapere quali utenti del sito sono acquirenti ma non venditori, puoi utilizzare l'operatore EXCEPT per trovare la *difference* tra i due elenchi di utenti. Se vuoi creare l'elenco di tutti gli utenti, indipendentemente dal ruolo, puoi utilizzare l'operatore UNION.

## Sintassi
<a name="r_UNION-synopsis"></a>

```
query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query
```

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

 *query*   
Espressione di query che corrisponde, sotto forma di elenco di selezione, a una seconda espressione di query che segue l'operatore UNION, INTERSECT o EXCEPT. Le due espressioni devono contenere lo stesso numero di colonne di output con tipi di dati compatibili; in caso contrario, i due set di risultati non possono essere confrontati e uniti. Le operazioni di definizione non consentono la conversione implicita tra diverse categorie di tipi di dati. Per ulteriori informazioni, consultare [Conversione e compatibilità dei tipi](c_Supported_data_types.md#r_Type_conversion).  
Puoi creare query contenenti un numero illimitato di espressioni di query e collegarle agli operatori UNION, INTERSECT ed EXCEPT in qualsiasi combinazione. Ad esempio, la seguente struttura di query è valida, assumendo che le tabelle T1, T2 e T3 contengano set di colonne compatibili:   

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

UNION   
Operazione di definizione che restituisce le righe da due espressioni di query, indipendentemente dal fatto che le righe derivino da una o entrambe le espressioni.

INTERSECT   
Operazione di definizione che restituisce le righe che derivano da due espressioni di query. Le righe che non vengono restituite da entrambe le espressioni vengono scartate.

EXCEPT \$1 MINUS   
Operazione di definizione che restituisce le righe che derivano da una delle due espressioni di query. Per qualificarsi per il risultato, le righe devono esistere nella prima tabella dei risultati ma non nella seconda. MINUS ed EXCEPT sono sinonimi esatti. 

ALL   
La parola chiave ALL conserva tutte le righe duplicate prodotte da UNION. Il comportamento predefinito quando la parola chiave ALL non viene utilizzata è di scartare questi duplicati. INTERSECT ALL, EXCEPT ALL e MINUS ALL non sono supportati.

## Ordine di valutazione degli operatori di definizione
<a name="r_UNION-order-of-evaluation-for-set-operators"></a>

Gli operatori di definizione UNION ed EXCEPT sono associativi a sinistra. Se non si specificano le parentesi per influenzare l'ordine di precedenza, una combinazione di questi operatori di definizione viene valutata da sinistra a destra. Ad esempio, nella seguente query, l'operazione UNION di T1 e T2 viene valutata per prima, quindi l'operazione EXCEPT viene eseguita sul risultato di UNION: 

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

L'operatore INTERSECT ha la precedenza sugli operatori UNION ed EXCEPT quando una combinazione di operatori viene utilizzata nella stessa query. Ad esempio, la seguente query valuta l'intersezione di T2 e T3, quindi l'unione del risultato con T1: 

```
select * from t1
union
select * from t2
intersect
select * from t3
order by c1;
```

Aggiungendo le parentesi, puoi applicare un diverso ordine di valutazione. Nel seguente caso, il risultato dell'unione di T1 e T2 viene intersecato con T3 e la query produce probabilmente un risultato diverso. 

```
(select * from t1
union
select * from t2)
intersect
(select * from t3)
order by c1;
```

## Note per l'utilizzo
<a name="r_UNION-usage-notes"></a>
+ I nomi di colonna restituiti nel risultato di una query dell'operazione di definizione sono i nomi di colonna (o alias) delle tabelle nella prima espressione di query. Poiché questi nomi di colonne sono potenzialmente fuorvianti, in quanto i valori della colonna derivano da tabelle su entrambi i lati dell'operatore di definizione, puoi fornire alias significativi per il set di risultati.
+ Un'espressione di query che precede un operatore di definizione non deve contenere una clausola ORDER BY. Una clausola ORDER BY produce risultati ordinati significativi solo quando viene utilizzata alla fine di una query che contiene operatori di definizione. In questo caso, la clausola ORDER BY si applica ai risultati finali di tutte le operazioni di definizione. La query più esterna può contenere anche clausole LIMIT e OFFSET standard. 
+ Quando le query dell'operatore di definizione restituiscono risultati decimali, le colonne dei risultati corrispondenti vengono elevate per restituire la stessa precisione e scala. Ad esempio, nella seguente query, dove T1.REVENUE è una colonna DECIMAL (10,2) e T2.REVENUE è una colonna DECIMAL (8,4), il risultato decimale viene elevato a DECIMAL (12,4): 

  ```
  select t1.revenue union select t2.revenue;
  ```

  La scala è `4` perché è la scala massima delle due colonne. La precisione è `12` perché T1.REVENUE richiede 8 cifre a sinistra del punto decimale (12 - 4 = 8). Questo tipo di elevazione garantisce che tutti i valori di entrambi i lati dell'UNION si adattino al risultato. Per i valori a 64 bit, la precisione massima del risultato è 19 e la scala del risultato massimo è 18. Per i valori a 128 bit, la precisione massima del risultato è 38 e la scala del risultato massimo è 37.

  Se il tipo di dati risultante supera limiti di precisione e scala di Amazon Redshift, la query restituisce un errore.
+ Per le operazioni di definizione, due righe vengono considerate identiche se, per ciascuna coppia di colonne corrispondente, i due valori di dati sono *uguali* o *entrambi NULL*. Ad esempio, se le tabelle T1 e T2 contengono entrambe una colonna e una riga e tale riga è NULL in entrambe le tabelle, un'operazione INTERSECT su quelle tabelle restituisce tale riga.

# Query UNION di esempio
<a name="c_example_union_query"></a>

Nella seguente query UNION, le righe nella tabella SALES vengono unite alle righe nella tabella LISTING. Tre colonne compatibili sono selezionate da ciascuna tabella; in questo caso, le colonne corrispondenti hanno gli stessi nomi e tipi di dati. 

Il set di risultati finale è ordinato dalla prima colonna nella tabella LISTING e limitato alle 5 righe con il valore LISTID più 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)
```

L'esempio seguente mostra come è possibile aggiungere un valore letterale all'output di una query UNION in modo da poter vedere quale espressione di query ha prodotto ogni riga nel set di risultati. La query identifica le righe dalla prima espressione di query come "B" (per gli acquirenti) e le righe dalla seconda espressione di query come "S" (per i venditori). 

La query identifica acquirenti e venditori per transazioni di biglietti che costano almeno \$110.000. L'unica differenza tra le due espressioni di query su entrambi i lati dell'operatore UNION è la colonna di collegamento per la tabella 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)
```

L'esempio seguente utilizza un operatore UNION ALL perché le righe duplicate, se trovate, devono essere conservate nel risultato. Per una serie specifica di eventi IDs, la query restituisce 0 o più righe per ogni vendita associata a ciascun evento e 0 o 1 riga per ogni elenco di quell'evento. IDs Gli eventi sono univoci per ogni riga delle tabelle LISTING ed EVENT, ma potrebbero esserci più vendite per la stessa combinazione di evento e inserzione IDs nella tabella SALES. 

La terza colonna nel set di risultati identifica l'origine della riga. Se proviene dalla tabella SALES, è contrassegnata con "Yes" nella colonna SALESROW. SALESROW è un alias per SALES.LISTID. Se la riga proviene dalla tabella LISTING, è contrassegnata con "No" nella colonna SALESROW. 

In questo caso, il set di risultati è costituito da tre righe di vendita per l'elenco 500, evento 7787. In altre parole, sono state eseguite tre diverse transazioni per l'elenco e la combinazione di eventi. Le altre due inserzioni, 501 e 502, non hanno prodotto vendite, quindi l'unica riga generata dalla query per questi elenchi IDs proviene dalla tabella 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 esegui la stessa query senza la parola chiave ALL, il risultato conserva solo una delle transazioni di vendita. 

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

# Query UNION ALL di esempio
<a name="c_example_unionall_query"></a>

L'esempio seguente utilizza un operatore UNION ALL perché le righe duplicate, se trovate, devono essere conservate nel risultato. Per una serie specifica di eventi IDs, la query restituisce 0 o più righe per ogni vendita associata a ciascun evento e 0 o 1 riga per ogni elenco di quell'evento. IDs Gli eventi sono univoci per ogni riga delle tabelle LISTING ed EVENT, ma potrebbero esserci più vendite per la stessa combinazione di evento e inserzione IDs nella tabella SALES.

La terza colonna nel set di risultati identifica l'origine della riga. Se proviene dalla tabella SALES, è contrassegnata con "Yes" nella colonna SALESROW. SALESROW è un alias per SALES.LISTID. Se la riga proviene dalla tabella LISTING, è contrassegnata con "No" nella colonna SALESROW.

In questo caso, il set di risultati è costituito da tre righe di vendita per l'elenco 500, evento 7787. In altre parole, sono state eseguite tre diverse transazioni per l'elenco e la combinazione di eventi. Le altre due inserzioni, 501 e 502, non hanno prodotto vendite, quindi l'unica riga generata dalla query per questi elenchi IDs proviene dalla tabella 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 esegui la stessa query senza la parola chiave ALL, il risultato conserva solo una delle transazioni di vendita. 

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

# Query INTERSECT di esempio
<a name="c_example_intersect_query"></a>

Confronta il seguente esempio con il primo esempio di UNION. L'unica differenza tra i due esempi è l'operatore di definizione che viene utilizzato, ma i risultati sono molto diversi. Solo una delle righe è uguale: 

```
235494 |    23875 |    8771
```

 Questa è l'unica riga del risultato limitato di 5 righe trovata in entrambe le tabelle.

```
select listid, sellerid, eventid from listing
intersect
select listid, sellerid, eventid from sales
order by listid desc, sellerid, eventid
limit 5;

listid | sellerid | eventid
--------+----------+---------
235494 |    23875 |    8771
235482 |     1067 |    2667
235479 |     1589 |    7303
235476 |    15550 |     793
235475 |    22306 |    7848
(5 rows)
```

La seguente query trova gli eventi (per i quali sono stati venduti i biglietti) che si sono verificati nelle sedi di New York City e Los Angeles a marzo. La differenza tra le due espressioni di query è il vincolo sulla colonna 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)
```

# Query EXCEPT di esempio
<a name="c_Example_MINUS_query"></a>

La tabella CATEGORY nel database TICKIT contiene le seguenti 11 righe: 

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

Supponi che una tabella CATEGORY\$1STAGE (una tabella di gestione temporanea) contenga una riga aggiuntiva: 

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

Restituisce la differenza tra le due tabelle. In altre parole, restituisce le righe che si trovano nella tabella CATEGORY\$1STAGE ma non nella tabella CATEGORY: 

```
select * from category_stage
except
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

La seguente query equivalente utilizza il sinonimo MINUS. 

```
select * from category_stage
minus
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

Se inverti l'ordine delle espressioni SELECT, la query non restituisce alcuna riga. 

# Clausola ORDER BY
<a name="r_ORDER_BY_clause"></a>

**Topics**
+ [Sintassi](#r_ORDER_BY_clause-synopsis)
+ [Parameters](#r_ORDER_BY_clause-parameters)
+ [Note per l'utilizzo](#r_ORDER_BY_usage_notes)
+ [Esempi di ORDER BY](r_Examples_with_ORDER_BY.md)

La clausola ORDER BY ordina il set di risultati di una query.

## Sintassi
<a name="r_ORDER_BY_clause-synopsis"></a>

```
[ ORDER BY expression [ ASC | DESC ] ]
[ NULLS FIRST | NULLS LAST ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
```

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

 *espressione*   
Espressione che definisce l'ordinamento del set di risultati della query, in genere specificando una o più colonne nell'elenco di selezione. I risultati vengono restituiti in base all'ordinamento binario UTF-8. È anche possibile specificare:  
+ Colonne che non si trovano nell'elenco di selezione
+ Espressioni formate da una o più colonne presenti nelle tabelle a cui fa riferimento la query
+ Numeri ordinali che rappresentano la posizione delle voci dell'elenco di selezione (o la posizione delle colonne nella tabella se non esiste alcun elenco di selezione)
+ Alias che definiscono le voci dell'elenco di selezione
Quando la clausola ORDER BY contiene più espressioni, il set di risultati viene ordinato in base alla prima espressione, quindi la seconda espressione viene applicata alle righe che presentano valori corrispondenti della prima espressione e così via.

ASC \$1 DESC   
Opzione che definisce l'ordinamento per l'espressione, come segue:   
+ ASC: crescente (ad esempio, dal più piccolo al più grande per i valori numerici e da 'A' a 'Z' per le stringhe di caratteri). Se non viene specificata alcuna opzione, i dati vengono ordinati in ordine crescente per impostazione predefinita. 
+ DESC: decrescente (ad esempio, dal più grande al più piccolo per i valori numerici e da 'Z' ad 'A' per le stringhe). 

NULLS FIRST \$1 NULLS LAST  
Opzione che specifica se i valori NULL devono essere ordinati per primi, prima dei valori non null, o per ultimi, dopo i valori non null. Per impostazione predefinita, i valori NULL vengono ordinati e classificati per ultimi in ordine ASC e ordinati e classificati per primi in ordine DESC.

LIMIT *number* \$1 ALL   <a name="order-by-clause-limit"></a>
Opzione che controlla il numero di righe ordinate restituite dalla query. Il numero LIMIT deve essere un integer positivo; il valore massimo è `2147483647`.   
LIMIT 0 non restituisce righe. Puoi utilizzare questa sintassi a scopo di test: per verificare che una query venga eseguita (senza visualizzare alcuna riga) o per restituire un elenco di colonne da una tabella. Una clausola ORDER BY è ridondante se si utilizza LIMIT 0 per restituire un elenco di colonne. L'impostazione predefinita è LIMIT ALL. 

OFFSET *start*   <a name="order-by-clause-offset"></a>
Opzione che specifica di ignorare il numero di righe prima di *start* prima di iniziare a restituire righe. Il numero OFFSET deve essere un integer intero positivo; il valore massimo è `2147483647`. Se utilizzato con l'opzione LIMIT, le righe OFFSET vengono ignorate prima di iniziare a contare le righe LIMIT restituite. Se non si utilizza l'opzione LIMIT, il numero di righe nel set dei risultati viene ridotto del numero di righe che vengono ignorate. Le righe ignorate da una clausola OFFSET devono ancora essere analizzate, quindi potrebbe essere inefficiente utilizzare un valore OFFSET di grandi dimensioni.

## Note per l'utilizzo
<a name="r_ORDER_BY_usage_notes"></a>

 Nota il seguente comportamento previsto con le clausole ORDER BY: 
+ I valori NULL sono considerati "superiori" rispetto a tutti gli altri valori. Con l'ordine di ordinamento crescente predefinito, i valori NULL vengono ordinati alla fine. Per modificare questo comportamento, utilizza l'opzione NULLS FIRST.
+ Quando una query non contiene una clausola ORDER BY, il sistema restituisce serie di risultati senza ordine prevedibile delle righe. La stessa query eseguita due volte potrebbe restituire il set di risultati in un ordine diverso. 
+ Le opzioni LIMIT e OFFSET possono essere utilizzate senza una clausola ORDER BY; tuttavia, per restituire un insieme coerente di righe, utilizza queste opzioni insieme a ORDER BY. 
+ In qualsiasi sistema parallelo come Amazon Redshift, quando ORDER BY non produce un ordinamento univoco, l'ordine delle righe è non deterministico. Ovvero, se l'espressione ORDER BY produce valori duplicati, l'ordine di restituzione di tali righe potrebbe variare da altri sistemi o da una sola esecuzione di Amazon Redshift a quella successiva. 
+ Amazon Redshift non supporta letterali stringa nelle clausole ORDER BY.

# Esempi di ORDER BY
<a name="r_Examples_with_ORDER_BY"></a>

Restituisce tutte le 11 righe dalla tabella CATEGORY, ordinate in base alla seconda colonna CATGROUP. Per i risultati con lo stesso valore CATGROUP, ordina i valori della colonna CATDESC in base alla lunghezza della stringa di caratteri. Quindi ordina per colonne 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)
```

Restituisce le colonne selezionate dalla tabella SALES, ordinate in base ai valori QTYSOLD più alti. Limita il risultato alle prime 10 righe: 

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

Restituisce un elenco di colonne e nessuna riga usando la sintassi LIMIT 0: 

```
select * from venue limit 0;
venueid | venuename | venuecity | venuestate | venueseats
---------+-----------+-----------+------------+------------
(0 rows)
```

# Clausola CONNECT BY
<a name="r_CONNECT_BY_clause"></a>

La clausola CONNECT BY specifica la relazione tra le righe in una gerarchia. È possibile utilizzare CONNECT BY per selezionare le righe in ordine gerarchico eseguendo il joining della tabella con se stessa ed elaborando i dati gerarchici. Ad esempio, può essere usata per eseguire spostamenti in modo ricorsivo all'interno di un organigramma ed elencare i dati.

L'elaborazione delle query gerarchiche avviene nel seguente ordine:

1. Se la clausola FROM ha un join, viene elaborata per prima.

1. Viene valutata la clausola CONNECT BY.

1. Viene valutata la clausola WHERE.

## Sintassi
<a name="r_CONNECT_BY_clause-synopsis"></a>

```
[START WITH start_with_conditions]
CONNECT BY connect_by_conditions
```

**Nota**  
Sebbene START e CONNECT non siano parole riservate, utilizza identificatori delimitati (virgolette doppie) o AS se si utilizza START e CONNECT come alias di tabella nella query per evitare errori in fase di 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'
```

## Parameters
<a name="r_CONNECT_BY_parameters"></a>

 *start\$1with\$1conditions*   
Condizioni che specificano la riga o le righe principali della gerarchia

 *connect\$1by\$1conditions*   
Condizioni che specificano la relazione tra le righe principali e le righe secondarie della gerarchia. Almeno una condizione deve essere qualificata con l'operatore unario ` ` utilizzato per fare riferimento alla riga principale.  

```
PRIOR column = expression
-- or
expression > PRIOR column
```

## Operatori
<a name="r_CONNECT_BY_operators"></a>

È possibile utilizzare i seguenti operatori in una query CONNECT BY.

 *LEVEL*   
Pseudocolonna che restituisce il livello di riga corrente nella gerarchia. Restituisce 1 per la riga principale, 2 per la riga secondaria e così via.

 *PRIOR*   
Operatore unario che valuta l'espressione per la riga principale della riga corrente nella gerarchia.

## Esempi
<a name="r_CONNECT_BY_example"></a>

L'esempio seguente è una query CONNECT BY che restituisce il numero di dipendenti che riportano direttamente o indirettamente a John (non più di 4 livelli). 

```
SELECT id, name, manager_id
FROM employee
WHERE LEVEL < 4
START WITH name = 'John'
CONNECT BY PRIOR id = manager_id;
```

Di seguito è riportato il risultato della query.

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

 La definizione di tabella per questo esempio è la seguente: 

```
CREATE TABLE employee (
   id INT,
   name VARCHAR(20),
   manager_id INT
   );
```

 Di seguito sono riportate le righe inserite nella tabella. 

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

Di seguito è riportato un organigramma per il dipartimento di John.

![\[Diagramma dell'organigramma per il dipartimento di John.\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/images/org-chart.png)


# Esempi di sottoquery
<a name="r_Subquery_examples"></a>

Gli esempi seguenti mostrano diversi modi in cui le sottoquery si adattano alle query SELECT. Per un altro esempio dell'uso delle sottoquery, consultare [Esempi di JOIN](r_Join_examples.md). 

## Sottoquery dell'elenco SELECT
<a name="r_Subquery_examples-select-list-subquery"></a>

L'esempio seguente contiene una sottoquery nell'elenco SELECT. Questa sottoquery è *scalar*: restituisce solo una colonna e un valore, che viene ripetuto nel risultato per ogni riga restituita dalla query esterna. La query confronta il valore Q1SALES che la sottoquery calcola con i valori di vendita per due altri trimestri (2 e 3) nel 2008, come definito dalla query esterna. 

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

## Sottoquery della clausola WHERE
<a name="r_Subquery_examples-where-clause-subquery"></a>

L'esempio seguente contiene una sottoquery di tabella nella clausola WHERE. Questa sottoquery produce più righe. In questo caso, le righe contengono solo una colonna, ma le sottoquery di tabella possono contenere più colonne e righe, proprio come qualsiasi altra tabella. 

La query trova i primi 10 venditori in termini di numero di biglietti venduti. L'elenco dei primi 10 è limitato dalla sottoquery che rimuove gli utenti che vivono in città dove ci sono le sedi dei biglietti. Questa query può essere scritta in diversi modi; ad esempio, la sottoquery potrebbe essere riscritta come un join all'interno della query principale. 

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

## Sottoquery della clausola WITH
<a name="r_Subquery_examples-with-clause-subqueries"></a>

Per informazioni, consultare [Clausola WITH](r_WITH_clause.md). 

# Sottoquery correlate
<a name="r_correlated_subqueries"></a>

L'esempio seguente contiene una *sottoquery correlata* nella clausola WHERE; questo tipo di sottoquery contiene una o più correlazioni tra le sue colonne e le colonne prodotte dalla query esterna. In questo caso, la correlazione è `where s.listid=l.listid`. Per ogni riga prodotta dalla query esterna, la sottoquery viene eseguita per qualificare o squalificare la riga. 

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

## Modelli di sottoquery correlate non supportate
<a name="r_correlated_subqueries-correlated-subquery-patterns-that-are-not-supported"></a>

Il pianificatore di query utilizza un metodo di riscrittura delle query denominato decorrelazione delle sottoquery per ottimizzare diversi modelli di sottoquery correlate per l'esecuzione in un ambiente MPP. Alcuni tipi di sottoquery correlate seguono modelli che Amazon Redshift non può decorrelare e non supporta. Le query che contengono i seguenti riferimenti di correlazione restituiscono errori: 
+  Riferimenti di correlazione che ignorano un blocco di query, noti anche come "riferimenti di correlazione ignorati". Ad esempio, nella seguente query, il blocco contenente il riferimento di correlazione e il blocco ignorato sono collegati da un predicato NOT EXISTS: 

  ```
  select event.eventname from event
  where not exists
  (select * from listing
  where not exists
  (select * from sales where event.eventid=sales.eventid));
  ```

  Il blocco ignorato in questo caso è la sottoquery rispetto alla tabella LISTING. Il riferimento di correlazione correla le tabelle EVENT e SALES. 
+  Riferimenti di correlazione di una sottoquery che fa parte di una clausola ON in una query esterna: 

  ```
  select * from category
  left join event
  on category.catid=event.catid and eventid =
  (select max(eventid) from sales where sales.eventid=event.eventid);
  ```

  La clausola ON contiene un riferimento di correlazione da SALES nella sottoquery a EVENT nella query esterna. 
+ Riferimenti di correlazione che rispettano i valori null a una tabella di sistema di Amazon Redshift. Ad esempio: 

  ```
  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);
  ```
+ Riferimenti di correlazione da una sottoquery contenente una funzione finestra. 

  ```
  select listid, qtysold
  from sales s
  where qtysold not in
  (select sum(numtickets) over() from listing l where s.listid=l.listid);
  ```
+ Riferimenti in una colonna GROUP BY ai risultati di una sottoquery correlata. Ad esempio: 

  ```
  select listing.listid,
  (select count (sales.listid) from sales where sales.listid=listing.listid) as list
  from listing
  group by list, listing.listid;
  ```
+ Riferimenti di correlazione da una sottoquery con una funzione di aggregazione e una clausola GROUP BY, connessi alla query esterna da un predicato IN. Questa restrizione non si applica alle funzioni di aggregazione MIN e MAX. Esempio: 

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

Seleziona le righe definite da qualsiasi query e le inserisce in una nuova tabella. Puoi specificare se creare una tabella permanente o temporanea. 

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

 Per dettagli sui parametri di questo comando, vedi [SELECT](r_SELECT_synopsis.md). 

## Esempi
<a name="r_SELECT_INTO-examples"></a>

Seleziona tutte le righe dalla tabella EVENT e crea una tabella NEWEVENT: 

```
select * into newevent from event;
```

Seleziona il risultato di una query di aggregazione in una tabella temporanea denominata 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>

Imposta il valore di un parametro di configurazione del server. Utilizzare il comando SET per sostituire un'impostazione solo per la durata della sessione o della transazione corrente.

Utilizza il comando [RESET](r_RESET.md) per restituire un parametro al valore predefinito. 

È possibile modificare i parametri di configurazione del server in diversi modi. Per ulteriori informazioni, consulta [Modifica della configurazione del server](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings). 

## Sintassi
<a name="r_SET-synopsis"></a>

```
SET { [ SESSION | LOCAL ]
{ SEED | parameter_name } { TO | = }
{ value | 'value' | DEFAULT } |
SEED TO value }
```

La seguente istruzione imposta il valore di una variabile di contesto di sessione.

```
SET { [ SESSION | LOCAL ]
variable_name { TO | = }
{ value | 'value'  }
```

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

SESSION   
Specifica che l'impostazione è valida per la sessione corrente. Valore predefinito.

*variable\$1name*   
Specifica il nome della variabile di contesto impostata per la sessione.  
La convenzione di denominazione è un nome in due parti separato da un punto, ad esempio *identifier.identifier*. È consentito un solo separatore di punti. Utilizzare un *identificatore* che segua le regole standard degli identificatori per Amazon Redshift Per ulteriori informazioni, consulta [Nomi e identificatori](r_names.md). Gli identificativi delimitati non sono ammessi.

LOCAL   
Specifica che l'impostazione è valida per la transazione corrente. 

SEED TO *value*   
Imposta un seed interno che deve essere utilizzata dalla funzione RANDOM per la generazione di numeri casuali.  
SET SEED accetta un *valore* numerico compreso tra 0 e 1 e moltiplica questo numero per (231-1) per l'uso con la funzione [Funzione RANDOM](r_RANDOM.md). Se utilizzi SET SEED prima di effettuare più chiamate RANDOM, RANDOM genera numeri in una sequenza prevedibile.

 *parameter\$1name*   
Nome del parametro da impostare. Per informazioni sui parametri, vedi [Modifica della configurazione del server](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings).

 *value*   
Nuovo valore del parametro. Utilizza le virgolette singole per impostare il valore su una stringa specifica. Se si utilizza SET SEED, questo parametro contiene il valore SEED. 

DEFAULT   
Imposta il parametro sul valore predefinito.

## Esempi
<a name="r_SET-examples"></a>

 **Modifica di un parametro per la sessione corrente** 

L'esempio seguente imposta il datestyle:

```
set datestyle to 'SQL,DMY';
```

 **Impostazione di un gruppo di query per la gestione dei carichi di lavoro** 

Se i gruppi di query sono elencati in una definizione di coda come parte della configurazione WLM del cluster, puoi impostare il parametro QUERY\$1GROUP su un nome di gruppo di query elencato. Le query successive vengono assegnate alla coda di query associata. L'impostazione di QUERY\$1GROUP rimane valida per la durata della sessione o finché non viene rilevato un comando RESET QUERY\$1GROUP.

Questo esempio esegue due query come parte del gruppo di query 'priority', quindi reimposta il gruppo di query. 

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

Per ulteriori informazioni, consulta [Gestione dei carichi di lavoro](cm-c-implementing-workload-management.md). 

 **Modifica il namespace di identità predefinito per la sessione** 

Un utente del database può impostare `default_identity_namespace`. Questo esempio mostra come utilizzare `SET SESSION` per sovrascrivere l’impostazione per la durata della sessione corrente e quindi mostrare il nuovo valore del provider di identità. Viene utilizzato più comunemente quando utilizzi un provider di identità con Redshift e Centro identità IAM. Per ulteriori informazioni sull’utilizzo di un provider di identità con Redshift, consulta [Connessione di Redshift a Centro identità IAM per offrire agli utenti un’esperienza di single sign-on](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;
```

Dopo avere eseguito il comando, puoi utilizzare un’istruzione GRANT o un’istruzione CREATE come la seguente:

```
GRANT SELECT ON TABLE mytable TO alice;

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

In questo caso, l’effetto dell’impostazione del namespace di identità predefinito equivale ad anteporre il namespace a ogni identità. In questo esempio, `alice` viene sostituito da `MYCO:alice`. Per ulteriori informazioni sulle impostazioni relative alla configurazione di Redshift con Centro identità IAM, consulta [ALTER SYSTEM](r_ALTER_SYSTEM.md) e [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md).

 **Impostazione di un'etichetta per un gruppo di query** 

Il parametro QUERY\$1GROUP definisce un'etichetta per una o più query eseguite nella stessa sessione dopo un comando SET. A sua volta, questa etichetta viene registrata quando vengono eseguite le query e può essere utilizzata per limitare i risultati restituiti dalle tabelle di sistema STL\$1QUERY e STV\$1INFLIGHT e dalla vista SVL\$1QLOG. 

```
show query_group;
query_group
-------------
unset
(1 row)

set query_group to '6 p.m.';


show query_group;
query_group
-------------
6 p.m.
(1 row)

select * from sales where salesid=500;
salesid | listid | sellerid | buyerid | eventid | dateid | ...
---------+--------+----------+---------+---------+--------+-----
500 |    504 |     3858 |    2123 |    5871 |   2052 | ...
(1 row)

reset query_group;

select query, trim(label) querygroup, pid, trim(querytxt) sql
from stl_query
where label ='6 p.m.';
query | querygroup |  pid  |                  sql
-------+------------+-------+----------------------------------------
57 | 6 p.m.     | 30711 | select * from sales where salesid=500;
(1 row)
```

Le etichette dei gruppi di query sono un meccanismo utile per isolare singole query o gruppi di query eseguite come parte degli script. Non è necessario identificare e tracciare le query in base alle loro etichette IDs; puoi tracciarle in base alle loro etichette.

 **Impostazione di un valore di seed per la generazione di numeri casuali** 

L'esempio seguente utilizza l'opzione SEED con SET per far sì che la funzione RANDOM generi numeri in una sequenza prevedibile.

Innanzitutto, restituisce tre interi RANDOM senza prima impostare il valore SEED: 

```
select cast (random() * 100 as int);
int4
------
6
(1 row)

select cast (random() * 100 as int);
int4
------
68
(1 row)

select cast (random() * 100 as int);
int4
------
56
(1 row)
```

Ora impostare il valore SEED su `.25`, e restituire altri tre numeri 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)
```

Infine, ripristinare il valore SEED su `.25`, e verificare che RANDOM restituisca gli stessi risultati delle tre chiamate precedenti: 

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

Nell'esempio seguente viene impostata una variabile di contesto personalizzata. 

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

Imposta il nome utente per la sessione corrente.

Puoi utilizzare il comando SET SESSION AUTHORIZATION, ad esempio, per verificare l'accesso al database eseguendo temporaneamente una sessione o una transazione come utente non privilegiato. Per eseguire questo comando, è necessario essere un utente con privilegi avanzati del database.

## Sintassi
<a name="r_SET_SESSION_AUTHORIZATION-synopsis"></a>

```
SET [ LOCAL ] SESSION AUTHORIZATION { user_name | DEFAULT }
```

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

LOCAL  
Specifica che l'impostazione è valida per la transazione corrente. L'omissione di questo parametro indica che l'impostazione è valida per la sessione corrente.

 *user\$1name*   
Nome dell'utente da impostare. Il nome utente può essere scritto come identificatore o stringa letterale.

DEFAULT  
Imposta il nome utente della sessione sul valore predefinito.

## Esempi
<a name="r_SET_SESSION_AUTHORIZATION-examples"></a>

L'esempio seguente imposta il nome utente per la sessione corrente su `dwuser`:

```
SET SESSION AUTHORIZATION 'dwuser';
```

L'esempio seguente imposta il nome utente per la transazione corrente su `dwuser`:

```
SET LOCAL SESSION AUTHORIZATION 'dwuser';
```

L'esempio seguente imposta il nome utente per la sessione corrente sul nome utente predefinito:

```
SET SESSION AUTHORIZATION DEFAULT;
```

# SET SESSION CHARACTERISTICS
<a name="r_SET_SESSION_CHARACTERISTICS"></a>

Questo comando è obsoleto.

# MOSTRA
<a name="r_SHOW"></a>

Visualizza il valore corrente di un parametro di configurazione del server. Questo valore può essere specifico per la sessione corrente se è attivo un comando SET. Per un elenco dei parametri di configurazione, consultare [Informazioni di riferimento sulla configurazione](cm_chap_ConfigurationRef.md).

## Sintassi
<a name="r_SHOW-synopsis"></a>

```
SHOW { parameter_name | ALL }
```

L'istruzione seguente mostra il valore corrente di una variabile di contesto di sessione. Se la variabile non esiste, Amazon Redshift genera un errore.

```
SHOW variable_name
```

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

 *parameter\$1name*   
Visualizza il valore corrente del parametro specificato.

ALL   
Visualizza i valori correnti di tutti i parametri.

*variable\$1name*   
Visualizza il valore corrente della variabile specificata.

## Esempi
<a name="r_SHOW-examples"></a>

L'esempio seguente visualizza il valore per il parametro del gruppo di query: 

```
show query_group;

query_group

unset
(1 row)
```

L'esempio seguente mostra un elenco di tutti i parametri e i relativi valori: 

```
show all;
name        |   setting
--------------------+--------------
datestyle          | ISO, MDY
extra_float_digits | 0
query_group        | unset
search_path        | $user,public
statement_timeout  | 0
```

L'esempio seguente mostra il valore corrente della variabile specificata.

```
SHOW app_context.user_id;
```

# MOSTRA LE CONCESSIONI ALLE COLONNE
<a name="r_SHOW_COLUMN_GRANTS"></a>

Visualizza le sovvenzioni su una colonna all'interno di una tabella.

## Autorizzazioni richieste
<a name="r_SHOW_COLUMN_GRANTS-required-permissions"></a>

SHOW GRANTS per un oggetto di destinazione mostrerà solo le concessioni visibili all'utente corrente. Una concessione è visibile all'utente corrente se l'utente corrente soddisfa uno dei seguenti criteri:
+ Diventa un superutente
+ Sii l'utente autorizzato
+ Diventa proprietario del ruolo assegnato
+ Ricevere il ruolo a cui si riferisce la concessione dell'oggetto

## Sintassi
<a name="r_SHOW_COLUMN_GRANTS-synopsis"></a>

```
SHOW COLUMN GRANTS ON TABLE
{ database_name.schema_name.table_name | schema_name.table_name }
[FOR {username | ROLE role_name | PUBLIC}]
[LIMIT row_limit]
```

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

database\$1name  
Il nome del database contenente la tabella di destinazione

schema\$1name  
Il nome dello schema contenente la tabella di destinazione

table\$1name  
Il nome della tabella di destinazione

username  
Includi solo le concessioni al nome utente nell'output

role\$1name  
Includi solo le concessioni a role\$1name nell'output

PUBLIC  
Includi solo le sovvenzioni a PUBLIC nell'output

row\$1limit  
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000.

## Esempi
<a name="r_SHOW_COLUMN_GRANTS-examples"></a>

L'esempio seguente mostra le concessioni di colonne nella tabella 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
```

L'esempio seguente mostra le assegnazioni di colonne nella tabella demo\$1schema.t100 per l'utente bob:

```
SHOW COLUMN GRANTS ON TABLE demo_schema.t100 for bob;
 database_name | schema_name | table_name | column_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+-------------+------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | demo_schema | t100       | b           | COLUMN      | UPDATE         |         135 | bob           | user          | f            | COLUMN          | dbadmin
```

# SHOW COLUMNS
<a name="r_SHOW_COLUMNS"></a>

Mostra un elenco di colonne in una tabella, insieme ad alcuni attributi delle colonne.

Ogni riga di output è costituita da un elenco separato da virgole di nome del database, nome dello schema, nome della tabella, nome della colonna, posizione ordinale, impostazione predefinita della colonna, valore nullable, tipo di dati, lunghezza massima dei caratteri, precisione numerica, commenti, tipo di chiave di ordinamento, ordine della chiave di ordinamento, chiave di distribuzione, codifica e confronto. Per ulteriori informazioni su questi attributi, consulta [SVV\$1ALL\$1COLUMNS](r_SVV_ALL_COLUMNS.md).

Se il comando SHOW COLUMNS restituisce più di 10.000 colonne, viene restituito un errore.

## Autorizzazioni richieste
<a name="r_SHOW_COLUMNS-privileges"></a>

Per visualizzare una colonna in una tabella Amazon Redshift, l’utente corrente deve soddisfare uno dei seguenti criteri:
+ Essere un utente con privilegi avanzati.
+ Essere il proprietario della tabella.
+ Sono stati concessi il privilegio USAGE per lo schema principale e il privilegio SELECT per la tabella o il privilegio SELECT per la colonna.

## Sintassi
<a name="r_SHOW_COLUMNS-synopsis"></a>

```
SHOW COLUMNS FROM TABLE database_name.schema_name.table_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

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

 *database\$1name*   
Il nome del database che contiene le tabelle da elencare.   
Per mostrare le tabelle in un formato AWS Glue Data Catalog, specifica (`awsdatacatalog`) come nome del database e assicurati che la configurazione del sistema sia impostata su. `data_catalog_auto_mount` `true` Per ulteriori informazioni, consulta [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *schema\$1name*   
Il nome dello schema che contiene le tabelle da elencare.   
Per mostrare AWS Glue Data Catalog le tabelle, fornite il nome del AWS Glue database come nome dello schema.

 *table\$1name*   
Il nome dello tabella che contiene le colonne da elencare. 

 *filter\$1pattern*   
Un'espressione di caratteri UTF-8 valida con il modello da associare ai nomi della tabella. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_SHOW_COLUMNS.html)
Se il *filter\$1pattern* non contiene metacaratteri, allora il modello rappresenta solo la stringa stessa; in questo caso LIKE agisce come l'operatore di uguaglianza. 

 *row\$1limit*   
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000. 

## Esempi
<a name="r_SHOW_COLUMNS-examples"></a>

L'esempio seguente mostra le colonne del database Amazon Redshift denominate `sample_data_dev` che sono nello schema `tickit` e tabella `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 |
```

L'esempio seguente mostra le tabelle del AWS Glue Data Catalog database denominate `awsdatacatalog` che si trovano nello schema `batman` e nella tabella`nation`. L'output è limitato a `2` righe.

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

# MOSTRA I VINCOLI
<a name="r_SHOW_CONSTRAINTS"></a>

Mostra un elenco di vincoli di chiave primaria e chiave esterna in una tabella.

## Autorizzazioni richieste
<a name="r_SHOW_CONSTRAINTS-required-permissions"></a>

Per eseguire SHOW CONSTRAINTS su una tabella, l'utente corrente deve soddisfare uno dei seguenti criteri:
+ Diventa un superutente
+ Diventa il proprietario del tavolo
+ Ottieni il privilegio USAGE sullo schema principale e il privilegio SELECT sulla tabella

## Sintassi
<a name="r_SHOW_CONSTRAINTS-synopsis"></a>

```
SHOW CONSTRAINTS {PRIMARY KEYS | FOREIGN KEYS [EXPORTED]}
FROM TABLE
{ database_name.schema_name.table_name | schema_name.table_name }
[LIMIT row_limit]
```

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

*database\$1name*  
Il nome del database contenente la tabella di destinazione

*schema\$1name*  
Il nome dello schema contenente la tabella di destinazione

*table\$1name*  
Il nome della tabella di destinazione

ESPORTATO  
Quando viene specificato EXPORTED, elenca tutte le chiavi esterne di altre tabelle che fanno riferimento alla tabella di destinazione.

*row\$1limit*  
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000.

## Esempi
<a name="r_SHOW_CONSTRAINTS-examples"></a>

L'esempio seguente mostra i vincoli di chiave primaria della tabella 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
```

L'esempio seguente mostra i vincoli di chiave esterna dalla tabella 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 |             |             |
```

L'esempio seguente mostra i vincoli di chiave esterna esportati dalla tabella 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>

Mostra la definizione di una tabella esterna, inclusi gli attributi delle tabelle e gli attributi delle colonne. È possibile utilizzare l'output dell'istruzione SHOW EXTERNAL TABLE per ricreare la tabella. 

Per ulteriori informazioni sulla creazione delle tabelle esterne, consultare [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md). 

## Sintassi
<a name="r_SHOW_EXTERNAL_TABLE-synopsis"></a>

```
SHOW EXTERNAL TABLE [external_database].external_schema.table_name [ PARTITION ]
```

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

 *external\$1database*   
Il nome del database esterno associato. Questo parametro è facoltativo.

 *external\$1schema*   
Il nome dello schema esterno associato. 

 *table\$1name*   
Il nome della tabella da visualizzare. 

PARTITION   
Visualizza le istruzioni ALTER TABLE per aggiungere le partizioni alla definizione della tabella. 

## Esempi
<a name="r_SHOW_EXTERNAL_TABLE-examples"></a>

Gli esempi seguenti si basano su una tabella esterna definita come segue:

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

Di seguito è riportato un esempio del comando SHOW EXTERNAL TABLE e l'output per la tabella `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';"
```

Di seguito è riportato un esempio del comando SHOW EXTERNAL TABLE e dell’output per la stessa tabella, ma con il database specificato anche nel parametro.

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

Di seguito è riportato un esempio del comando SHOW EXTERNAL TABLE e l'output quando si utilizza il parametro `PARTITION`. L'output contiene istruzioni ALTER TABLE per aggiungere le partizioni alla definizione della tabella.

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

Visualizza i database da un Catalogo dati o un data warehouse Amazon Redshift. SHOW DATABASES elenca tutti i database accessibili, ad esempio, all'interno del data warehouse, i AWS Glue Data Catalog database (awsdatacatalog), i database di condivisione dei dati e i database Lake Formation.

## Autorizzazioni richieste
<a name="r_SHOW_DATABASES-privileges"></a>

Tutti i database sono visibili agli utenti tranne:
+ Per i database creati da un’unità di condivisione dati con autorizzazioni per essere visibili, all’utente corrente deve essere concessa l’autorizzazione USAGE per il database.

## Sintassi
<a name="r_SHOW_DATABASES-syntax"></a>

Per mostrare i database di un data warehouse Amazon Redshift:

```
SHOW DATABASES 
[ LIKE '<expression>' ]
[ LIMIT row_limit ]
```

Per mostrare i database di un Catalogo dati:

```
SHOW DATABASES FROM DATA CATALOG 
[ ACCOUNT  '<id1>', '<id2>', ... ]
[ LIKE '<expression>' ]
[ IAM_ROLE default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' ]
[ LIMIT row_limit ]
```

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

ACCOUNT '<id1>', '<id2>', ...   
Gli AWS Glue Data Catalog account da cui elencare i database. L'omissione di questo parametro indica che Amazon Redshift deve mostrare i database dell'account proprietario del cluster.

LIKE '<expression>'  
Filtra l'elenco di database mostrando solo quelli che soddisfano l'espressione specificata. Questo parametro supporta modelli che utilizzano i caratteri jolly % (percento) e \$1 (carattere di sottolineatura).

IAM\$1ROLE default \$1 'SESSION' \$1 'arn:aws:iam::<account-id>:role/<role-name>'  
Se specifichi un ruolo IAM associato al cluster quando esegui il comando SHOW DATABASES, Amazon Redshift utilizzerà le credenziali del ruolo quando esegui le query sul database.  
Specificare la parola chiave `default` significa utilizzare il ruolo IAM impostato come predefinito e associato al cluster.  
Utilizza `'SESSION'` se ti connetti al cluster Amazon Redshift utilizzando un'identità federata e accedi alle tabelle dallo schema esterno creato con il comando [CREATE DATABASE](r_CREATE_DATABASE.md). Per ulteriori informazioni, consulta l'argomento relativo a [Utilizzo di un'identità federata per gestire l'accesso di Amazon Redshift alle risorse locali e alle tabelle esterne di Amazon Redshift Spectrum](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html), che illustra come configurare l'identità federata.   
L'Amazon Resource Name (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione. Come minimo, il ruolo IAM deve disporre dell'autorizzazione per eseguire un'operazione LIST sul bucket Amazon S3 a cui accedere e un'operazione GET sugli oggetti Amazon S3 contenuti nel bucket. Per ulteriori informazioni sui database creati da AWS Glue Data Catalog for datashare e utilizzando IAM\$1ROLE, vedi [Lavorare con le condivisioni di dati gestite da Lake Formation](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html) come consumatore.  
Quanto segue mostra la sintassi per la stringa di parametro IAM\$1ROLE per un singolo ARN.  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
È possibile concatenare i ruoli in modo che il cluster possa presumere un altro ruolo IAM, possibilmente appartenente a un altro account. Puoi concatenare fino a 10 ruoli. Per ulteriori informazioni, consulta [Concatenazione di ruoli IAM per Amazon Redshift Spectrum](c-spectrum-iam-policies.md#c-spectrum-chaining-roles).   
 Per collegare a questo ruolo IAM una policy di autorizzazioni IAM simile alla seguente.    
****  

```
{
    "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": "*"
        }
    ]
}
```
Per la procedura per creare un ruolo IAM da utilizzare con la query federata, consultare [Creazione di un segreto e di un ruolo IAM per l'utilizzo di query federate](federated-create-secret-iam-role.md).   
Non includere spazi nell'elenco dei ruoli concatenati.
Quanto segue mostra la sintassi per concatenare tre ruoli.  

```
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*  
Clausola per LIMITARE il numero di righe restituite. Dove *row\$1limit* è il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000.

## Esempi
<a name="r_SHOW_DATABASES-examples"></a>

L'esempio seguente mostra tutti i database del catalogo dati dell'account con ID 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 |          |
```

Di seguito sono riportati esempi che dimostrano come visualizzare tutti i database del Catalogo dati dall'account con ID 123456789012 utilizzando le credenziali di un ruolo IAM.

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE default;
```

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE <iam-role-arn>;
```

L’esempio seguente mostra tutti i database nel data warehouse Amazon Redshift connesso.

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

# MOSTRA LE FUNZIONI
<a name="r_SHOW_FUNCTIONS"></a>

Mostra un elenco di funzioni in uno schema, insieme alle informazioni sugli oggetti elencati.

Ogni riga di output contiene le colonne database\$1name, schema\$1name, function\$1name, number\$1of\$1arguments, argument\$1list, return\$1type, remarks.

Se da SHOW FUNCTIONS risultano più di 10.000 righe, il comando genera un errore.

## Autorizzazioni richieste
<a name="r_SHOW_FUNCTIONS-required-permissions"></a>

Per visualizzare una funzione in uno schema Redshift, l'utente corrente deve soddisfare uno dei seguenti criteri:
+ Diventa un superutente
+ Sii il proprietario della funzione
+ È stato concesso il privilegio USAGE sullo schema principale e concesso EXECUTE sulla funzione

## Sintassi
<a name="r_SHOW_FUNCTIONS-synopsis"></a>

```
SHOW FUNCTIONS FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

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

*database\$1name*  
Il nome del database che contiene le funzioni da elencare.

*schema\$1name*  
Il nome dello schema che contiene le funzioni da elencare.

*filter\$1pattern*  
Un'espressione di caratteri UTF-8 valida con uno schema che corrisponde ai nomi delle funzioni. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_SHOW_FUNCTIONS.html)
Nota che filter\$1pattern corrisponde solo al nome della funzione.

*row\$1limit*  
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000.

## Esempi
<a name="r_SHOW_FUNCTIONS-examples"></a>

L'esempio seguente mostra le funzioni dello schema 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           |
```

L'esempio seguente mostra le funzioni dello schema demo\$1schema con nomi che terminano con '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>

Visualizza le concessioni per un utente, un ruolo o un oggetto. L'oggetto può essere un database, uno schema, una tabella, una funzione o un modello. Quando specifichi un oggetto, ad esempio una tabella o una funzione, devi qualificarlo con una notazione in due o tre parti. Ad esempio `schema_name.table_name` o `database_name.schema_name.table_name`.

Se da SHOW GRANTS risultano più di 10.000 righe, il comando genera un errore.

## Autorizzazioni richieste
<a name="r_SHOW_GRANTS-permissions"></a>

Per eseguire SHOW GRANTS per un utente o un ruolo di destinazione, l'utente corrente deve soddisfare uno dei seguenti criteri:
+ Diventa un superutente
+ Sii l'utente bersaglio
+ Diventa il proprietario del ruolo target
+ Ricevere il ruolo

SHOW GRANTS per un oggetto di destinazione mostrerà solo le concessioni visibili all'utente corrente. Una concessione è visibile all'utente corrente se l'utente corrente soddisfa uno dei seguenti criteri:
+ Diventa un superutente
+ Sii l'utente bersaglio
+ Diventa proprietario del ruolo assegnato
+ Ricevere il ruolo a cui si riferisce la concessione dell'oggetto

## Sintassi
<a name="r_SHOW_GRANTS-syntax"></a>

Di seguito è riportata la sintassi per visualizzare le concessioni per un oggetto. Tieni presente che il secondo modo di specificare una funzione è valido solo per gli schemi e i database creati da un’unità di condivisione dati.

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

Di seguito è riportata la sintassi per visualizzare le concessioni per un utente o un ruolo. 

```
SHOW GRANTS FOR
{username | ROLE role_name}
[FROM DATABASE database_name]
[LIMIT row_limit]
```

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

 *database\$1name*   
Il nome del database per cui visualizzare le concessioni.

 *function\$1name*   
Il nome della funzione per cui visualizzare le concessioni.

nome\$1modello  
Il nome del modello su cui mostrare le sovvenzioni.

 *schema\$1name*   
Il nome dello schema per cui visualizzare le concessioni.

 *table\$1name*   
Il nome della tabella per cui visualizzare le concessioni.

FOR *username*   
Indica la visualizzazione delle concessioni per un utente.

FOR ROLE *role\$1name*   
Indica la visualizzazione delle concessioni per un ruolo.

FOR PUBLIC  
Indica la visualizzazione delle concessioni per PUBLIC.

 *row\$1limit*   
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000. 

## Esempi
<a name="r_SHOW_GRANTS-examples"></a>

L’esempio seguente visualizza tutte le concessioni relative a un database denominato `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
```

Il comando seguente mostra tutte le concessioni relative a uno schema denominato `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
```

Il comando seguente mostra tutte le concessioni relative a un utente denominato `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
```

Il comando seguente mostra tutte le concessioni relative a una tabella denominata `t3` per un utente denominato `alice`. Tieni presente che puoi utilizzare una notazione in due o tre parti per specificare il nome della tabella.

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

L’esempio seguente mostra tutte le concessioni relative a una tabella denominata `t4`. Osserva i diversi modi in cui puoi specificare il nome della tabella.

```
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 le informazioni utili su un modello di machine learning, inclusi lo stato, i parametri utilizzati per crearlo e la funzione di previsione con i relativi tipi di argomenti di input. È possibile utilizzare le informazioni da SHOW MODEL per ricreare il modello. Se le tabelle di base sono state modificate, l'esecuzione di CREATE MODEL con la stessa istruzione SQL genera un modello diverso. Le informazioni restituite da SHOW MODEL sono diverse per il proprietario del modello e per un utente con il privilegio EXECUTE. SHOW MODEL mostra diversi output quando un modello viene addestrato da Amazon Redshift o quando il modello è un modello BYOM.

## Sintassi
<a name="r_SHOW_MODEL-synopsis"></a>

```
SHOW MODEL ( ALL | model_name )
```

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

ALL   
Restituisce tutti i modelli che l'utente può utilizzare e i relativi schemi.

 *model\$1name*   
Il nome del modello. Il nome del modello in uno schema deve essere unico.

## Note per l'utilizzo
<a name="r_SHOW_MODEL_usage_notes"></a>

Il comando SHOW MODEL restituisce: 
+ Il nome del modello.
+ Lo schema in cui è stato creato il modello.
+ Il proprietario del modello.
+ L'ora di creazione del modello.
+ Lo stato del modello, ad esempio READY, TRAINING o FAILED.
+ Il messaggio del motivo per un modello fallito.
+ L'errore di convalida se il modello ha terminato l'addestramento.
+ Il costo stimato necessario per ricavare il modello per un approccio non BYOM. Solo il proprietario del modello può visualizzare queste informazioni.
+ Un elenco dei parametri specificati dall'utente e dei relativi valori, in particolare i seguenti elementi:
  + La colonna TARGET specificata.
  + Il tipo di modello, AUTO o XGBoost.
  + Il tipo di problema, come REGRESSION, BINARY\$1CLASSIFICATION, MULTICLASS\$1CLASSIFICATION. Questo parametro è specifico di AUTO.
  + Il nome del processo di formazione Amazon SageMaker AI o del processo Amazon SageMaker AI Autopilot che ha creato il modello. Puoi utilizzare questo nome di lavoro per trovare ulteriori informazioni sul modello su Amazon SageMaker AI.
  + L'obiettivo, come MSE, F1, Accuracy. Questo parametro è specifico di AUTO.
  + Il nome della funzione creata.
  + Il tipo di inferenza, locale o remota.
  + Gli argomenti di input della funzione di previsione.
  + I tipi di argomenti di input della funzione di previsione per i modelli che non sono BYOM (bring your own model).
  + Il tipo restituito della funzione di previsione. Questo parametro è specifico di BYOM.
  + Il nome dell'endpoint Amazon SageMaker AI per un modello BYOM con inferenza remota.
  + Il ruolo IAM. Solo il proprietario del modello può vederlo.
  + Il bucket S3 utilizzato. Solo il proprietario del modello può vederlo.
  + La AWS KMS chiave, se ne è stata fornita una. Solo il proprietario del modello può vederlo.
  + Il tempo massimo di esecuzione del modello.
+ Se il tipo di modello non è AUTO, Amazon Redshift mostra anche l'elenco degli iperparametri forniti e i relativi valori.

È inoltre possibile visualizzare alcune delle informazioni fornite da SHOW MODEL in altre tabelle di catalogo, come pg\$1proc. Amazon Redshift restituisce informazioni sulla funzione di previsione registrata nella tabella del catalogo pg\$1proc. Queste informazioni includono i nomi degli argomenti di input e i relativi tipi per la funzione di previsione. Amazon Redshift restituisce le stesse informazioni nel comando SHOW MODEL.

```
SELECT * FROM pg_proc WHERE proname ILIKE '%<function_name>%';
```

## Esempi
<a name="r_SHOW_MODEL-examples"></a>

L'esempio seguente mostra l'output di show model.

```
SHOW MODEL ALL;

Schema Name |  Model Name
------------+---------------
 public     | customer_churn
```

Il proprietario di customer\$1churn può visualizzare il seguente output. Un utente con solo il privilegio EXECUTE non può visualizzare il ruolo IAM, il bucket Amazon S3 e il costo stimato della modalità.

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

Visualizza le condivisioni in entrata e in uscita in un cluster dallo stesso account o tra account. Se non si specifica un nome di una unità di condivisione dati, Amazon Redshift visualizza tutte le unità di condivisione dati in tutti i database del cluster. Gli utenti che dispongono dei privilegi ALTER e SHARE possono visualizzare le condivisioni per le quali dispongono dei privilegi. 

## Sintassi
<a name="r_SHOW_DATASHARES-synopsis"></a>

```
SHOW DATASHARES [ LIKE 'namepattern' ] 
```

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

LIKE  
Una clausola facoltativa che confronta il modello di nome specificato con la descrizione dell'unità di condivisione dati. Quando si utilizza questa clausola, Amazon Redshift visualizza solo le unità di condivisione dati con nomi che corrispondono al modello di nome specificato.

*namepattern*  
Il nome dell'unità di condivisione dati richiesta o parte del nome da associare utilizzando caratteri jolly.

## Esempi
<a name="r_SHOW_DATASHARES-examples"></a>

L'esempio seguente mostra le unità di condivisione dati in entrata e in uscita in un 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
```

# MOSTRA PARAMETRI
<a name="r_SHOW_PARAMETERS"></a>

Mostra un elenco di parametri per una funzione/procedura, insieme ad alcune informazioni sui parametri.

Ogni riga di output contiene le colonne database\$1name, schema\$1name, procedure\$1name o function\$1name, parameter\$1name, ordinal\$1position, parameter\$1type (IN/OUT), data\$1type, character\$1maximum\$1length, numeric\$1precision, numeric\$1scale e remarks.

## Autorizzazioni richieste
<a name="r_SHOW_PARAMETERS-required-permissions"></a>

Per visualizzare uno schema redshift, l'utente corrente function/procedure deve soddisfare uno dei seguenti criteri:
+ Diventa un superutente
+ Sii il proprietario della funzione
+ È stato concesso il privilegio USAGE sullo schema principale e concesso EXECUTE sulla funzione

## Sintassi
<a name="r_SHOW_PARAMETERS-synopsis"></a>

```
SHOW PARAMETERS OF {FUNCTION| PROCEDURE}
[database_name.]schema_name.function_name(argtype [, ...] )
[LIKE 'filter_pattern'];
```

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

*database\$1name*  
Il nome del database che contiene la funzione da elencare.

*schema\$1name*  
Il nome dello schema che contiene la funzione da elencare.

*filter\$1pattern*  
Un'espressione di caratteri UTF-8 valida con il modello da associare ai nomi della tabella. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_SHOW_PARAMETERS.html)

## Esempi
<a name="r_SHOW_PARAMETERS-examples"></a>

L'esempio seguente mostra i parametri della procedura 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                     |                          |                   |
```

L'esempio seguente mostra i parametri della procedura demo\$1schema.f1 con nomi che iniziano con '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
```

L'esempio seguente mostra i parametri della funzione 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                     |                          |                   |
```

# MOSTRA LE POLITICHE
<a name="r_SHOW_POLICIES"></a>

Visualizza le politiche di sicurezza a livello di riga (RLS) e di mascheramento dinamico dei dati (DDM) definite in un database, nonché le politiche RLS e DDM applicate a relazioni specifiche. Solo un superutente o un utente con il `sys:secadmin` ruolo nel database può visualizzare i risultati di queste politiche.

## Sintassi
<a name="r_SHOW_POLICIES-synopsis"></a>

```
SHOW { RLS | MASKING } POLICIES
[
    ON { database_name.schema_name.relation_name
       | schema_name.relation_name
       }
    [ FOR { user_name | ROLE role_name | PUBLIC } ]
  |
    FROM DATABASE database_name
]
[ LIMIT row_limit ];
```

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

*database\$1name*  
Il nome del database da cui mostrare le politiche.

*schema\$1name*  
Nome dello schema della relazione su cui mostrare le politiche allegate.

*relation\$1name*  
Il nome della relazione su cui mostrare le politiche allegate.

*user\$1name*  
Il nome dell'utente per il quale la politica è allegata alla relazione.

*role\$1name*  
Il nome del ruolo per il quale la politica è allegata alla relazione.

*row\$1limit*  
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000.

**Nota**  
La visualizzazione delle policy da un database diverso dal database connesso è supportata su Amazon Redshift Federated Permissions Catalog. Il comando SHOW POLICIES supporta query tra database per tutti i database nei magazzini con autorizzazioni federate Amazon Redshift

## Esempi
<a name="r_SHOW_POLICIES-examples"></a>

Il comando seguente mostra le politiche RLS del database connesso.

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

Il comando seguente mostra le politiche di mascheramento dal database «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)
```

Il comando seguente mostra le politiche RLS allegate alla relazione 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
```

Il comando seguente mostra le politiche di mascheramento allegate alla relazione transaction\$1table dal database «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"]
```

Il comando seguente mostra le politiche RLS allegate alla relazione sales\$1table dal database «sales\$1db.finance-catalog» per l'utente «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
```

Il comando seguente mostra le politiche RLS allegate alla relazione transaction\$1table dal database «sales\$1db.finance-catalog» per il ruolo 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 la definizione di una determinata procedura archiviata, inclusa la relativa firma. Puoi utilizzare l'output di un SHOW PROCEDURE per ricreare la procedura archiviata. 

## Sintassi
<a name="r_SHOW_PROCEDURE-synopsis"></a>

```
SHOW PROCEDURE sp_name [( [ [ argname ] [ argmode ] argtype [, ...] ] )]
```

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

 *sp\$1name*   
Il nome della procedura da mostrare. 

*[argname] [ argmode] argtype*   
Tipi di argomento di input per individuare la procedura archiviata. Facoltativamente, puoi includere i tipi di dati dell'argomento completi, inclusi gli argomenti OUT. Questa parte è facoltativa se il nome della procedura archiviata è univoco (ossia non in overload).

## Esempi
<a name="r_SHOW_PROCEDURE-examples"></a>

L'esempio seguente mostra la definizione della procedura `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)
```

# MOSTRA PROCEDURE
<a name="r_SHOW_PROCEDURES"></a>

Mostra un elenco di procedure in uno schema, insieme alle informazioni sugli oggetti elencati.

Ogni riga di output contiene colonne `database_name``schema_name`,`procedure_name`,`number_of_arguments`,`argument_list`,`return_type`, commenti.

Se da SHOW PROCEDURES risultano più di 10.000 righe, il comando genera un errore.

## Autorizzazioni richieste
<a name="r_SHOW_PROCEDURES-required-permissions"></a>

Per visualizzare una procedura in uno schema Redshift, l'utente corrente deve soddisfare uno dei seguenti criteri:
+ Diventa un superutente
+ Sii il proprietario della procedura
+ È stato concesso il privilegio USAGE sullo schema principale e ha concesso EXECUTE sulla procedura

## Sintassi
<a name="r_SHOW_PROCEDURES-synopsis"></a>

```
SHOW PROCEDURES FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

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

database\$1name  
Il nome del database che contiene le procedure da elencare.

schema\$1name  
Il nome dello schema che contiene le procedure da elencare.

filter\$1pattern  
Un'espressione di caratteri UTF-8 valida con uno schema che corrisponde ai nomi delle procedure. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_SHOW_PROCEDURES.html)
Notate che filter\$1pattern corrisponde solo al nome della procedura.

row\$1limit  
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000.

## Esempi
<a name="r_SHOW_PROCEDURES-examples"></a>

L'esempio seguente mostra le procedure dello schema 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                                       |
```

L'esempio seguente mostra le procedure dello schema demo\$1schema con nomi che terminano con '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 un elenco di schemi in un database, insieme ad alcuni attributi dello schema.

Ogni riga di output è composta dal nome del database, dal nome dello schema, dal proprietario dello schema, dal tipo di schema, dall'ACL dello schema, dal database di origine e dall'opzione dello schema. Per ulteriori informazioni su questi attributi, consulta [SVV\$1ALL\$1SCHEMAS](r_SVV_ALL_SCHEMAS.md).

Se dal comando SHOW SCHEMAS possono risultare più di 10.000 schemi, viene restituito un errore.

## Autorizzazioni richieste
<a name="r_SHOW_SCHEMAS-privileges"></a>

Per visualizzare uno schema in una tabella Amazon Redshift, l’utente corrente deve soddisfare uno dei seguenti criteri:
+ Essere un utente con privilegi avanzati.
+ Essere il proprietario dello schema.
+ È stato concesso il privilegio USAGE per lo schema.

## Sintassi
<a name="r_SHOW_SCHEMAS-synopsis"></a>

```
SHOW SCHEMAS FROM DATABASE database_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

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

 *database\$1name*   
Il nome del database che contiene le tabelle da elencare.   
Per mostrare le tabelle in un formato AWS Glue Data Catalog, specificate (`awsdatacatalog`) come nome del database e assicuratevi che la configurazione del sistema sia `data_catalog_auto_mount` impostata su. `true` Per ulteriori informazioni, consulta [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *filter\$1pattern*   
Un'espressione di caratteri UTF-8 valida con il modello da associare ai nomi dello schema. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_SHOW_SCHEMAS.html)
Se il *filter\$1pattern* non contiene metacaratteri, allora il modello rappresenta solo la stringa stessa; in questo caso LIKE agisce come l'operatore di uguaglianza. 

 *row\$1limit*   
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000. 

## Esempi
<a name="r_SHOW_SCHEMAS-examples"></a>

L'esempio seguente mostra gli schemi del database Amazon Redshift denominato `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       |                             |                 |
```

L'esempio seguente mostra gli schemi del AWS Glue Data Catalog database denominato`awsdatacatalog`. Il numero massimo di righe di output è `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>

Mostra la definizione di una tabella, inclusi gli attributi della tabella, i vincoli di tabella, gli attributi di colonna, le regole di confronto delle colonne e i vincoli di colonna. È possibile utilizzare l'output dell'istruzione SHOW TABLE per creare nuovamente la tabella. 

Per ulteriori informazioni sulla creazione di una tabella, consultare [CREATE TABLE](r_CREATE_TABLE_NEW.md). 

## Sintassi
<a name="r_SHOW_TABLE-synopsis"></a>

```
SHOW TABLE [schema_name.]table_name 
```

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

 *schema\$1name*   
(Facoltativo) Il nome dello schema correlato. 

 *table\$1name*   
Il nome della tabella da visualizzare. 

## Esempi
<a name="r_SHOW_TABLE-examples"></a>

Di seguito è riportato un esempio del comando SHOW TABLE e l'output per la tabella `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 );
```

Di seguito è riportato un esempio dell'output del comando SHOW TABLE per la tabella `category` nello schema `public`. La classificazione del database è 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 );
```

L'esempio seguente crea la tabella `foo` con una chiave primaria.

```
create table foo(a int PRIMARY KEY, b int);
```

I risultati SHOW TABLE visualizzano l'istruzione create con tutte le proprietà della tabella `foo`.

```
show table foo;
```

```
CREATE TABLE public.foo ( 
a integer NOT NULL ENCODE az64, 
b integer ENCODE az64, PRIMARY KEY (a) 
) 
DISTSTYLE AUTO;
```

In questo esempio, creiamo una tabella in cui le colonne `a` ereditano le regole di confronto CASE\$1SENSITIVE predefinite del database, mentre `b` sono impostate esplicitamente sulle regole di confronto CASE\$1INSENSITIVE. `c`

```
CREATE TABLE public.foo (
a CHAR, 
b VARCHAR(10) COLLATE CASE_INSENSITIVE, 
c SUPER COLLATE CASE_INSENSITIVE
);
```

I risultati SHOW TABLE visualizzano l'istruzione create con tutte le proprietà della tabella `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 un elenco di tabelle in uno schema, insieme ad alcuni attributi della tabella.

Ogni riga di output è composta da nome del database, nome dello schema, nome della tabella, tipo di tabella, ACL della tabella, commenti, proprietario della tabella, ora dell'ultima modifica, ora dell'ultima modifica, dist\$1style e sottotipo di tabella. Per ulteriori informazioni su questi attributi, consulta [SVV\$1ALL\$1TABLES](r_SVV_ALL_TABLES.md).

I timestamp di modifica e modifica possono essere in ritardo rispetto agli aggiornamenti della tabella di circa 20 minuti.

Se il comando SHOW TABLES restituisce più di 10.000 tabelle, viene restituito un errore.

## Autorizzazioni richieste
<a name="r_SHOW_TABLES-privileges"></a>

Per visualizzare una tabella in uno schema Amazon Redshift, l’utente corrente deve soddisfare uno dei seguenti criteri:
+ Essere un utente con privilegi avanzati.
+ Essere il proprietario della tabella.
+ Sono stati concessi il privilegio USAGE per lo schema principale e il privilegio SELECT per la tabella o il privilegio SELECT per qualsiasi colonna della tabella.

## Sintassi
<a name="r_SHOW_TABLES-synopsis"></a>

```
SHOW TABLES FROM SCHEMA database_name.schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

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

 *database\$1name*   
Il nome del database che contiene le tabelle da elencare.   
Per mostrare le tabelle in un formato AWS Glue Data Catalog, specificate (`awsdatacatalog`) come nome del database e assicuratevi che la configurazione `data_catalog_auto_mount` del sistema sia impostata su. `true` Per ulteriori informazioni, consulta [ALTER SYSTEM](r_ALTER_SYSTEM.md).

 *schema\$1name*   
Il nome dello schema che contiene le tabelle da elencare.   
Per mostrare AWS Glue Data Catalog le tabelle, fornite il nome del AWS Glue database come nome dello schema.

 *filter\$1pattern*   
Un'espressione di caratteri UTF-8 valida con il modello da associare ai nomi della tabella. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_SHOW_TABLES.html)
Se il *filter\$1pattern* non contiene metacaratteri, allora il modello rappresenta solo la stringa stessa; in questo caso LIKE agisce come l'operatore di uguaglianza. 

 *row\$1limit*   
Il numero massimo di righe da restituire. Il *row\$1limit* può essere compreso tra 0 e 10.000. 

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

# MOSTRA MODELLO
<a name="r_SHOW_TEMPLATE"></a>

Visualizza la definizione completa di un modello, incluso il nome completo (database, schema e nome del modello) e tutti i parametri. L'output è un'istruzione CREATE TEMPLATE valida che è possibile utilizzare per ricreare il modello o creare un modello simile con modifiche. 

Per ulteriori informazioni sulla creazione del modello, vedere. [CREARE UN MODELLO](r_CREATE_TEMPLATE.md) 

## Autorizzazioni richieste
<a name="r_SHOW_TEMPLATE-privileges"></a>

Per visualizzare la definizione di un modello, è necessario disporre di una delle seguenti opzioni:
+ Privilegi di superutente
+ Privilegio USAGE sul modello e privilegio USAGE sullo schema contenente il modello

## Sintassi
<a name="r_SHOW_TEMPLATE-synopsis"></a>

```
SHOW TEMPLATE [database_name.][schema_name.]template_name;
```

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

 *database\$1name*   
(Facoltativo) Il nome del database in cui viene creato il modello. Se non viene specificato, viene utilizzato il database corrente. 

 *schema\$1name*   
(Facoltativo) Il nome dello schema in cui viene creato il modello. Se non viene specificato, il modello viene cercato nel percorso di ricerca corrente. 

 *nome\$1modello*   
Il nome del modello. 

## Esempi
<a name="r_SHOW_TEMPLATE-examples"></a>

Di seguito è riportato un esempio dell'output SHOW TEMPLATE per il modello: `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 ',';
```

L'esempio seguente crea un modello `demo_template` nello schema`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';
```

# MOSTRA MODELLI
<a name="r_SHOW_TEMPLATES"></a>

Mostra un elenco di modelli in uno schema, insieme ai relativi attributi.

Ogni riga di output è composta da nome del modello, ID modello, tipo di modello, proprietario del modello, nome del database, nome dello schema, ora di creazione, ora dell'ultima modifica e ultima modifica da. 

Per i dettagli completi del modello, inclusi i parametri del modello, consulta[SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md).

## Autorizzazioni richieste
<a name="r_SHOW_TEMPLATES-privileges"></a>

Per visualizzare i modelli in uno schema Amazon Redshift, devi disporre di uno dei seguenti:
+ Privilegi di superutente
+ Privilegio USAGE sullo schema contenente i modelli

## Sintassi
<a name="r_SHOW_TEMPLATES-synopsis"></a>

```
SHOW TEMPLATES FROM SCHEMA [database_name.]schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ];
```

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

 *database\$1name*   
(Facoltativo) Il nome del database contenente i modelli da elencare. Se non viene fornito, utilizza il database corrente.

 *schema\$1name*   
Il nome dello schema che contiene i modelli da elencare. 

 *filter\$1pattern*   
(Facoltativo) Un'espressione di caratteri UTF-8 valida con uno schema che corrisponde ai nomi dei modelli. L'opzione LIKE esegue una corrispondenza con distinzione tra maiuscole e minuscole e supporta i seguenti metacaratteri che corrispondono ai modelli:      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/redshift/latest/dg/r_SHOW_TEMPLATES.html)
Se il *filter\$1pattern* non contiene metacaratteri, allora il modello rappresenta solo la stringa stessa; in questo caso LIKE agisce come l'operatore di uguaglianza. 

 *row\$1limit*   
Il numero massimo di righe da restituire. L'intervallo valido è compreso tra 0 e il limite del modello nel cluster (il valore predefinito è 1000).

## Esempi
<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>

Mostra la definizione di una vista, incluse le viste materializzate e le viste con associazione tardiva. È possibile utilizzare l'output dell'istruzione SHOW VIEW per creare nuovamente la tabella. 

## Sintassi
<a name="r_SHOW_VIEW-synopsis"></a>

```
SHOW VIEW [schema_name.]view_name 
```

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

 *schema\$1name*   
(Facoltativo) Il nome dello schema correlato. 

 *view\$1name*   
Il nome della vista da mostrare. 

## Esempi
<a name="r_SHOW_VIEW-examples"></a>

 Di seguito è riportata la definizione della vista per la vista `LA_Venues_v`.

```
create view LA_Venues_v as select * from venue where venuecity='Los Angeles';
```

Di seguito è riportato un esempio del comando SHOW VIEW e l'output per la vista definita in precedenza.

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

Di seguito è riportata la definizione della vista `public.Sports_v` nello schema `public`.

```
create view public.Sports_v as select * from category where catgroup='Sports';
```

Di seguito è riportato un esempio del comando SHOW VIEW e l'output per la vista definita in precedenza.

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

Sinonimo della funzione BEGIN. 

Per informazioni, consultare [BEGIN](r_BEGIN.md). 

# TRUNCATE
<a name="r_TRUNCATE"></a>

Elimina tutte le righe da una tabella senza eseguire una scansione della tabella: questa operazione è un'alternativa più rapida a un'operazione DELETE non qualificata. Per eseguire un comando TRUNCATE, devi disporre dell’autorizzazione TRUNCATE TABLE, essere il proprietario della tabella o essere un utente con privilegi avanzati. Per concedere le autorizzazioni per troncare una tabella, utilizza il comando [GRANT](r_GRANT.md).

TRUNCATE è molto più efficiente di DELETE e non richiede VACUUM e ANALYZE. Tuttavia, tieni presente che TRUNCATE esegue il commit della transazione in cui viene eseguito.

## Sintassi
<a name="r_TRUNCATE-synopsis"></a>

```
TRUNCATE [ TABLE ] table_name
```

Il comando funziona anche su una vista materializzata.

```
TRUNCATE materialized_view_name
```

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

TABLE   
Parola chiave facoltativa. 

 *table\$1name*   
Tabella temporanea o persistente. Solo il proprietario della tabella o un utente con privilegi avanzati può troncarla.   
Puoi troncare qualsiasi tabella, incluse le tabelle a cui si fa riferimento nei vincoli di chiave esterna.   
Non è necessario sottoporre a vacuum una tabella dopo averla troncata. 

 *materialized\$1view\$1name*   
Una vista materializzata.  
È possibile troncare una vista materializzata utilizzata per [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md). 

## Note per l'utilizzo
<a name="r_TRUNCATE_usage_notes"></a>
+  Il comando TRUNCATE esegue il commit della transazione in cui viene eseguito; di conseguenza, non è possibile eseguire il rollback di un'operazione TRUNCATE e un comando TRUNCATE può eseguire altre operazioni quando esegue il commit. 
+ Le operazioni TRUNCATE mantengono blocchi esclusivi quando vengono eseguite sulle viste materializzate in streaming di Amazon Redshift connesse a uno dei seguenti elementi:
  +  Un flusso di dati Amazon Kinesis 
  +  Un argomento Streaming gestito da Amazon per Apache Kafka 
  +  Un flusso esterno supportato, ad esempio un argomento Confluent Cloud Kafka 

  Per ulteriori informazioni, consulta [Importazione in streaming in una vista materializzata](materialized-view-streaming-ingestion.md).

## Esempi
<a name="r_TRUNCATE-examples"></a>

Utilizza il comando TRUNCATE per eliminare tutte le righe dalla tabella CATEGORY: 

```
truncate category;
```

Tenta di eseguire il rollback di un'operazione TRUNCATE: 

```
begin;

truncate date;

rollback;

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

La tabella DATE rimane vuota dopo il comando ROLLBACK perché il comando TRUNCATE è stato eseguito automaticamente. 

L'esempio seguente utilizza il comando TRUNCATE per eliminare tutte le righe da una vista materializzata. 

```
truncate my_materialized_view;
```

Elimina tutti i record nella vista materializzata e lascia intatti la vista materializzata e il relativo schema. Nella query, il nome della vista materializzata è un esempio.

# UNLOAD
<a name="r_UNLOAD"></a>


|  | 
| --- |
|  La crittografia lato client per i comandi COPY e UNLOAD non sarà più disponibile per i nuovi clienti a partire dal 30 aprile 2025. Se hai utilizzato la crittografia lato client con i comandi COPY e UNLOAD nei 12 mesi precedenti il 30 aprile 2025, puoi continuare a utilizzare la crittografia lato client con COPY o UNLOAD fino al 30 aprile 2026. Dopo il 30 aprile 2026 non potrai utilizzare la crittografia lato client per i comandi COPY e UNLOAD. Consigliamo di passare alla crittografia lato server per COPY e UNLOAD il prima possibile. Se utilizzi già la crittografia lato server per COPY e UNLOAD, non cambia nulla e puoi continuare a utilizzarla senza modificare le query. Per ulteriori informazioni sulla crittografia per COPY e UNLOAD, consulta il parametro ENCRYPTED di seguito.  | 

Scarica il risultato di una query in uno o più file di testo, JSON o Apache Parquet in Amazon S3 tramite la crittografia lato server di Amazon S3 (SSE-S3). Puoi inoltre specificare la crittografia lato server con una chiave AWS Key Management Service (SSE-KMS).

Per impostazione predefinita, il formato del file scaricato è testo delimitato da pipe (`|`).

È possibile gestire la dimensione dei file su Amazon S3 e, per estensione, il numero di file, impostando il parametro MAXFILESIZE. Assicurati che gli intervalli IP S3 siano aggiunti all'elenco di indirizzi consentiti. Per ulteriori informazioni sugli intervalli IP S3 richiesti, consulta [Isolamento di rete](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation).

È possibile scaricare il risultato di una query di Amazon Redshift sul proprio data lake Amazon S3 in Apache Parquet, un formato di archiviazione a colonne aperte per l'analisi particolarmente efficiente. Il formato Parquet è fino a 2 volte più veloce a scaricare e consuma fino a 6 volte meno spazio di archiviazione in Amazon S3 rispetto ai formati di testo. Ciò consente di salvare la trasformazione e l'arricchimento dei dati eseguita in Amazon S3 nel data lake Amazon S3 in un formato aperto. Puoi quindi analizzare i tuoi dati con Redshift Spectrum e altri AWS servizi come Amazon Athena, Amazon EMR e Amazon AI. SageMaker 

Per ulteriori informazioni e scenari di esempio sull'utilizzo del comando UNLOAD, consulta [Scaricamento dei dati in Amazon Redshift](c_unloading_data.md).

## Privilegi e autorizzazioni richiesti
<a name="r_UNLOAD-permissions"></a>

Affinché il comando UNLOAD abbia esito positivo, è necessario almeno il privilegio SELECT sui dati nel database, insieme all'autorizzazione per scrivere nella posizione Amazon S3. Per informazioni sulle autorizzazioni di accesso alle AWS risorse per il comando UNLOAD, consulta. [AWS Autorizzazioni per accedere ad altre risorse](copy-usage_notes-access-permissions.md)

Per applicare le autorizzazioni con privilegi minimi, segui questi suggerimenti per concedere le autorizzazioni, in base alle esigenze, solo all’utente che esegue il comando.
+ L’utente deve disporre del privilegio SELECT per i dati. Per informazioni su come limitare i privilegi del database, consulta [GRANT](r_GRANT.md).
+ L’utente deve disporre dell’autorizzazione ad assumere il ruolo IAM per scrivere nel bucket Amazon S3 nell’ Account AWS. Per limitare l’accesso all’assunzione di un ruolo da parte di un utente del database, consulta [Limitazione dell’accesso a ruoli IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service-database-users.html) nella *Guida alla gestione di Amazon Redshift*.
+ L’utente ha bisogno di accedere al bucket Amazon S3. Per limitare l’autorizzazione utilizzando una policy di bucket di Amazon S3, consulta [Policy dei bucket per Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html) nella *Guida per l’utente di Amazon Simple Storage Service*.

## Sintassi
<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::<Account AWS-id-1>:role/<role-name>[,arn:aws:iam::<Account AWS-id-2>:role/<role-name>][,...]' }
            
where option is
| [ FORMAT [ AS ] ] CSV | PARQUET | JSON
| PARTITION BY ( column_name [, ... ] ) [ INCLUDE ]
| MANIFEST [ VERBOSE ]
| HEADER
| DELIMITER [ AS ] 'delimiter-char'
| FIXEDWIDTH [ AS ] 'fixedwidth-spec'
| ENCRYPTED [ AUTO ]
| BZIP2
| GZIP
| ZSTD
| ADDQUOTES
| NULL [ AS ] 'null-string'
| ESCAPE
| ALLOWOVERWRITE
| CLEANPATH
| PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
| MAXFILESIZE [AS] max-size [ MB | GB ]
| ROWGROUPSIZE [AS] size [ MB | GB ]
| REGION [AS] 'aws-region' }
| EXTENSION 'extension-name'
```

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

('*select-statement*')   
Query SELECT. I risultati della query vengono scaricati. Nella maggior parte dei casi, vale la pena scaricare i dati nell'ordine ordinato specificando una clausola ORDER BY nella query. Questo approccio risparmia il tempo richiesto per ordinare i dati quando vengono ricaricati.   
La query deve essere racchiusa tra virgolette singole, come mostrato di seguito:   

```
('select * from venue order by venueid')
```
Se la query contiene virgolette (ad esempio per racchiudere valori letterali), inserire il valore letterale tra due set di virgolette singole. È inoltre necessario racchiudere la query tra virgolette singole:   

```
('select * from venue where venuestate=''NV''')
```

TO 's3://*object-path/name-prefix*'   
Il percorso completo, incluso il nome del bucket, nella posizione su Amazon S3 dove Amazon Redshift scrive gli oggetti del file di output, incluso il file manifest se è specificato MANIFEST. Ai nomi degli oggetti viene anteposto *name-prefix*. Se si utilizza `PARTITION BY`, viene aggiunta automaticamente una barra alla fine del valore *name-prefix*, se necessario. Per maggiore sicurezza, UNLOAD si collega ad Amazon S3 utilizzando una connessione HTTPS. Per impostazione predefinita, UNLOAD scrive uno o più file per sezione. UNLOAD aggiunge un numero di sezioni e un numero di parte al prefisso del nome specificato come segue:  
`<object-path>/<name-prefix><slice-number>_part_<part-number>`.   
Se viene specificato MANIFEST, il file manifest viene scritto come segue:  
`<object_path>/<name_prefix>manifest`.   
Se PARALLEL è specificato OFF, i file di dati vengono scritti come segue:  
`<object_path>/<name_prefix><part-number>`.   
UNLOAD crea automaticamente file crittografati usando la crittografia lato server (SSE) Amazon S3, incluso il file manifest se viene utilizzato MANIFEST. Il comando COPY legge automaticamente i file crittografati sul lato server durante l'operazione di caricamento. È possibile scaricare in modo trasparente i file crittografati sul lato server dal bucket utilizzando la console di Amazon S3 o l'API. Per ulteriori informazioni, consultare [Protezione dei dati con la crittografia lato server](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html).   
REGION è obbligatorio quando il bucket Amazon S3 non si trova nella stessa Regione AWS del database Amazon Redshift. 

*authorization*  
Il comando UNLOAD necessita l'autorizzazione per scrivere dati in Amazon S3. Il comando UNLOAD utilizza gli stessi parametri usati dal comando COPY per l'autorizzazione. Per ulteriori informazioni, consultare [Parametri di autorizzazione](copy-parameters-authorization.md) nel riferimento della sintassi del comando COPY.

IAM\$1ROLE \$1default \$1 'arn:aws:iam: :role/ '*<Account AWS-id-1>**<role-name>*   <a name="unload-iam"></a>
Utilizzare la parola chiave predefinita per fare in modo che Amazon Redshift utilizzi il ruolo IAM impostato come predefinito e associato al cluster quando viene eseguito il comando UNLOAD.  
L'Amazon Resource Name (ARN) per un ruolo IAM utilizzato dal cluster per l'autenticazione e l'autorizzazione. Se specifichi IAM\$1ROLE, non è possibile utilizzare ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY, SESSION\$1TOKEN o CREDENTIALS. IAM\$1ROLE può essere concatenato. Per ulteriori informazioni, consulta [Concatenazione di ruoli IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles) nella *Guida alla gestione di Amazon Redshift*.

[ FORMAT [AS] ] CSV \$1 PARQUET \$1 JSON  <a name="unload-csv"></a>
Le parole chiave per specificare il formato di scarico che sovrascrive il formato predefinito.   
Scarica in un file di testo in formato CSV utilizzando una virgola (,) come delimitatore predefinito. Se un campo contiene delimitatori, virgolette doppie, caratteri newline o ritorni a capo, il campo nel file scaricato è racchiuso tra virgolette doppie. A una virgoletta doppia all'interno di un campo dati viene aggiunta un'ulteriore virgoletta doppia. Quando vengono scaricate zero righe, Amazon Redshift potrebbe scrivere oggetti Amazon S3 vuoti.  
Nel caso di PARQUET, viene scaricata in un file in formato Apache Parquet versione 1.0. Per impostazione predefinita, ogni gruppo di righe viene compresso mediante la compressione SNAPPY. Per ulteriori informazioni sul formato Apache Parquet, consultare [Parquet](https://parquet.apache.org/).   
Nel caso di JSON, scarica in un file JSON con ogni riga contenente un oggetto JSON, che rappresenta un record completo nel risultato della query. Amazon Redshift supporta la scrittura di JSON nidificati quando il risultato della query contiene colonne SUPER. Per creare un oggetto JSON valido, il nome di ogni colonna della query deve essere univoco. Nel file JSON, i valori booleani vengono scaricati come `t` o `f` e i valori NULL vengono scaricati come `null`. Quando vengono scaricate zero righe, Amazon Redshift non scrive oggetti Amazon S3 vuoti.  
Le parole chiave FORMAT e AS sono facoltative. Non puoi utilizzare CSV con ESCAPE, FIXEDWIDTH o ADDQUOTES. Non è possibile utilizzare PARQUET con DELIMITER, FIXEDWIDTH, ADDQUOTES, ESCAPE, NULL AS, HEADER, GZIP o ZSTD. BZIP2 PARQUET con ENCRYPTED è supportato solo con la crittografia lato server con una chiave (SSE-KMS). AWS Key Management Service Non è possibile utilizzare JSON con DELIMITER, HEADER, FIXEDWIDTH, ADDQUOTES, ESCAPE o NULL AS.

PARTITION BY ( *column\$1name* [, ... ] ) [INCLUDE]  <a name="unload-partitionby"></a>
Specifica le chiavi di partizione per l'operazione di scaricamento. UNLOAD suddivide automaticamente i file di output in cartelle di partizione in base ai valori chiave di partizione, secondo la convenzione Apache Hive. Ad esempio, un file Parquet che appartiene all'anno di partizione 2019 e al mese di settembre ha il seguente prefisso: `s3://amzn-s3-demo-bucket/my_prefix/year=2019/month=September/000.parquet`.   
Il valore per *column\$1name* deve essere una colonna nei risultati della query che vengono scaricati.   
Se si specifica PARTITION BY con l'opzione INCLUDE, le colonne delle partizioni non vengono rimosse dai file scaricati.   
Amazon Redshift non supporta letterali stringa nelle clausole PARTITION BY.

MANIFEST [ VERBOSE ]  
Crea un file manifest che elenca esplicitamente i dettagli per dati creati dal processo UNLOAD. Il manifest è un file di testo in formato JSON che elenca l'URL di ciascun file scritto in Amazon S3.   
Se viene specificato MANIFEST con l'opzione VERBOSE, il manifest include i seguenti dettagli:   
+ I nomi della colonna e i tipi di dati e per i tipi di dati CHAR, VARCHAR o NUMERIC le dimensioni di ciascuna colonna. Per i tipi di dati CHAR e VARCHAR, la dimensione è la lunghezza. Per un tipo di dati DECIMAL o NUMERIC, le dimensioni sono la precisione e la scalabilità. 
+ Numero di righe scaricate in ciascun file. Se è specificata l'opzione HEADER, il numero di righe include la riga dell'intestazione. 
+ Le dimensioni totali del file di tutti i file scaricati e il numero totale di righe scaricate su tutti i file. Se è specificata l'opzione HEADER, il numero di righe include le righe dell'intestazione. 
+ L'autore. L'autore è sempre "Amazon Redshift".
Puoi specificare VERBOSE solo dopo MANIFEST.   
Il file manifest è scritto nello stesso prefisso del percorso Amazon S3 come file scaricati nel formato `<object_path_prefix>manifest`. Ad esempio, se UNLOAD specifica il prefisso del percorso di Amazon S3 '`s3://amzn-s3-demo-bucket/venue_`', il percorso del file manifest sarà '`s3://amzn-s3-demo-bucket/venue_manifest`'.

HEADER  
Aggiunge una riga di intestazione che contiene i nomi delle colonne nella parte superiore di ogni file output. Anche le opzioni di trasformazione del testo, come CSV, DELIMITER, ADDQUOTES ed ESCAPE, si applicano alla riga di intestazione. Non è possibile utilizzare HEADER con FIXEDWIDTH.

DELIMITER AS '*delimiter\$1character*'   
Specifica un singolo carattere ASCII utilizzato per separare i campi del file di output, ad esempio un carattere pipe ( \$1 ), una virgola ( , ) o una tabulazione ( \$1t ). Il delimitatore predefinito per i file di testo è un carattere pipe. Il delimitatore predefinito per i file CSV è una virgola. La parola chiave AS è facoltativa. Non è possibile utilizzare DELIMITER con FIXEDWIDTH. Se i dati contengono il carattere delimitatore, è necessario specificare l'opzione ESCAPE per evitare il delimitatore o utilizzare ADDQUOTES per racchiudere i dati tra virgolette doppie. In alternativa, specifica un delimitatore non contenuto nei dati.

FIXEDWIDTH '*fixedwidth\$1spec*'   
Scarica i dati in un file in cui ogni larghezza di colonna è fissa, invece di essere separate da un delimitatore. La stringa *fixedwidth\$1spec* specifica il numero di colonne e la larghezza delle colonne. La parola chiave AS è facoltativa. Poiché FIXEDWIDTH non tronca i dati, la specifica per ogni colonna nell'istruzione UNLOAD deve essere lunga almeno quanto la lunghezza della voce più lunga per quella colonna. Di seguito è indicato il formato di *fixedwidth\$1spec*:   

```
'colID1:colWidth1,colID2:colWidth2, ...'
```
Non è possibile utilizzare FIXEDWIDTH con DELIMITER o HEADER.

ENCRYPTED [AUTO]  <a name="unload-parameters-encrypted"></a>
Specifica che i file di output in Amazon S3 sono crittografati con la crittografia lato server di Amazon S3. Se viene specificato MANIFEST, anche il file manifest viene crittografato. Per ulteriori informazioni, consulta [Scaricamento di file di dati crittografati](t_unloading_encrypted_files.md). Se non specifichi il parametro ENCRYPTED, UNLOAD crea automaticamente file crittografati utilizzando la crittografia lato server di Amazon S3 AWS con chiavi di crittografia gestite (SSE-S3).   
Per ENCRYPTED, potresti voler scaricare su Amazon S3 utilizzando la crittografia lato server con AWS KMS una chiave (SSE-KMS). In tal caso, utilizza il parametro [KMS_KEY_ID](#unload-parameters-kms-key-id) per fornire l'ID della chiave. Non puoi usare il parametro [Utilizzo del parametro CREDENTIALS](copy-parameters-authorization.md#copy-credentials) con il parametro KMS\$1KEY\$1ID. Se esegui un comando UNLOAD per i dati utilizzando KMS\$1KEY\$1ID, puoi eseguire un'operazione COPY per gli stessi dati senza specificare una chiave.   
Se viene utilizzato ENCRYPTED AUTO, il comando UNLOAD recupera la chiave di AWS KMS crittografia predefinita sulla proprietà del bucket Amazon S3 di destinazione e crittografa i file scritti su Amazon S3 con la chiave. AWS KMS Se il bucket non dispone della chiave di AWS KMS crittografia predefinita, UNLOAD crea automaticamente file crittografati utilizzando la crittografia lato server di Amazon Redshift AWS con chiavi di crittografia gestite (SSE-S3). Non è possibile utilizzare questa opzione con KMS\$1KEY\$1ID, MASTER\$1SYMMETRIC\$1KEY o CREDENTIALS contenente master\$1symmetric\$1key. 

KMS\$1KEY\$1ID '*key-id*'  <a name="unload-parameters-kms-key-id"></a>
Speciifica l'ID della chiave per una chiave AWS Key Management Service (AWS KMS) da utilizzare per crittografare i file di dati su Amazon S3. [Per ulteriori informazioni, consulta What is? AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) Se specifichi KMS\$1KEY\$1ID, devi specificare anche il parametro [ENCRYPTED](#unload-parameters-encrypted). Se specifichi KMS\$1KEY\$1ID, non puoi autenticare usando il parametro CREDENTIALS. Utilizza invece [Utilizzo del parametro IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role) o [Utilizzo dei parametri ACCESS\$1KEY\$1ID e SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id). 

BZIP2   
Scarica i dati in uno o più file compressi con bzip2 per sezione. A ogni file risultante viene aggiunta l'estensione `.bz2`. 

GZIP   
Scarica i dati in uno o più file compressi con gzip per sezione. A ogni file risultante viene aggiunta l'estensione `.gz`. 

ZSTD   
Scarica i dati in uno o più file compressi con Zstandard per sezione. A ogni file risultante viene aggiunta l'estensione `.zst`. 

ADDQUOTES   
Mettere le virgolette attorno a ciascun campo dati scaricato, in modo che Amazon Redshift possa scaricare i valori dei dati che contengono il delimitatore stesso. Ad esempio, se il delimitatore è una virgola, puoi scaricare e ricaricare i seguenti dati:   

```
 "1","Hello, World" 
```
Senza le virgolette aggiunte, la stringa `Hello, World` verrebbe analizzata come due campi separati.  
Alcuni formati di output non supportano ADDQUOTES.  
Se usi ADDQUOTES, devi specificare REMOVEQUOTES nel parametro COPY se ricarichi i dati.

NULL AS '*null-string*'   
Specifica una stringa che rappresenta un valore null nei file scaricato. Se si utilizza questa opzione, tutti i file di output contengono la stringa specificata al posto di qualsiasi valore null trovato nei dati selezionati. Se questa opzione non è specificata, i valori null vengono scaricati come:   
+ Stringhe a lunghezza zero per output delimitati 
+ Stringhe di spazi vuoti per output a larghezza fissa
Se viene specificata una stringa null per uno scaricamento a larghezza fissa e la larghezza di una colonna di output è inferiore alla larghezza della stringa null, si verifica il seguente comportamento:   
+ Un campo vuoto è l'output per le colonne non di caratteri 
+ Viene restituito un errore per le colonne di caratteri 
A differenza di altri tipi di dati in cui una stringa definita dall'utente rappresenta un valore nullo, Amazon Redshift esporta le colonne di dati SUPER utilizzando il formato JSON e li rappresenta come null come determinato dal formato JSON. Di conseguenza, le colonne di dati SUPER ignorano l'opzione NULL [AS] utilizzata nei comandi UNLOAD.

ESCAPE   
Per le colonne CHAR e VARCHAR in file scaricati delimitati, un carattere di escape (`\`) viene inserito prima di ogni occorrenza dei seguenti caratteri:  
+ Avanzamento riga: `\n`
+ Ritorno a capo: `\r`
+ Il carattere delimitatore specificato per i dati scaricati. 
+ Il carattere di escape: `\`
+ Il carattere virgoletta: `"` o `'` (se nel comando UNLOAD sono specificati entrambi, ESCAPE e ADDQUOTES).
Se hai caricato i dati utilizzando un comando COPY con l'opzione ESCAPE, è necessario specificare anche l'opzione ESCAPE con il comando UNLOAD per generare il file di output reciproco. Allo stesso modo, se utilizzi UNLOAD usando l'opzione ESCAPE, è necessario usare ESCAPE quando effettui un COPY sugli stessi dati.

ALLOWOVERWRITE   <a name="allowoverwrite"></a>
Per impostazione predefinita, UNLOAD ha esito negativo se trova i file che potrebbe sovrascrivere. Se è specificato ALLOWOVERWRITE, UNLOAD sovrascrive i file esistenti, incluso il file manifest. 

CLEANPATH  <a name="cleanpath"></a>
L'opzione CLEANPATH rimuove i file esistenti che si trovano nel percorso Amazon S3 specificato nella clausola TO prima di scaricare i file nella posizione specificata.   
Se si include la clausola PARTITION BY, i file esistenti vengono rimossi solo dalle cartelle delle partizioni per ricevere i nuovi file generati dall'operazione UNLOAD.  
È necessario disporre dell'autorizzazione `s3:DeleteObject` sul bucket Amazon S3. Per ulteriori informazioni, consultare [Policy e autorizzazioni in Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html) nella *Guida per l'utente di Amazon Simple Storage Service*. I file rimossi utilizzando l'opzione CLEANPATH vengono eliminati in modo definitivo e non possono essere recuperati. Se il bucket Amazon S3 di destinazione ha il controllo delle versioni abilitato, UNLOAD con l’opzione CLEANPATH non rimuove le versioni precedenti dei file.  
Non è possibile specificare l'opzione CLEANPATH se si specifica l'opzione ALLOWOVERWRITE.

PARALLEL   <a name="unload-parallel"></a>
Per impostazione predefinita, UNLOAD scrive i dati in parallelo in più file, in base al numero di sezioni nel cluster. L'opzione predefinita è ON o TRUE. Se PARALLEL è OFF o FALSE, UNLOAD scrive in uno o più file di dati in serie, ordinati in modo assoluto in base alla clausola ORDER BY, se utilizzata. Le dimensioni massime per un file di dati sono di 6,2 GB. Ad esempio, se scarichi 13,4 GB di dati, UNLOAD crea i seguenti tre file.  

```
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
```
Il comando UNLOAD è progettato per usare l'elaborazione parallela. Nella maggior parte dei casi, è consigliabile lasciare abilitata l'opzione PARALLEL, in particolare se i file vengono usati per caricare le tabelle usando un comando COPY.

MAXFILESIZE [AS] max-size [ MB \$1 GB ]   <a name="unload-maxfilesize"></a>
Specificare la dimensione massima dei file creati da UNLOAD in Amazon S3. Specifica un valore decimale compreso tra 5 MB e 6,2 GB. La parola chiave AS è facoltativa. L'unità predefinita è MB. Se MAXFILESIZE non è specificato, la dimensione massima del file predefinita è 6,2 GB. MAXFILESIZE non influisce sulle dimensioni del file manifest, se utilizzato.

ROWGROUPSIZE [AS] [MB \$1 GB]   <a name="unload-rowgroupsize"></a>
Specifica le dimensioni dei gruppi di righe. La scelta di dimensioni maggiori può ridurre il numero di gruppi di righe, riducendo la quantità di comunicazioni di rete. Specificare un valore intero compreso tra 32 MB e 128 MB. La parola chiave AS è facoltativa. L'unità predefinita è MB.  
Se non è specificato ROWGROUPSIZE, la dimensione predefinita è 32 MB. Per utilizzare questo parametro, il formato di archiviazione deve essere Parquet e il tipo di nodo deve essere ra3.4xlarge, ra3.16xlarge o dc2.8xlarge.

REGION [AS] '*aws-region*'  <a name="unload-region"></a>
Speciifica Regione AWS dove si trova il bucket Amazon S3 di destinazione. REGION è necessario per UNLOAD su un bucket Amazon S3 che non si trova nello Regione AWS stesso database Amazon Redshift.   
Il valore per *aws\$1region deve corrispondere a una AWS regione* elencata nella tabella delle [regioni e degli endpoint di Amazon Redshift](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region) nel. *Riferimenti generali di AWS*  
Per impostazione predefinita, UNLOAD presuppone che il bucket Amazon S3 di destinazione si trovi nello stesso database Amazon Regione AWS Redshift.

EXTENSION '*extension-name*'  <a name="unload-extension"></a>
Specifica l'estensione del file da aggiungere ai nomi dei file scaricati. Amazon Redshift non esegue alcuna convalida, quindi è necessario verificare che l'estensione del file specificata sia corretta. Se specifichi un metodo di compressione senza fornire un'estensione, Amazon Redshift aggiunge solo l'estensione del metodo di compressione al nome del file. Se non fornisci alcuna estensione e non specifichi un metodo di compressione, Amazon Redshift non aggiunge nulla al nome del file. 

## Note per l’utilizzo
<a name="unload-usage-notes"></a>

### Utilizzo di ESCAPE per tutte le operazioni UNLOAD di testo delimitato
<a name="unload-usage-escape"></a>

Quando specifichi UNLOAD usando un delimitatore, i dati possono includere il delimitatore o uno qualsiasi dei caratteri elencati nella descrizione dell'opzione ESCAPE. In questo caso, devi usare l'opzione ESCAPE con l'istruzione UNLOAD. Se non usi l'opzione ESCAPE con UNLOAD, le successive operazioni COPY che utilizzano i dati scaricati potrebbero non riuscire.

**Importante**  
Si consiglia di utilizzare sempre ESCAPE sia con l'istruzione UNLOAD sia con quella COPY. A meno che tu non sia sicuro che i tuoi dati non contengano delimitatori o altri caratteri per cui si potrebbe dover utilizzare il carattere di escape. 

### Perdita della precisione a virgola mobile
<a name="unload-usage-floating-point-precision"></a>

Potresti riscontrare la perdita di precisione per i dati a virgola mobile che vengono successivamente scaricati e ricaricati. 

### Clausola Limit
<a name="unload-usage-limit-clause"></a>

La query SELECT non può utilizzare una clausola LIMIT nell'istruzione SELECT esterna. Ad esempio, la seguente istruzione UNLOAD non riesce.

```
unload ('select * from venue limit 10')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Utilizza invece una clausola LIMIT nidificata, come nell'esempio seguente.

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

In alternativa, è possibile popolare una tabella usando SELECT…INTO o CREATE TABLE AS usando una clausola LIMIT, quindi scaricare da quella tabella.

### Scaricare una colonna definita come tipo dati GEOMETRY
<a name="unload-usage-geometry"></a>

È possibile scaricare colonne di tipo GEOMETRY in formato testo o CSV. Non è possibile scaricare dati di tipo GEOMETRY con l'opzione `FIXEDWIDTH`. I dati vengono scaricati nella forma esadecimale del formato Extended Well-Known Binary (EWKB). Se la dimensione dei dati in formato EWKB è superiore a 4 MB, l'utente riceve l'avviso del fatto che i dati non possono essere successivamente caricati in una tabella. 

### Scarico del tipo di dati HLLSKETCH
<a name="unload-usage-hll"></a>

È possibile scaricare colonne di tipo HLLSKETCH solo in formato testo o CSV. Non è possibile scaricare dati di tipo HLLSKETCH con l'opzione `FIXEDWIDTH`. I dati vengono scaricati nel formato Base64 per schizzi densi HyperLogLog o nel formato JSON per schizzi sparsi. HyperLogLog Per ulteriori informazioni, consulta [HyperLogLog funzioni](hyperloglog-functions.md).

Nell'esempio seguente viene esportata una tabella contenente colonne HLLSKETCH in un file.

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

### Scaricare una colonna definita come tipo dati VARBYTE
<a name="unload-usage-varbyte"></a>

È possibile scaricare colonne di tipo VARBYTE in formato testo o CSV. I dati vengono scaricati nel formato esadecimale. Non è possibile scaricare i dati VARBYTE con l'opzione `FIXEDWIDTH`. L'opzione `ADDQUOTES` di UNLOAD in un CSV non è supportata. Una colonna VARBYTE non può essere utilizzata come colonna di partizione. 

### Clausola FORMAT AS PARQUET
<a name="unload-parquet-usage"></a>

Tieni presenti queste considerazioni quando utilizzi FORMAT AS PARQUET:
+ Lo scaricamento in Parquet non utilizza la compressione a livello di file. Ogni gruppo di righe viene compresso con SNAPPY.
+ Se MAXFILESIZE non è specificato, la dimensione massima del file predefinita è 6,2 GB. È possibile utilizzare MAXFILESIZE per specificare una dimensione file di 5 MB-6,2 GB. La dimensione effettiva del file è approssimata quando il file viene scritto, quindi potrebbe non corrispondere esattamente al numero specificato.

  Per massimizzare le prestazioni di scansione, Amazon Redshift prova a creare file Parquet contenenti gruppi di righe da 32 MB di dimensioni uguali. Il valore MAXFILESIZE specificato viene arrotondato automaticamente al multiplo più vicino di 32 MB. Ad esempio, se si specifica 200 MB per MAXFILESIZE, ogni file Parquet scaricato è di circa 192 MB (gruppo di righe da 32 MB x 6 = 192 MB).
+ Se una colonna utilizza il formato di dati TIMESTAMPTZ, vengono scaricati solo i valori di timestamp. Le informazioni sul fuso orario non vengono scaricate.
+ Non specificare i prefissi dei nomi file che iniziano con caratteri di sottolineatura (\$1) o punto (.). Redshift Spectrum tratta i file che iniziano con questi caratteri come file nascosti e li ignora.

### Clausola PARTITION BY
<a name="unload-partitionby-usage"></a>

Tieni presenti queste considerazioni quando utilizzi PARTITION BY:
+ Le colonne delle partizioni non sono incluse nel file di output.
+ Assicurati di includere colonne di partizione nella query SELECT utilizzata nell'istruzione UNLOAD. È possibile specificare un numero qualsiasi di colonne di partizione nel comando UNLOAD. Esiste tuttavia una limitazione che prevede che almeno una colonna non di partizione faccia parte del file.
+ Se il valore della chiave di partizione è null, Amazon Redshift scarica automaticamente i dati in una partizione di default chiamata `partition_column=__HIVE_DEFAULT_PARTITION__`. 
+ Il comando UNLOAD non effettua chiamate a un catalogo esterno. Per registrare le nuove partizioni in modo che facciano parte della tabella esterna esistente, utilizza un ALTER TABLE separato... Comando ADD PARTITION... Oppure è possibile eseguire un comando CREATE EXTERNAL TABLE per registrare i dati scaricati come una nuova tabella esterna. Puoi anche utilizzare un crawler per popolare il tuo Data Catalog AWS Glue . Per ulteriori informazioni, consultare [Definizione di crawler](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) nella *Guida per gli sviluppatori di AWS Glue *. 
+ Se si utilizza l'opzione MANIFEST, Amazon Redshift genera un solo file manifest nella cartella Amazon S3 principale.
+ I tipi di dati di colonna che è possibile utilizzare come chiave di partizione sono SMALLINT, INTEGER, BIGINT, DECIMAL, REAL, BOOLEAN, CHAR, VARCHAR, DATE e TIMESTAMP. 

### Utilizzo del privilegio ASSUMEROLE per concedere l'accesso a un ruolo IAM per le operazioni UNLOAD
<a name="unload-assumerole-privilege-usage"></a>

Per fornire l'accesso per utenti e gruppi specifici a un ruolo IAM per le operazioni UNLOAD, un utente con privilegi avanzati può concedere il privilegio ASSUMEROLE su un ruolo IAM a utenti e gruppi. Per informazioni, consulta [GRANT](r_GRANT.md). 

### UNLOAD non supporta gli alias degli Access Point Amazon S3
<a name="unload-usage-s3-access-point-alias"></a>

È possibile utilizzare gli alias degli Access Point Amazon S3 con il comando UNLOAD. 

## Esempi
<a name="r_UNLOAD-examples"></a>

Per alcuni esempi che illustrano come utilizzare il comando UNLOAD, consulta [Esempi di UNLOAD](r_UNLOAD_command_examples.md).

# Esempi di UNLOAD
<a name="r_UNLOAD_command_examples"></a>

Questi esempi mostrano vari parametri del comando UNLOAD. La maggior parte degli esempi usa il set di dati TICKIT di esempio. Per ulteriori informazioni, consulta [Database di esempio](c_sampledb.md).

**Nota**  
Questi esempi contengono interruzioni di riga per una migliore leggibilità. Non includere interruzioni di riga o spazi nella stringa *credentials-args*.

## Scarica VENUE in un file delimitato da pipe (delimitatore predefinito)
<a name="unload-examples-venue"></a>

L'esempio seguente scarica la tabella VENUE e scrive i dati in `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';
```

Per impostazione predefinita, UNLOAD scrive uno o più file per sezione. Supponendo un cluster a due nodi con due sezioni per nodo, l'esempio precedente crea questi file in `amzn-s3-demo-bucket`:

```
unload/0000_part_00
unload/0001_part_00
unload/0002_part_00
unload/0003_part_00
```

Per differenziare meglio i file di output, puoi includere un prefisso nella posizione. L'esempio seguente scarica la tabella VENUE e scrive i dati in `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';
```

Il risultato sono questi quattro file nella cartella `unload`, sempre presupponendo quattro sezioni.

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## Scaricare la tabella LINEITEM nei file Parquet partizionati
<a name="unload-examples-partitioned-parquet"></a>

Nell'esempio seguente viene scaricata la tabella LINEITEM in formato Parquet, partizionata dalla colonna `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);
```

Supponendo quattro sezioni, i file Parquet risultanti vengono partizionati dinamicamente in varie cartelle. 

```
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**  
In alcuni casi, il comando UNLOAD viene utilizzato con l'opzione INCLUDE come illustrato nella seguente istruzione SQL.   

```
unload ('select * from lineitem')
to 's3://amzn-s3-demo-bucket/lineitem/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
PARQUET
PARTITION BY (l_shipdate) INCLUDE;
```
In questi casi, la colonna `l_shipdate` è presente anche nei dati nei file Parquet. In caso contrario, i dati delle colonne `l_shipdate` non si trovano nei file Parquet.

## Scarica la tabella VENUE in un file JSON
<a name="unload-examples-json"></a>

L'esempio seguente scarica la tabella VENUE e scrive i dati in formato JSON in `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;
```

Di seguito sono riportare righe di esempio dalla tabella 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
```

Dopo lo scaricamento in JSON, il formato del file è simile al seguente.

```
{"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}
```

## Scarica VENUE in un file CSV
<a name="unload-examples-csv"></a>

L'esempio seguente scarica la tabella VENUE e scrive i dati in formato CSV in `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;
```

Supponiamo che la tabella VENUE contenga le seguenti righe.

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

Il file di unload è simile al seguente.

```
1,Pinewood Racetrack,Akron,OH,0
2,"Columbus ""Crew"" Stadium",Columbus,OH,0
4,"Community, Ballpark, Arena",Kansas City,KS,0
```

## Scarica VENUE in un file CSV utilizzando un delimitatore
<a name="unload-examples-csv-delimiter"></a>

L'esempio seguente scarica la tabella VENUE e scrive i dati in formato CSV utilizzando il carattere pipe (\$1) come delimitatore. Il file scaricato viene scritto su `s3://amzn-s3-demo-bucket/unload/`. La tabella VENUE in questo esempio contiene il carattere pipe nel valore della prima riga (`Pinewood Race|track`). Lo fa per mostrare che il valore nel risultato è racchiuso tra virgolette doppie. Una virgoletta doppia è sottoposta a escape mediante una virgoletta doppia e l'intero campo è racchiuso tra virgolette doppie. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
CSV DELIMITER AS '|';
```

Supponiamo che la tabella VENUE contenga le seguenti righe.

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

Il file di unload è simile al seguente.

```
1|"Pinewood Race|track"|Akron|OH|0
2|"Columbus ""Crew"" Stadium"|Columbus|OH|0
4|Community, Ballpark, Arena|Kansas City|KS|0
```

## Scarica VENUE con un file manifest
<a name="unload-examples-manifest"></a>

Per creare un file manifest, includi l'opzione MANIFEST. L’esempio seguente scarica la tabella VENUE e scrive un file manifesto insieme ai file di dati in s3://amzn-s3-demo-bucket/venue\$1pipe\$1: 

**Importante**  
Se scarichi i file con l'opzione MANIFEST, devi utilizzare l'opzione MANIFEST con il comando COPY quando carichi i file. Se usi lo stesso prefisso per caricare i file e non specifichi l'opzione MANIFEST, COPY non riesce perché presuppone che il file manifest sia un file di dati.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

Il risultato sono questi cinque file:

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

Di seguito viene mostrato il contenuto di un file manifest. 

```
{
  "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"}
  ]
}
```

## Scarica VENUE con MANIFEST VERBOSE
<a name="unload-examples-manifest-verbose"></a>

Se viene specificata l'opzione MANIFEST VERBOSE, il file manifest include le seguenti sezioni: 
+ La sezione `entries` elenca il percorso Amazon S3, la dimensione del file e il conteggio righe per ciascun file. 
+ La sezione `schema` elenca i nomi della colonna, i tipi di dati e la dimensione di ciascuna colonna. 
+ La sezione `meta` mostra la dimensione totale del file e il conteggio righe per tutti i file. 

L'esempio seguente scarica la tabella VENUE utilizzando l'opzione 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;
```

Di seguito viene mostrato il contenuto di un file manifest.

```
{
  "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"
  }
}
```

## Scarica VENUE con un Header
<a name="unload-examples-header"></a>

Di seguito è riportato un esempio di scaricamento di VENUE con una riga intestazione.

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

Di seguito viene mostrato il contenuto di un file output con una riga intestazione.

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

## Scarica VENUE in file più piccoli
<a name="unload-examples-maxfilesize"></a>

Le dimensioni massime predefinite per un file sono di 6,2 GB. Se i dati scaricati sono superiori a 6,2 GB, UNLOAD crea un nuovo file per ogni segmento di dati da 6,2 GB. Per creare file più piccoli, specifica il parametro MAXFILESIZE. Presupponendo che la dimensione dei dati nell'esempio precedente fosse 20 GB, il seguente comando UNLOAD crea 20 file, ciascuno di 1 GB di dimensione.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
maxfilesize 1 gb;
```

## Scarica VENUE in serie
<a name="unload-examples-serial"></a>

Per scaricare in serie, specifica PARALLEL OFF. UNLOAD scrive quindi un file alla volta, fino a un massimo di 6,2 GB per file. 

L'esempio seguente scarica la tabella VENUE e scrive i dati in serie in `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;
```

Il risultato è un file chiamato venue\$1serial\$1000. 

Se i dati scaricati sono superiori a 6,2 GB, UNLOAD crea un nuovo file per ogni segmento di dati da 6,2 GB. L'esempio seguente scarica la tabella LINEORDER e scrive i dati in serie in `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;
```

Il risultato è la seguente serie di file.

```
lineorder_serial_0000.gz
lineorder_serial_0001.gz
lineorder_serial_0002.gz
lineorder_serial_0003.gz
```

Per differenziare meglio i file di output, puoi includere un prefisso nella posizione. L'esempio seguente scarica la tabella VENUE e scrive i dati in `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';
```

Il risultato sono questi quattro file nella cartella `unload`, sempre presupponendo quattro sezioni.

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## Carica VENUE da file scaricati
<a name="unload-examples-load"></a>

Per caricare una tabella da un set di file scaricati, è sufficiente invertire il processo utilizzando un comando COPY. L'esempio seguente crea una nuova tabella LOADVENUE e carica la tabella dai file di dati creati nell'esempio precedente.

```
create table loadvenue (like venue);

copy loadvenue from 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

Se hai usato l'opzione MANIFEST per creare un file manifest con i file scaricati, puoi caricare i dati utilizzando lo stesso file manifest. A questo scopo, puoi eseguire un comando COPY con l'opzione MANIFEST. L'esempio seguente carica i dati utilizzando un file manifest.

```
copy loadvenue
from 's3://amzn-s3-demo-bucket/venue_pipe_manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

## Scarica VENUE in file crittografati
<a name="unload-examples-unload-encrypted"></a>

L'esempio seguente scarica la tabella VENUE in un set di file crittografati utilizzando una chiave. AWS KMS Se specifichi un file manifest con l'opzione ENCRYPTED, anche il file manifest viene crittografato. Per ulteriori informazioni, consulta [Scaricamento di file di dati crittografati](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;
```

L'esempio seguente scarica la tabella VENUE in un set di file crittografati utilizzando una chiave simmetrica master. 

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

## Carica VENUE da file crittografati
<a name="unload-examples-load-encrypted"></a>

Per caricare le tabelle da un set di file creati usando UNLOAD con l'opzione ENCRYPT, devi invertire il processo utilizzando un comando COPY. Con quel comando, utilizza l'opzione ENCRYPTED e specifica la stessa chiave simmetrica master utilizzata per il comando UNLOAD. L'esempio seguente carica la tabella LOADVENUE dai file di dati crittografati creati nell'esempio precedente.

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

## Scarica dati di VENUE in un file delimitato da tabulazioni
<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';
```

I file di dati di output hanno l'aspetto seguente: 

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

## Scarica VENUE in un file di dati a larghezza fissa
<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';
```

I file di dati di output sono simili a quanto segue. 

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

## Scarica VENUE in un set di file delimitati da tabulazioni e compressi con GZIP
<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;
```

## Scaricamento di VENUE in un file di testo compresso con GZIP
<a name="unload-examples-venue-extension-gzip"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
extension 'txt.gz'
gzip;
```

## Scarica dati contenenti un delimitatore
<a name="unload-examples-delimiter"></a>

Questo esempio utilizza l'opzione ADDQUOTES per scaricare i dati delimitati da virgole in cui alcuni dei campi di dati effettivi contengono una virgola.

Per prima cosa, crea una tabella che contenga virgolette.

```
create table location (id int, location char(64));

insert into location values (1,'Phoenix, AZ'),(2,'San Diego, CA'),(3,'Chicago, IL');
```

Quindi, scarica i dati usando l'opzione ADDQUOTES.

```
unload ('select id, location from location')
to 's3://amzn-s3-demo-bucket/location_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter ',' addquotes;
```

I file di dati scaricati hanno l'aspetto seguente: 

```
1,"Phoenix, AZ"
2,"San Diego, CA"
3,"Chicago, IL"
...
```

## Scarica i risultati di una query di join
<a name="unload-examples-join"></a>

L'esempio seguente scarica i risultati di una query di join che contiene una funzione finestra. 

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

I file di output hanno l'aspetto seguente: 

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

## Scarica utilizzando NULL AS
<a name="unload-examples-null-as"></a>

UNLOAD restituisce valori null come stringhe vuote per impostazione predefinita. I seguenti esempi mostrano come usare NULL AS per sostituire una stringa di testo per null.

Per questi esempi, aggiungiamo valori null alla tabella VENUE.

```
update venue set venuestate = NULL
where venuecity = 'Cleveland';
```

Seleziona da VENUE dove VENUESTATE è null per verificare che le colonne contengano 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
```

Ora, specifica UNLOAD per la tabella VENUE usando l'opzione NULL AS per sostituire i valori nulli con la stringa di caratteri '`fred`'. 

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
null as 'fred';
```

Il seguente esempio del file scaricato mostra che i valori nulli sono stati sostituiti con `fred`. Risulta che anche alcuni valori di VENUESEATS erano null e sono stati sostituiti con `fred`. Anche se il tipo di dati di VENUESEATS è intero, UNLOAD converte i valori in testo nei file scaricati, quindi COPY li converte in numeri interi. Se stai scaricando in un file a larghezza fissa, la stringa NULL AS non deve essere più grande della larghezza del campo.

```
248|Charles Playhouse|Boston|MA|0
251|Paris Hotel|Las Vegas|NV|fred
258|Tropicana Hotel|Las Vegas|NV|fred
300|Kennedy Center Opera House|Washington|DC|0
306|Lyric Opera House|Baltimore|MD|0
308|Metropolitan Opera|New York City|NY|0
  5|Gillette Stadium|Foxborough|MA|5
 22|Quicken Loans Arena|Cleveland|fred|0
101|Progressive Field|Cleveland|fred|43345
...
```

Per caricare una tabella dai file scaricati, utilizza un comando COPY con la stessa opzione NULL AS. 

**Nota**  
Se tenti di caricare i null in una colonna definita come NON NULL, il comando COPY ha esito negativo.

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

Per verificare che le colonne contengano null, non solo stringhe vuote, seleziona da LOADVENUENULLS e filtra per null.

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

...
```

Puoi usare UNLOAD con una tabella che contiene valori null utilizzando il comportamento predefinito NULL AS e quindi specificare COPY per copiare i dati di nuovo in una tabella utilizzando il comportamento predefinito NULL AS; tuttavia, tutti i campi non numerici nella tabella di destinazione contengono stringhe vuote, non null. Per impostazione predefinita, UNLOAD converte i valori null in stringhe vuote (spazio vuoto o lunghezza zero). COPY converte le stringhe vuote in NULL per le colonne numeriche, ma inserisce stringhe vuote in colonne non numeriche. L'esempio seguente mostra come eseguire un comando UNLOAD seguito da COPY utilizzando il comportamento predefinito 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';
```

In questo caso, quando filtri per null, solo le righe in cui VENUESEATS contiene valori nulli. Dove VENUESTATE contiene valori nulli nella tabella (VENUE), VENUESTATE nella tabella di destinazione (LOADVENUENULLS) contiene stringhe vuote.

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

Per caricare le stringhe vuote in colonne non numeriche come NULL, includi le opzioni EMPTYASNULL o BLANKSASNULL. Va bene usarle entrambe.

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

Per verificare che le colonne contengano NULL e non solo stringhe vuote o spazi, selezionare da LOADVENUENULLS e filtrare per null.

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

## Scarica utilizzando il parametro ALLOWOVERWRITE
<a name="unload-examples-allowoverwrite"></a>

Per impostazione predefinita, UNLOAD non sovrascrive i file esistenti nel bucket di destinazione. Ad esempio, se esegui la stessa istruzione UNLOAD due volte senza modificare i file nel bucket di destinazione, il secondo UNLOAD non riesce. Per sovrascrivere i file esistenti, incluso il file manifest, specifica l'opzione ALLOWOVERWRITE.

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest allowoverwrite;
```

## Scarica la tabella EVENT utilizzando i parametri PARALLEL e MANIFEST
<a name="unload-examples-manifest-parallel"></a>

È possibile SCARICARE una tabella in parallelo e generare un file manifest. I file di dati Amazon S3 sono tutti creati allo stesso livello e ai nomi viene aggiunto il suffisso dello schema `0000_part_00`. Il file manifest si trova allo stesso livello di cartella dei file di dati e ha il suffisso del testo `manifest`. Il seguente codice SQL scarica la tabella EVENT e crea file con il nome di 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;
```

L'elenco dei file Amazon S3 è simile al seguente.

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

Il contenuto del file `parallelmanifest` è simile al seguente:

```
{
  "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 }}
  ]
}
```

## Scarica la tabella EVENT utilizzando i parametri PARALLEL OFF e MANIFEST
<a name="unload-examples-manifest-serial"></a>

È possibile SCARICARE una tabella in parallelo (PARALLEL OFF) e generare un file manifest. I file di dati Amazon S3 sono tutti creati allo stesso livello e ai nomi viene aggiunto il suffisso dello schema `0000`. Il file manifest si trova allo stesso livello di cartella dei file di dati e ha il suffisso del testo `manifest`.

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/serial'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
parallel off
manifest;
```

L'elenco dei file Amazon S3 è simile al seguente.

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

Il contenuto del file `serialmanifest` è simile al seguente:

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/serial000", "meta": { "content_length": 436991 }}
  ]
}
```

## Scarica la tabella EVENT utilizzando i parametri PARTITION BY e MANIFEST
<a name="unload-examples-manifest-partition"></a>

È possibile SCARICARE una tabella per partizione e generare un file manifest. In Amazon S3 viene creata una nuova cartella con cartelle di partizione secondarie e i file di dati nelle cartelle secondarie con uno schema di nome simile a `0000_par_00`. Il file manifest si trova allo stesso livello di cartella delle cartelle secondarie con il 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;
```

L'elenco dei file Amazon S3 è simile al seguente.

```
 Name                   Type     Last modified                        Size                  
 partition           	Folder
```

Nella cartella `partition` ci sono cartelle secondarie con il nome della partizione e il file manifest. Di seguito è riportata la parte inferiore dell'elenco delle cartelle nella cartella `partition`, simile alla seguente.

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

Nella cartella `eventname=Zucchero/` ci sono i file di dati simili ai seguenti.

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

L'aspetto del contenuto del file `manifest` è simile al seguente:

```
{
  "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 }}
  ]
}
```

## Scarica la tabella EVENT utilizzando i parametri MAXFILESIZE, ROWGROUPSIZE e MANIFEST
<a name="unload-examples-manifest-maxsize"></a>

È possibile SCARICARE una tabella in parallelo e generare un file manifest. I file di dati Amazon S3 sono tutti creati allo stesso livello e ai nomi viene aggiunto il suffisso dello schema `0000_part_00`. I file di dati Parquet generati sono limitati a 256 MB e la dimensione del gruppo di righe è di 128 MB. Il file manifest si trova allo stesso livello di cartella dei file di dati e ha il suffisso `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;
```

L'elenco dei file Amazon S3 è simile al seguente.

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

Il contenuto del file `eventsizemanifest` è simile al seguente:

```
{
  "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**
+ [Sintassi](#r_UPDATE-synopsis)
+ [Parameters](#r_UPDATE-parameters)
+ [Note per l'utilizzo](#r_UPDATE_usage_notes)
+ [Esempi di istruzioni UPDATE](c_Examples_of_UPDATE_statements.md)

Aggiorna i valori in una o più colonne della tabella quando una condizione è soddisfatta. 

**Nota**  
Le dimensioni massime per una istruzione SQL è di 16 MB.

## Sintassi
<a name="r_UPDATE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
            UPDATE table_name [ [ AS ] alias ] SET column = { expression | DEFAULT } [,...]

[ FROM fromlist ]
[ WHERE condition ]
```

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

Clausola WITH  
Clausola facoltativa che ne specifica una o più. *common-table-expressions* Per informazioni, consulta [Clausola WITH](r_WITH_clause.md). 

 *table\$1name*   
Tabella temporanea o persistente. Solo il proprietario della tabella o un utente con il privilegio UPDATE sulla tabella può aggiornare le righe. Se utilizzi la clausola FROM o selezioni dalle tabelle in un'espressione o una condizione, devi avere il privilegio SELECT su tali tabelle. Non puoi assegnare alla tabella un alias, ma puoi specificare un alias nella clausola FROM.   
Le tabelle esterne di Amazon Redshift Spectrum sono di sola lettura. Non puoi eseguire UPDATE per una tabella esterna.

alias  
Nome alternativo temporaneo per una tabella di destinazione. Gli alias sono facoltativi. La parola chiave AS è sempre facoltativa. 

SET *column* =   
Una o più colonne che vuoi modificare. Le colonne che non sono elencate mantengono i rispettivi valori correnti. Non includere il nome della tabella nella specifica di una colonna di destinazione. Ad esempio, `UPDATE tab SET tab.col = 1` non è valido.

 *espressione*   
Espressione che definisce il nuovo valore per la colonna specificata. 

DEFAULT   
Aggiorna la colonna con il valore predefinito assegnato alla colonna nell'istruzione CREATE TABLE. 

FROM *tablelist*   
Puoi aggiornare una tabella facendo riferimento alle informazioni presenti in altre tabelle. Elenca queste altre tabelle nella clausola FROM o utilizza una sottoquery come parte della condizione WHERE. Le tabelle elencate nella clausola FROM possono avere alias. Se è necessario includere la tabella di destinazione dell'istruzione UPDATE nell'elenco, utilizza un alias. 

WHERE *condition*   
Clausola facoltativa che limita gli aggiornamenti alle righe che corrispondono a una condizione. Quando la condizione restituisce `true`, le colonne SET specificate vengono aggiornate. La condizione può essere un semplice predicato su una colonna o una condizione basata sul risultato di una sottoquery.   
Puoi nominare qualsiasi tabella nella sottoquery, inclusa la tabella di destinazione per UPDATE. 

## Note per l'utilizzo
<a name="r_UPDATE_usage_notes"></a>

Dopo aver aggiornato un numero elevato di righe in una tabella: 
+ Applica l'operazione di vacuum alla tabella per recuperare spazio di memorizzazione e riordinare le righe. 
+ Analizza la tabella per aggiornare le statistiche del pianificatore di query. 

Gli outer join sinistra, destra e completi non sono supportati nella clausola FROM di un'istruzione UPDATE e restituiscono il seguente errore: 

```
ERROR: Target table must be part of an equijoin predicate
```

 Se è necessario specificare un outer join, utilizza una sottoquery nella clausola WHERE dell'istruzione UPDATE. 

Se l'istruzione UPDATE richiede un self join alla tabella di destinazione, è necessario specificare la condizione di join e i criteri della clausola WHERE che qualificano le righe per l'operazione di aggiornamento. In generale, quando la tabella di destinazione viene unita a se stessa o a un'altra tabella, una best practice è utilizzare una sottoquery che separa chiaramente le condizioni di join dai criteri che qualificano le righe per gli aggiornamenti. 

Le query UPDATE con più corrispondenze per riga generano un errore quando il parametro di configurazione `error_on_nondeterministic_update` è impostato su *true*. Per ulteriori informazioni, consulta [error\$1on\$1nondeterministic\$1update](r_error_on_nondeterministic_update.md).

Puoi aggiornare una colonna GENERATED BY DEFAULT AS IDENTITY. Le colonne definite come GENERATED BY DEFAULT AS IDENTITY possono essere aggiornate con i valori forniti. Per ulteriori informazioni, consulta [GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause). 

# Esempi di istruzioni UPDATE
<a name="c_Examples_of_UPDATE_statements"></a>

Per ulteriori informazioni sulle tabelle utilizzate negli esempi seguenti, consultare [Database di esempio](c_sampledb.md).

La tabella CATEGORY nel database TICKIT contiene le seguenti righe: 

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

 **Aggiornamento di una tabella in base a un intervallo di valori** 

Aggiorna la colonna CATGROUP in base a un intervallo di valori nella colonna 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 |
+-------+----------+----------+---------------------------+
```

 **Aggiornamento di una tabella in base a un valore corrente** 

Aggiorna le colonne CATNAME e CATDESC in base al valore corrente di CATGROUP: 

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

In questo caso, la colonna CATDESC è stata impostata su null perché non è stato definito alcun valore predefinito quando è stata creata la tabella.

Esegui i seguenti comandi per reimpostare i dati della tabella CATEGORY sui valori originali:

```
TRUNCATE category;

COPY category
FROM 's3://redshift-downloads/tickit/category_pipe.txt' 
DELIMITER '|' 
IGNOREHEADER 1 
REGION 'us-east-1'
IAM_ROLE default;
```

 **Aggiornamento di una tabella in base al risultato di una sottoquery della clausola WHERE** 

Aggiorna la tabella CATEGORY in base al risultato di una sottoquery nella clausola 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');
```

Visualizza la tabella aggiornata: 

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

 **Aggiornamento di una tabella in base al risultato di una sottoquery della clausola WITH** 

Per aggiornare la tabella CATEGORY in base al risultato di una sottoquery utilizzando la clausola WITH, utilizza l'esempio seguente.

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

## Aggiornamento di una tabella in base al risultato di una condizione di join
<a name="c_Examples_of_UPDATE_statements-updating-a-table-based-on-the-result-of-a-join-condition"></a>

Aggiorna le 11 righe originali nella tabella CATEGORY in base alle righe CATID corrispondenti nella tabella 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                           |
+-------+----------+-----------+--------------------------------------------+
```

 Tieni presente che la tabella EVENT è elencata nella clausola FROM e la condizione di join alla tabella di destinazione è definita nella clausola WHERE. Solo quattro righe sono qualificate per l'aggiornamento. Queste quattro righe sono le righe i cui i valori CATID erano originariamente 6, 7, 8 e 9; solo queste quattro categorie sono rappresentate nella tabella EVENT: 

```
SELECT DISTINCT catid FROM event;

+-------+
| catid |
+-------+
| 6     |
| 7     |
| 8     |
| 9     |
+-------+
```

Aggiorna le 11 righe originali nella tabella CATEGORY estendendo l'esempio precedente e aggiungendo un'altra condizione alla clausola WHERE. A causa della restrizione sulla colonna CATGROUP, solo una riga si qualifica per l'aggiornamento (sebbene quattro righe siano idonee per il join). 

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

Un modo alternativo per scrivere questo esempio è il seguente: 

```
UPDATE category SET catid=100
FROM event JOIN category cat ON event.catid=cat.catid
WHERE cat.catgroup='Concerts';
```

Il vantaggio di questo approccio è che i criteri di join sono chiaramente separati da qualsiasi altro criterio che qualifica le righe per l'aggiornamento. Nota l'uso dell'alias CAT per la tabella CATEGORY nella clausola FROM.

## Aggiornamenti con outer join nella clausola FROM
<a name="c_Examples_of_UPDATE_statements-updates-with-outer-joins-in-the-from-clause"></a>

L'esempio precedente mostrava un inner join specificato nella clausola FROM di un'istruzione UPDATE. L'esempio seguente restituisce un errore perché la clausola FROM non supporta gli outer join alla tabella di destinazione: 

```
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 è necessario specificare un outer join per l'istruzione UPDATE, puoi spostare la sintassi dell'outer join in una sottoquery. 

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

## Aggiornamenti con colonne di un'altra tabella nella clausola SET
<a name="c_Examples_of_UPDATE_statements-set-with-column-from-another-table"></a>

Utilizza l'esempio seguente per aggiornare la tabella listing nel database di esempio TICKIT con i valori della tabella sales.

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

Modifica il database su cui vengono eseguite le query. SHOW USE punta al database che è stato utilizzato più di recente con il comando USE. RESET USE ripristina il database utilizzato. Ciò significa che, se il database non è specificato in SQL, gli oggetti vengono cercati nel database corrente.

## Sintassi
<a name="r_USE-synopsis"></a>

```
USE database
```

## Esempi
<a name="r_USE_command-examples"></a>

Supponiamo che esistano tre database: `dev`, `pdb` e`pdb2`. Lascia due tabelle `t` negli schemi pubblici di ciascuno dei database. Innanzitutto inserisci i dati nelle tabelle di diversi database:

```
dev=# insert into dev.public.t values (1);
INSERT 0 1
dev=# insert into pdb.public.t values (2);
INSERT 0 1
```

Senza impostare esplicitamente un database, il sistema utilizza il database connesso. Controlla il contesto attuale del database:

```
dev=# show use;
Use Database

(1 row)
dev=> show search_path;
search_path
$user, public
(1 row)
```

Quando esegui una query su una tabella `t` senza specificare un database, il sistema utilizza la tabella del database corrente:

```
dev=# select * from t;
c
----
1
(1 row)
```

Utilizza il comando `use` per cambiare database senza modificare la connessione:

```
dev=# use pdb;
USE
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# select * from t;
id
----
2
(1 row)
```

Puoi anche specificare esplicitamente lo schema:

```
dev=# select * from public.t;
id
----
2
(1 row)
```

Ora puoi creare tabelle in diversi schemi all’interno del database corrente:

```
dev=# create table s1.t(id int);
CREATE TABLE
dev=# insert into pdb.s1.t values (3);
INSERT 0 1
```

Il percorso di ricerca determina a quali oggetti dello schema puoi accedere quando non specifichi uno schema:

```
dev=# set search_path to public, s1;
SET
dev=# select * from t;
 id
----
  2
(1 row)
```

Modifica l’ordine degli schemi per accedere a diverse tabelle:

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

Passa a un altro database mantenendo la connessione originale:

```
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# use pdb2;
USE
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)
```

Quando cambi database, viene reimpostato il percorso di ricerca predefinito:

```
dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

Crea una tabella e inserisci i dati nel database corrente:

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

Nelle transazioni puoi scrivere nel database corrente e leggere da qualsiasi database utilizzando una notazione in tre parti. È incluso anche il database connesso:

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

Ripristina il database connesso. Tieni presente che non viene solo ripristinato il database utilizzato in precedenza `pdb`, ma viene reimpostato anche il database connesso. Viene ripristinato anche il percorso di ricerca predefinito: 

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

Puoi modificare i database all’inizio di una transazione, ma non dopo avere eseguito le query:

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

### Esempio del Catalogo dati
<a name="use-redlake-example"></a>

Innanzitutto crea tabelle in schemi e cataloghi diversi per dimostrare le query tra cataloghi. Inizia creando tabelle nel database connesso.

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

A questo punto crea tabelle simili in un catalogo diverso. Di seguito viene dimostrato come utilizzare i database tra cataloghi.

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

Controlla il contesto corrente del database. Senza impostare esplicitamente un database, il sistema utilizza il database connesso.

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

Imposta il USEd database per interrogare le tabelle in un catalogo diverso.

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

Quando esegui query sulla tabella t, i risultati provengono dal database tra cataloghi.

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

Modifica il percorso di ricerca per accedere alle tabelle in diversi schemi all'interno del USEd database.

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

Anche se USE è impostato su un database tra cataloghi, è comunque possibile eseguire query esplicitamente sul database originale.

```
dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

Reimposta il USEd database per fare nuovamente riferimento agli oggetti nel database connesso.

```
dev=# RESET USE;

dev=# SHOW USE;
 Use Database
--------------

(1 row)
```

Tieni presente che search\$1path viene ripristinato quando viene ripristinato USE.

```
dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

Dopo il ripristino, le query fanno riferimento al database connesso originale.

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

Puoi modificare il percorso di ricerca nel database originale per accedere a schemi diversi.

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

Riordina le righe e recupera spazio di memorizzazione di una tabella specificata o di tutte le tabelle del database corrente.

**Nota**  
Solo gli utenti con le autorizzazioni necessarie possono efficacemente eseguire l'operazione vacuum su una tabella. Se VACUUM viene eseguito senza le necessarie autorizzazioni di tabella, l'operazione viene completata ma non ha alcun effetto. Per l'elenco delle autorizzazioni di tabella valide per eseguire efficacemente VACUUM, consulta la seguente sezione Privilegi richiesti.

Amazon Redshift riordina automaticamente i dati ed esegue VACUUM DELETE in background. Ciò riduce la necessità di eseguire il comando VACUUM. Per ulteriori informazioni, consulta [Vacuum delle tabelle](t_Reclaiming_storage_space202.md). 

Per impostazione predefinita, il comando VACUUM ignora la fase di ordinamento per ogni tabella dove più del 95% delle righe della tabella sono già ordinate. Ignorare la fase di ordinamento può migliorare significativamente le prestazioni di VACUUM. Per modificare la soglia predefinita di ordinamento o eliminazione per una singola tabella, includi il nome della tabella e il parametro TO *threshold* PERCENT quando esegui il comando VACUUM. 

Gli utenti possono accedere alle tabelle mentre ne viene eseguito il vacuum. È possibile eseguire query e scrivere operazioni mentre viene eseguito il vacuum di una tabella, ma quando i comandi DML (Data Manipulation Language) e il vacuum vengono eseguiti contemporaneamente, potrebbero richiedere più tempo. Se si eseguono le istruzioni UPDATE e DELETE durante un vacuum, le prestazioni del sistema potrebbero essere ridotte. VACUUM DELETE blocca temporaneamente le operazioni di aggiornamento ed eliminazione. 

Amazon Redshift esegue automaticamente un vacuum DELETE ONLY in background. L'operazione di vacuum automatica viene sospesa quando gli utenti eseguono operazioni DDL (Data Definition Language), ad esempio ALTER TABLE.

**Nota**  
La sintassi e il comportamento del comando VACUUM in Amazon Redshift sono sostanzialmente diversi dall'operazione VACUUM di PostgreSQL. Ad esempio, l'operazione VACUUM di default in Amazon Redshift è VACUUM FULL, che recupera spazio su disco e riordina tutte le righe. Al contrario, l'operazione VACUUM predefinita in PostgreSQL recupera solo lo spazio e lo rende disponibile per il riutilizzo.

Per ulteriori informazioni, consulta [Vacuum delle tabelle](t_Reclaiming_storage_space202.md).

## Privilegi richiesti
<a name="r_VACUUM_command-privileges"></a>

Di seguito sono elencati i privilegi necessari per VACUUM:
+ Superuser
+ Utenti con il privilegio VACUUM
+ Proprietario della tabella
+ Proprietario del database con cui è condivisa la tabella

## Sintassi
<a name="r_VACUUM_command-synopsis"></a>

```
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ]
[ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
```

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

FULL   <a name="vacuum-full"></a>
Ordina la tabella specificata (o tutte le tabelle nel database corrente) e recupera lo spazio su disco occupato dalle righe che sono state contrassegnate per l'eliminazione dalle precedenti operazioni UPDATE e DELETE. VACUUM FULL è il valore predefinito.  
Un'operazione vacuum full non esegue una reindicizzazione delle tabelle interlacciate. Per reindicizzare le tabelle interlacciate seguite da un vacuum full, utilizza l'opzione [VACUUM REINDEX](#vacuum-reindex).   
Per impostazione predefinita, il comando VACUUM FULL ignora la fase di ordinamento per ogni tabella con almeno il 95% delle righe ordinate. Se VACUUM è in grado di ignorare la fase di ordinamento, esegue il comando DELETE ONLY e recupera lo spazio nella fase di eliminazione in modo tale che almeno il 95 percento delle restanti righe non sia contrassegnato per l'eliminazione.    
Se la soglia di ordinamento non viene soddisfatta (ad esempio, se il 90 percento delle righe viene ordinato) e VACUUM esegue un ordinamento completo, viene eseguita anche un'operazione di eliminazione completa, recuperando spazio dal 100% delle righe eliminate.   
Puoi modificare la soglia di vacuum predefinita solo per una singola tabella. Per modificare la soglia predefinita di vacuum per una singola tabella, includi il nome della tabella e il parametro TO *threshold* PERCENT. 

SORT ONLY   <a name="vacuum-sort-only"></a>
Ordina la tabella specificata (o tutte le tabelle nel database corrente) senza recuperare spazio liberato dalle righe eliminate. Questa opzione è utile quando il recupero di spazio su disco non è importante, ma è importante riordinare le nuove righe. Un vacuum SORT ONLY riduce il tempo trascorso per le operazioni di vacuum quando la regione non ordinata non contiene un numero elevato di righe eliminate e non copre l'intera regione ordinata. Le applicazioni che non hanno vincoli di spazio su disco ma dipendono dalle ottimizzazioni delle query associate al mantenimento ordinato delle righe della tabella possono trarre vantaggio da questo tipo di vacuum.  
Per impostazione predefinita, il comando VACUUM SORT ONLY ignora ogni tabella con almeno il 95% delle righe ordinate. Per modificare la soglia predefinita di ordinamento per una singola tabella, includi il nome della tabella e il parametro TO *threshold* PERCENT quando esegui il comando VACUUM. 

DELETE ONLY   <a name="vacuum-delete-only"></a>
Amazon Redshift esegue automaticamente un vacuum DELETE ONLY in background, per cui non sarà quasi mai necessario eseguire un vacuum DELETE ONLY.  
Un VACUUM DELETE recupera lo spazio su disco occupato dalle righe che sono state contrassegnate per l'eliminazione dalle precedenti operazioni UPDATE e DELETE e compatta la tabella per liberare lo spazio utilizzato. Un'operazione di vacuum DELETE ONLY non ordina i dati della tabella.   
Questa opzione riduce il tempo necessario per le operazioni di vacuum quando il recupero di spazio su disco è importante, ma non è importante riordinare le nuove righe. Questa opzione può anche essere utile quando le prestazioni della query sono già ottimali e il riordinamento delle righe per ottimizzare le prestazioni della query non è un requisito.  
Per impostazione predefinita, VACUUM DELETE ONLY consente di recuperare spazio in modo tale che almeno il 95% delle restanti righe non viene contrassegnato per l'eliminazione. Per modificare la soglia predefinita di eliminazione per una singola tabella, includi il nome della tabella e il parametro TO *threshold* PERCENT quando esegui il comando VACUUM.    
Alcune operazioni, come `ALTER TABLE APPEND`, possono causare la frammentazione delle tabelle. Quando usi la clausola `DELETE ONLY`, l'operazione di vacuum recupera lo spazio dalle tabelle frammentate. Lo stesso valore di soglia del 95 percento si applica all'operazione di deframmentazione. 

REINDEX  <a name="vacuum-reindex"></a>
Analizza la distribuzione dei valori nelle colonne interlacciate della chiave di ordinamento, quindi esegue un'operazione di VACUUM completa. Se si utilizza REINDEX, è necessario un nome di tabella.  
VACUUM REINDEX può impiegare molto più tempo rispetto a VACUUM FULL perché esegue un ulteriore passaggio per analizzare le chiavi di ordinamento interlacciato. L'operazione di ordinamento e unione può richiedere più tempo per le tabelle interlacciate perché l'ordinamento interlacciato potrebbe dover riordinare più righe rispetto a un ordinamento composto.  
Se un'operazione di VACUUM REINDEX termina prima del completamento, il successivo VACUUM riprende l'operazione di reindicizzazione prima di eseguire l'operazione vacuum full.  
VACUUM REINDEX non è supportato con TO *threshold* PERCENT.  

RECLUSTER  <a name="vacuum-recluster"></a>
Ordina le parti della tabella che non sono ordinate. Le parti della tabella che sono già ordinate in base all'ordinamento automatico della tabella rimangono intatte. Questo comando non unisce i dati appena ordinati con la regione ordinata. Inoltre, non recupera tutto lo spazio contrassegnato per l'eliminazione. Al termine di questo comando, la tabella potrebbe non apparire completamente ordinata, come indicato dal campo `unsorted` in SVV\$1TABLE\$1INFO.   
 Si consiglia di utilizzare VACUUM RECLUSTER per tabelle di grandi dimensioni con importazione frequente e query che accedono solo ai dati più recenti.   
 VACUUM RECLUSTER non è supportato con TO threshold PERCENT. Se si utilizza RECLUSTER, è necessario un nome di tabella.  
VACUY RECLUSTER non è supportato su tabelle con chiavi di ordinamento interlacciato e tabelle con stile di distribuzione ALL.

 *table\$1name*   
Nome della tabella da sottoporre al vacuum. Se non si specifica un nome tabella, l'operazione di vacuum si applica a tutte le tabelle nel database corrente. Puoi specificare qualsiasi tabella permanente o temporanea creata dall'utente. Il comando non è significativo per altri oggetti, come le viste e le tabelle di sistema.  
 Se includi il parametro TO *threshold* PERCENT, è richiesto un nome tabella.

 TO *threshold* PERCENT   
Clausola che specifica la soglia oltre la quale VACUUM ignora la fase di ordinamento e la soglia di destinazione per recuperare lo spazio nella fase di eliminazione. La *soglia di ordinamento* è la percentuale delle righe totali che sono già ordinate per la tabella specificata prima del vacuuming.  La *soglia di eliminazione* è la percentuale minima delle righe totali non contrassegnate per l'eliminazione dopo il vacuum.   
Dal momento che VACUUM riordina le righe solo quando la percentuale delle righe ordinate in una tabella è inferiore alla soglia di ordinamento, Amazon Redshift può spesso ridurre significativamente i tempi di esecuzione di VACUUM. Analogamente, quando VACUUM non è vincolato a recuperare spazio dal 100% delle righe contrassegnate per l'eliminazione, è spesso in grado di ignorare i blocchi di riscrittura che contengono solo alcune righe eliminate.  
Ad esempio, se specifichi 75 per *threshold*, VACUUM ignora la fase di ordinamento se almeno il 75% delle righe della tabella sono già ordinate. Per la fase di eliminazione, VACUUMS imposta una destinazione per il recupero dello spazio su disco in modo tale che almeno il 75% delle righe della tabella non sia contrassegnato per l'eliminazione dopo il vacuum. Il valore di *threshold* deve essere un numero intero compreso tra 0 e 100. Il valore predefinito è 95. Se specifichi il valore 100, VACUUM ordina sempre la tabella a meno che non sia già completamente ordinata e recupera lo spazio da tutte le righe contrassegnate per l'eliminazione. Se specifichi il valore 0, VACUUM non ordina mai la tabella e non recupera lo spazio.  
Se includi il parametro TO *threshold* PERCENT, devi specificare anche un nome tabella. Se non specifichi un nome di tabella, VACUUM non riesce.   
Non è possibile utilizzare il parametro TO *threshold* PERCENT con REINDEX. 

BOOST  
Esegue il comando VACUUM con risorse aggiuntive, come memoria e spazio su disco, che sono disponibili. Con l'opzione BOOST, VACUUM funziona in una finestra e blocca le eliminazioni e gli aggiornamenti simultanei per la durata dell'operazione VACUUM. L'esecuzione con l'opzione BOOST richiede risorse di sistema, che potrebbero influire sulle prestazioni della query. Eseguire VACUUM BOOST quando il carico sul sistema è leggero, ad esempio durante le operazioni di manutenzione.   
Durante l'utilizzo dell'opzione BOOST tenere presente quanto segue:  
+ Specificando l'opzione BOOST, è obbligatorio specificare il valore *table-name*. 
+ L'opzione BOOST non è supportata nell'operazione REINDEX. 
+ L'opzione BOOST è ignorata nell'operazione DELETE ONLY. 

## Note per l'utilizzo
<a name="r_VACUUM_usage_notes"></a>

Per la maggior parte delle applicazioni Amazon Redshift, si consiglia l'utilizzo di vacuum completo. Per ulteriori informazioni, consulta [Vacuum delle tabelle](t_Reclaiming_storage_space202.md).

Prima di eseguire un'operazione di vacuum, tieni presente il seguente comportamento: 
+ Non è possibile eseguire VACUUM all'interno di un blocco di transazioni (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare [Livelli di isolamento in Amazon Redshift](c_serial_isolation.md). 
+ Le dimensioni della tabella potrebbero crescere quando viene sottoposta al vacuum. Questo comportamento è previsto quando non ci sono righe eliminate da recuperare o il nuovo ordinamento della tabella produce un rapporto inferiore di compressione dei dati.
+ Durante le operazioni di vacuum, è previsto un certo degrado delle prestazioni delle query. Le normali prestazioni riprendono non appena l'operazione di vacuum è completa.
+ Le operazioni di scrittura simultanee procedono durante le operazioni di vacuum, ma non è consigliabile eseguire operazioni di scrittura durante il vacuum. È più efficiente completare le operazioni di scrittura prima di eseguire il vacuum. Inoltre, tutti i dati scritti dopo l'avvio di un'operazione di vacuum non possono essere resi vacuum da tale operazione. In questo caso, è necessaria una seconda operazione di vacuum.
+ Un'operazione di vacuum potrebbe non avviarsi se un'operazione di carico o inserimento è già in corso. Le operazioni di vacuum richiedono temporaneamente l'accesso esclusivo alle tabelle per essere avviate. Questo accesso esclusivo è richiesto per breve tempo, quindi le operazioni di vacuum non bloccano i carichi e gli inserimenti simultanei per un periodo di tempo significativo.
+ Le operazioni di vacuum vengono saltate in assenza di lavoro da eseguire per una determinata tabella. Tuttavia, si verifica un sovraccarico associato alla scoperta della possibilità di saltare l'operazione. Se sai che una tabella è una versione originale o non soddisfa la soglia di vacuum, non sottoporla a un'operazione di vacuum.
+ Un'operazione di vacuum DELETE ONLY su una piccola tabella potrebbe non ridurre il numero di blocchi utilizzati per memorizzare i dati, specialmente quando la tabella ha un numero elevato di colonne o il cluster utilizza un numero elevato di sezioni per nodo. Queste operazioni di vacuum aggiungono un blocco per colonna per sezione per tenere conto degli inserimenti simultanei nella tabella e c'è il rischio che questo sovraccarico superi la riduzione del numero di blocchi dallo spazio su disco recuperato. Ad esempio, se una tabella con 10 colonne su un cluster con 8 nodi occupa 1000 blocchi prima di un vacuum, il vacuum non riduce il numero di blocchi effettivo a meno che non vengano recuperati più di 80 blocchi di spazio su disco a causa delle righe eliminate. Ogni blocco di dati utilizza 1 MB.

Operazioni di vacuum automatiche in pausa in presenza di una delle condizioni seguenti: 
+ Un utente esegue un'operazione DDL (Data Definition Language), ad esempio ALTER TABLE, che richiede un blocco esclusivo sulla tabella su cui è attualmente in funzione il vacuum automatico. 
+ Un periodo di caricamento del cluster elevato.

### Supporto del VACUUM simultaneo
<a name="r_VACUUM_usage_notes_concurrent"></a>

Amazon Redshift supporta l’esecuzione simultanea di più transazioni di vacuum in diverse sessioni in un cluster o un gruppo di lavoro. Ciò significa che puoi emettere più istanze diverse di tutte le modalità di vacuum contemporaneamente, con ogni transazione di vacuum per un’unica tabella. Due operazioni di vacuum non possono funzionare contemporaneamente con una singola tabella.

**Linee guida per l’utilizzo simultaneo del vacuum**
+ Quando esegui transazioni di vacuum simultanee tra sessioni diverse, devi monitorare le risorse di sistema ed evitare di effettuare troppe operazioni di vacuum contemporaneamente.
+ Il livello di simultaneità consigliato dipende dalla quantità di spazio da recuperare, dal numero e dalla larghezza delle righe da ordinare, dalla dimensione del warehouse e dalla dimensione del carico di lavoro eseguito insieme alle operazioni di VACUUM.
+ A seconda della modalità della transazione di vacuum, inizia con due operazioni di vacuum simultanee e aggiungine altre in base alla durata di esecuzione e al carico del sistema. Proprio come le altre richieste complesse inviate dagli utenti, le operazioni di vacuum possono iniziare a mettersi in coda se ne esegui troppe simultaneamente quando Amazon Redshift raggiunge i limiti delle risorse di sistema. 
+ Esegui più operazioni BOOST di vacuum con attenzione. L’esecuzione di vacuum con l’opzione BOOST richiede risorse di sistema, che potrebbero influire sulle prestazioni della query. Eseguire VACUUM BOOST quando il carico sul sistema è leggero, ad esempio durante le operazioni di manutenzione.
+ Se non si specifica un nome tabella, l'operazione di vacuum si applica a tutte le tabelle nel database corrente. Queste operazioni di vacuum continuano a funzionare in sequenza.

## Esempi
<a name="r_VACUUM_command-examples"></a>

Recupera lo spazio del database e riordina le righe in tutte le tabelle in base alla soglia predefinita di vacuum del 95 percento.

```
vacuum;
```

Recupera lo spazio e riordina le righe nella tabella SALES in base alla soglia predefinita del 95 percento. 

```
vacuum sales;
```

Recupera sempre lo spazio e riordina le righe nella tabella SALES. 

```
vacuum sales to 100 percent;
```

Riordina le righe della tabella SALES solo se risultano già ordinate meno del 75% delle righe. 

```
 vacuum sort only sales to 75 percent;
```

Recupera spazio nella tabella SALES in modo tale che almeno il 75 delle restanti righe non sia contrassegnato per l'eliminazione dopo il vacuum. 

```
vacuum delete only sales to 75 percent;
```

Reindicizza e quindi sottoponi al vacuum la tabella LISTING. 

```
vacuum reindex listing;
```

Il seguente comando restituisce un errore. 

```
vacuum reindex listing to 75 percent;
```

Esegui il recluster e quindi sottoponi a vacuum la tabella LISTING. 

```
vacuum recluster listing;
```

Esegui il recluster e quindi sottoponi a vacuum la tabella LISTING con l'opzione BOOST. 

```
vacuum recluster listing boost;
```