¿Cómo iba a utilizar una pista de auditoría para mostrar los campos que nunca han sido editados?

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

  •  21-08-2019
  •  | 
  •  

Pregunta

Para un proyecto que estoy trabajando, me ha pedido para crear una pista de auditoría de todos los cambios que se han hecho a los registros. Esta es la primera vez que he tenido que crear una pista de auditoría, por lo que he estado haciendo un gran trabajo de investigación sobre el tema.

La aplicación será desarrollado en PHP / MSSQL, y estará bajo tráfico.

A partir de mi lectura, que han más o menos decidido tener una tabla de auditoría y el uso disparadores para registrar los cambios en la tabla.

Los dos requisitos para la visualización en la solicitud son como sigue:

  1. Ser capaz de ver un registro de todos los cambios realizados en un campo (yo más o menos sé cómo hacer esto)

  2. Ser capaz de ver, al visualizar un registro en la aplicación, un indicador junto a cualquier campo en el registro que se haya cambiado (y posiblemente otra información como la fecha del último cambio).

Artículo # 2 es el que está actualmente me está dando dolor. Sin hacer una consulta independiente para cada campo (o una consulta anidada muy largo que se llevará a las edades de ejecutar), ¿alguien tiene sugerencias para una mejor manera de hacer esto? (He pensado en añadir un campo adicional "ModifiedFlag" para cada campo de la tabla, que actuará como indicador booleano si el campo siempre ha sido editado, pero que parece como un montón de gastos.

¿Fue útil?

Solución

Me gustaría tratar la información de auditoría por separado de la información de dominio real tanto como sea posible.

Requisito # 1: Creo que va a crear tablas de auditoría adicionales para registrar los cambios. Eric sugerencia es buena, la creación de la información de auditoría usando disparadores en la base de datos SQL. De esta manera su aplicación no tiene que ser consciente de la lógica de auditoría.

Si su base de datos no es compatible con disparadores, entonces tal vez usted está usando algún tipo de persistencia o la capa de base de datos. Esto también sería un buen lugar para poner este tipo de lógica, como de nuevo a minimizar las dependencias entre los Normal código de la aplicación y el código de auditoría.

Requisito 2: En cuanto a los indicadores que muestran: Yo no crear campos booleanos en la tabla que almacena la real. (Esto podría causar todo tipo de dependencias que existen entre su Normal código de la aplicación y su pista de auditoría código.)

Me gustaría tratar de dejar que el código responsable de mostrar el formulario también ser responsable de mostrar los datos de auditoría sobre el terreno. Esto hará que sobrecarga consulta, pero eso es el costo para la visualización de esta capa adicional de información. Tal vez se puede minimizar la sobrecarga de base de datos mediante la adición de metadatos a la información de auditoría que permita su fácil recuperación.

Algunas aplicaciones Enterprisy grande que mantengo utiliza más o menos la siguiente estructura:

  • Una tabla de modificación de la cabecera correspondiente a un cambio de un registro en una tabla.

Los campos:

changeId, changeTable, changedPrimaryKey, userName, dateTime

-. Una tabla de campos cambio correspondiente a un campo que se cambia

Los campos:

changeId, changeField, oldValue, NewValue

contenido de la muestra:

modificación de la cabecera:

'1', 'BooksTable', '1852860138', 'AdamsD', '2009-07-01 15:30'

Cambiar artículo:

'1', 'Title', 'The Hitchhiker's Guide to the Gaxaly', 'The Hitchhiker's Guide to the Galaxy'
'1', 'Author', 'Duglas Adasm', 'Douglas Adams'

Esta estructura permite tanto una fácil visualización de pistas de auditoría, así como su fácil recuperación para mostrar los indicadores deseados. Una consulta (combinación interna en la tabla de cabecera y posiciones) sería suficiente para recuperar toda la información a mostrar en una sola forma. (O incluso una mesa cuando se tiene una lista de muestra de Id)

Otros consejos

Como requisito general de abanderamiento cambió campo "huele" un poco extraño. Si los registros son de larga vida y puede cambiar con el tiempo a continuación, finalmente todos los campos tenderán a quedar tan marcado. Por lo tanto me pregunto cómo cualquier usuario podría tener sentido de un simple conjunto de indicadores por campo.

Esa línea de pensamiento me hace sospechar que los datos se almacenan tiene que ser, como se ha descrito, una verdadera pista de auditoría con todos los cambios registrados, y el primer desafío real es decidir cómo la información debe ser presentada al el usuario.

Creo que su idea de preparar algún tipo de datos aggregateOfTheAuditTrail es probable que sea muy útil. La pregunta sería es una sola bandera por registro suficiente? Si el acceso principal del usuario es a través de la lista a continuación, tal vez es suficiente sólo para poner de relieve los registros modificados para después profundizar. O una fecha de la última modificación del valor de registro, de modo que sólo los registros modificados recientemente se resaltan - todos de vuelta a cuáles son las necesidades reales de los usuarios son. Me resulta difícil imaginar que los registros cambiados hace 3 años son tan intersting como aquellos cambiado la semana pasada.

Luego, cuando llegamos a la perforación hacia abajo a un solo registro. Una vez más una bandera sencilla por campo no suena muy práctico (aunque su dominio, sus necesidades). Si es así, entonces su idea resumen está bien. Mi conjetura es que una secuencia de cambios en un campo, y la secuencia de los cambios generales en el registro, son mucho más interesante. Empleado tenía aumento salarial, los empleados movido departamento, fue promovido empleado = tres eventos de negocios individuales o una?

Si se necesita algo más que una simple bandera entonces sospecho que sólo tiene que devolver la totalidad (o reciente) pista de auditoría para el registro y dejar que la figura de la interfaz de usuario encontrar la manera de presentar eso.

Por lo tanto, mi primer pensamiento: Algún tipo de material rodante de mantenimiento de un acta resumida suena como una buena idea. Si es necesario se mantiene en las discusiones de fondo o trabajos por lotes. Nos deisgn que para ser útil-negocio sin tener que ir a la pista de auditoría completa cada vez. Luego de los análisis detallados que permiten a algunos o la totalidad de la pista para ser recuperado.

En lo personal, me gustaría hacer el seguimiento sencilla, y la presentación de informes cobarde.

Cada vez que un usuario inserta un registro, se hace una inserción en la tabla de auditoría para esa tabla

'I', 'Date', 'User', 'Data column1','Data Column2', etc.

Esto es asumiendo la estructura de las tablas no va a cambiar con el tiempo (re. La cantidad de DataColumns)

Para las actualizaciones, basta con insertar

'U', 'Date', 'User', 'Data column1', etc

Insertar lo que el usuario acaba de entrar como una actualización.

A continuación, después de la inserción y actualización, que tendrá la siguiente

'I','May 3 2009','BLT','person005','John','Smith','Marketing'
'U','May 4 2009','BLT','person005','John','Smith','Accounting'

A continuación, es sólo un informe fácil demostrar que el registro persona única 'person005' ha tenido una inserción y una actualización, donde se actualiza su departamento.

Debido a la baja utilización del sistema, que tiene un inserto simple en cambiar a continuación, un proceso de información más complejo no se va a efectuar el rendimiento. Este estilo seguirá funcionando con sistemas de tráfico más altas, ya que la carga extra en una edición es mínima, mientras que la mayor carga de trabajo intensidad de informar los cambios no se hace tan a menudo como una actualización, por lo que el sistema no se caiga.

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