CORREÇÃO: Registro de controle de alterações está inconsistente durante uma atualização em uma tabela que tem um índice exclusivo ou em cluster no SQL Server

Aplica-se a: SQL Server 2016 DeveloperSQL Server 2016 EnterpriseSQL Server 2016 Enterprise Core

Sintomas


Quando você executa uma atualização em uma tabela tem um índice em cluster ou exclusivo e a atualização ocorre em uma coluna exclusiva não principal, o registro de controle de alterações são inconsistente com a instrução update.

Por exemplo, suponha que uma coluna chamada "Coluna1 "está incluído nocluster ou exclusivo índice de . Quando o valor da coluna é alterado de uma maior para um valor menor (por exemplo, alterando o valor de 20 para 16), a tabela de lado o controle de alterações recebe a operação de inserção antes da operação de exclusão. Por exemplo, a transação log Inserir linha operação de registro é recebida antes da operação de exclusão de linha, ou "I" é inserida 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

Quandoo valor da coluna é alterado de menor para um valor de largeer (como alterar o valor de 16 a 20), "D" será 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 a ordenação incorreta entre pares de delete/insert na tabela do lado de controle de alterações.

Resolução


A correção para esse problema está incluída nas seguintes atualizações para SQL Server:

         Atualização cumulativa 8 para SQL Server 2017

         Atualização cumulativa 9 para o SQL Server 2016 Service Pack 1

12 de atualização cumulativa para SQL Server 2014 SP2

Status


A Microsoft confirmou que este é um problema nos produtos Microsoft listados na seção "Aplicável a".

Mais informações


Para uma tabela de rastreamento ativado de alteração, quando ocorre uma atualização em uma coluna não principal que é definida para ser exclusivo, duas entradas são inseridas na tabela do lado de controle de alterações: uma entrada para cada uma das ações de divisão, 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 insere um valor menor, um "I" operação é executada na tabela do lado primeiro, seguido por uma operação de "D". Isso faz com que uma operação incorreta sendo retornada para esta linha. Isso ocorre porque o "I" seguido de "D" é agregado como "d".

Como somente os valores de chave primária são mantidos nas tabelas de lado, não é necessário ter duas entradas separadas. Isso é verdadeiro desde que a coluna de chave primária não é atualizada.

Esse problema é corrigido para colunas exclusivas não principal. Nesse caso, quando a atualização ocorre, somente uma linha é inserida por ter "U" como uma operação de atualização, em vez de duas entradas que têm "D" e "I".

Referências


Conheça a terminologia que a Microsoft usa para descrever as atualizações de software.