Symptômes
Lorsque vous exécutez une mise à jour sur une table qui a un index cluster ou unique et que la mise à jour se produit sur une colonne unique non principale, l’enregistrement de suivi des modifications n’est pas cohérent avec l’instruction de mise à jour.
Par exemple, supposons qu’une colonne nommée « column1 » est incluse dans l’index cluster ou unique. Lorsque la valeur de colonne passe d’une valeur plus grande à une valeur plus petite (par exemple, la modification de la valeur de 20 à 16), la table latérale de suivi des modifications reçoit l’opération d’insertion avant l’opération de suppression. Par exemple, l’opération d’insertion d’enregistrement de ligne dans le journal des transactions est reçue avant l’opération de suppression de ligne, ou « I » est inséré avant « D ».
Sys_change_version |
sys_change_create_version |
sys_change_operation |
sys_change_column |
sys_change_context |
PK_column |
1116 |
19 |
Je |
NULL |
NULL |
5639485628 |
1116 |
20 |
D |
NULL |
NULL |
5639485628 |
Lorsque la valeur de colonne passe d’une valeur plus petite à une valeur plus grande (par exemple, la modification de la valeur de 16 à 20), « D » est inséré avant « 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 |
Je |
NULL |
NULL |
5639485628 |
Cause
Ce problème se produit en raison d’un classement incorrect entre les paires delete/insert dans la table latérale de suivi des modifications.
Résolution
Le correctif de ce problème est inclus dans les mises à jour suivantes pour SQL Server :
Mise à jour cumulative 8 pour SQL Server 2017
Mise à jour cumulative 9 pour SQL Server Service Pack 1 2016
À propos des builds SQL Server
Chaque nouvelle build pour SQL Server contient tous les correctifs de sécurité et correctifs de sécurité qui se trouvaient dans la build précédente. Nous vous recommandons d’installer la dernière build pour SQL Server :
Dernière mise à jour cumulative pour SQL Server 2017
État
Microsoft a confirmé l’existence de ce problème dans les produits Microsoft répertoriés dans la section « S’applique à ».
Informations supplémentaires
Pour une table activée pour le suivi des modifications, lorsqu’une mise à jour se produit sur une colonne non primaire définie comme unique, deux entrées sont insérées dans la table côté suivi des modifications : une entrée pour chacune des actions fractionnées, Insérer et Supprimer.
Lorsque la fonction CHANGETABLE est appelée pour énumérer les modifications, ces entrées sont triées par des valeurs de clé primaire, puis les opérations sont agrégées. Si la mise à jour insère une valeur inférieure, une opération « I » est exécutée d’abord sur la table latérale, suivie d’une opération « D ». Cela entraîne le retour d’une opération incorrecte pour cette ligne. Cela est dû au fait que « I » suivi de « D » est agrégé comme « D ».
Étant donné que seules les valeurs de clé primaire sont conservées dans les tables latérales, il n’est pas nécessaire d’avoir deux entrées distinctes. Cela est vrai tant que la colonne de clé primaire n’est pas mise à jour.
Ce problème est résolu pour les colonnes uniques non primaires. Dans ce cas, lorsque la mise à jour se produit, une seule ligne est insérée en ayant « U » comme opération de mise à jour au lieu de deux entrées qui ont « D » et « I ».
Références
Découvrez la terminologie utilisée par Microsoft pour décrire les mises à jour logicielles.