Temporal Tables no SQL Server: histórico automático sem triggers
João Barros
06 de June de 2025
2 min de leitura
As System-Versioned Temporal Tables, introduzidas no SQL Server 2016 e no padrão SQL:2011, mantêm automaticamente o histórico de todas as alterações de dados — sem triggers, sem código de auditoria manual.
Criar uma Temporal Table
CREATE TABLE dbo.Clientes (
id_cliente INT PRIMARY KEY,
nome NVARCHAR(200) NOT NULL,
email NVARCHAR(200) NOT NULL,
plano VARCHAR(50),
-- Colunas obrigatórias para versionamento 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));
Inserir, actualizar e apagar normalmente
-- Nada muda na escrita — o SQL Server gere o histórico automaticamente
UPDATE dbo.Clientes SET plano = 'Premium' WHERE id_cliente = 101;
DELETE FROM dbo.Clientes WHERE id_cliente = 999;
-- O registo eliminado fica preservado na tabela de histórico
Consultar dados no passado
-- Estado actual
SELECT * FROM dbo.Clientes WHERE id_cliente = 101;
-- Estado em 1 de Janeiro de 2024
SELECT * FROM dbo.Clientes
FOR SYSTEM_TIME AS OF '2024-01-01 00:00:00'
WHERE id_cliente = 101;
-- Todo o histórico de um cliente
SELECT *, valid_from, valid_to FROM dbo.Clientes
FOR SYSTEM_TIME ALL
WHERE id_cliente = 101
ORDER BY valid_from;
-- Alterações num período (auditing)
SELECT * FROM dbo.Clientes
FOR SYSTEM_TIME BETWEEN '2024-06-01' AND '2024-06-30'
WHERE id_cliente = 101;
Gestão da tabela de histórico
-- Ver tamanho da tabela de histórico
SELECT COUNT(*) FROM dbo.ClientesHistorico;
-- Limpar histórico mais antigo que 2 anos
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));
Conclusão
Temporal Tables são a forma mais elegante de implementar auditoria e histórico em SQL Server. Zero código adicional, sintaxe SQL padrão para consultas temporais e compatibilidade total com o optimizador de queries.