I triggers sono chiamate a funzioni che sono automaticamente eseguite quando sono eseguiti sul database stesso azioni tipo inserimento o modifica di records.
Facciamo un esempio:
In un ipotetico database per gestire un magazzino, creiamo una tabella, products,
dove assieme al nome del prodotto registriamo la sua quantita’.
Ora, normalmente, per ragioni che non sto qui a spiegare ma fidatevi,
le operazioni di carico/scarico delle quantita’ non sono eseguite su questa tabella
ma su una tabella apposita che potremmo chiamare events.
Vediamo come potrebbero essere queste due tabelle
CREATE TABLE ‘products’ (
product_id INTEGER PRIMARY KEY,
product TEXT,
stock INTEGER DEFAULT 0,
enable INTEGER DEFAULT 1
);
CREATE TABLE ‘events’ (
event_id INTEGER PRIMARY KEY,
product_id INTEGER,
quantity INTEGER,
operation_type INTEGER,
enable INTEGER DEFAULT 1
);
l’idea di base e’ come aggiornare il campo stock sulla tabella products
ogni volta che inseriamo un record sulla tabella events.
Quando inseriamo un record nella tabella events dobbiamo stare attenti
al valore che inseriremo sul campo operation_type.
Questo campo ci dira’ se l’operazione implica una addizione o una sottrazione
e soprattutto lo dira’ al trigger che aggiornera’ automagicamente la tabella
products sul campo stock.
Questo il trigger in tutto il suo splendore
CREATE TRIGGER update_stock AFTER INSERT ON ‘events’
BEGIN
UPDATE ‘products’ SET stock =
(CASE WHEN new.operation_type = 1
THEN stock + new.quantity
ELSE stock – new.quantity
END)
WHERE product_id = new.product_id;
END;
in pratica abbiamo detto al trigger, che abbiamo chiamato “update_stock”,
che dopo un inserimento sulla tabella events ,AFTER INSERT ON ‘events’,
se il valore di operation_type e’ = 1, CASE WHEN new.operation_type = 1,
allora deve aggiornare il valore del campo stock sulla tabella products
aggiungendo al valore esistente il valore inserito sul campo quantity,
THEN stock + new.quantity, se no lo deve sottrarre.
Ecco un esempio completo.
Apriamo il nostro editor preferito, qua si usa gedit, e scriviamo
DROP TABLE IF EXISTS 'products';
DROP TABLE IF EXISTS 'events';
/*creiamo due tabelle*/
CREATE TABLE 'products' (
product_id INTEGER PRIMARY KEY,
product TEXT,
stock INTEGER DEFAULT 0,
enable INTEGER DEFAULT 1
);
CREATE TABLE 'events' (
event_id INTEGER PRIMARY KEY,
product_id INTEGER,
quantity INTEGER,
operation_type INTEGER,
enable INTEGER DEFAULT 1
);
/*creiamo il trigger
quando inseriamo un record sulla tabella events se
il valore del campo operation_type e' uguale ad 1 allora
il trigger aggiungera' sul campo stock della tabella
products il valore passato sul campo quantity della
tabella events, viceversa lo sottrarra'*/
CREATE TRIGGER update_stock AFTER INSERT ON 'events'
BEGIN
UPDATE 'products' SET stock =
(CASE WHEN new.operation_type = 1
THEN stock + new.quantity
ELSE stock - new.quantity
END)
WHERE product_id = new.product_id;
END;
/*inseriamo un po di valori sulla tabella products*/
INSERT INTO 'products' VALUES(Null,'Mele',0,1);
INSERT INTO 'products' VALUES(Null,'Pere',0,1);
INSERT INTO 'products' VALUES(Null,'Banane',0,1);
SELECT "la tabella products appena creata";
SELECT product,stock FROM products;
/*inseriamo un po di valori sulla tabella events*/
INSERT INTO 'events' VALUES(Null,1,1,1,1);
INSERT INTO 'events' VALUES(Null,1,2,1,1);
INSERT INTO 'events' VALUES(Null,1,3,1,1);
INSERT INTO 'events' VALUES(Null,2,4,1,1);
INSERT INTO 'events' VALUES(Null,2,5,1,1);
INSERT INTO 'events' VALUES(Null,2,6,1,1);
INSERT INTO 'events' VALUES(Null,3,7,1,1);
INSERT INTO 'events' VALUES(Null,3,8,1,1);
INSERT INTO 'events' VALUES(Null,3,9,1,1);
/*vadiamo come ha lavorato il trigger, abbiamo eseguito solo operation_type =1 quindi abbiamo sommato*/
SELECT "Il 'trigger' ha eseguito le addizioni";
SELECT product,stock FROM products;
INSERT INTO 'events' VALUES(Null,1,3,0,1);
INSERT INTO 'events' VALUES(Null,2,5,0,1);
INSERT INTO 'events' VALUES(Null,3,4,0,1);
/*vadiamo come ha lavorato il trigger, abbiamo eseguito solo operation_type =0 quindi abbiamo sotttatto*/
SELECT "Il 'trigger' ha eseguito le sottrazioni";
SELECT product,stock FROM products;
salviamo il file come data.sql
quindi dalla shell di linux lanciamo sqlite con
bc@hal9000:~/1966bc$ sqlite3 test.db
questo per creare il database test.db e da dentro eseguiamo
.read data.sql
sqlite> bc@hal9000:~/1966bc$ sqlite3 test.db
SQLite version 3.7.13
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .read data.sql
la tabella products appena creata
Mele|0
Pere|0
Banane|0
Il 'trigger' ha eseguito le addizioni
Mele|6
Pere|15
Banane|24
Il 'trigger' ha eseguito le sottrazioni
Mele|3
Pere|10
Banane|20
sqlite>
sqlite>
p.s.
non so se mi spiego disse il paracadute...spiegati meglio disse il paracadutista!
alla prossima