Modificar la estructura de una tabla con versión del sistema habilitado

  • 15 Ago 2023
  • MSSQL

¿Qué es una tabla temporal con versión del sistema?

Una tabla temporal con versión del sistema es un tipo de tabla de usuario diseñada para conservar un historial completo de los cambios de datos y facilitar los análisis en un momento específico. Este tipo de tabla temporal se conoce como tabla temporal con versiones del sistema, porque el período de validez de cada fila lo administra el sistema (es decir, el motor de base de datos).

Más en la documentación oficial

Agregar system versioning a una tabla existente

Antes todo es necesario agregar las columnas ValidFrom y ValidTo

ALTER TABLE dbo.task 
    ADD
        ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN
            CONSTRAINT DF_dbo_task_ValidFrom DEFAULT SYSUTCDATETIME()
      , ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN
            CONSTRAINT DF_dbo_task_ValidTo DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999')
      , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);
GO

Ahora, podemos habilitar SYSTEM_VERSIONING. En este caso indicando que el nombre de la tabla donde serán almacenados los datos historicos sea task_history

ALTER TABLE jsi.task 
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = jsi.task_history)
);

Qué pasa si queremos modificar una tabla con versión de sistema habilitado?

Cuando se habilita la función SYSTEM_VERSIONING a una tabla, SQL Server se ocupará de crear una tabla auxiliar exactamente igual donde se registrará cada cambio realizado a través de UPDATE y DELETE. Después de haber habilitado esta función la estructura de nuestra tabla no podrá modificarse. Primero será necesario eliminar la función de system versioning, luego modificar ambas tablas para mantener su consistencia y luego volver a habilitar temporal tables.

ALTER TABLE dbo.task SET (SYSTEM_VERSIONING = OFF);

-- modificar ambas tablas

ALTER TABLE dbo.task ADD effort_completed NUMERIC(5,2) NULL
ALTER TABLE dbo.task_history ADD effort_completed NUMERIC(5,2) NULL

-- volver a habilitar system versioning

ALTER TABLE dbo.task 
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.task_history)
);