[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 621.   Grilletti per il controllo del dominio degli attributi

Nel momento in cui si inseriscono o si modificano i valori per una tupla di una certa relazione, può essere importante fare in modo di rifiutare i valori impossibili, in quanto non facenti parte del dominio previsto per gli attributi della stessa. Di solito, questo tipo di controllo può essere dichiarato in fase di creazione della relazione; tuttavia, un DBMS limitato potrebbe ignorare tali dichiarazioni.

I grilletti sono delle funzioni che «scattano», in quanto vengono eseguite, quando si verificano certi eventi. Attraverso i grilletti è possibile impedire l'inserimento di valori errati all'interno degli attributi e questo è l'obiettivo del capitolo.

621.1   Creazione dei grilletti «Causali_ins» e «Causali_upd»

Con l'ausilio di un programma per la scrittura e modifica di file di testo puro, si crei il file grilletti-causali.sql, contenente il testo seguente, sostituendo le metavariabili con informazioni appropriate e rispettando la punteggiatura:

-- Creazione dei grilletti "Causali_ins" e "Causali_upd"
-- Esercizio di: cognome nome classe
-- Data: data
-- File: grilletti-causali.sql

CREATE TRIGGER Causali_ins
               BEFORE INSERT ON Causali
               FOR EACH ROW
               BEGIN
                    SELECT CASE
                    WHEN (NEW.Variazione > 1)
                    THEN
                        RAISE (ABORT, 'L''attributo "Variazione" non può essere superiore a 1!')
                    WHEN (NEW.Variazione < -1)
                    THEN
                        RAISE (ABORT, 'L''attributo "Variazione" non può essere inferiore a -1!')
                    WHEN (NEW.Variazione = 0)
                    THEN
                        RAISE (ABORT, 'L''attributo "Variazione" non può essere pari a 0!')
                    END;
                END;

CREATE TRIGGER Causali_upd
               BEFORE UPDATE ON Causali
               FOR EACH ROW
               BEGIN
                    SELECT CASE
                    WHEN (NEW.Variazione > 1)
                    THEN
                        RAISE (ABORT, 'L''attributo "Variazione" non può essere superiore a 1!')
                    WHEN (NEW.Variazione < -1)
                    THEN
                        RAISE (ABORT, 'L''attributo "Variazione" non può essere inferiore a -1!')
                    WHEN (NEW.Variazione = 0)
                    THEN
                        RAISE (ABORT, 'L''attributo "Variazione" non può essere pari a 0!')
                    END;
                END;

In questo modo, si creano i grilletti Causali_ins e Causali_upd, con lo scopo di avvisare in caso di inserimento di un valore impossibile nell'attributo Variazione della relazione Causali (sia nel caso di inserimento di una tupla nuova, sia quando si cerca di modificare quell'attributo in una tupla già esistente). Si osservi che, all'interno dei messaggi di errore, l'apostrofo è stato raddoppiato, per evitare che possa essere interpretato come la conclusione della stringa.

Si controlli di avere scritto il file grilletti-causali.sql in modo corretto, rispettando anche la punteggiatura; si controlli di avere salvato il file con il nome previsto, quindi si proceda con il comando seguente:

sqlite3 mag.db < grilletti-causali.sql[Invio]

Se non si ottiene alcun messaggio da parte del programma, la creazione dei grilletti dovrebbe essere avvenuta con successo, altrimenti, è stato commesso un errore. Per rimediare all'errore, si devono prima cancellare i grilletti, quindi si può ritentare l'inserimento del comando (ammesso che il file grilletti-causali.sql sia stato corretto di conseguenza). I passaggi per eliminare i grilletti, in modo interattivo, sono quelli seguenti:

sqlite3 mag.db[Invio]

SQLite version ...
Enter ".help" for instructions

sqlite> DROP TRIGGER Causali_ins;[Invio]

sqlite> DROP TRIGGER Causali_upd;[Invio]

sqlite> .quit[Invio]

Quando si ritiene di avere creato correttamente i grilletti, si può tentare l'inserimento o la modifica di tuple con valori errati nella relazione Causali, per verificare se queste vengono rifiutate come dovrebbero. Si proceda con i passaggi seguenti, utilizzando sqlite3 in modo interattivo:

sqlite3 mag.db[Invio]

SQLite version ...
Enter ".help" for instructions

sqlite> INSERT INTO Causali VALUES (100, 'Doppio carico', +2);[Invio]

INSERT INTO Causali VALUES (100, 'Doppio carico', +2);
SQL error: L'attributo "Variazione" non può essere superiore a 1!

