2008-09-01 12 views
25

¿Cuál es la mejor manera de rastrear cambios en una tabla de base de datos?Cómo rastrear cambios de datos en una tabla de base de datos

Imagine que tiene una aplicación en la que los usuarios (en el contexto de la aplicación, no los usuarios de bases de datos) pueden cambiar los datos almacenados en alguna tabla de la base de datos. ¿Cuál es la mejor manera de rastrear un historial de todos los cambios, para que pueda mostrar qué usuario y a qué hora cambiar qué datos?

+2

Algunos buena discusión aquí: http://discuss.joelonsoftware.com/default.asp?design.4.483891 .10 –

+0

Véase también [¿El mejor diseño para una tabla de base de datos de registro de cambios/auditoría?] (Https://stackoverflow.com/questions/201527/best-design-for-a-changelog-auditing-database-table) – user

Respuesta

3

En general, si su aplicación está estructurada en capas, haga que el nivel de acceso a los datos llame a un procedimiento almacenado en su servidor de base de datos para escribir un registro de los cambios en la base de datos.

En los idiomas que admiten tal cosa aspect-oriented programming puede ser una buena técnica para este tipo de aplicación. La auditoría de los cambios en la tabla de la base de datos es el tipo de operación que normalmente deseará registrar para todas las operaciones, por lo que AOP puede funcionar muy bien.

Tenga en cuenta que los cambios en la base de datos de registro crearán una gran cantidad de datos y ralentizarán el sistema. Puede ser sensato utilizar una solución de cola de mensajes y una base de datos separada para realizar el registro de auditoría, según el tamaño de la aplicación.

También es perfectamente factible usar procedimientos almacenados para manejar esto, aunque puede haber un poco de trabajo involucrando pasar las credenciales del usuario a la base de datos.

+1

Parece que si desea permitir que el usuario vea su propio historial o el historial de otras personas, un archivo de registro no sería muy accesible para ellos. –

3

Aquí tiene algunos problemas que no se relacionan bien entre sí.

En el nivel básico de la base de datos puede hacer un seguimiento de los cambios teniendo una tabla separada que obtiene una entrada agregada a ella mediante activadores en instrucciones INSERT/UPDATE/DELETE. Esa es la forma general de rastrear cambios en una tabla de base de datos.

La otra cosa que desea es saber qué usuario hizo el cambio. En general, sus desencadenantes no sabrían esto. Supongo que si quiere saber qué usuario cambió un dato, es posible que varios usuarios cambien los mismos datos.

No hay una forma correcta de hacerlo, es probable que desee tener una tabla separada en la que insertará un registro cada vez que un usuario actualice algunos datos en la otra tabla, incluidos el usuario, la marca de tiempo y el ID de el registro cambiado

Asegúrate de usar una transacción para no terminar con casos en que la actualización se realiza sin la inserción, o si haces el pedido al revés no terminas insertando sin la actualización.

0

¿Un registro de seguimiento en una tabla separada (con una columna de ID, posiblemente con marcas de tiempo)?

¿Deseará deshacer los cambios también? ¿Tal vez precrear la declaración de deshacer (un DELETE para cada INSERT, una (una) ACTUALIZACIÓN para cada ACTUALIZACIÓN normal) y guardar eso en la traza?

4

Un método que he visto con bastante frecuencia es tener tablas de auditoría. Luego, puede mostrar lo que ha cambiado, lo que ha cambiado y de qué cambió, o lo que quiera que su corazón desee. Entonces, podría escribir un desencadenador para hacer el registro real. No es demasiado doloroso si se hace correctamente ...

No importa cómo lo haga, depende de cómo se conectan los usuarios a la base de datos. ¿Están usando un usuario de una sola aplicación a través de un contexto de seguridad dentro de la aplicación, se están conectando usando sus propias cuentas en el dominio, o la aplicación simplemente hace que todos se conecten con una cuenta sql genérica?

Si no puede obtener la información del usuario de la conexión de la base de datos, es un poco más problemático. Y luego puede ver el registro en la aplicación, por lo que si tiene un proceso llamado "CreateOrder" o lo que sea, puede iniciar sesión en la tabla Order_Audit o lo que sea.

Al hacerlo todo dentro de la aplicación, se abre un poco más a los cambios realizados desde fuera de la aplicación, pero si tiene múltiples aplicaciones todas usando la misma información y solo quería ver qué cambios realizó, quizás eso es lo que quería ... < encogimiento de hombros>

¡Buena suerte para usted, sin embargo!

--Kevin

1

En la investigación de esta misma pregunta, me encontré con una discusión here muy útil. Sugiere tener una tabla paralela establecida para el seguimiento de cambios, donde cada tabla de seguimiento de cambios tiene las mismas columnas que su seguimiento, más columnas para quién la cambió, cuándo y si se eliminó. (Debe ser posible generar el esquema para este más o menos automáticamente mediante el uso de una versión regexed en marcha de las secuencias de comandos pre-existentes.)

+0

Sí, esta es una muy buena introducción/tutorial –

0

Probemos con este componente de código abierto:

https://tabledependency.codeplex.com/

TableDependency es un componente C# genérico utilizado para recibir notificaciones cuando cambia el contenido de una tabla de base de datos especificada.

-1

Si todos los cambios de php. Puede usar class para registrar evry INSERT/UPDATE/DELETE antes de la consulta. Será Guardar acción, mesa, columna, nuevoValor, oldValue, fecha, sistema (si es necesario), ip, agente de usuario, clumnReference, operatorReference, valuereference. Todas las tablas/columnas/acciones que necesitan registrarse son configurables.

1

Supongamos que tengo una Person Table con 10 columnas que incluyen PersonSid y UpdateDate. Ahora, quiero hacer un seguimiento de las actualizaciones en Person Table. Aquí es la técnica simple utilicé:

  1. Crear una tabla person_log

    crear person_log mesa (fecha datetime2, sid int);

  2. crear un disparador en la mesa persona que va a insertar una fila en la tabla person_log cada vez que se actualiza la tabla Persona:

    crear tr gatillo de dbo.Person
    para la actualización
    como inserción en person_log (fecha, sid) seleccionar updatedDTTM, PersonSID desde insertada

Después de las actualizaciones, consulta de tabla person_log y usted será capaz de ver personSid que quedó actualizan. Lo mismo que puede hacer para Insertar, eliminar.

El ejemplo de arriba es para SQL, que me haga saber en caso de cualquier duda o utilice este enlace: http://www.4guysfromrolla.com/webtech/042507-1.shtml

Cuestiones relacionadas