database - tablas - Cómo rastrear cambios de datos en una tabla de base de datos
optimizar consultas mysql explain (8)
¿Cuál es la mejor manera de rastrear los cambios 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 BD) 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?
¿Un registro de seguimiento en una tabla separada (con una columna de ID, posiblemente con marcas de tiempo)?
¿También va a querer deshacer los cambios, tal vez pre-crear la declaración de deshacer (un DELETE para cada INSERT, un (UN-) UPDATE para cada ACTUALIZACIÓN normal) y guardar eso en el rastreo?
Aquí hay algunos problemas que no se relacionan bien entre sí.
En el nivel básico de la base de datos, puede realizar un seguimiento de los cambios al tener una tabla separada que obtiene una entrada añadida a través de activadores en las instrucciones INSERT / UPDATE / DELETE. Esa es la forma general de rastrear cambios en una tabla de base de datos.
La otra cosa que quieres 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, probablemente desee tener una tabla separada en la que el código de la aplicación 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 del registro modificado.
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.
En general, si su aplicación está estructurada en capas, haga que el nivel de acceso a 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 lenguajes que soportan tal cosa , la programación orientada a aspectos puede ser una buena técnica para usar en este tipo de aplicaciones. 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 credenciales de usuario a través de la base de datos.
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 hagas, depende de cómo se conectan tus 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.
Hacerlo todo dentro de la aplicación te abre un poco más a los cambios realizados desde el exterior de la aplicación, pero si tienes varias aplicaciones todas usando los mismos datos y solo querías ver qué cambios realizó el tuyo, tal vez eso es lo que querías. ... encogimiento de hombros
¡Buena suerte para ti, sin embargo!
- Kevin
Al investigar esta misma pregunta, encontré una discusión aquí 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ó. (Debería ser posible generar el esquema para esto más o menos automáticamente mediante el uso de una versión regexed de sus scripts existentes).
Probemos con este componente de código abierto:
https://tabledependency.codeplex.com/
TableDependency es un componente genérico de C # utilizado para recibir notificaciones cuando cambia el contenido de una tabla de base de datos específica.
Si todos los cambios de php. Puede usar class para registrar evry INSERT / UPDATE / DELETE antes de la consulta. Será save action , table , column , newValue , oldValue , date , system (si es necesario), ip , UserAgent , clumnReference , operatorReference , valueReference . Todas las tablas / columnas / acciones que necesitan registrarse son configurables.
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. Esta es la técnica simple que utilicé:
Crea una tabla person_log
create table person_log (date datetime2, sid int);
Cree un desencadenador en la tabla Person que insertará una fila en la tabla person_log cada vez que se actualice la tabla Person:
crear trigger tr en dbo.Person
para la actualización
como insertar en person_log (date, sid) seleccione updatedDTTM, PersonSID de insertado
Después de cualquier actualización, consulte la tabla person_log y podrá ver personSid que se actualizó. Lo mismo que puede hacer para Insertar, eliminar.
El ejemplo anterior es para SQL, hágamelo saber en caso de cualquier consulta o utilice este enlace: http://www.4guysfromrolla.com/webtech/042507-1.shtml