sqlite> INSERT INTO Causali VALUES (101, 'Doppio scarico', -2);[Invio]

INSERT INTO Causali VALUES (101, 'Doppio scarico', -2);
SQL error: L'attributo "Variazione" non può essere inferiore a -1!

sqlite> INSERT INTO Causali VALUES (102, 'Movimento nullo', 0);[Invio]

INSERT INTO Causali VALUES (102, 'Movimento nullo', 0);
SQL error: L'attributo "Variazione" non può essere pari a 0!

sqlite> UPDATE Causali SET Variazione = +2 WHERE Causale = 1;[Invio]

UPDATE Causali SET Variazione = +2 WHERE Causale = 1;
SQL error: L'attributo "Variazione" non può essere superiore a 1!

sqlite> UPDATE Causali SET Variazione = -2 WHERE Causale = 2;[Invio]

UPDATE Causali SET Variazione = -2 WHERE Causale = 2;
SQL error: L'attributo "Variazione" non può essere inferiore a -1!

sqlite> UPDATE Causali SET Variazione = 0 WHERE Causale = 3;[Invio]

UPDATE Causali SET Variazione = 0 WHERE Causale = 3;
SQL error: L'attributo "Variazione" non può essere pari a 0!

sqlite> .quit[Invio]

621.2   Creazione del grilletto «Articoli_ins» e «Articoli_upd»

Con l'ausilio di un programma per la scrittura e modifica di file di testo puro, si crei il file grilletti-articoli.sql, contenente il testo seguente, sostituendo le metavariabili con informazioni appropriate e rispettando la punteggiatura:

-- Creazione dei grilletti "Articoli_ins" e "Articoli_upd"
-- Esercizio di: cognome nome classe
-- Data: data
-- File: grilletti-articoli.sql

CREATE TRIGGER Articoli_ins
               BEFORE INSERT ON Articoli
               FOR EACH ROW
               BEGIN
                    SELECT CASE
                    WHEN (NEW.Listino <= 0)
                    THEN
                        RAISE (ABORT, 'Il prezzo non può essere inferiore o uguale a zero!')
                    WHEN (NEW.ScortaMin < 0)
                    THEN
                        RAISE (ABORT, 'La scorta minima non può essere inferiore a zero!')
                    END;
                END;

CREATE TRIGGER Articoli_upd
               BEFORE UPDATE ON Articoli
               FOR EACH ROW
               BEGIN
                    SELECT CASE
                    WHEN (NEW.Listino <= 0)
                    THEN
                        RAISE (ABORT, 'Il prezzo non può essere inferiore o uguale a zero!')
                    WHEN (NEW.ScortaMin < 0)
                    THEN
                        RAISE (ABORT, 'La scorta minima non può essere inferiore a zero!')
                    END;
                END;

In questo modo, si creano i grilletti Articoli_ins e Articoli_upd, con lo scopo di impedire l'inserimento di valori impossibili per il prezzo di listino e per la scorta minima (sia con le istruzioni INSERT, sia con UPDATE).

Si controlli di avere scritto il file grilletti-articoli.sql in modo corretto, rispettando anche la punteggiatura; si controlli di avere salvato il file con il nome previsto, quindi si proceda con il comando seguente:

sqlite3 mag.db < grilletti-articoli.sql[Invio]

Se non si ottiene alcun messaggio da parte del programma, la creazione dei grilletti dovrebbe essere avvenuta con successo, altrimenti, è stato commesso un errore. Per rimediare all'errore, si devono prima cancellare i grilletti, quindi si può ritentare l'inserimento del comando (ammesso che il file grilletti-articoli.sql sia stato corretto di conseguenza). I passaggi per eliminare i grilletti, in modo interattivo, sono quelli seguenti:

sqlite3 mag.db[Invio]

SQLite version ...
Enter ".help" for instructions

sqlite> DROP TRIGGER Articoli_ins;[Invio]

sqlite> DROP TRIGGER Articoli_upd;[Invio]

sqlite> .quit[Invio]

Quando si ritiene di avere creato correttamente i grilletti in questione, si può tentare l'inserimento di tuple con valori errati nella relazione Articoli, per verificare se queste vengono rifiutate come dovrebbero. Si proceda con i passaggi seguenti, utilizzando sqlite3 in modo interattivo:

sqlite3 mag.db[Invio]

SQLite version ...
Enter ".help" for instructions

