Temporal Tables SQL Server 2016

Uma das novidades do SQL Server 2016 é o Temporal Tables, mais talvez fiquem com dúvidas o que é o Temporal Tables e como poderia utiliza-lo no dia-a-dia, por isso, irei explicar de forma simples e objetiva.

Temporal tables nada mais é do que o histórico de alterações ocorridas em determinada tabela do banco de dados, essa opção poderá ser habilitada e desabilitada quando necessário por tabela.

Vamos colocar em prática, para que possam ver como esse funcionalidade é simples e extremamente útil.


Como criar uma tabela com a funcionalidade ‘Temporal Tables’?

[sourcecode language=”sql”]

CREATE TABLE PRECO
(
ID_PRODUTO int NOT NULL PRIMARY KEY CLUSTERED
, VALOR FLOAT NOT NULL
, DT_INICIO datetime2 (2) GENERATED ALWAYS AS ROW START
, DT_FIM datetime2 (2) GENERATED ALWAYS AS ROW END
, PERIOD FOR SYSTEM_TIME (DT_INICIO, DT_FIM)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.PRECO_HIST));

[/sourcecode]

Notem que a criação da tabela temos alguns elementos diferentes, são eles:

“DT_INICIO datetime2 (2) GENERATED ALWAYS AS ROW START”
“DT_FIM datetime2 (2) GENERATED ALWAYS AS ROW END”
“PERIOD FOR SYSTEM_TIME (DT_INICIO, DT_FIM)”

Os 3 elementos são referente a data que as ações foram realizadas nas tabelas, essas informações servem principalmente para tabela que terá os históricos das informações.

“WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.PRECO_HIST))”

Essa condição está dizendo que o versionamento está ativo e que as informações de histórico serão gravadas na tabela ‘dbo.PRECO_HIST’. Caso não seja informado o nome da tabela de histórico que será gravada as informações, será criada uma tabela com nome aleatório, conforme exemplo, ‘MSSQL_TemporalHistoryFor_661577395’.

Agora que já foi criada tabela, entendemos sobre seu funcionamento, vamos fazer inserção de dados na mesma.

[sourcecode language=”sql”]

INSERT INTO PRECO (ID_PRODUTO, VALOR)
VALUES (1, 12.88), (2, 11.88), (3, 13.77), (4, 15.85), (5, 10.99), (6, 3.54);

[/sourcecode]

Após o insert apenas a tabela ‘PRECO’ terá informações, a tabela de histórico não, pois, os registros que estão na tabela ‘PRECO’ são os ‘originais’, pois, não sofreram nenhuma alteração ainda.

Tabelas Apos Insert

Agora, vamos fazer alterações de alguns registros para ver o que será inserido na tabela de histórico.

[sourcecode language=”sql”]

UPDATE PRECO SET VALOR = VALOR – (VALOR * 0.66)

WHERE ID_PRODUTO IN (1,3,5);

[/sourcecode]

Os registros que foram feitas as alterações serão inseridos na tabela de histórico com os valores originais e com data que alteração ocorreu, data essa em formato UTC, vejam imagem abaixo.

Tabelas Apos Update

Agora vamos excluir determinado registro para ver qual informação será inserida na tabela de histórico.

[sourcecode language=”sql”]
DELETE FROM PRECO WHERE ID_PRODUTO = 3;
[/sourcecode]

Notem como ficou tabela de histórico, agora possui dois registros com produto 3, um registro foi alteração de preço que foi realizada anteriormente e outro o registro excluído.

Tabelas Apos Delete

Para visualizarem a data e hora baseado em nosso horário basta converter data conforme exemplo abaixo:

[sourcecode language=”sql”]
SELECT ID_PRODUTO,
VALOR,
CONVERT(DATETIME, SWITCHOFFSET(CONVERT(DATETIMEOFFSET, DT_INICIO), DATENAME(TZOFFSET, SYSDATETIMEOFFSET()))) AS DT_INICIO,
CONVERT(DATETIME, SWITCHOFFSET(CONVERT(DATETIMEOFFSET, DT_FIM), DATENAME(TZOFFSET, SYSDATETIMEOFFSET()))) AS DT_FIM
FROM PRECO_HIST;
[/sourcecode]

Tabela de Hist. Com data formatada

Façam um bom uso!!!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.