I trigger SQL

I trigger sono elementi molto interessanti all’interno di una dbms. L’argomento in realtà è trattato raramente o superficialmente nei corsi di informatica delle scuole superiori e nell’esame di stato. I trigger sono frammenti di codice che intercettano un determinato evento su dati e tabelle, come l’inserimento di un nuovo record o la cancellazione di un record esistente. Quando si verifica un evento prestabilito è possibile eseguire del codice automatico aggiuntivo che esegue una determinata operazione, ad esempio di aggiornamento di altri dati sulla tabella selezionato o altra fonte dati.

I trigger possono essere creati in due modalità: o completamente da codice selezionando una tabella e quindi il tab SQL, oppure in modalità semi-automatica selezionando il tab Trigger come in foto.

La schermata successiva si apre con un riepilogo dei trigger esistenti sulla tabella prescelta (qui ce n’è uno chiamato col nome di fantasia baggio) e con il menù Aggiungi trigger per crearne di nuovi. Selezioniamo quest’ultima voce.

La schermata popup che si apre non è molto ben congeniata ma ci permette poche, dirette e semplici operazioni: un nome di riconoscimento del trigger, la tabella su cui agisce indipendentemente da dove sia stata lanciata la maschera, l’evento a cui si deve scatenare il nostro trigger (inserimento, cancellazione, aggiornamento) e la tempistica se prima che venga formalizzata la l’evento/transazione prescelta o dopo.

Il codice poi inseribile si riferisce alla modifica di ogni riga della tabella. Sta a noi selezionare cosa e come fare. Nella tabella Articoli di esempio c’è un campo quantità denominato qta. Ad esempio potrei aggiungere un controllo/validazione dei dati inseriti. Con la parola riservata NEW si indica il nuovo record che sta per essere inserito. Con una if su ogni riga prevengo che la qta inserita sia sovrascritta e posta a zero invece.

Il codice relativo al trigger appena creato. Per l’alunno che affronta l’esame di stato, vale la pena memorizzare una sintassi simile per riproporla cartaceamente davanti ad una eventuale domanda. Il codice ovviamente è esportabile e può ricreare automaticamente il trigger inserito nella console SQL.

CREATE TRIGGER baggio BEFORE INSERT ON Articoli
FOR EACH ROW 
    IF NEW.qta < 0  THEN 
       SET NEW.qta = 0;
    END IF;

Altro esempio di utilizzo di un trigger in un esempio dove utilizzarlo non PRIMA ma DOPO l’inserimento di una riga potrebbe essere a fronte dell’aggiornamento di un campo calcolato. Sono poco usati ma spesso per motivi di performance vengono utilizzati per contenere un certo quantitativo di righe o conteggio generico, una somma totale ad esempio di righe di un ordine o un semplice valore numerico calcolato che per un motivo o l’altro non è possibile fare via query o codice interfaccia al nostro db.

Prendiamo questa coppia di tabelle Ordine e RigheOrdine. Mentre la testata Ordine ha la sua normale chiave primaria OrdineId, le righe hanno bisogno di una chiave autonoma progressiva che indichiamo nel campo RigaId, abbiamo bisogno di una chiave esterna che faccia riferimento alla tesata OrdineId e un numero progressivo di riga d’ordine, che riparta in automatico da 1 ad ogni ordine ed aumenti mano a mano che aggiungiamo una riga nell’ordine. Sembra un ottimo pretesto per automatizzare l’incremento e decremento di questo numero riga a seconda che si aggiunga o tolga un record dell’ordine.

CREATE TRIGGER `AumentoRigaOrdine` BEFORE INSERT ON `RigheOrdine`
 FOR EACH ROW 
BEGIN
DECLARE conta INT;
SET conta  = 
(SELECT MAX(*)
 FROM RigheOrdine
 WHERE OrdineId = NEW.OrdineId );
 
SET NEW.RigaOrdine = conta+1; 
END

Al lettore il test del trigger per capire quale sia il limite di usare la funzione di aggregazione MAX piuttosto che il COUNT

Ultima modifica 31 Marzo 2023