CREATE DATABASE - Amazon Redshift

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à.

CREATE DATABASE

Crea un nuovo database.

Per creare un database, devi essere un utente con privilegi avanzati o disporre del privilegio CREATEDB.

Non è possibile eseguire CREATE DATABASE all'interno di un blocco di transazione (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare Isolamento serializzabile.

Sintassi

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

Parametri

database_name

Nome del nuovo database. Per ulteriori informazioni sui nomi validi, consultare Nomi e identificatori.

WITH

Parola chiave facoltativa.

OWNER

Specifica il proprietario di un database.

=

Carattere facoltativo.

db_owner

Nome utente per il proprietario del database.

CONNECTION LIMIT { limit | UNLIMITED }

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. Il valore predefinito è UNLIMITED. Per visualizzare le connessioni correnti, eseguire una query sulla vista di sistema STV_SESSIONS.

Nota

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 { CASE_SENSITIVE | CASE_INSENSITIVE }

Una clausola che specifica se la stringa di ricerca o il confronto è CASE_SENSITIVE o CASE_INSENSITIVE. L'opzione di default è CASE_SENSITIVE.

ISOLATION LEVEL { SERIALIZABLE | SNAPSHOT }

Una clausola che specifica il livello di isolamento utilizzato quando vengono eseguite query su un database.

  • Isolamento SERIALIZABLE: fornisce la serializzabilità completa per le transazioni simultanee. Questo è il valore di default per un database creato in un cluster con provisioning. Per ulteriori informazioni, consulta Isolamento serializzabile.

  • Isolamento SNAPSHOT: fornisce un livello di isolamento con protezione contro i conflitti di aggiornamento ed eliminazione. Questo è il valore predefinito per un database creato in uno spazio dei nomi serverless.

È possibile visualizzare con quale modello di simultaneità è in esecuzione il database come segue:

  • Esegui una query sulla vista del catalogo STV_DB_ISOLATION_LEVEL. Per ulteriori informazioni, consulta STV_DB_ISOLATION_LEVEL.

    SELECT * FROM stv_db_isolation_level;
  • Eseguire una query sulla vista PG_DATABASE_INFO.

    SELECT datname, datconfig FROM pg_database_info;

    Il livello di isolamento per database appare accanto alla chiave concurrency_model. Un valore di 1 indica SNAPSHOT. Un valore di 2 indica SERIALIZABLE.

Nei database Amazon Redshift, sia l'isolamento SERIALIZABLE che quello SNAPSHOT sono tipi di livelli di isolamento serializzabili. Vale a dire, le letture modificabili, le letture non ripetibili e le letture fantasma vengono impedite in base allo standard SQL. Entrambi i livelli di isolamento garantiscono che una transazione funzioni su uno snapshot di dati esistente all'inizio della transazione e che nessun'altra transazione possa modificare tale snapshot. Tuttavia, l'isolamento SNAPSHOT non fornisce la serializzabilità completa, poiché non impedisce inserimenti e aggiornamenti anomali in scrittura su diverse righe di tabella.

Lo scenario seguente illustra gli aggiornamenti anomali in scrittura con il livello di isolamento SNAPSHOT. Una tabella denominata Numbers contiene una colonna denominata digits che contiene valori 0 e 1. L'istruzione UPDATE di ogni utente non si sovrappone all'altro utente. Tuttavia, i valori 0 e 1 vengono scambiati. L'istruzione SQL che eseguono segue questa sequenza temporale con i seguenti risultati:

Orario Operazione utente 1 Operazione utente 2
1 BEGIN;
2 BEGIN;
3 SELECT * FROM Numbers;
digits
------
0
1
4 SELECT * FROM Numbers;
digits
------
0
1
5 UPDATE Numbers SET digits=0 WHERE digits=1;
6 SELECT * FROM Numbers;
digits
------
0
0
7 COMMIT;
8 Update Numbers SET digits=1 WHERE digits=0;
9 SELECT * FROM Numbers;
digits
------
1
1
10 COMMIT;
11 SELECT * FROM Numbers;
digits
------
1
0
12 SELECT * FROM Numbers;
digits
------
1
0

Se lo stesso scenario viene eseguito utilizzando l'isolamento serializzabile, Amazon Redshift termina l'utente 2 a causa di una violazione della serializzazione e restituisce un errore 1023. Per ulteriori informazioni, consulta Come correggere errori di isolamento serializzabile. In questo caso, solo l'utente 1 può eseguire correttamente il commit. Non tutti i carichi di lavoro richiedono un isolamento serializzabile come requisito, nel qual caso l'isolamento degli snapshot è sufficiente come livello di isolamento di destinazione per il database.

ARN '<ARN>'

L'ARN del AWS Glue database da utilizzare per creare il database.

{ WITH NO DATA CATALOG SCHEMA | DATA CATALOG SCHEMA '<schema>' }
Nota

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_ROLE { default | 'SESSION' | 'arn:aws:iam::<Account AWS-id>:role/<role-name>' }
Nota

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, 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_ROLE 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.

Quanto segue mostra la sintassi per la stringa di parametro IAM_ROLE 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.

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.

Nota

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

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

FROM DATASHARE

Una parola chiave che indica dove si trova l'unità di condivisione dati.

datashare_name

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_guid

Un valore che specifica lo spazio dei nomi del produttore a cui appartiene l'unità di condivisione dati.

ACCOUNT account_id

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

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 utilizzi CREATE DATABASE per creare database da condivisioni di dati tra AWS account, specifica sia ACCOUNT che NAMESPACE del produttore.

È 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

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_ROLE. Per ulteriori informazioni sui parametri e sui valori accettati, consulta Parametri.

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;

Limiti di CREATE DATABASE

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

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_INSENSITIVE, tutte le colonne CHAR o VARCHAR utilizzano confronto senza distinzione tra maiuscole e minuscole Per informazioni sul confronto, consultare Sequenze di regole di confronto.

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_COUNT(), REGEXP_REPLACE(), REGEXP_INSTR(), REGEXP_SUBSTR()

  • 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.

Per ulteriori informazioni sulla funzione COLLATE, consultare Funzione COLLATE.

Limitazioni del confronto di database

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.
  • Amazon Redshift non supporta il confronto per il tipo di dati SUPER. La creazione di colonne SUPER nei database senza distinzione tra maiuscole e minuscole e le interazioni tra colonne SUPER e colonne senza distinzione tra maiuscole e minuscole non sono supportate.

    Nell'esempio seguente viene creata una tabella con SUPER come tipo di dati nel database senza distinzione tra maiuscole e minuscole:

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

    Nell'esempio seguente viene eseguita una query sui dati con una stringa senza distinzione tra maiuscole e minuscole confrontando i dati SUPER:

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

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.

Esempi

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_DATABASE_INFO.

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

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)