Tablas Versionadas: Creación y Gestión de Historial de Cambios en SQL

Clase 17 de 31Curso de Optimización de Bases de Datos en SQL Server

Resumen

¿Qué son las tablas versionadas y cómo se utilizan?

Las tablas versionadas son estructuras dentro de una base de datos SQL que permiten guardar un histórico de cambios realizados a los datos. Estas estructuras son extremadamente útiles para auditorías o para regresar a un punto específico si se necesita revertir algún cambio. Mediante el uso de una tabla versionada, podemos crear un registro histórico que se actualiza automáticamente cada vez que se modifican los datos. Esto significa que cualquier cambio en los datos dentro de la tabla principal se refleja en una tabla histórica.

¿Cómo se crea una tabla versionada?

El proceso de creación de una tabla versionada en SQL implica la creación de columnas especiales como Valid From y Valid To. Estas columnas se utilizan para indicar la vigencia de los datos dentro de la tabla:

CREATE TABLE Usuario (
    UserId INT PRIMARY KEY,
    Nombre NVARCHAR(50),
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.UsuarioHistory));

Este script crea una tabla llamada Usuario con un sistema de versionado, lo que permite que cualquier cambio en los datos también se registre en una tabla histórica llamada UsuarioHistory.

¿Cómo se gestionan los datos insertados y actualizados?

Es importante notar que las tablas versionadas únicamente guardan registros de las operaciones UPDATE y DELETE, no de los INSERT. Esto significa que, al realizar un UPDATE, como cambiar el nombre de un usuario en la tabla Usuario, estos cambios se registrarán en la tabla UsuarioHistory.

UPDATE Usuario
SET Nombre = 'Roy Rojas R'
WHERE UserId = 1;

Cómo modificar tablas existentes para incluir versionado

Agregar funcionalidad de versionado a una tabla ya existente también es posible. Supongamos que tenemos una tabla Usuario2 sin un sistema de versionado. Podemos modificarla y agregarle el sistema de gestión de versiones y una tabla histórica correspondiente.

ALTER TABLE Usuario2
ADD ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START,
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);

ALTER TABLE Usuario2
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Usuario2History));

¿Qué pasa si ya no necesitas el versionado?

Si en algún momento decides que el versionado ya no es necesario, puedes desactivarlo fácilmente. Esta acción no eliminará el histórico existente; simplemente separará las tablas históricas para que puedas decidir qué hacer con esos datos.

ALTER TABLE Usuario SET (SYSTEM_VERSIONING = OFF);

Con esto, el control de versiones se desactiva y la tabla histórica UsuarioHistory permanecerá intacta, proporcionando flexibilidad para gestionar los datos antiguos.

¿Cuándo deberías utilizar tablas versionadas?

El uso de tablas versionadas es especialmente valioso en situaciones donde se requiere:

  • Control de versiones detallado, para rastrear cada cambio realizado en los datos.
  • Auditoría, especialmente en sectores regulados donde el seguimiento de las modificaciones es crucial.

El sorprender a tu equipo con la eficiencia de estas tablas para gestionar datos históricos y cambios automáticamente ayuda en la productividad al liberar a los desarrolladores de manejar manualmente estos registros. Recuerda siempre mantenerte actualizado para optimizar tus procesos de gestión de datos y seguir aprendiendo sobre las nuevas herramientas que ofrece SQL.