

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 VIEW`
<a name="create-view"></a>

`CREATE VIEW` definisce una nuova vista persistente. Aurora DSQL non supporta le viste temporanee, sono supportate solo le viste permanenti.

## Sintassi supportata
<a name="create-view-supported-syntax"></a>

```
CREATE [ OR REPLACE ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
    [ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
    AS query
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
```

## Description
<a name="create-view-description"></a>

`CREATE VIEW` definisce una vista basata su una query. La vista non è materializzata fisicamente. Al contrario, la query viene eseguita ogni volta che si fa riferimento alla vista in una query. 

`CREATE or REPLACE VIEW` è simile, ma se esiste già una vista con lo stesso nome, questa viene sostituita. La nuova query deve generare le stesse colonne generate dalla query della vista esistente (ovvero gli stessi nomi di colonna nello stesso ordine e con gli stessi tipi di dati), ma può aggiungere ulteriori colonne alla fine dell’elenco. I calcoli che danno origine alle colonne di output possono essere diversi. 

Se viene specificato un nome di schema (come `CREATE VIEW myschema.myview ...`), la vista viene creata utilizzando lo schema specificato. In caso contrario la vista viene creata nello schema corrente. 

Il nome della vista deve essere distinto dal nome di qualsiasi altra relazione (tabella, indice, vista) nello stesso schema. 

## Parameters
<a name="create-view-parameters"></a>

`CREATE VIEW` supporta vari parametri per controllare il comportamento delle viste aggiornabili automaticamente.

**`RECURSIVE`**  
Crea una vista ricorsiva. La sintassi: `CREATE RECURSIVE VIEW [ schema . ] view_name (column_names) AS SELECT ...;` è equivalente a `CREATE VIEW [ schema . ] view_name AS WITH RECURSIVE view_name (column_names) AS (SELECT ...) SELECT column_names FROM view_name;`.   
Per una vista ricorsiva è necessario specificare un elenco di nomi di colonne della vista.

**`name`**  
Il nome della vista da creare, che può essere facoltativamente accompagnato dallo schema. Per una vista ricorsiva è necessario specificare un elenco di nomi di colonne. 

**`column_name`**  
Un elenco facoltativo di nomi da utilizzare per le colonne nella vista. Se non vengono specificati nomi di colonne, questi ricavati dalla query.

**`WITH ( view_option_name [= view_option_value] [, ... ] )`**  
Questa clausola specifica i parametri opzionali per una vista. Sono supportati i seguenti parametri.  
+ `check_option (enum)` - Questo parametro può assumere i valori `local` o `cascaded` ed è equivalente a specificare `WITH [ CASCADED | LOCAL ] CHECK OPTION`.
+ `security_barrier (boolean)` - Deve essere usato se la vista è destinata a fornire una sicurezza a livello di riga. Aurora DSQL attualmente non supporta la sicurezza a livello di riga, ma questa opzione forzerà comunque la valutazione delle condizioni della vista (e di tutte `WHERE` le condizioni che utilizzano operatori contrassegnati come`LEAKPROOF`) a essere valutate per prime.
+ `security_invoker (boolean)` - Questa opzione fa sì che le relazioni di base sottostanti vengano verificate con i privilegi dell’utente della vista anziché con quelli del proprietario della vista. Per dettagli completi, consulta le note riportate di seguito.
Tutte le opzioni precedenti possono essere modificate nelle viste esistenti utilizzando `ALTER VIEW`.

**`query`**  
Un `VALUES` comando `SELECT` or che fornirà le colonne e le righe della vista.

**`WITH [ CASCADED | LOCAL ] CHECK OPTION`**  
Questa opzione controlla il comportamento delle viste aggiornabili automaticamente. Quando viene specificata questa opzione, i comandi `INSERT` e `UPDATE` sulla vista verranno controllati per garantire che le nuove righe soddisfino la condizione di definizione della vista (ovvero, le nuove righe vengono controllate per garantire che siano visibili attraverso la vista). In caso contrario, l’aggiornamento verrà rifiutato. Se `CHECK OPTION` non è specificato, i comandi `INSERT` e `UPDATE` sulla vista possono creare righe che non sono visibili attraverso la vista stessa.  
`LOCAL` - Le nuove righe vengono verificate solo in base alle condizioni definite direttamente nella vista stessa. Qualsiasi condizione definita nelle viste di base sottostanti non viene verificata (a meno che anch’esse non specifichino l’opzione `CHECK OPTION`).  
`CASCADED` - Le nuove righe vengono verificate rispetto alle condizioni della vista e di tutte le viste di base sottostanti. Se viene indicato `CHECK OPTION` e non viene specifica l’opzioni `LOCAL` né l’opzione `CASCADED`, viene assunto il valore `CASCADED`.   
`CHECK OPTION` può essere utilizzato con le viste `RECURSIVE`. `CHECK OPTION` è supportato solo nelle viste aggiornabili automaticamente.

## Note
<a name="create-view-notes"></a>

Utilizzare l’istruzione `DROP VIEW` per eliminare le viste. 

I nomi e i tipi di dati delle colonne della vista devono essere considerati attentamente. Ad esempio, CREATE VIEW vista AS SELECT ’Hello World’; non è consigliato perché il nome della colonna predefinito è `?column?;`. Inoltre, il tipo di dati della colonna predefinito è `text`, il che potrebbe non essere quello desiderato. 

Un approccio migliore consiste nello specificare esplicitamente il nome della colonna e il tipo di dati, ad esempio: `CREATE VIEW vista AS SELECT text 'Hello World' AS hello;`. 

Per impostazione predefinita, l’accesso alle relazioni di base sottostanti a cui si fa riferimento nella vista è determinato dalle autorizzazioni del proprietario della vista. In alcuni casi, questo può essere utilizzato per fornire un accesso sicuro ma limitato alle tabelle sottostanti. Tuttavia, non tutte le viste sono protette dalla manomissione.
+ Se la proprietà `security_invoker` della vista è impostata su true, l’accesso alle relazioni di base sottostanti è determinato dalle autorizzazioni dell’utente che esegue la query, anziché su quelle del proprietario della vista. Pertanto, l’utente di una vista con l’opzione Security Invoker deve disporre delle autorizzazioni pertinenti sulla vista e sulle relative relazioni di base sottostanti.
+ Se una delle relazioni di base sottostanti è una vista con l’opzione Security Invoker, verrà trattata come se vi fosse stato effettuato l’accesso direttamente dalla query originale. Pertanto, una vista con l’opzione Security Invoker verificherà sempre le relazioni di base sottostanti utilizzando le autorizzazioni dell’utente corrente, anche se vi si accede da una vista senza la proprietà `security_invoker`.
+ Le funzioni chiamate nella vista vengono trattate come se fossero state chiamate direttamente dalla query che utilizza la vista. Pertanto, l’utente di una vista deve disporre delle autorizzazioni per chiamare tutte le funzioni utilizzate dalla vista. Le funzioni nella vista vengono eseguite con i privilegi dell’utente che esegue la query o del proprietario della funzione, a seconda che le funzioni siano definite come `SECURITY INVOKER` o `SECURITY DEFINER`.
+ L’utente che crea o sostituisce una vista deve disporre dei privilegi `USAGE` su tutti gli schemi a cui si fa riferimento nella query della vista, al fine di poter accedere agli oggetti a cui si fa riferimento in tali schemi.
+ Quando `CREATE OR REPLACE VIEW` viene utilizzato su una vista esistente, vengono modificate solo la regola di `SELECT` di definizione della vista, più eventuali parametri `WITH ( ... )` e relativa `CHECK OPTION`. Le altre caratteristiche della vista, tra cui proprietà, autorizzazioni e regole non selezionate, rimangono invariate. Per sostituire una vista è necessario esserne proprietari (ciò include essere un membro del ruolo proprietario).

## Viste aggiornabili
<a name="create-view-updatable-view"></a>

Le viste semplici sono aggiornabili automaticamente: il sistema consentirà alle istruzioni `INSERT`, `UPDATE` e `DELETE` di operare sulla vista allo stesso modo in cui avrebbe fatto su una normale tabella. Una vista è aggiornabile automaticamente se soddisfa tutte le seguenti condizioni:
+ La vista deve avere esattamente una voce nell’elenco della clausola `FROM`, e tale elemento deve essere una tabella o un’altra vista aggiornabile.
+ La definizione della vista non deve contenere clausole `WITH`, `DISTINCT`, `GROUP BY`, `HAVING`, `LIMIT` o `OFFSET` al livello principale.
+ La definizione della vista non deve contenere operazioni sugli insiemi (`UNION`, `INTERSECT` o`EXCEPT`) al livello principale.
+ L’elenco di selezione della vista non deve contenere aggregati, funzioni finestra o funzioni che restituiscono insiemi.

Una vista aggiornabile automaticamente può contenere una combinazione di colonne aggiornabili e non aggiornabili. Una colonna è aggiornabile se è un semplice riferimento a una colonna aggiornabile della relazione di base sottostante. In caso contrario, la colonna è di sola lettura e si verifica un errore se un’istruzione `INSERT` o `UPDATE` tenta di assegnarle un valore.

Una vista più complessa che non soddisfa tutte queste condizioni è di sola lettura per impostazione predefinita: il sistema non consente inserimenti, aggiornamento o eliminazioni sulla vista.

**Nota**  
L’utente che esegue l’inserimento, l’aggiornamento o l’eliminazione sulla vista deve disporre del privilegio di inserimento, aggiornamento o eliminazione corrispondente sulla vista. Per impostazione predefinita, il proprietario della vista deve disporre dei privilegi pertinenti sulle relazioni di base sottostanti, mentre l’utente che esegue l’aggiornamento non necessita di alcuna autorizzazione sulle relazioni di base sottostanti. Tuttavia, se la vista ha l’opzione security\$1invoker impostata su true, è l’utente che esegue l’aggiornamento, anziché il proprietario della vista, che deve disporre dei privilegi pertinenti sulle relazioni di base sottostanti.

## Esempi
<a name="create-view-examples"></a>

Per creare una visualizzazione composta da tutti i film comici.

```
CREATE VIEW comedies AS
    SELECT *
    FROM films
    WHERE kind = 'Comedy';
```

Creazione di una vista con `LOCAL CHECK OPTION`.

```
CREATE VIEW pg_comedies AS
    SELECT *
    FROM comedies
    WHERE classification = 'PG'
    WITH CASCADED CHECK OPTION;
```

Crea una vista ricorsiva.

```
CREATE RECURSIVE VIEW public.nums_1_100 (n) AS
    VALUES (1)
UNION ALL
    SELECT n+1 FROM nums_1_100 WHERE n < 100;
```

## Compatibilità
<a name="create-view-compatibility"></a>

`CREATE OR REPLACE VIEW` è un’estensione del linguaggio PostgreSQL. Anche la `WITH ( ... )` clausola è un’estensione, così come le viste con guardabarriere e le viste con security invoker. Aurora DSQL supporta queste estensioni del linguaggio. 