Подумал, я бы поставил здесь обновление, так как эта проблема принесла мне несколько седых волос, и я сейчас немного ближе к решению.
Наконец-то у меня появилось время поработать над этим, и мне удалось воспроизвести эту проблему в нашей тестовой среде, используя симулятор WAN, замедляя соединение и вводя случайную потерю пакетов. (чтобы лучше всего имитировать производственную среду, где сервер находится за очень плохой линией).
После некоторой трассировки SQL и подробного ведения журнала, вот мои выводы:
При репликации строки со столбцом XML процесс выполняется в 2 этапа. Сначала выполняется вставка полной строки, но с пустой строкой для столбца XML. Сразу после этого выполняется обновление со столбцом XML, содержащим данные. Поскольку ссылка медленная, в некоторых ситуациях произошло нарушение внешнего ключа.
В этом случае таблица 2 зависит от таблицы 1. После завершения репликации table1 и начала репликации table2 (перечисление вставки / обновлений, которое занимает медленное соединение), некоторые записи были добавлены в table1 и table2. Поэтому некоторые вставки в Таблицу 2 завершились неудачно, потому что записи Таблицы не были в базе данных и собирались реплицироваться только в следующем пакете. В следующий раз, когда произошла репликация, больше не происходило нарушений внешнего ключа, однако при попытке вставить строку, которая ранее была неудачной в таблице 2 (строка столбца XML), отсутствовала часть обновления (я мог видеть это в профилировщике SQL). ) и именно поэтому строка завершилась после того, как все было сделано с пустым XML.
Установка «Enforce for replication» в false на внешних ключах, кажется, решает проблему, однако я все еще думаю, что весь этот процесс должен работать с параметром, установленным в true.
Я записал в службу поддержки Microsoft для этого. Я отправил следы и логи в Microsoft и посмотрю, что они скажут.
Я читал эту статью: http://msdn.microsoft.com/en-us/library/ms152529(v=SQL.90).aspx. Но для меня установка этой опции на false - своего рода обходной путь, не так ли?
Что вы, ребята, думаете?
ps: Надеюсь, это понятно, пытался объяснить это как мог. Английский не мой родной язык.