SQL: Trigger
0️⃣ Link utili



1️⃣ Cosa sono?
I trigger sono delle procedure che vengono eseguite quando si verifica un evento nel database, in maniera automatica.
I trigger permettono agli utenti di specificare vincoli di integrità più complessi.
I trigger, in particolare, vengono eseguiti quando un utente esegue un operazione di:
INSERT
UPDATE
DELETE
I trigger vengono eseguiti quando si verifica un evento valido, altrimenti vengono “ignorati”.
2️⃣ A cosa servono?
I trigger possono servire per diversi scopi:
- per mantenere l'integrità referenziale tra le varie tabelle
- per mantenere l'integrità dei dati della singola tabella
- per monitorare i campi di una tabella ed eventualmente generare eventi ad hoc
- per creare tabelle di auditing per i record che che vengono modificati o eliminati
4️⃣ Sintassi
CREATE TRIGGER trigger_name
ON { Table name or view name }
[ WITH <Options> ]
{ FOR | AFTER | INSTEAD OF }
{ [INSERT], [UPDATE] , [DELETE] }
- nome trigger:
CREATE [OR REPLACE] TRIGGER <nome trigger>
- collocazione temporale del trigger:
BEFORE | AFTER | INSTEAD OF
- azione(i) del trigger:
INSERT OR UPDATE [OF <colonna(e)>] OR DELETE ON <tabella>
- tipo di trigger (opzionale):
FOR EACH ROW
- restrizioni trigger (solo per triggers for each row):
WHEN (<condizione>)
- corpo del trigger:
<blocco PL/SQL>
📝 Esempi
per gli esempi sottostanti prendiamo in considerazione la seguente tabella:
CREATE TABLE Student(
studentID INT NOT NULL AUTO_INCREMENT,
FName VARCHAR(20),
LName VARCHAR(20),
Address VARCHAR(30),
City VARCHAR(15),
Marks INT,
PRIMARY KEY(studentID)
);
Esempio 1
Nel trigger sottostante, stiamo cercando di calcolare la percentuale dello studente non appena i suoi dettagli vengono aggiornati al database.
CREATE TRIGGER sample_trigger
before INSERT
ON student
FOR EACH ROW
SET new.total = new.marks/6;
Esempio 2
Qui quando inseriamo i dati nella tabella studente automaticamente il trigger verrà invocato. Il trigger aggiungerà 100 alla colonna marks nella colonna student.
CREATE TRIGGER calculate
before INSERT
ON student
FOR EACH ROW
SET new.marks = new.marks+100;
Esempio 3
inanzitutto creiamo una seconda tabella per questo specifico esempio:
create table Final_mark(
per int );
Quando inseriamo i dati nella tabella, il trigger total mark memorizza il risultato nella tabella Final_mark.
CREATE TRIGGER total_mark
after INSERT
ON student
FOR EACH ROW
insert into Final_mark values(new.marks);