¿Hay alguna forma independiente de la base de datos de recibir notificaciones de cambio de datos a nivel de campo?
-
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.)
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