Sintomas
Quando você executa uma atualização em uma tabela que tem um índice clusterizado ou exclusivo e a atualização ocorre em uma coluna exclusiva não primária, o registro de controle de alterações é inconsistente com a instrução de atualização.
Por exemplo, suponha que uma coluna chamada "column1" esteja incluída no índice clusterizado ou exclusivo. Quando o valor da coluna é alterado de um valor maior para um menor (como alterar o valor de 20 para 16), a tabela lateral de controle de alterações recebe a operação de inserção antes da operação de exclusão. Por exemplo, a operação de registro de linha de inserção de log de transações é recebida antes da operação de exclusão de linha ou "I" é inserido antes de "D".
Sys_change_version |
sys_change_create_version |
sys_change_operation |
sys_change_column |
sys_change_context |
PK_column |
1116 |
19 |
Eu |
NULL |
NULL |
5639485628 |
1116 |
20 |
D |
NULL |
NULL |
5639485628 |
Quando o valor da coluna é alterado de um valor menor para um maior (como alterar o valor de 16 para 20), "D" é inserido antes de "I".
Sys_change_version |
sys_change_create_version |
sys_change_operation |
sys_change_column |
sys_change_context |
PK_column |
1126 |
32 |
D |
NULL |
NULL |
5639485628 |
1126 |
33 |
Eu |
NULL |
NULL |
5639485628 |
Causa
Esse problema ocorre devido à ordenação incorreta entre pares de exclusão/inserção na tabela lateral de controle de alterações.
Resolução
A correção desse problema está incluída nas seguintes atualizações para SQL Server:
Atualização cumulativa 8 para SQL Server 2017
Atualização cumulativa 9 para SQL Server 2016 Service Pack 1
Sobre SQL Server builds
Cada novo build para SQL Server contém todos os hotfixes e correções de segurança que estavam no build anterior. Recomendamos que você instale o build mais recente para SQL Server:
Atualização cumulativa mais recente do SQL Server 2017
Status
A Microsoft confirmou que este é um problema nos produtos Microsoft listados na seção "Aplicável a".
Mais informações
Para uma tabela habilitada para controle de alterações, quando ocorre uma atualização em uma coluna não primária definida como exclusiva, duas entradas são inseridas na tabela lateral de controle de alterações: uma entrada para cada uma das ações divididas, Inserir e Excluir.
Quando a função CHANGETABLE é chamada para enumerar as alterações, essas entradas são classificadas por valores de chave primária e, em seguida, as operações são agregadas. Se a atualização inserir um valor menor, uma operação "I" será executada na tabela lateral primeiro, seguida por uma operação "D". Isso faz com que uma operação incorreta seja retornada para essa linha. Isso ocorre porque "I" seguido de "D" é agregado como "D".
Como apenas os valores de chave primária são mantidos nas tabelas lateradas, não é necessário ter duas entradas separadas. Isso é verdadeiro desde que a coluna de chave primária não seja atualizada.
Esse problema foi corrigido para colunas exclusivas não primárias. Nesse caso, quando a atualização ocorre, apenas uma linha é inserida tendo "U" como uma operação de atualização em vez de duas entradas que têm "D" e "I".
Referências
Saiba mais sobre a terminologia que a Microsoft usa para descrever as atualizações de software.