Sintomas
Quando executa uma atualização numa tabela que tem um índice exclusivo ou agrupado e a atualização ocorre numa coluna exclusiva não principal, o registo de registo de alterações é inconsistente com a declaração de atualização.
Por exemplo, suponha que uma coluna com o nome "coluna1" está incluída no índice agrupado ou exclusivo. Quando o valor da coluna é alterado de um valor maior para um valor menor (por exemplo, alterar o valor de 20 para 16), a tabela do lado do seguimento de alterações recebe a operação inserir antes da operação de eliminação. Por exemplo, a operação de inserção de registo de linha do registo de transações é recebida antes da operação eliminar 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 |
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), o "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 pares eliminar/inserir na tabela lateral de alterações de seguimento.
Resolução
A correção para este problema está incluída nas seguintes atualizações para o SQL Server:
Atualização Cumulativa 8 para SQL Server 2017
Atualização Cumulativa 9 para SQL Server Service Pack 1 de 2016
Acerca de SQL Server com builds
Cada nova com build for SQL Server contém todas as correções de segurança e correções de segurança que estavam na com build anterior. Recomendamos que instale a comtrução mais recente para o SQL Server:
Atualização cumulativa mais recente SQL Server 2017
Estado
A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".
Mais informações
Para uma tabela ativada para o registo de alterações, quando ocorre uma atualização numa coluna não principal definida para ser exclusiva, são inseridas duas entradas na tabela do lado do registo 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 mais baixo, primeiro será 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 deve-se ao facto de "I" seguido de "D" ser 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 é verdadeiro desde que a coluna de chave primária não seja atualizada.
Este problema foi corrigido para colunas exclusivas não principais. Neste caso, quando a atualização ocorre, só é inserida uma linha por ter "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 utiliza para descrever as atualizações de software.