Esiste un modo indipendente dal database di ricevere notifiche di modifica dei dati a livello di campo?
-
10-07-2019 - |
Domanda
Attualmente, usando SQL Server 2005, eseguo il polling di un "evento Windows" database per determinare le modifiche in una tabella denominata WINDOWS_EVENTS, che ha un campo timestamp. Osservando il timestamp posso determinare se la riga è cambiata, ma non quale campo in quella riga è cambiato.
Esiste un metodo generico (ovvero un modo indipendente dal database) per rilevare le modifiche a livello di campo? (Ho bisogno che sia generico, perché non si può dire quale database utilizzerebbe un cliente, quindi non voglio usare Notification Services o altre tecnologie specifiche di SQL Server. Potrei usare qualsiasi soluzione, .NET, Java o qualsiasi altra lingua se questo mi aiuta a risolvere il mio problema.)
Soluzione
Innanzitutto, consiglierei di cambiare la struttura della tabella da qualcosa del genere:
id field1 field2 field3 field4 timestamp
in qualcosa del genere:
Table 1
-------
id fieldKey value timestamp
1 1 42 12:03am
2 3 'Cow' 1:45am
3 2 'Moo' 2:33am
4 4 99 3:59am
Table 2
-------
fieldKey fieldLabel
1 Field One
2 Field Two
3 Event One
4 Event Two
In secondo luogo, puoi ottenere ciò che desideri copiando il vecchio valore o calcolando l'hash dei valori di campo (per campi lunghi) e memorizzandoli in un altro campo (oldField1, oldField2, ecc.) insieme al timestamp, quindi sondare il tavolo. Credo che tutti i database abbiano una funzione hash, come SHA1 ('xyz') o MD5 ('abc'), anche se potrebbe avere un nome leggermente diverso in ognuno.
Quindi, quando esegui il polling della tabella per le modifiche, vedi la riga che è cambiata e puoi fare un confronto campo per campo per scoprire quale campo è cambiato. Quindi confronteresti field1 con oldField1, field2 con oldField2, field3 con oldField3, ecc. Per i BLOB, potresti confrontare SHA1 (field4) con oldField4).
Crea un trigger di procedura memorizzata per copiare i campi quando aggiorni il timestamp.
Un'altra soluzione è quella di creare una tabella di registro delle modifiche ai dati che memorizza solo le modifiche. Sarebbe inserito tramite una stored procedure trigger e sembrerebbe così
id tableName rowKey fieldName oldValue newValue timestamp
1 WINDOWS_EVENTS 42 event1 stable crash 4:44am