Ho una tabella con 120 colonne. Ho bisogno di impostare audit trail che registrerebbe qualsiasi colonna se fosse stata modificata. Come è ora, mi sa che devo impostare un trigger con condizione di qualcosa di simile per ogni colonna:Trigger di aggiornamento MySQL: trova le colonne modificate?
IF(NEW.columnName != OLD.columnName)
THEN //log the old value
Ciò dovrebbe essere fatto 120 volte ... Mentre io avrei accettato questo approccio 20 anni fa, oggi mi rifiuto di credere che sia impossibile automatizzare una procedura così semplice trovando automaticamente le colonne modificate.
Questo è quello che ho scoperto finora:
- né nuovo né vecchio è un tavolo, è una sorta di un costrutto del linguaggio, Perciò non si può fare o qualcosa di simile "SELECT NOW *.".
- SQL dinamico non consentito nei trigger (questo potrebbe aver risolto il problema).
- Le procedure che utilizzano SQL dinamico non sono consentite nei trigger (seriamente, Oracle, sembra che tu abbia lavorato davvero duramente per disabilitare questa funzione, non importa quale).
Stavo pensando di utilizzare i trigger BEFORE e AFTER in combinazione con tabelle e variabili temporanee che avrebbero probabilmente risolto il problema, tuttavia ancora una volta sarebbe richiesto un SQL dinamico. Mi sento come se avessi colpito un vicolo cieco.
C'è una soluzione a questo?
Una domanda a margine: sarebbe possibile in PostgreSQL?
UPDATE: Ho trovato 2 possibili soluzioni ma nessuno di loro sembrano abbastanza chiaro per me:
- utilizzando EVENTI come una soluzione per utilizzare i trigger in combinazione con SQL dinamico workaround. Devo ammettere che non lo capisco, questo significa che l'EVENTO spara ogni secondo, non importa quale?
- This article afferma che è possibile utilizzare SQL dinamico all'interno del trigger purché venga utilizzata una tabella temporanea. Questo è ancora utilizzando SQL dinamico, quindi non capisco.
Hai controllato questo con [Session Information Functions in Postgres come per la tua ultima domanda] (http://stackoverflow.com/questions/8759595/within-a-trigger-function-how-to-get-which-fields-are-being-updated) – bonCodigo
@bonCodigo Grazie, apparentemente PostgreSQL è più flessibile in questo caso. – Caballero