database - sesion - registro de eventos sql server
¿Una estrategia efectiva para dejar una pista de auditoría/historial de cambios para las aplicaciones DB? (6)
Al igual que con un desencadenante (o incluso con), puede hacer que cada transacción desencadene un evento de registro de forma asincrónica y que otro proceso (o solo un subproceso) controle realmente 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 lleva a bloqueos de los registros de auditoría en cascada).
Además, puede mejorar el rendimiento de la base de datos primaria manteniendo la base de datos de auditoría en una ubicación separada.
¿Cuáles son algunas estrategias con las que la gente ha tenido éxito para mantener un historial de cambios para los datos en una base de datos bastante compleja? Una de las aplicaciones que uso y desarrollo con frecuencia podría beneficiarse realmente de una forma más completa de seguimiento de cómo los registros han cambiado con el tiempo. Por ejemplo, en este momento los registros pueden tener una cantidad de campos de fecha y hora y campos de usuario modificados, pero actualmente no tenemos un esquema para registrar múltiples cambios, por ejemplo, si una operación se revierte. En un mundo perfecto, sería posible reconstruir el registro tal como estaba después de cada guardado, etc.
Alguna información sobre el DB:
- Necesita tener la capacidad de crecer en miles de registros por semana
- 50-60 Tablas
- Las tablas revisadas principales pueden tener varios millones de registros cada una
- Cantidad razonable de claves foráneas e índices establecidos
- Usando PostgreSQL 8.x
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 triggers aumenta el tiempo requerido para realizar la transacción y, dependiendo del volumen, puede causar problemas de rendimiento.
Otra forma es explorar si la base de datos proporciona alguna forma de extraer los registros "Rehacer" como en el caso de Oracle. Registros de rehacer es lo que usa la base de datos para volver a crear los datos en caso de que fallen y tengan que recuperarse.
En el pasado, he utilizado desencadenantes para construir db update / insert / delete logging.
Puede insertar un registro cada vez que una de las acciones anteriores se realiza en una tabla específica en una tabla de registro que realiza un seguimiento de la acción, qué usuario de db lo hizo, marca de tiempo, tabla en la que se realizó y valor anterior.
Sin embargo, probablemente haya una mejor respuesta, ya que esto requeriría que guarde en caché el valor antes de que se realice la eliminación o actualización real, creo. Pero podrías usar esto para hacer retrocesos.
Si está utilizando Hibernate, eche un vistazo a JBoss Envers . Desde la página principal del proyecto:
El proyecto Envers tiene como objetivo permitir el control de versiones fácil de clases persistentes de JPA. Todo lo que tiene que hacer es anotar su clase persistente o algunas de sus propiedades, que desea versión, con @Versioned. Para cada entidad versionada, se creará una tabla, que contendrá el historial de los cambios realizados en la entidad. A continuación, puede recuperar y consultar datos históricos sin mucho esfuerzo.
Esto es algo similar al enfoque de Eric , pero probablemente con mucho menos esfuerzo. Sin embargo, no sé qué idioma / tecnología utilizas para acceder a la base de datos.
Una estrategia que puede usar es MVCC, Control de Concurrencia de Múltiples Valores. En este esquema, nunca hace actualizaciones en ninguna de sus tablas, simplemente inserta, manteniendo números de versión para cada registro. Esto tiene la ventaja de proporcionar una instantánea exacta desde cualquier punto en el tiempo, y también evita completamente los problemas de bloqueo de actualización que afectan a muchas bases de datos.
Pero hace una enorme base de datos, y todas las selecciones requieren una cláusula adicional para seleccionar la versión actual de un registro.
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 de SQL Server de Pop Rivett : Pop en la auditoría Sendero
Cree una tabla de auditoría y luego cree un activador para cada tabla que desee auditar.
Sugerencia: use Codesmith para construir sus disparadores.