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
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)
);
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)
);