Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 24 di 58
  • livello intermedio
Indice lezioni

Le viste (views)

Utilizzare e conoscere il costrutto delle viste (o views) su MySQL, al fine di creare "tabelle virtuali" e limitare o ottimizzare la visibilità dei dati.
Utilizzare e conoscere il costrutto delle viste (o views) su MySQL, al fine di creare "tabelle virtuali" e limitare o ottimizzare la visibilità dei dati.
Link copiato negli appunti

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, invece, le approfondiremo meglio nelle lezioni successive.

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.

Ti consigliamo anche