[Gfoss] esempio Trigger semplice

Andrea Peri aperi2007 a gmail.com
Ven 15 Dic 2017 08:02:22 CET


Ad esempio un esempio di uso che ho tipico di un trigger e' impedire la
modifica dei dati.

Ricordo un vecchio nostro plugin che facemmo realizzare per qgis in cui la
base dati era uno spatialite nelle cui tabelle erano stati inseriti dei
triggers per impedire che l'utente potesse
modificare i dati aprendo un qgis e mettendo lo spatialite in editing. Il
plugin guidava l'utente a eseguire detemrinate modifiche in un certo modo e
solo quelle.
Volevamo garantirci che l'utente non potesse aprire lo spatialite in
autonomia con qgis stesso o con altro software e intervenire sui dati
alterandoli in maniera incontrollata.
Per questo adottammo alcuni triggers che a certe condizioni impedivano la
modifica dei dati.

Altro esempio e' quello di usare un triger per fare la MakeValid della
geometria e garantire quindi la sua correttezza.

Tutto bello.
Pero' attenzione ad aggiungere i triggers.
Il maggior rischio e' pensare di usarli per fare cose troppo sofisticate.

Con il rischio che poiche' non si a mai cosa in futuro ci si deve fare con
tali dati, di ritrovarsi magari dopo qualche mese a vedere comportamenti
anomali su un applicativo e dimenticarsi che dentro la BD vi' sono dei
triggers che facevano certe operazioni e che guarda caso interfericono con
altre operazioni all'epoca non preventivate.

I triggers non sono facilmente rilevabili , e, specialmente su spatialite,
non credo che si possano nemmeno rimuovere senza interferire con i dati
stessi.

Qui pero' forse lo sa' meglio Furieri.
Forse mi sbaglio, ma temo che per rimuovere un trigger su una tabella
spatialite sia necessario droppare la tabella con tutto il suo contenuto.

Se cosi' fosse occorre stare parecchio attenti a usarli , perche' se per
rimuovere un trigger che da noia si deve cancellare tutti i dati in tale
tabella.
Si fa' certamente, ma diventa macchinoso e complicato .

Quindi attenzione, massima attenzione a usare i triggers.


A.


Il giorno 15 dicembre 2017 00:40, <a.furieri a lqt.it> ha scritto:

> On Thu, 14 Dec 2017 22:19:25 +0100, Massimiliano Moraca wrote:
>
>> 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..?
>>
>>
> Massimiliano,
>
> certo che puoi; i triggers sono un meccanismo universale,
> ci puoi fare qualsiasi cosa che ti viene in mente
> (o quasi ...)
>
> l'unico limite e' la tua capacita' creativa di saperti
> "inventare" un buon modello dati; naturalmente serve
> anche una base molto solida di conoscenza teorica su
> SQL con tutte le sue estensioni Spatial, cosi' come e'
> indispensabile quella certa "praticaccia spicciola" che
> si acquisisce solo a forza di lavorare sul campo imparando
> piu' che altro dai propri errori.
>
> giusto per analizzare per sommi capi il tuo esempio
> relativo all'evoluzione storica dei dati, e' molto
> piu' semplice di quanto tu possa credere:
>
> 1. ti crei una tavola di appoggio in cui andrai a
>    registrare tutte le successive modifiche delle
>    tue geometrie. una scelta saggia sarebbe quella
>    di introdurre un opportuno vincolo FK che associ
>    direttamente ciascuna "riga-versione" con la
>    corrispondente riga della tavola-madre.
>    cosi' come sarebbe opportuno inserire un timestamp
>    che tenga traccia della data-ora in cui e' avvenuta
>    la modifica; datti un'occhiata a DateTime('now')
>
> 2. a questo punto vai ad installare tre triggers
>    sulla tavola-madre, uno per la Insert, uno per
>    la Update ed uno per la Delete.
>    ovviamente ciascuno di questi non fara' altro
>    che prendere la geometria e salvarla permanentemente
>    sulla tavola-versioni associandola al timestamp
>    corrente.
>
> basta; non serve altro. e' piu' facile da implementare
> che da spiegare.
>
>
> concetti da tenere bene a mente:
> ================================
> un Trigger e' semplicemente un gestore di eventi.
> una volta che il Trigger e' correttamente installato
> scattera' automaticamente tutte le volte che si
> verifica l'evento in oggetto.
> l'azione specifica di ciascun Trigger e' determinata
> da un "pezzo" di SQL che sta a te scrivere nel modo
> che ritieni piu' opportuno; hai tutta la liberta'
> che vuoi di fare qualsiasi cosa che ti passi per la
> zucca, basta solo che tu trovi il modo di tradurla
> in una appropriata sequenza di comandi SQL.
> ovviamente liberta' e responsabilita' sono sempre
> due facce della medesima medaglia; se non funziona
> e' sicuramente colpa tua, e ti dovrai quindi armare
> di santissima pazienza per fare tutto il debugging
> del caso (che e' poi la vera essenza di qualsiasi
> sviluppo sw; un bravo sviluppatore non e' uno bravo
> a scrivere codice, e' soprattutto uno bravo a fare
> debugging)
>
>
> Mi indicate una risorsa da cui studiare? Anche un libro se non c'è
>> nulla online...
>>
>>
> non credo proprio che esista nulla di specifico
> relativo ai triggers, al massimo puoi trovare qualche
> manuale generico su SQL che avra' un capitoletto
> sui meccanismi generali dei triggers.
> dovresti sicuramente trovare qualche manuale piu' o
> meno ponderoso in qualsiasi libreria universitaria.
>
> per tutto il resto serve tenere sempre sotto mano
> la doc tecnica del tuo DBMS preferito [1], ma soprattutto
> servono tempo, pazienza e perseveranza, uniti ad un
> pizzico di intuizione e di fantasia creativa.
>
> [1] https://www.sqlite.org/lang.html
>
> ciao Sandro
>
>
>
> _______________________________________________
> 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
>



-- 
-----------------
Andrea Peri
. . . . . . . . .
qwerty àèìòù
-----------------


Maggiori informazioni sulla lista Gfoss