Tabla de historial de la base de datos / Tabla de seguimiento

12

Actualmente quiero estructurar una tabla de seguimiento / historial como esta:

  • PrimaryKey - ID
  • OtherTableId - fk
  • fieldName: nombre del campo que se rastrea
  • OldValue
  • NewValue
  • Nombre de usuario
  • CreateDateTime

Básicamente, quiero tener una tabla que rastree el historial de otras tablas, almacenar el nombre de la columna del campo modificado con el valor nuevo y antiguo. Mi pregunta es: ¿alguien puede hacer agujeros en esto? Además, ¿cuál es la forma más fácil de asegurarse de que solo un nombre de columna de las tablas, su seguimiento se ingrese en la columna fieldName? Actualmente, mis opciones son tener una enumeración en el servicio que estoy creando o crear otra tabla de estado y hacer que el campo Nombre sea un fk. ¿Alguna idea mejor?

Editar Objetivo: Actualmente solo hay 2 campos que nos interesa rastrear. Se mostrará un campo en una página web para mostrar el historial, solo un departamento podrá acceder al otro campo y tendrán acceso a una vista de la base de datos que podrán consultar. Estarían consultando solo este campo para obtener información sobre quién cambió el campo y qué hacer. Esta es la razón por la que queríamos establecerla donde un campo de base de datos define la columna de la tabla en lugar de tener una copia exacta del historial de registros de la tabla. Solo queremos dos campos rastreados con las posibilidades de agregar o eliminar campos en el futuro.

Gracias!

    
pregunta user76982 08.01.2013 - 17:02

4 respuestas

8

Agujeros de punción: ¿qué sucede si el esquema de la base de datos se cambia en el mismo punto más adelante en el tiempo, y cambia el nombre de una columna, o se elimina por completo la columna? Muchos sistemas de bases de datos lo permiten. ¿Qué pasará con tu "fieldName" entonces?

Para la integridad de los datos: debe asegurarse de que cada actualización o operación de eliminación seguramente actualizará su tabla de seguimiento. Esto se logra mejor mediante la activación de un procedimiento almacenado. Debe asegurarse de que solo esos procedimientos almacenados tengan acceso de escritura a su tabla de seguimiento, para que nadie más pueda escribir valores incorrectos.

Si puede vivir con una solución específica de proveedor de db: la mayoría de los sistemas db tienen tablas del sistema donde se almacena la información del esquema (nombres de tablas, identificadores de tablas, nombres de columnas, etc.). Puede verificar si es posible establecer una referencia de clave externa a dicha tabla del sistema. Eso permitiría reemplazar el nombre del campo por un ID de campo si la base de datos admite algo como esto.

En realidad, si necesita rastrear filas completas de la tabla específica, incluidas todas las columnas (y no solo un pequeño subconjunto de las columnas), debe considerar la sugerencia de @ sarfeast. Lea este artículo sobre los inconvenientes de modelos nombre-valor-par.

    
respondido por el Doc Brown 08.01.2013 - 17:11
8

La implementación de auditoría de cambios (seguimiento de historial) más exitosa que he visto es menos genérica y mucho más sencilla. Implica crear una tabla de registro de cambios para cada tabla que desea monitorear, manteniendo nombres de columna y tipos de datos idénticos (con una columna adicional para la marca de tiempo).

El objetivo final, es decir, lo que le gustaría hacer con los datos auditados ayudará a evaluar qué tan adecuado podría ser cada enfoque.

    
respondido por el ofraski 08.01.2013 - 17:16
7

En resumen: debe configurar el mecanismo de Pista de auditoría para las tablas en las que desea realizar un seguimiento del cambio de valor.

Tabla de seguimiento de auditoría única :

  

Cree una tabla para registrar el nombre de la tabla, el nombre del campo y la antigua y nueva   Versiones de los datos. Para este método es habitual registrar tanto el antiguo como el   Nuevas versiones de los datos y solo aquellos campos que han cambiado. A   implementar esto en los desencadenantes es un requisito que, o bien hay una   clave principal en la tabla o solo se actualizan filas individuales.

Aquí hay una buena publicación con scripts sobre cómo lograrlo: Creación de pistas de auditoría

Otras referencias útiles para buscar:

respondido por el EL Yusubov 08.01.2013 - 18:16
3

Es posible que desee consultar NHibernate Envers documentación del proyecto para obtener ideas.

Básicamente, tiene una tabla de revisión donde puede agregar datos adicionales como una marca de tiempo o un usuario. Luego, cada tabla de la que realiza el seguimiento obtiene una tabla de auditoría adicional con todas las columnas duplicadas, un fk a la tabla de revisión y el tipo de revisión (agregar, modificar, eliminar). AFAIK, no querría que sus tablas de auditoría tuvieran un FK real en la tabla real porque eso evitaría las eliminaciones.

    
respondido por el dotjoe 08.01.2013 - 18:11

Lea otras preguntas en las etiquetas