Implementei as Tabelas Temporais com Versão do Sistema na tabela "Pedidos". O aplicativo está usando diferentes padrões de acesso para modificar os dados nesta tabela. Existem instruções diretas vindas do aplicativo ou o aplicativo está executando longos lotes em transações explícitas nas quais ele faz várias alterações em várias tabelas. A atualização na tabela "Pedidos" não é a primeira declaração nesses lotes longos! Então, às vezes estamos enfrentando o seguinte erro.
A modificação de dados falhou na tabela com versão do sistema "Pedidos" porque o horário da transação foi anterior ao horário de início do período para os registros afetados.
Aparentemente, esse é um comportamento padrão das tabelas temporais com versão do sistema. https://learn.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017#how-does-temporal-work
Isso é algo que sempre precisará ser tratado em uma rotina de exceção? Ou a Microsoft está pensando em mudar esse comportamento?
--Script para simular a mensagem de erro:
CREATE TABLE dbo.Orders
(
[OrderId] INT NOT NULL PRIMARY KEY CLUSTERED
, [OrderValue] DECIMAL(19,4)
, [ValidFrom] DATETIME2 (2) GENERATED ALWAYS AS ROW START
, [ValidTo] DATETIME2 (2) GENERATED ALWAYS AS ROW END
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.OrdersHistory));
GO
INSERT dbo.Orders ([OrderId], [OrderValue])
VALUES (1, 9.99), (2, 9.99);
GO
SELECT * FROM dbo.Orders;
GO
--Run first query
BEGIN TRAN
WAITFOR DELAY '00:00:15';
UPDATE dbo.Orders
SET [OrderValue] = [OrderValue] + 1;
COMMIT TRAN
--Run Query 2 in another session sql server
BEGIN TRAN
UPDATE dbo.Orders
SET [OrderValue] = [OrderValue] + 1;
COMMIT TRAN