- INSERT: per le operazioni di inserimento dati è possibile utilizzare solo NEW in quanto non esiste alcun vecchio valore a cui far riferimento;
- UPDATE: è possibile utilizzare sia OLD che NEW a seconda che si desideri far riferimento al valore di un campo, prima o dopo l’operazione di UPDATE;
- DELETE: è possibile utilizzare solo OLD in quanto non si ha alcun nuovo valore.
Nel caso di Trigger scatenati mediante BEFORE per gli eventi INSERT e UPDATE, è anche possibile modificare il valore NEW di un dato campo prima che tale valore venga scritto nel database, facciamo un esempio:
delimiter $$; CREATE TRIGGER controllo_eta BEFORE UPDATE ON clienti FOR EACH ROW BEGIN IF NEW.anni < 0 THEN SET NEW.anni = 0; ELSEIF NEW.anni > 120 THEN SET NEW.anni = 120; END IF; END $$ DELIMITER ;
Nel nostro esempio abbiamo creato un Trigger per effettuare una sorta di controllo sull’età dichiarata dai clienti: se questa è minore di 0 il valore che verrà scritto nel DB sarà 0, viceversa se viene indicata un età superiore di 120 anni il nuovo valore sarà imato automaticamente a 120.
La clausola DEFINER nella creazione di un Trigger con MySQL
Come visto per le Stored Procedures e per le Stored Functions, è possibile inserire la clausola DEFINER per indicare al DBMS qual’è l’uteente legittimato a farricorso allo specifico Trigger che si sta creando. In mancanza, il DBMS assegnerà il Trigger all’utente corrente (cioè l’utente che stiamo utilizzando per crearlo, come se avessimo dichiarato esplicitamente DEFINER = CURRENT_USER).
Vediamo un esempio:
CREATE DEFINER=`nomeutente`@`localhost` TRIGGER ...
Nel nostro esempio abbiamo creato un nuovo Trigger accessibile per l’utente “nomeutente” connesso mediante localhost.
Gestire più Trigger associati allo stesso momento/evento
A partire dalla versione 5.7.2 di MySQL, è possibile che alla medesima tabella siano associati più Trigger attivabili allo stesso momento e per il medesimo evento. In tal caso i diversi Trigger saranno eseguiti dal DBMS secondo l’ordine di creazione, salvo che non sia stato specificato un ordine esplicito (mediante le parole chiave FOLLOWS e PRECEDES seguite dal nome del Trigger che si vuole seguire o anticipare).
Supponiamo, ad esempio, di voler attivare un altro Trigger (associato sempre alla stessa tabella per il medesimo tempo/evento) da eseguirsi prima di “controllo_eta” visto nell’esempio precedente:
CREATE TRIGGER controllo_username BEFORE UPDATE ON clienti FOR EACH ROW PRECEDES controllo_eta ...
Il nuovo Triger “controllo_username” verrà lanciato automaticamente porima di “controllo_eta” nonostante sia stato creato successivamente.
Conoscere i Trigger attivi su un DB MySQL
Per conoscere tutti i Triggers attivi all’interno del nostro database possiamo semplicemente digitare in console:
SHOW TRIGGERS;
Eliminare un Trigger in MySQL
Una volta creato un Trigger è sempre possibile rimuoverlo mediante il comando DROP TRIGGER, in questo modo:
DROP TRIGGER nome_trigger;
Anche per i Trigger è possibile aggiungere la clausola IF EXISTS in questo modo:
DROP TRIGGER IF EXISTS nome_trigger;