Ознаки
Під час запуску оновлення в таблиці, яка має кластерний або унікальний індекс і оновлення відбувається на не основний унікальний стовпець, відстеження змін запис не узгоджено з оновлення інструкції.
Наприклад, припустімо, що стовпець з іменем "стовпець1" додається до звичайного або унікального індексу. Якщо значення стовпця змінюється з більшого на менше (наприклад, змінення значення з 20 на 16), перед операцією видалення функція відстеження змін отримує операцію вставлення. Наприклад, операція вставлення запису рядка в журнал транзакцій отримується перед операцією видалення рядка, або "I" вставляється перед "D".
Sys_change_version |
sys_change_create_version |
sys_change_operation |
sys_change_column |
sys_change_context |
PK_column |
1116 |
19 |
Я |
NULL |
NULL |
5639485628 |
1116 |
20 |
D |
NULL |
NULL |
5639485628 |
Коли значення стовпця змінюється з меншого на більше (наприклад, змінення значення з 16 на 20), "D" вставляється перед "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 |
Я |
NULL |
NULL |
5639485628 |
Причина
Ця проблема виникає через неправильне впорядкування між парами видалення та вставлення в бічній таблиці відстеження змін.
Спосіб вирішення
Виправлення цієї проблеми включено в такі оновлення для SQL Server:
Сукупний пакет оновлень 8 для SQL Server 2017
Сукупне оновлення 9 для пакета оновлень 1 SQL Server 2016
Сукупний пакет оновлень 12 для SQL Server 2014 з пакетом оновлень 2 (SP2)
Про збірки SQL Server
Кожна нова збірка для SQL Server містить усі виправлення та виправлення системи безпеки, які були в попередній збірці. Радимо інсталювати найновішу збірку для SQL Server:
Останнє сукупне оновлення для SQL Server 2017 р.
Стан
Корпорація Майкрософт підтвердила, що це проблема в продуктах Microsoft, перелічених у розділі "Стосується".
Додаткова інформація
У таблиці з підтримкою відстеження змін, коли оновлення відбувається в невід'ємному стовпці, визначеному як унікальний, два записи вставляються в бічну таблицю відстеження змін: по одному запису для кожної з розділених дій, Вставлення та Видалення.
Коли функція CHANGETABLE викликається для перелічення змін, ці записи сортуються за значеннями первинного ключа, а потім агрегуються операції. Якщо оновлення вставляє менше значення, спочатку на бічній таблиці виконується операція "I", а потім операція "D". Це призводить до неправильної операції, що повертається для цього рядка. Це відбувається тому, що "I" після "D" агрегується як "D".
Оскільки в бічних таблицях зберігаються лише значення первинного ключа, не потрібно мати два окремі записи. Це відбувається, якщо стовпець первинного ключа не оновлюється.
Цю проблему вирішено для не основних унікальних стовпців. У цьому випадку, коли відбувається оновлення, лише один рядок вставляється, маючи "U" як операцію оновлення замість двох записів, які мають "D" і "I".
Посилання
Дізнайтеся про термінологію , яка використовується корпорацією Майкрософт для опису оновлень програмного забезпечення.