Forum > Databases

Log

(1/4) > >>

cappe:
Dovrei fare un log delle modifiche fatte ai database dagli utenti, secondo voi è meglio scriverlo a livello di trigger o di codice pascal. Qualche idea su come o qualche spunto?
Sono orientato di scriverlo in Pascal, ma ci sto pensando ...

nomorelogic:
ciao
per farlo a livello di trigger dovresti avere gli utenti che accedono al DB ognuno col loro codice (intendo la connessione al DB)

in uno scenario dove l'applicazione si connette al DB sempre con lo stesso utente e poi l'utente è gestito dall'applicazione è meglio  farlo da codice pascal

Stilgar:
Ciao Cappe.

La risposta, come spesso capita in informatica, non è univoca.
Dipende dallo scenario che ti interessa (tanto per cambiare).

Se a te non serve salvare l'utente che opera la modifica, potrebbe essere il trigger che opera la storicizzazione del record modificato, una storicizzazione acefale, per capirsi.
Se devi mettere in piedi una sorta di audit, forse l'utente che opera la modifica ti serve e quindi le strategie devono cambiare (come suggerito da nomore potrebbe non essere lo stesso utente di connessione al db)
Se il DB che utilizzi permette di mettere in sessione dei valori custom, il trigger potrebbe essere ancora una strada praticabile: carici il nome dell'utente che modifica in sessione e il trigger lo legge.

Se a te serve una soluzione che non sia legata mani e piedi ad un engine specifico, la strada dell'applicazione esterna che gestisce l'utenza (come parametro nell'insert, per banalizzare l'operazione) sicuramente è più "portabile" tra i vari engine. Essendo 2 operazioni di modifica (storicizzazione + update) ricordati che devi gestire la transazione.
Storicizzare un record che poi si schianta nella modifica potrebbe portare a delle difficoltà e casini nel caso in cui l'ufficio audit volesse un report delle modifiche.

Spero di averti dato qualche spunto di riflessione.

Stilgar

DragoRosso:
Eseguire un Audit delle transazioni di un DB non è cosa semplice. Alcuni DB, anzi dire molti DB, dovrebbero già avere internamente la funzionalità richiesta (tra cui FIREBIRD e MSSQL se non vado errato).

SQLite invece presenta i normali Trigger che possono essere usati per fare creare un log. Però ti leghi specificatamente allo stato del DB e se fai variazioni delle tabelle ad esempio tramite update del tuo applicativo (cosa che ad esempio io faccio) bisogna ricordarsi di aggiornare anche i trigger con delle DDL.

Eseguendo tu a livello di codice i post, commit, etc ... io lo farei con gli eventi propri del componente (ZEOS ad esempio) tipo AfterPOST, AfterCommit, ......

Più flessibile ....

Ciao

nomorelogic:
cmq su vuoi passare per i trigger, ti dico come ho fatto io in qualche occasione


* se possibile, nelle tabelle da "loggare", aggiungi una colonna dove memorizzi l'utente (dell'applicazione) che ha effettuato la modifica e/o l'inserimento
* creati una stored procedure apposita per inserire i log  (questo ti faciliterà il porting e la manutenzione), così puoi fare il log sia da trigger che da codice pascal
* nei trigger metti il richiamo alla stored procedure di cui sopra, mantieni il trigger più semplice possibile
* nella stored procedure, metti l'utente come parametro e leggilo dal campo aggiunto sopra
* ti rimane fuori l'eliminazione: nel trigger "before update" non c'è un campo utente in quanto il record viene eliminato (quindi non sai chi ha eliminato il record)... ma a questo puoi ovviare richiamando la stored procedure dall'applicazione pascal...

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa