Ao consultar os dados especificando a data desejada, os registros das 2 tabelas serão considerados, de forma transparente para você, conforme vou demonstrar logo a seguir no próximo tópico.
A tabela em questão deve ter uma PRIMARY KEY definida para poder utilizar o recurso de versionamento. Caso contrário, você verá uma mensagem como essa:
Msg 13553, Level 16, State 1, Line 4
System versioned temporal table ‘dirceuresende.dbo.Tabela_Temporal’ must have primary key defined.
Uma vez que você crie uma tabela com esse recurso ativado, você não poderá realizar a operação de TRUNCATE TABLE nesta tabela, resultando na seguinte mensagem de erro:
Msg 13545, Level 16, State 1, Line 58
Truncate failed on table ‘dirceuresende.dbo.Tabela_Temporal’ because it is not supported operation on system-versioned tables.
Você não conseguirá mais excluir a tabela que está com um versionamento ativo. Para fazer isso, precisará parar o versionamento e depois excluir a tabela. Caso contrário, verá a seguinte mensagem de erro:
Msg 13552, Level 16, State 1, Line 58
Drop table operation failed on table ‘dirceuresende.dbo.Tabela_Temporal’ because it is not supported operation on system-versioned temporal tables.
In-memory OLTP não pode ser utilizado
Triggers INSTEAD OF não são permitidas. Triggers AFTER só permitidas apenas na tabela atual (Não pode criar na tabela histórica).
A tabela histórica não pode possuir constraints
Msg 13564, Level 16, State 1, Line 1
Adding CHECK constraint to a temporal history table ‘dirceuresende.dbo.Tabela_Temporal_Historico’ is not allowed.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint or index. See previous errors.
Os dados na tabela histórica não podem ser modificados manualmente (UPDATE, DELETE, INSERT, etc)
Msg 13560, Level 16, State 1, Line 1
Cannot delete rows from a temporal history table ‘dirceuresende.dbo.Tabela_Temporal_Historico’.
As instruções INSERT e UPDATE não podem fazer referência à s colunas do perÃodo SYSTEM_TIME
Msg 13537, Level 16, State 1, Line 5
Cannot update GENERATED ALWAYS columns in table ‘dirceuresende.dbo.Tabela_Temporal’.
Quais tabelas são temporais na minha base?
Visualizar conteúdo
Para verificar quais tabelas estão com o recurso do versionamento de sistema ativado, basta executar essa query abaixo:
Após criar uma tabela temporal (versionamento de sistema), a tela do Object Explorer do SQL Server Management Studio irá mostrar a tabela da seguinte maneira:
Como converter uma tabela comum para Tabela Temporal?
Visualizar conteúdo
Para converter uma tabela comum para Tabela Temporal, basta executar alguns comandos de ALTER TABLE para criar as colunas de definição de perÃodo (Dt_Inicio e Dt_Fim) e ativar o versionamento na tabela, conforme exemplo abaixo:
Transact-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
USE[dirceuresende]
GO
-- Criação normal de uma tabela
CREATETABLEdbo.Tabela_Comum (
IdINTIDENTITY(1,1)NOTNULLPRIMARYKEY,
Ds_NomeVARCHAR(100)NOTNULL,
Dt_NascimentoDATETIMENOTNULL,
Nr_TelefoneVARCHAR(15)NOTNULL,
Nr_CPFVARCHAR(14)NOTNULL,
)WITH(DATA_COMPRESSION=PAGE)
-- Crio as colunas de metadados para controlar a validade dos registros
E se a tabela já possuir registros ? Bom, neste caso, basta criar as colunas com uma constraint para incluir um valor DEFAULT nas colunas que serão criadas agora e que não possuem valor:
Transact-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
USE[dirceuresende]
GO
-- Criação normal de uma tabela
CREATETABLEdbo.Tabela_Comum (
IdINTIDENTITY(1,1)NOTNULLPRIMARYKEY,
Ds_NomeVARCHAR(100)NOTNULL,
Dt_NascimentoDATETIMENOTNULL,
Nr_TelefoneVARCHAR(15)NOTNULL,
Nr_CPFVARCHAR(14)NOTNULL,
)WITH(DATA_COMPRESSION=PAGE)
INSERTINTOdbo.Tabela_Comum
(
Ds_Nome,
Dt_Nascimento,
Nr_Telefone,
Nr_CPF
)
VALUES
(
'Dirceu Resende',-- Ds_Nome - varchar(100)
'1990-01-01',-- Dt_Nascimento - datetime
'2799999999',-- Nr_Telefone - varchar(15)
'11111111111'-- Nr_CPF - varchar(14)
)
-- Crio as colunas de metadados para controlar a validade dos registros
Com a query acima, você irá criar as novas colunas com Dt_Inicio = data/hora atual e Dt_Fim = data máxima do datetime2, ou seja, todos os registros da tabela serão considerados os registros atuais.
Como consultar os dados da Tabela Temporal?
Visualizar conteúdo
Agora que criamos a nossa tabela com o versionamento de sistema ativado, transformando nossa tabela em uma tabela temporal ou temporal table, vamos gerar algumas informações e depois visualizar como podemos consultá-las:
Transact-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
INSERTINTOdbo.Tabela_Temporal
(
Ds_Nome,
Dt_Nascimento,
Nr_Telefone,
Nr_CPF
)
VALUES
(
'Dirceu Resende',-- Ds_Nome - varchar(100)
'1900-05-28',-- Dt_Nascimento - datetime
'2799999999',-- Nr_Telefone - varchar(15)
'12345678909'
),
(
'Teste 2',-- Ds_Nome - varchar(100)
'1900-01-01',-- Dt_Nascimento - datetime
'27888888888',-- Nr_Telefone - varchar(15)
'11111111111'
)
UPDATEdbo.Tabela_Temporal
SETDs_Nome='Teste'
WHEREDs_Nome='Teste 2'
UPDATEdbo.Tabela_Temporal
SETNr_CPF='22222222222'
WHEREDs_Nome='Dirceu Resende'
DELETEFROMdbo.Tabela_Temporal
WHEREDs_Nome='Teste'
Resultado da nossa tabela:
Nos exemplos acima, utilizei a cláusula AS OF ‘data’. Existem 5 tipos de cláusulas para especificar o perÃodo de datas desejado:
ALL: Retorna todas as alterações realizadas na tabela
Exemplo:
AS OF: Recurso point-in-time, ou seja, retorna os dados em uma data e hora especÃfica
FROM <start_date_time> TO <end_date_time>: Retorna todos os registros cujo campo Dt_Inicial < data final informada e campo Dt_Final > data inicial informada.
CONTAINED IN (<start_date_time> , <end_date_time>): Retorna todos os registros cujo Dt_Inicial >= data inicial informada e campo Dt_Final <= data final informada.
Exemplo:
Como desativar o versionamento de uma Tabela Temporal?
Visualizar conteúdo
Caso você não queira mais utilizar o recurso de versionamento de sistema, transformando uma tabela temporal numa tabela comum e excluindo todos os metadados e estrutura da tabela temporal, basta você utilizar os comandos abaixo:
Se você quer apenas desativar temporariamente o recurso de versionamento, mas não quer excluir as informações, você pode utilizar o comando abaixo:
Dirceu, nos testes realizados aqui, notei que o campo dt_ini esta sempre recebendo a datahora + 4 toda vez que o registro sofre um update.
ele pega a hora atual e soma 4 horas e joga no campo.
isso ocorre tambem na tabela de histórico,
teste com sql 2016 express
sql instalado local, verifiquei com select getdate() e a data esta correta.
Dirceu, como você diferencia esse recurso do Change Tracking e CDC? Todos esses três recursos me parecem atingir o mesmo resultado que a temporal, o que muda é só a forma de acessar tais dados históricos. Grato pela atenção.
Olá Rodrigo, vou criar um novo artigo pra responder sua dúvida