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:
Postar um comentário