CDC множественная вставка/удаление одного и того же значения идентификатора

У меня есть таблица T, которая содержит идентификатор, установленный как идентификатор и первичный ключ. Я включил CDC в таблице, а затем добавил XML-поле, которое мне не нужно было захватывать, поэтому я больше ничего не делал (чтобы воссоздать таблицу захвата и/или перенести старые данные захвата).

Теперь у меня есть хранимая процедура, которая (среди прочего) обновляет только вновь созданное поле (без другого поля) в таблице T. Я заметил, что вместо записи обновления (операция = 3, за которой следует операция = 4), CDC записывает удаление (операция = 1), за которой следует вставка (операция = 2), и все поля одинаковы (конечно, поскольку ни одно из них не было обновлено)

Я действительно заметил это, потому что одно и то же значение идентификатора было вставлено и/или удалено более одного раза, что невозможно (если только идентификатор identity_insert не включен, что не так)

Почему CDC записывает операцию = 1 вместо 3 и операцию = 2 вместо 4? Это где-то задокументировано или это баг?


person P. Kouvarakis    schedule 20.06.2016    source источник


Ответы (1)


Причина, по которой вы видите пару «Удалить/вставить» (номер операции 1/2), а не пару обновления (3/4), заключается в том, что вы обновляете «набор» данных, который ТАКЖЕ имеет уникальное ограничение для вашего столбца.

Чтобы SQL понял это, не нарушая ограничения уникальности, он удаляет строку и вставляет ее повторно (с «обновлением»).

Подробнее об этом. Это не проблема и не дефект. это то, как работает SQL, и CDC невинно регистрирует его, как он его видит. Помните, что CDC — это просто подписчик, который копирует события по мере их возникновения.

Если вам нужно увидеть обновление, вам, возможно, придется искать «пару» 1/2, а не ТОЛЬКО код операции 3/4.

Несколько замечательных статей. Ограниченное обновление — это термин, используемый для описания определенных типов инструкций UPDATE от издателя, которые будут реплицироваться как пары DELETE/INSERT на подписчике. Мы выполняем ограниченное обновление для каждого обновления на основе набора, которое изменяет столбец, являющийся частью уникального индекса или ограничения. Другими словами, если оператор UPDATE затрагивает более одной строки и изменяет столбец, имеющий какие-либо ограничения UNIQUE, оператор UPDATE отправляется подписчику в виде пары DELETE/INSERT... подробнее здесь

https://support.microsoft.com/en-us/kb/238254

person 5x1llz    schedule 30.09.2016
comment
Очень интересно, но на самом деле это не ответ на мой вопрос. В моем случае я обновляю только поле XML, которое не является частью какого-либо уникального ограничения. - person P. Kouvarakis; 02.10.2016