[Gfoss] esempio Trigger semplice

Massimiliano Moraca massimilianomoraca a gmail.com
Gio 14 Dic 2017 22:19:25 CET


Sti trigger mi stanno inTRIGGando :P
Con un trigger è possibile anche tenere traccia dell'evoluzione temporale
di un vettore? Ad esempio poligoni creati, modificati, cancellati..?

Mi indicate una risorsa da cui studiare? Anche un libro se non c'è nulla
online...

Il giorno 14 dicembre 2017 18:50, <a.furieri a lqt.it> ha scritto:

> 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
>
>
>
>
>
> _______________________________________________
> Gfoss a 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
>


Maggiori informazioni sulla lista Gfoss