[Gfoss] esempio Trigger semplice

a.furieri a lqt.it a.furieri a lqt.it
Gio 14 Dic 2017 18:50:49 CET


On Thu, 14 Dec 2017 18:18:36 +0100 (CET), falcerisimone a inwind.it 
wrote:
> Ciao a tutti,
> non so quasi niente di triggers, ma desidero condividere la
> conoscenza di un semplice esempio di trigger.
> In questo esempio si tratta del calcolo automatico della lunghezza di
> polilinee ogni qualvolta se ne disegnino di nuove oppure aggiornando
> un solo vertice.
> In questo modo non dovrete piĆ¹ preoccuparvi di lanciare manualmente
> ogni volta il calcolo delle lunghezze!
> In pratica si devono creare due triggers: insert e update.
> Testato su Spatialite. Enjoy!
>
> Es:
> [
> CREATE TABLE ril_lunghezze
> (pk INTEGER NOT NULL PRIMARY KEY,
> indirizzo TEXT,
> lunghezza DOUBLE,
> note TEXT);
>
> SELECT 
> AddGeometryColumn('ril_lunghezze','geom',32632,'LINESTRING',2);
>
> CREATE TRIGGER insert_calc_length AFTER INSERT ON ril_lunghezze
> BEGIN
> UPDATE ril_lunghezze
> SET
> lunghezza= ROUND(ST_LENGTH(geom), 2)
> WHERE ROWID=NEW.ROWID;
> END
>
> CREATE TRIGGER update_calc_length AFTER UPDATE ON ril_lunghezze
> BEGIN
> UPDATE ril_lunghezze
> SET
> lunghezza= ROUND(ST_LENGTH(geom), 2)
> WHERE ROWID=NEW.ROWID;
> END
> ]
>

Bravo Simone,

hai visto che scrivere un trigger e' tutto sommato facile ?
ed e' uno strumento molto potente, che se viene usato bene
e nel modo corretto puo' consentire di implementare buona
parte della business logic specifica del processo direttamente
dentro al DBMS.

un possibile miglioramento / ottimizzazione:

CREATE TRIGGER update_calc_length
     AFTER UPDATE OF geom ON ril_lunghezze

- come l'hai scritto tu il trigger scattera' inesorabilmente
   per ogni UPDATE; ma se la geometria e' sempre quella di prima
   e' un inutile perditempo.
- se invece lo definisci come "AFTER UPDATE OF geom" il
   trigger scattera' solo quando serve realmente, e cioe'
   quando la geometria risulta effettivamente modificata.


infine una domanda (ma giusto per curisita'): perche'
usi la ROUND() ?
capisco che lo scopo e' quello di arrotondare le lunghezze
con due sole cifre decimali, ma cosi' rischi di alterare
un po' troppo pesantemente i dati.
forse e' meglio se registri le lunghezze con tutti i
decimali possibili, e magari arrotondi a due decimali
quando poi vai ad interrogare. esempio:

SELECT Sum(lunghezza) FROM ril_lunghezze;

oppure

SELECT Round(Sum(lunghezza), 2) FROM ril_lunghezze;

con la seconda arrotondi il totale finale, e quindi
non introduci scostamenti significativi dal valore
reale.
invece con la prima rischi che la somma di tanti
valori arrotondati a monte vada ad amplificare
gli scostamenti.
a lume di naso sarebbe meglio evitare di arrotondare
tutte le volte che scatta il trigger.

ciao Sndro






Maggiori informazioni sulla lista Gfoss