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