En primer lugar es necesario agregar un conjunto de propiedades a las tablas:
- Versión - hora de la última modificación (también puede ser autoincremental contador en lugar de tiempo).
- LastModifiedBy - referencia al usuario que realizó la última modificación (si la almacena).
Luego tiene varias opciones sobre cómo almacenar su historial de versiones. Puede
Cree una nueva tabla para cada una de las tablas principales para las que desea almacenar el historial. Las tablas de historial tendrán los mismos campos que la tabla principal, pero las claves primarias y externas no se aplicarán. Para cada clave externa también se creó la versión de la tienda de la entrada referenciada en la versión de tiempo.
O puede serializar todo lo interesante sobre su entidad y almacenar todos los blobs serializados para todas las entidades que quiera versionar en una tabla de historial global (personalmente prefiero el primer acercamiento).
¿Cómo llenas tus tablas de historial? Mediante actualización y eliminación de desencadenantes.
- En la activación de la actualización de su entidad, copie todos los valores anteriores en la tabla del historial. Para cada clave externa, también copie la versión actual de la entidad a la que se hace referencia.
- En supresión de eliminación: básicamente, haga lo mismo.
Tenga en cuenta que cada vez más sistemas modernos NO eliminan nada. Solo marca cosas como eliminadas. Si desea seguir este patrón (que tiene varios beneficios), en lugar de eliminar agregue el indicador IsDeleted a sus entidades (por supuesto, debe filtrar entidades eliminadas en todas partes).
¿Cómo ves tu historial? Solo use la tabla de historial, ya que tiene todas las mismas propiedades que la tabla principal, no debería ser un problema. Pero, al expandir claves externas, asegúrese de que la Versión de entidad referenciada sea la misma que la que almacena en su tabla de historial. Si no es así, debe ir a la tabla de Historial de esa entidad a la que se hace referencia y tomar los valores allí. De esta forma, siempre tendrá una instantánea de cómo se veía la entidad en ESE momento, incluidas todas las referencias.
Además de todo lo anterior, también puede restaurar el estado de su entidad a cualquier versión anterior.
Tenga en cuenta que esta implementación, aunque es fácil, puede consumir algo de espacio, ya que almacena instantánea, no solo se están realizando cambios. Si solo desea almacenar cambios, en el desencadenador de actualización puede detectar qué campos se han cambiado, serializarlos y almacenarlos en la tabla de historial global. De esa manera, al menos puede mostrar en la interfaz de usuario qué ha cambiado y por quién (aunque puede tener problemas para volver a una versión anterior).
Agregaré una recompensa para obtener una respuesta más detallada, por favor :) –
@AnynameDonotcare para cada tabla para la que desee almacenar el historial: 1) agregar la columna Versión (puede ser hora, puede incrementarse el contador). 2) agregue otra tabla con todas las mismas propiedades que la tabla principal (pero mejor expanda las claves externas). 3) Antes de la activación de la actualización, si la columna Versión ha cambiado, copie los valores antiguos en esta tabla de versiones. 4) Beneficio. – Evk
@Evk: estaré muy agradecido si pudiera agregar una respuesta detallada con un ejemplo simple (usando 'EF') podría usarse como una base para la aplicación empresarial (sobre la eliminación de acciones de acción y mm) –