Allora si può ragione su FB.
https://firebirdsql.org/file/documentation/html/en/refdocs/fblangref30/firebird-30-language-reference.html#fblangref30-ddl-trigger (https://firebirdsql.org/file/documentation/html/en/refdocs/fblangref30/firebird-30-language-reference.html#fblangref30-ddl-trigger)
Utilizzando 2 funzioni FB puoi "personalizzare" la sessione di lavoro dell'utente.
SELECT RDB$SET_CONTEXT ('USER_SESSION', 'OS_USER','UTENTE OS') FROM RDB$DATABASE;
SELECT RDB$GET_CONTEXT ('USER_SESSION', 'OS_USER') FROM RDB$DATABASE;
In questo modo puoi customizzare le sessioni e lavorare con i trigger, generalizzare le tue query (da pascal), adattare la "stored procedure" senza dover sempre pescare l'utente dal sistema operativo.
(Salvi e riusi in altre parole)
Stilgar
Per migliorare il suggerimento di nomore.
Se duplichi la struttura che devi mettere sotto audit, e aggiungi la colonna utente + operazione, puoi utilizzare 3 valori (quindi aggiungi anche il tipo di manipolazione del record che viene operato).
0=Insert
1=Update
2=Delete
(o una cosa similie).
Così puoi tracciare anche le cancellazioni, oltre che le versioni del record con tutte le modifiche operate sulla singola riga.
Poi, se aggiungi la data inizio validità e fine validità, puoi tenere traccia anche quando è stato modificato il record sotto audit.
Quindi la logica dovrebbe essere:
1) Chiudere la validità del record storicizzato precedente, con il codice di modifica che hai utilizzato + utente, se presente (l'update può lavorare anche se il record no è presente, senza far scattare errori)
update {tabella}_storico set data_validita_fine = CURRENT_TIMESTAMP, mod_code={codice_modifica} where data_validita_fine is null
una cosa del tipo
2) Modificare/Inserire/Eliminare il record d'interesse.
3) Copiare il record attuale in quello storico
insert {tabella}_storico select *, CURRENT_TIMESTAMP, null, null from {tabella}
Le query sono di esempio, non so se funzionano così come le ho messe (non maledirmi)
Stilgar
Stilgar.
Continuo a mettere carne al fuoco.
Se vuoi utilizzare il nome utente del sistema operativo per sapere chi ha fatto cosa, prova a vedere questa query:
SELECT DISTINCT a. *
FROM mon$attachments a
JOIN mon$transactions t ON a.mon$attachment_id = t.mon$attachment_id
WHERE NOT (t.mon$read_only = 1 AND t.mon$isolation_mode >= 2)
Forse i campi MON$REMOTE_HOST e MON$OS_USER possono essere interessanti....
Stilgar