Sintomas
Quando executa uma atualização numa tabela que tem um índice em cluster ou exclusivo e a atualização ocorre numa coluna exclusiva não primária, o registo de controlo de alterações é inconsistente com a instrução de atualização.
Por exemplo, suponha que uma coluna com o nome "column1" está incluída no índice em cluster ou exclusivo. Quando o valor da coluna é alterado de um valor maior para um valor menor (como alterar o valor de 20 para 16), a tabela lateral de controlo de alterações recebe a operação de inserção antes da operação de eliminação. Por exemplo, a operação de registo de inserção de linha do registo de transações é recebida antes da operação eliminar 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 | I | NULL | NULL | 5639485628 |
| 1116 | 20 | D | NULL | NULL | 5639485628 |
Quando o valor da coluna é alterado de um valor menor para um valor 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 | I | NULL | NULL | 5639485628 |
Causa
Este problema ocorre devido a uma ordenação incorreta entre os pares eliminar/inserir na tabela lateral do controlo de alterações.
Resolução
A correção para este 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 Service Pack 1 de 2016
Atualização Cumulativa 12 para SQL Server 2014 SP2
Acerca das SQL Server builds
Cada nova compilação para SQL Server contém todas as correções e correções de segurança que estavam na compilação anterior. Recomendamos que instale a compilação mais recente para SQL Server:
Atualização cumulativa mais recente do SQL Server 2017
compilação mais recente do SQL Server 2016
Atualização cumulativa mais recente para SQL Server 2014
Estado
A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".
Mais informações
Para uma tabela ativada para controlo de alterações, quando ocorre uma atualização numa coluna não primária definida como exclusiva, são inseridas duas entradas na tabela lateral de controlo de alterações: uma entrada para cada uma das ações divididas, Inserir e Eliminar.
Quando a função CHANGETABLE é chamada para enumerar as alterações, estas entradas são ordenadas por valores de chave primária e, em seguida, as operações são agregadas. Se a atualização inserir um valor inferior, primeiro é executada uma operação "I" na tabela lateral, seguida de uma operação "D". Isto faz com que seja devolvida uma operação incorreta para esta linha. Isto acontece porque "I" seguido de "D" é agregado como "D".
Uma vez que apenas os valores da chave primária são mantidos nas tabelas laterais, não é necessário ter duas entradas separadas. Isto acontece desde que a coluna de chave primária não seja atualizada.
Este problema foi corrigido para colunas exclusivas não primárias. Neste caso, quando a atualização ocorre, apenas uma linha é inserida por ter "U" como uma operação de atualização em vez de duas entradas com "D" e "I".
Referências
Saiba mais sobre a terminologia que a Microsoft utiliza para descrever as atualizações de software.