[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