Configurei o SQL Server Change Tracking em uma tabela t1 no MS SQL2008R2. Dentro de uma transação, insiro uma linha nela e a atualizo 'n' vezes. Quando examino as contagens de linhas nas tabelas de controle de alterações, ele mostra o número 'n' de linhas, enquanto o syscommitab mostra apenas 1 linha. Como o mecanismo de controle de alterações é um mecanismo síncrono e, de acordo com a documentação, espera-se que rastreie apenas "mudanças líquidas" que ocorreram em uma transação, por que a tabela de controle de alterações mostra 'n' linhas em vez de apenas 1 ? Aqui está o SQL que foi usado para examinar a contagem de linhas.
SELECT sct1.name as CT_schema,
sot1.name as CT_table,
ps1.row_count as CT_rows,
ps1.reserved_page_count*8./1024. as CT_reserved_MB,
sct2.name as tracked_schema,
sot2.name as tracked_name,
ps2.row_count as tracked_rows,
ps2.reserved_page_count*8./1024. as tracked_base_table_MB,
change_tracking_min_valid_version(sot2.object_id) as min_valid_version
FROM sys.internal_tables it
JOIN sys.objects sot1 on it.object_id=sot1.object_id
JOIN sys.schemas AS sct1 on
sot1.schema_id=sct1.schema_id
JOIN sys.dm_db_partition_stats ps1 on
it.object_id = ps1. object_id
and ps1.index_id in (0,1)
LEFT JOIN sys.objects sot2 on it.parent_object_id=sot2.object_id
LEFT JOIN sys.schemas AS sct2 on
sot2.schema_id=sct2.schema_id
LEFT JOIN sys.dm_db_partition_stats ps2 on
sot2.object_id = ps2. object_id
and ps2.index_id in (0,1)
WHERE it.internal_type IN (209, 210)
and (sot2.name='t1' or sot1.name='syscommittab')
Acima SQL cortesia de https://www.brentozar.com/archive/2014/06/performance-tuning-sql-server-change-tracking/
O Change Tracking vigia cada operação DML; não tem nenhum conceito de uma transação. Portanto, se você alterar uma linha 5 vezes, seja em uma transação ou não, obterá 5 linhas. Da documentação da Microsoft :
Ele não contém nenhuma lógica mais complicada do que isso (como apenas registrar a mudança líquida). É claro que você pode determinar as alterações líquidas usando as funções de controle de alterações em vez de consultar a tabela CT diretamente. Você pode recolher manualmente as linhas duplicadas na tabela de controle de alterações agrupando em sua consulta ou talvez o Change Data Capture possa ser mais o que você procura?
Se você quiser algo que esteja ciente de transações e registre apenas as alterações líquidas, você pode consultar as Tabelas Temporais . Você terá que mudar para uma versão do SQL Server produzida nesta década (2016 ou 2017).