Eu corro o seguinte código para limpar dados antigos. O código exato estava sendo executado as is
como etapa de trabalho do SQL Agent apontando para um banco de dados do usuário. Esperando confirmar com um lote de 10.000 linhas. 2 dias atrás não fez isso, após encerrar a sessão (motivo do encerramento não está relacionado a esta questão) reverteu toda a exclusão e não apenas o último lote.
Alguém pode me indicar um motivo?
SET NOCOUNT ON;
DECLARE @rowCount INT;
SET @rowCount= 1;
WHILE @rowCount > 0
BEGIN
BEGIN TRANSACTION;
DELETE TOP (10000)
dbo.TableName
WHERE RecordedAt<DATEADD(month, -3, GETDATE() )
SET @rowCount = @@ROWCOUNT;
COMMIT TRANSACTION;
END
Difícil de diagnosticar definitivamente com base nas informações fornecidas, mas a causa provável é que o lote foi invocado inadvertidamente com uma transação já aberta. Sugiro um ou mais dos seguintes procedimentos para evitar que o problema avance:
Adicione
SET XACT_ABORT ON;
ao lote para ajudar a garantir que as transações explícitas sejam revertidas automaticamente.Remova o supérfluo
BEGIN TRAN
eCOMMIT
uma vez que a transação automática de instrução única reverterá totalmente um lote de exclusão se ocorrer um erro.Adicionar tratamento de erros