Temporal Table no SQL Server – 2ª Parte
- 1.Temporal Table no SQL Server – 1ª Parte
- 2.Temporal Table no SQL Server – 2ª Parte
- 3.Temporal Table no SQL Server – 3ª 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