PostgreSQL 9.0, un tour sulle novità: parte 3, Trigger

Prosegue con questo articolo la mini-serie dedicata alle novità di PostgreSQL 9, dopo avere analizzato Hot Standby e Streaming Replication.

Nello specifico, le nuove funzionalità affrontate in questa sede sono: trigger su colonna e trigger con condizione (WHEN).

Una piccola premessa per coloro che non sono ancora familiari con PostgreSQL: Postgres fornisce il supporto per i trigger sin dalla versione 6.2 (1997).

I trigger su colonna sono attivati soltanto quando una specifica colonna è aggiornata in modo esplicito con una operazione di UPDATE. Permettono pertanto di evitare l’utilizzo di condizioni logiche e operazioni di confronto all’interno del codice delle funzioni trigger.

Ad esempio:

CREATE TRIGGER trigger_aggiorna_col1
BEFORE UPDATE OF col1 ON tabella1
FOR EACH ROW EXECUTE PROCEDURE aggiorna_col1();

Il trigger appena creato viene creato soltanto quando la colonna col1 della tabella tabella1 viene aggiornato, invocando la funzione speciale di tipo trigger aggiorna_col1().

È importante notare che i trigger di colonna non vengono eseguiti se le colonne sono impostate al valore di DEFAULT. L’aggiunta del trigger su colonna va a colmare una lacuna di PostgreSQL rispetto allo standard SQL:2003.

I trigger con condizione, detti anche trigger WHEN, permettono di definire condizioni semplici al solo verificarsi delle quali un determinato trigger viene eseguito. Questa funzionalità completa il tentativo da parte degli sviluppatori di PostgreSQL di limitare l’utilizzo di blocchi condizionali di tipo IF ... THEN all’interno delle procedure trigger, riducendo notevolmente il numero di trigger in esecuzione e conseguentemente il carico di CPU sul server del database.

Ad esempio, il trigger sottostante esegue il controllo sul bilancio di un conto corrente soltanto in caso di modifica del bilancio stesso:

CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
EXECUTE PROCEDURE check_account_update();

Il seguente esempio invece scriverà nel log un aggiornamento di riga soltanto nel caso di modifica della riga stessa. Questo caso è molto utile in framework e applicazioni che utilizzano ORM, che potrebbero tentare operazioni di modifica anche per righe non realmente modificate:

 CREATE TRIGGER log_update
AFTER UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE log_account_update();

Le possibilità sono pressoché infinite. Potrebbe ad esempio essere opportuno ignorare l’aggiornamento in caso di assenza di modifiche:

CREATE TRIGGER log_update
AFTER UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.* IS NOT DISTINCT FROM NEW.*)
EXECUTE PROCEDURE no_op();

Nota: Ricordo che questo speciale sulla versione 9 è fortemente ispirato dal wiki di PostgreSQL e in molti casi ne rappresenta una fedele traduzione in lingua italiana.

This Post Has 0 Comments

Leave A Reply