Автоматически разрешать конфликт слияния первичного ключа

Не могли бы вы предложить мне, как я мог бы автоматически разрешать конфликты первичных ключей при слиянии между Publisher и Subscriber. Похоже, Sql Server не делает это из коробки:(.

Средство просмотра конфликтов показывает мне следующее сообщение:

Вставка строки в "_publisher_server_" не может быть передана в "_subscriber_server_". Эта ошибка может быть вызвана нарушением ограничения. Нарушение ограничения PRIMARY KEY 'PK_PartPlan_FD9D7F927172C0B5'. Невозможно вставить дубликат ключа в объект '_table_name_'.

Спасибо.

3 ответа

Решение

Это не простое решение (так как вы, вероятно, уже разработали свою базу данных с автоинкрементом int ключей), но использование GUID ("uniqueidentifier") для первичных ключей решит проблему коллизии PK.

Ты пытался WHEN MATCHED THEN а также WHEN NOT MATCHED BY TARGET THEN сделать UPSERT (условно UPDATE или INSERT)?

Документацию можно найти здесь.

Я предполагаю, что первичный ключ представляет один и тот же элемент в обеих БД.

Самый простой способ, которым я решил эту проблему с помощью ПК с автонумерами, - это изменить приращение числа автонумеров с 1 до 10 (или 100, или 1000, что требуется), а затем установить начальное значение для всех участников по-разному.

Итак, я могу начать семена:
DB1 на 1
DB2 на 2
DB3 на 3
...
DBn при n (n <приращение)

Например: приращение 100 даст PK для БД:
DB1: ** 101, 201, 301...
DB2: ** 102, 202, 302...
DB3: ** 103, 203, 303...
Независимо от того, сколько строк INSERTОни всегда будут иметь уникальные PK, потому что последние цифры отражают конкретную базу данных.

Этот метод может быть адаптирован по мере необходимости для вашего числа подписчиков, они никогда не столкнутся, и вы получите дополнительное преимущество, узнав точку отправления, только что указав свой суррогатный ключ.

Для существующих таблиц просто сбросьте семя PK и интервалы по сценарию. Это должно быть очень легко сделать.


Вы можете использовать GUIDE PK, но использование GUID может быть довольно проблематичным в качестве первичного ключа, особенно если вы также не удаляете его из кластерного индекса. Они также больше, и вы уже можете иметь код в зависимости от целых чисел.

При создании репликации слиянием SQL Server автоматически создает идентификаторы GUID, которые он использует для отслеживания изменений, но это не означает, что они должны быть PK

Другие вопросы по тегам