¿Estrategia eficaz para dejar un registro de auditoría/historial de cambios para aplicaciones de base de datos?

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

Pregunta

¿Cuáles son algunas estrategias con las que las personas han tenido éxito para mantener un historial de cambios de datos en una base de datos bastante compleja?Una de las aplicaciones que uso y desarrollo con frecuencia realmente podría beneficiarse de una forma más completa de rastrear cómo los registros han cambiado con el tiempo.Por ejemplo, en este momento los registros pueden tener una cantidad de marcas de tiempo y campos de usuario modificados, pero actualmente no tenemos un esquema para registrar cambios múltiples, por ejemplo, si se revierte una operación.En un mundo perfecto, sería posible reconstruir el registro tal como estaba después de cada guardado, etc.

Alguna información sobre la base de datos:

  • Necesita tener la capacidad de crecer miles de registros por semana.
  • 50-60 mesas
  • Las tablas principales revisadas pueden tener varios millones de registros cada una.
  • Cantidad razonable de claves externas e índices establecidos
  • Usando PostgreSQL 8.x
¿Fue útil?

Solución

En el pasado, he utilizado activadores para crear registros de actualización/inserción/eliminación de bases de datos.

Puede insertar un registro cada vez que se realiza una de las acciones anteriores en una tabla específica en una tabla de registro que realiza un seguimiento de la acción, qué usuario de base de datos la realizó, marca de tiempo, tabla en la que se realizó y valor anterior.

Sin embargo, probablemente haya una mejor respuesta, ya que creo que esto requeriría que almacene en caché el valor antes de realizar la eliminación o actualización real.Pero podrías usar esto para hacer reversiones.

Otros consejos

Una estrategia que podría utilizar es MVCC, control de concurrencia de valores múltiples.En este esquema, nunca actualiza ninguna de sus tablas, solo realiza inserciones y mantiene los números de versión para cada registro.Esto tiene la ventaja de proporcionar una instantánea exacta de cualquier momento y también evita por completo los problemas de bloqueo de actualizaciones que afectan a muchas bases de datos.

Pero crea una base de datos enorme y todas las selecciones requieren una cláusula adicional para seleccionar la versión actual de un registro.

Si está utilizando Hibernate, eche un vistazo a JBoss Envers.Desde la página de inicio del proyecto:

El proyecto Envers tiene como objetivo permitir un fácil control de versiones de clases JPA persistentes.Todo lo que tienes que hacer es anotar tu clase persistente o algunas de sus propiedades, que deseas versionar, con @Versioned.Para cada entidad versionada, se creará una tabla que contendrá el historial de cambios realizados en la entidad.Luego podrá recuperar y consultar datos históricos sin mucho esfuerzo.

Esto es algo similar a El enfoque de Eric, pero probablemente con mucho menos esfuerzo.Sin embargo, no sé qué idioma/tecnología utiliza para acceder a la base de datos.

El único problema con el uso de Triggers es que aumenta la sobrecarga de rendimiento de cualquier inserción/actualización/eliminación.Para una mayor escalabilidad y rendimiento, le gustaría mantener la transacción de la base de datos al mínimo.La auditoría mediante activadores aumenta el tiempo necesario para realizar la transacción y, según el volumen, puede causar problemas de rendimiento.

otra forma es explorar si la base de datos proporciona alguna forma de extraer los registros "Rehacer" como es el caso de Oracle.Los registros de rehacer son lo que utiliza la base de datos para recrear los datos en caso de que falle y tenga que recuperarse.

De manera similar a un disparador (o incluso con), puede hacer que cada transacción active un evento de registro de forma asincrónica y que otro proceso (o simplemente un hilo) maneje el registro.Habría muchas formas de implementar esto dependiendo de su aplicación.Sugiero que la aplicación active el evento para que no cause una carga innecesaria en su primera transacción (lo que a veces conduce a bloqueos de registros de auditoría en cascada).

Además, es posible que pueda mejorar el rendimiento de la base de datos principal manteniendo la base de datos de auditoría en una ubicación separada.

Utilizo SQL Server, no PostgreSQL, así que no estoy seguro de si esto funcionará para usted o no, pero Pop Rivett tuvo un excelente artículo sobre cómo crear una pista de auditoría aquí:Preguntas frecuentes número 5 sobre SQL Server de Pop Rivett:Pop en el rastro de auditoría

Cree una tabla de auditoría y luego cree un activador para cada tabla que desee auditar.

Pista:usar Codesmith para desarrollar sus desencadenantes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top