Le viste (views)

Le viste sono comunemente considerate un modo per mostrare i dati di un database con una struttura diversa da quella che hanno effettivamente sulla base dati.

Un uso possibile delle viste è quello di concedere ad un utente l’accesso ad una tabella mostrandogli solo alcune colonne: tali colonne saranno inserite nella vista, sulla quale l’utente avrà i permessi di accesso, mentre gli saranno negati quelli sulla tabella sottostante.

Altre possibili applicazioni riguardano la possibilità di leggere dati da più tabelle contemporaneamente attraverso JOIN o UNION, oppure di comprendere dati che non sono fisicamente presenti sulla tabella in quanto calcolati a partire da altri dati.

Le viste non possono avere lo stesso nome di una tabella facente parte dello stesso database. Ecco la sintassi da usare per la creazione di una vista:

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { utente | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW nome [(lista_colonne)]
    AS istruzione_select
    [WITH [CASCADED | LOCAL] CHECK OPTION]

La clausola OR REPLACE consente di sostituire una vista con lo stesso nome eventualmente già esistente. Le clausole DEFINER e SQL SECURITY hanno lo stesso significato già visto, rispettivamente, nella lezione 21 sui trigger e nella 20 sulle stored procedure, ma vengono utilizzate solo a partire da MySQL 5.0.16.

La lista delle colonne, opzionale, viene usata per specificare i nomi delle colonne dalle quali è composta la vista. È possibile ometterla e adottare come nomi di colonne quelli restituiti dalla SELECT.

L’istruzione SELECT è quella che definisce quali dati sono contenuti nella vista. Essa può essere anche molto complessa, fare riferimento a più tabelle, contenere subquery, ma è sottoposta ad alcuni limiti: non può utilizzare variabili, non può contenere subquery nella FROM, non può fare riferimento a tabelle temporanee ma solo a tabelle già esistenti. Non possono esistere viste temporanee.

Una caratteristica essenziale delle viste è quella di essere o meno aggiornabili: una vista aggiornabile infatti consente di modificare i dati della tabella sottostante, cosa che non è possibile in caso contrario. Tuttavia una vista, per essere aggiornabile, deve soddisfare determinate condizioni: in pratica, deve esistere una relazione uno a uno fra le righe della vista e quelle della tabella sottostante.

Quindi la SELECT che genera la vista non può contenere funzioni aggregate, DISTINCT, GROUP BY, HAVING, UNION, subquery nella lista delle colonne selezionate, JOIN (con qualche eccezione, vedere oltre); inoltre non può avere un’altra vista non aggiornabile nella clausola FROM, o una subquery nella WHERE che fa riferimento a una tabella nella FROM.

Le viste possono essere generate con due algoritmi: MERGE o TEMPTABLE. Con quest’ultimo, la SELECT relativa alla vista viene utilizzata per creare una tabella temporanea, sulla quale viene poi eseguita l’istruzione richiesta; con MERGE invece la SELECT viene “mescolata” con l’istruzione che richiama la vista stessa. Una vista non è mai aggiornabile se creata con TEMPTABLE.

La clausola ALGORITHM che abbiamo visto nella CREATE può essere usata per specificare quale algoritmo usare: tuttavia per poter usare MERGE è necessario che la vista soddisfi alcuni dei criteri che abbiamo visto in precedenza per le viste aggiornabili. Se utilizziamo TEMPTABLE per una vista che potrebbe essere costruita con MERGE, avremo la conseguenza di non poterla usare per aggiornamenti, ma il vantaggio di una maggior velocità nel rilascio della tabella sottostante. Se non indichiamo la clausola ALGORITHM, il default sarà UNDEFINED.

Quando una vista è aggiornabile possiamo anche utilizzarla per inserire dati, purché contenga tutte le colonne della tabella che non hanno un valore di default, e nessuna colonna derivata da espressioni.

In alcuni casi, come eccezione a quanto detto prima, può essere aggiornabile una vista che contiene una INNER JOIN, a patto che gli aggiornamenti vengano fatti sui campi di una sola tabella. Sulla stessa vista è possibile fare delle INSERT, anche in questo caso su una sola tabella.

La clausola WITH CHECK OPTION si usa nei casi di viste aggiornabili, per impedire inserimenti o aggiornamenti di righe della tabella che non soddisfano la condizione prevista nella clausola WHERE della vista. Qualora la vista faccia riferimento ad altre viste, l’ulteriore specificazione di CASCADED fa sì che il controllo venga propagato alle condizioni delle viste interne; se invece viene specificato LOCAL il controllo viene effettuato solo al primo livello, cioè sulla vista attuale. Il default è CASCADED.

Per modificare una vista si utilizza una istruzione ALTER che è praticamente identica alla CREATE OR REPLACE:

ALTER
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { utente | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW nome [(lista_colonne)]
    AS istruzione_select
    [WITH [CASCADED | LOCAL] CHECK OPTION]

L’eliminazione della vista si ottiene con l’istruzione DROP VIEW:

DROP VIEW [IF EXISTS] nome

Infine è possibile visualizzare la definizione della vista attraverso la seguente istruzione:

SHOW CREATE VIEW nome

I permessi

Per creare una vista occorre il privilegio CREATE VIEW (nonchè il privilegio SUPER se si vuole definire un altro utente come DEFINER); per eliminarla il privilegio DROP. Entrambi i privilegi sono necessari per modificare una vista (sia con ALTER VIEW che con CREATE OR REPLACE).

Infine il privilegio SHOW_VIEW consente di visualizzare la definizione della vista. Ovviamente sono poi necessari i permessi richiesti per accedere ai dati selezionati; tali permessi sono richiesti al creatore o all’esecutore della vista a seconda del parametro SQL SECURITY.

Both comments and pings are currently closed.

Comments are closed.