Quando uma linha é atualizada, a coluna SYS_CHANGE_OPERATION ainda mostra I (Inserir) e não U (Atualizar) ao consultar CHANGETABLE .
Aqui está o que estou fazendo.
USE master
GO
CREATE DATABASE TestCT ;
GO
SELECT compatibility_level , @@VERSION
FROM sys.databases WHERE name = 'TestCT';
compatibilidade_level = 160
@@Version = Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64) Oct 8 2022 05:58:25 Copyright (C) 2022 Microsoft Corporation Developer Edition (64 bits) no Windows 10 Pro 10.0 (Build 19045: ) (Hipervisor)
ALTER DATABASE TestCT
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) ;
USE TestCT;
GO
DROP TABLE IF EXISTS dbo.TestCT
CREATE TABLE dbo.TestCT(
Id INT IDENTITY (1,1) CONSTRAINT PK__TestCT PRIMARY KEY ,
Col1 VARCHAR(100)
) ;
GO
ALTER TABLE dbo.TestCT
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON) ;
GO
INSERT INTO dbo.TestCT (Col1)
VALUES ('INSERT1') ;
GO
SELECT *
FROM CHANGETABLE (CHANGES dbo.TestCT,0) as CT
LEFT JOIN dbo.TestCT EM ON CT.Id = EM.Id
ORDER BY SYS_CHANGE_VERSION ;
GO
SYS_CHANGE_OPERATION
aqui está I (Inserir) como esperado.
Agora, se eu atualizar a linha
UPDATE T
SET Col1 = 'UPDATE'
FROM dbo.TestCT T
WHERE Col1 = 'INSERT1';
GO
SYS_CHANGE_OPERATION
aqui ainda é I (Inserir) e não U (Atualizar). Como você pode ver, SYS_CHANGE_VERSION
aumentou em 1 como esperado.
O que estou fazendo de errado aqui?
Você não está fazendo nada de errado, exceto ;-), neste caso, o resultado deve ser um INSERT. Isso ocorre porque em sua consulta, você está solicitando tudo com o início 0.
Isso significa que você obterá a definição de 0. Desde 0, houve um INSERT e uma atualização, no entanto, quando você vir os dados, terá o resultado mais recente. Portanto, o UPDATE não é relevante. Desde 0 é um INSERT para o leitor. Quando você trocar o 0 por 1, o SQL verá as mudanças desde 1, e então será um UPDATE.
A Microsoft tem uma boa documentação sobre isso: https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/work-with-change-tracking-sql-server?view=sql-server- ver16