Проблемы
При запуске обновления для таблицы с кластеризованным или уникальным индексом, когда обновление выполняется в не первичном уникальном столбце, запись отслеживания изменений не согласуется с инструкцией update.
Например, предположим, что столбец с именем column1 включен в кластеризованный или уникальный индекс. При изменении значения столбца с большего на меньшее (например, изменение значения с 20 на 16) таблица отслеживания изменений получает операцию вставки перед операцией удаления. Например, операция вставки записи строки журнала транзакций получена до операции удаления строки или перед "D" вставляется "I".
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) перед "I" вставляется "D".
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 для SQL Server 2016 с пакетом обновления 1 (SP1)
Накопительный пакет обновления 12 для SQL Server 2014 с пакетом обновления 2 (SP2)
Сведения SQL Server сборках
Каждая новая сборка SQL Server содержит все исправления и исправления безопасности, которые были в предыдущей сборке. Рекомендуется установить последнюю сборку для SQL Server:
Последнее накопительное обновление для SQL Server 2017
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".
Дополнительная информация
Для таблицы с поддержкой отслеживания изменений при обновлении не основного столбца, который определен как уникальный, в боковую таблицу отслеживания изменений вставляются две записи: по одной записи для каждого из разделенных действий— "Вставка" и "Удалить".
При вызове функции CHANGETABLE для перечисления изменений эти записи сортируются по значениям первичного ключа, а затем операции агрегируются. Если обновление вставляет меньшее значение, сначала выполняется операция "I" в боковой таблице, за которой следует операция "D". В результате возвращается неправильная операция для этой строки. Это связано с тем, что строка "I" после "D" агрегирована как "D".
Так как в параллельных таблицах хранятся только значения первичного ключа, не обязательно иметь две отдельные записи. Это верно, если столбец первичного ключа не обновляется.
Эта проблема устранена для не первичных уникальных столбцов. В этом случае при обновлении вставляется только одна строка с буквой "U" в качестве операции обновления вместо двух записей с символами "D" и "I".
Ссылки
Сведения о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.