Visitatori: 947
I Triggers sono essenzialmente dei blocchi di codice PL/SQL come le Store Procedures e le Functions che vedremo nelle prossime lezioni, ma al contrario di questi sono legati ad una Tabella in particolare.
I Triggers vengono eseguiti dal DBMS al verificarsi di un particolare evento che può essere l'inserimento di un nuovo record in una tabella, la cancellazione di un record o l'aggiornamento di una particolare colonna della tabella. In genere (è consigliabile) il Trigger deve contenere solo il codice strettamente necessario, meglio ancora se la chiamata ad una procedura/funzione.
Nel caso di una Tabella l'azione del Trigger può essere eseguita al BEFORE dell'evento da cui scaturisce o all'AFTER.
La sintassi standard per la creazione di un Trigger è la seguente:
CREATE [OR REPLACE] TRIGGER [nome_utente.]nome_trigger
{BEFORE | AFTER | INSTEAD OF} {DELETE | INSERT | UPDATE [OF col1 [,col2]…]}
ON [nome_utente.]nome_tabella | nome_vista [referencing old as nuovo_nome
| new as nuovo_nome] [for each row] [when condizione…]
DECLARE
....
BEGIN
....
END;
Può sembrare difficilmente comprensibile ma ciò è dovuto al fatto che sono indicate tutte le possibile clausole (opzionali) per la dichiarazione di un Trigger. La Sintassi semplificata è la seguente:
CREATE [OR REPLACE] TRIGGER nome_trigger
{BEFORE | AFTER | INSTEAD OF} evento
ON nome_tabella
[FOR EACH ROW [WHEN condizione]]
BEGIN
corpo_trigger
END nome_trigger;
Adesso vedremo la creazione di un Trigger molto comune, ovvero creeremo un trigger che scrive un log a video ogni volta che i record di una tabella vengono aggiunti, modiifcati o cancellati.
Per questo esempio creeremo una Tabella di appoggio che chiamiamo Impiegati:
CREATE TABLE Impiegati(
ID VARCHAR2(4) NOT NULL,
nome VARCHAR2(10),
cognome VARCHAR2(10),
data_inizio DATE,
data_fine DATE,
salario Number(8,2)
)
Riempite questa balla con alcuni Record per esempio:
1) insert into Impiegati(ID, nome, cognome, data_inizio, data_fine, salario)
values('01','Mario', 'Rossi', to_date('19820730','YYYYMMDD'), to_date('19890203','YYYYMMDD'),
2500.00)
2) insert into Impiegati(ID, nome, cognome, data_inizio, data_fine, salario)
values('01','Mario', 'Verdi', to_date('19800510','YYYYMMDD'), to_date('19950505','YYYYMMDD'),
3000.00)
3) insert into Impiegati(ID, nome, cognome, data_inizio, data_fine, salario)
values('01','Mario', 'Bianchi', to_date('19810320','YYYYMMDD'), to_date('20020207','YYYYMMDD'),
2000.00)
se volete, abbiate più fantasia di me..
Adesso creiamo il nostro Trigger:
CREATE OR REPLACE TRIGGER LogImpiegati
BEFORE INSERT OR DELETE OR UPDATE ON Impiegati
FOR EACH ROW
DECLARE
tipo_op CHAR(1); // 'I' =INSERT, 'D'= DELETE, 'U'= UPDATE.
BEGIN
IF INSERTING THEN
tipo_op := 'I';
ELSIF UPDATING THEN
tipo_op := 'U';
ELSE
tipo_op := 'D';
END IF;
DBMS_OUTPUT.put_line(tipo_op ||' '|| :old.nome ||' '
|| :old.cognome);
END LogImpiegato;
Se Adesso per prova eseguiamo la seguente istruzione sql (aumentiamo di 100 euro il salario degli Impiegati):
UPDATE Impiegati SET salario=salario+100;
Avremmo il seguente risultato:
U Mario Rossi
U Mario Verdi
U Mario Bianchi
3 rows updated.
ovvero il Trigger ci avvisa che i 3 record sono stati aggiornati (U). Avremmo potuto stampare anche il nuovo valore dell'ID con la sintassi :new.ID, ma in genera non si conosce il valore della colonna che verrà aggiornato in un update quindi è consigliabile stampare nel log dei valori che identificano il record e che difficilmente vengono aggiornati (l'ID sarebbe stata una scelta ottima).
Se provassimo a svuotare la tabella:
DELETE FROM Impiegati;
Avremmo:
D Mario Rossi
D Mario Verdi
D Mario Bianchi
3 rows deleted.
Nella prossima lezione vedremo altri esempi di Trigger.

|