Esiste un modo indipendente dal database di ricevere notifiche di modifica dei dati a livello di campo?

StackOverflow https://stackoverflow.com/questions/1221106

  •  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.)

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top