sexta-feira, 9 de setembro de 2016

Temporal Table no SQL Server 2016 – 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
  • FROM TO
  • BETWEEN AND
  • CONTAINED IN ( , )
  • ALL
Script
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

Nenhum comentário: