skip to Main Content

Temporal Table no SQL Server – 2ª Parte

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