sqlite> INSERT INTO Articoli[Invio]

   ...>     VALUES (660, 'DVD gratis','pz', 0, 200);[Invio]

INSERT INTO Articoli VALUES (660, 'DVD gratis','pz', 0, 200);
SQL error: Il prezzo non può essere inferiore o uguale a zero!

sqlite> INSERT INTO Articoli[Invio]

   ...>     VALUES (661, 'DVD ti paghiamo noi','pz', -2.00, 200);[Invio]

INSERT INTO Articoli VALUES (661, 'DVD ti paghiamo noi','pz', -2.00, 200);
SQL error: Il prezzo non può essere inferiore o uguale a zero!

sqlite> INSERT INTO Articoli[Invio]

   ...>     VALUES (662, 'DVD virtuale','pz', 2.00, -200);[Invio]

INSERT INTO Articoli VALUES (662, 'DVD virtuale','pz', 2.00, -200);
SQL error: La scorta minima non può essere inferiore a zero!

sqlite> UPDATE Articoli SET Listino = 0 WHERE Articolo = 1;[Invio]

UPDATE Articoli SET Listino = 0 WHERE Articolo = 1;
SQL error: Il prezzo non può essere inferiore o uguale a zero!

sqlite> UPDATE Articoli SET Listino = -2.00 WHERE Articolo = 2;[Invio]

UPDATE Articoli SET Listino = -2.00 WHERE Articolo = 2;
SQL error: Il prezzo non può essere inferiore o uguale a zero!

sqlite> UPDATE Articoli SET ScortaMin = -200 WHERE Articolo = 101;[Invio]

UPDATE Articoli SET ScortaMin = -200 WHERE Articolo = 101;
SQL error: La scorta minima non può essere inferiore a zero!

sqlite> .quit[Invio]

621.3   Verifica sulla creazione dei grilletti «Movimenti_ins» e «Movimenti_upd»

Si prepari il file grilletti-movimenti.sql, seguendo lo scheletro seguente, tenendo conto che si vuole impedire l'inserimento nella relazione Movimenti di quantità inferiori o uguali a zero e di valori inferiori a zero.

Figura 621.19. Scheletro del file grilletto-movimenti.sql, da completare.

-- Creazione dei grilletti "Movimenti_ins" e "Movimenti_upd"
-- Esercizio di: cognome nome classe
-- Data: data
-- File: grilletti-movimenti.sql

CREATE TRIGGER Movimenti_ins
               BEFORE INSERT ...
               FOR EACH ROW
               BEGIN
                    ...
                    ...
                    ...
               END;

CREATE TRIGGER Movimenti_upd
               BEFORE UPDATE ...
               FOR EACH ROW
               BEGIN
                    ...
                    ...
                    ...
               END;

Una volta completato e salvato il file grilletti-movimenti, se ne controlli il funzionamento con la base di dati:

sqlite3 mag.db < grilletti-movimenti.sql[Invio]

Se non si ottiene alcun messaggio da parte del programma, la creazione dei grilletti dovrebbe essere avvenuta con successo, altrimenti, è stato commesso un errore. Per rimediare all'errore, si devono prima cancellare i grilletti, quindi si può ritentare l'inserimento del comando (ammesso che il file grilletti-movimenti.sql sia stato corretto di conseguenza).

Si consegni per la valutazione la stampa del file grilletti-movimenti.sql.

621.4   Conclusione

Prima di passare al capitolo successivo, si deve riprendere il file magazzino.sql e vi si devono aggiungere le istruzioni per la creazione dei grilletti Causali_ins, Causali_upd, Articoli_ins, Articoli_upd, Movimenti_ins e Movimenti_upd, come contenuto nei file grilletti-causali.sql, grilletti-articoli.sql e grilletti-movimenti.sql.

Si osservi che la dichiarazione dei grilletti va collocata immediatamente dopo la creazione della relazione a cui fanno riferimento e immediatamente prima delle istruzioni che inseriscono delle tuple.

Una volta aggiornato il file magazzino.sql come descritto, si deve cancellare il file mag.db e ricreare a partire dalle istruzioni contenute nel file magazzino.sql:

sqlite3 mag.db < magazzino.sql[Invio]

Se vengono segnalati degli errori, occorre correggere il file magazzino.sql, cancellare nuovamente il file mag.db, quindi si deve ripetere l'operazione. La base di dati contenuta nel file mag.db, viene usata nel capitolo successivo e non si può proseguire se non si riesce a ricrearla correttamente.

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome grilletti_per_il_controllo_del_dominio_degli_attributi.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!