On Thu, 14 Dec 2017 18:18:36 +0100 (CET), falcerisim...@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
_______________________________________________
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni
dell'Associazione GFOSS.it.
801 iscritti al 19/07/2017