(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
SQL Server

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.

Compartir: