skip to Main Content

Temporal Table no SQL Server – 2ª Parte

Post Series: Temporal Table no SQL Server

No 1º post sobre Temporal Table falei sobre as principais características desta nova funcionalidade no SQL Server 2016, além de mostrar como habilitar.  Você pode acessar a 1ª parte no link abaixo:

Neste post veremos como consultar as informações na tabela de histórico e proceder alterações de Schema.

 

CONSULTANDO O HISTÓRICO

Podemos acessar a tabela de histórico, criada quando habilitamos Temporal Table, da mesma forma que acessamos qualquer outra tabela, com o comando SELECT e suas variações.  Contudo, devido a natureza desta funcionalidade, a Microsoft disponibilizou uma cláusula adicional chamada FOR SYSTEM_TIME, que contém 5 opções:

  • AS OF <date_time>
  • FROM <start_date_time> TO <end_date_time>
  • BETWEEN <start_date_time> AND <end_date_time>
  • CONTAINED IN (<start_date_time> , <end_date_time>)
  • ALL
UPDATE dbo.Cliente SET RendaMensal = 30100.00 WHERE Cliente_ID = 3
WAITFOR DELAY '00:01.000'
DELETE dbo.Cliente WHERE Cliente_ID = 2
UPDATE dbo.Cliente SET RendaMensal = 30200.00 WHERE Cliente_ID = 3
WAITFOR DELAY '00:01.000'
UPDATE dbo.Cliente SET RendaMensal = 30300.00 WHERE Cliente_ID = 3

SELECT Cliente_ID, Nome, RendaMensal, RendaAnual, SysStartTime, SysEndTime  
FROM dbo.Cliente
FOR SYSTEM_TIME ALL 
ORDER BY Cliente_ID, SysStartTime

O Script acima mostra todo o conteúdo da tabela Cliente incluindo todo o histórico de atualizações.  Reparem as 3 atualizações na coluna RendaMensal do cliente Katia, vamos utilizar abaixo FOR SYSTEM_TIME AS OF para selecionar uma atualização do cliente Katia:

SELECT * FROM dbo.Cliente
FOR SYSTEM_TIME AS OF '2016-09-02 22:50:09.9381378'
WHERE Cliente_ID = 3 

No próximo script deixa clara a diferença entre FOR SYSTEM_TIME FROM e FOR SYSTEM_TIME BETWEEN:

SELECT Cliente_ID, Nome, RendaMensal, RendaAnual, SysStartTime, SysEndTime  
FROM dbo.Cliente
FOR SYSTEM_TIME FROM  '2016-09-02 22:49:48.6712690' TO '2016-09-02 22:51:09.9746530'   
WHERE Cliente_ID = 3 

SELECT Cliente_ID, Nome, RendaMensal, RendaAnual, SysStartTime, SysEndTime  
FROM dbo.Cliente
FOR SYSTEM_TIME BETWEEN  '2016-09-02 22:49:48.6712690' AND '2016-09-02 22:51:09.9746530'   
WHERE Cliente_ID = 3

O resultado do FOR SYSTEM_TIME FROM não incluiu a 3ª alteração porque os parâmetros inicial e final não são incluídos no resultado, já no FOR SYSTEM_TIME BETWEEN inclui ambos os parâmetros no resultado.

Já a cláusula FOR SYSTEM_TIME CONTAINED seleciona os registros a partir de uma lista de datas, exemplo no script abaixo:

SELECT Cliente_ID, Nome, RendaMensal, RendaAnual, SysStartTime, SysEndTime  
FROM dbo.Cliente
FOR SYSTEM_TIME CONTAINED IN ('2016-09-02 22:49:48.6712690','2016-09-02 22:51:09.9746530')
WHERE Cliente_ID = 3

 

ALTERAÇÃO DE SCHEMA

Quando habilitamos Temporal Table, algumas alterações de Schema não são permitidas, sendo necessário desabilitar antes de alterar.  Apenas as instruções abaixo são permitidas:

  • ALTER TABLE … REBUILD
  • CREATE INDEX
  • CREATE STATISTICS

No exemplo abaixo tentei excluir a tabela Cliente e recebi a mensagem de erro:
Msg 13552, Level 16, State 1, Line 67
Drop table operation failed on table ‘TesteDB.dbo.Cliente’ because it is not supported operation on system-versioned temporal tables.

Para excluir a tabela tenho que primeiro desabilitar Temporal Table  e depois excluí-la:

ALTER TABLE dbo.Cliente SET (SYSTEM_VERSIONING = OFF)   
DROP TABLE IF EXISTS dbo.Cliente
DROP TABLE IF EXISTS dbo.Cliente_Hist

Na 3a e última parte do post sobre Temporal Table vou falar sobre desempenho.

Até o próximo post.

Saudações Tricolores,
Landry

Deixe uma resposta

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

Back To Top