Temporal Tables en SQL Server: historial automático sin triggers
João Barros
06 de June de 2025
2 min de lectura
Las System-Versioned Temporal Tables, introducidas en SQL Server 2016 y en el estándar SQL:2011, mantienen automáticamente el historial de todos los cambios de datos — sin triggers, sin código de auditoría manual.
Crear una Temporal Table
CREATE TABLE dbo.Clientes (
id_cliente INT PRIMARY KEY,
nombre NVARCHAR(200) NOT NULL,
email NVARCHAR(200) NOT NULL,
plan VARCHAR(50),
-- Columnas obligatorias para el versionado temporal
valid_from DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,
valid_to DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME (valid_from, valid_to)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ClientesHistorico));
Insertar, actualizar y borrar normalmente
-- Nada cambia en la escritura — SQL Server gestiona el historial automáticamente
UPDATE dbo.Clientes SET plan = 'Premium' WHERE id_cliente = 101;
DELETE FROM dbo.Clientes WHERE id_cliente = 999;
-- El registro eliminado queda preservado en la tabla de historial
Consultar datos en el pasado
-- Estado actual
SELECT * FROM dbo.Clientes WHERE id_cliente = 101;
-- Estado el 1 de enero de 2024
SELECT * FROM dbo.Clientes
FOR SYSTEM_TIME AS OF '2024-01-01 00:00:00'
WHERE id_cliente = 101;
-- Todo el historial de un cliente
SELECT *, valid_from, valid_to FROM dbo.Clientes
FOR SYSTEM_TIME ALL
WHERE id_cliente = 101
ORDER BY valid_from;
-- Cambios en un periodo (auditing)
SELECT * FROM dbo.Clientes
FOR SYSTEM_TIME BETWEEN '2024-06-01' AND '2024-06-30'
WHERE id_cliente = 101;
Gestión de la tabla de historial
-- Ver el tamaño de la tabla de historial
SELECT COUNT(*) FROM dbo.ClientesHistorico;
-- Limpiar historial más antiguo que 2 años
ALTER TABLE dbo.Clientes SET (SYSTEM_VERSIONING = OFF);
DELETE FROM dbo.ClientesHistorico WHERE valid_to < DATEADD(YEAR, -2, GETDATE());
ALTER TABLE dbo.Clientes SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ClientesHistorico));
Conclusión
Las Temporal Tables son la forma más elegante de implementar auditoría e historial en SQL Server. Cero código adicional, sintaxis SQL estándar para consultas temporales y compatibilidad total con el optimizador de consultas.