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

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.

Partilhar: