ASPITALIA.IT

Sito dedicato alla tecnologia web di Microsoft. Da ASP a ASP.NET trovate articoli e tutorial interessanti adatti anche a chi si av...

Leggi la Descrizione
HTML.IT

Uno dei migliori siti di programmazione presenti sul Web. Se volete iniziare a programmare in qualsiasi linguaggio, html.it &egrav...

Leggi la Descrizione
YoungPortal.it

Portale ricco di risorse per sviluppatori Delphi, asp.net, java. Da poco attiva la nuova sezione SUBSONIC che cerca di andare inco...

Leggi la Descrizione
TRIGGERS

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.

Sintassi Creazione Trigger

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.

Esempio 1 - Creazione Trigger di Log su una Tabella

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.

Indice degli articoli