¿Hay alguna forma independiente de la base de datos de recibir notificaciones de cambio de datos a nivel de campo?

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

  •  10-07-2019
  •  | 
  •  

Pregunta

Actualmente, usando SQL Server 2005, sondeo un " eventos de Windows " base de datos para determinar los cambios en una tabla llamada WINDOWS_EVENTS, que tiene un campo de marca de tiempo. Mirando la marca de tiempo, puedo determinar si la fila cambió, pero no qué campo en esa fila cambió.

¿Existe alguna forma genérica (es decir, de forma independiente de la base de datos) para detectar cambios en el nivel de campo? (Necesito que sea genérico, porque no se sabe qué base de datos usaría un cliente, por lo que no quiero usar Notification Services u otra tecnología específica de SQL Server. Podría usar cualquier solución, .NET, Java o cualquier otro idioma si eso me ayuda a resolver mi problema.)

¿Fue útil?

Solución

Primero, recomendaría cambiar la estructura de su tabla de algo como esto:

id      field1   field2   field3   field4   timestamp

en algo como esto:

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

En segundo lugar, puede lograr lo que desea copiando el valor anterior o calculando el hash de los valores de campo (para campos largos) y almacenándolos en otro campo (oldField1, oldField2, etc.) junto con la marca de tiempo, luego sondear la mesa. Creo que todas las bases de datos tienen una función hash, como SHA1 ('xyz') o MD5 ('abc'), aunque puede tener un nombre ligeramente diferente en cada una.

Luego, cuando sondea la tabla en busca de cambios, ve la fila que ha cambiado y puede hacer una comparación campo por campo para averiguar qué campo ha cambiado. Entonces, compararía field1 con oldField1, field2 con oldField2, field3 con oldField3, etc. Para blobs, podría comparar SHA1 (field4) con oldField4).

Cree un desencadenador de procedimiento almacenado para copiar los campos cuando actualice la marca de tiempo.

Otra solución es crear una tabla de registro de cambios de datos que solo almacene los cambios. Se insertaría a través de un procedimiento almacenado de activación y se vería así

id    tableName       rowKey    fieldName     oldValue     newValue     timestamp
1     WINDOWS_EVENTS  42        event1        stable       crash        4:44am
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top