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.
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.
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.
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]
Façam um bom uso!!!