Разрешение конфликтов при репликации слиянием
Область применения: SQL Server
В репликации слиянием конфликты разрешаются на основе сопоставителя, указанного для каждой статьи. По умолчанию для разрешения конфликтов не требуется вмешательство пользователя. Но конфликты можно просмотреть, и результат разрешения может быть изменен в средстве просмотра конфликтов репликации Майкрософт.
Данные конфликтов доступны в средстве просмотра конфликтов репликации в течение времени, указанном для срока хранения конфликтов (по умолчанию это время равно 14 дням). Чтобы установить срок хранения конфликтов, выполните любое из указанных ниже действий:
Укажите значение хранения для
@conflict_retention
параметра sp_addmergepublication (Transact-SQL).Укажите значение conflict_retention для параметра и значения хранения для
@property
@value
параметра sp_changemergepublication (Transact-SQL).
По умолчанию сведения о конфликтах сохраняются:
- На издателе и подписчике, если уровень совместимости публикации 90RTM или выше.
- На издателе, если уровень совместимости публикации ниже, чем 80RTM.
- На издателе, если подписчики работают под управлением SQL Server Compact. Конфликтные данные не могут храниться в подписчиках SQL Server Compact.
Хранение информации о конфликте управляется с помощью свойства публикации conflict_logging . Дополнительные сведения см. в статьях sp_addmergepublication (Transact-SQL) и sp_changemergepublication (Transact-SQL).
Конфликты также можно разрешить в интерактивном режиме во время синхронизации с помощью интерактивного сопоставителя Майкрософт. Интерактивный сопоставитель доступен через диспетчер синхронизации Microsoft Windows. Дополнительные сведения см. в разделе "Синхронизация подписки с помощью диспетчера синхронизации Windows" (диспетчер синхронизации Windows).
Устранение конфликтов
Подключитесь к издателю (или подписчику при необходимости) в Microsoft SQL Server Management Studio, а затем разверните узел сервера.
Раскройте папку Репликация , а затем папку Локальные публикации .
Щелкните правой кнопкой мыши публикацию, для которой требуется просмотреть конфликты, а затем щелкните Просмотреть конфликты.
Примечание.
Если для свойства conflict_logging задано значение 'subscriber' , пункт меню Просмотреть конфликты будет недоступен. Чтобы просмотреть конфликты, запустите в командной строке программу ConflictViewer.exe. По умолчанию программа ConflictViewer.exe находится в следующем каталоге: Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE. Чтобы вывести список допустимых параметров запуска, выполните команду ConflictViewer.exe -?.
В диалоговом окне Выбор таблицы с конфликтами выберите базу данных, публикацию и таблицу, для которой необходимо просмотреть конфликты.
В средстве просмотра конфликтов репликации можно выполнить следующие действия:
Отфильтровать строки с помощью кнопок, расположенных справа от верхней сетки.
Выбрать строку в верхней сетке для отображения информации об этой строке в нижней сетке.
Выберите одну или более строк в верхней сетке, щелкните Удалить, что эквивалентно нажатию кнопки Отправить выигравший (без внесения каких-либо изменений в данные).
Нажать кнопку свойств (...) для просмотра дополнительной информации о столбце, вовлеченном в конфликт.
Измените данные в столбце Выигравший вариант или Проигравший вариант до отправки данных (данные доступны только для чтения, если столбец окрашен в серый цвет).
Щелкните Отправить выигравший , чтобы принять строку, определенную как победитель в конфликте.
Щелкните Отправить проигравший , чтобы переопределить разрешение конфликта и передать значение, определенное как проигравший в конфликте на все узлы в топологии.
Выбрать Записать подробности этого конфликта , чтобы записать данные конфликта в файл. Для указания размещения файла наведите указатель на меню Просмотр и щелкните Параметры. Введите значение или нажмите кнопку обзора (...), а затем перейдите к необходимому файлу. Нажмите кнопку ОК для выхода из диалогового окна Параметры .
Закройте средство просмотра конфликтов репликации.
Просмотр сведений о конфликтах
Если конфликт разрешается в репликации слиянием, данные из проигравшей строки записываются в таблицу конфликтов. Эти данные конфликта можно просмотреть программно с помощью хранимых процедур репликации. Дополнительные сведения см. в разделе Advanced Merge Replication Conflict Detection and Resolution.
Выполните процедуру sp_helpmergepublicationна издателе в базе данных публикации. Запомните значения следующих столбцов в результирующем наборе.
centralized_conflicts — значение 1 показывает, что конфликтующие строки хранятся на издателе, а значение 0 показывает, что на издателе не хранятся конфликтующие строки.
decentralized_conflicts — значение 1 показывает, что конфликтующие строки хранятся на подписчике, а значение 0 показывает, что на подписчике не хранятся конфликтующие строки.
Примечание.
Способ регистрации конфликта в публикации слиянием устанавливается с помощью параметра
@conflict_logging
процедуры sp_addmergepublication. Использовать параметр@centralized_conflicts
не рекомендуется.
В таблице ниже приводятся значения этих столбцов в зависимости от значений, указанных в параметре
@conflict_logging
.Значение @conflict_logging centralized_conflicts decentralized_conflicts publisher 1 0 subscriber 0 1 оба 1 1 Выполните процедуру sp_helpmergearticleconflictsна издателе в базе данных публикации или на подписчике в базе данных подписки. Укажите значение в параметре
@publication
, чтобы получить сведения о конфликтах только для статей, принадлежащих конкретной публикации. Таким образом будут получены сведения о конфликтах для статей, содержащих конфликты. Запомните значение conflict_table для всех интересующих статей. Если параметр conflict_table для статьи имеет значение NULL, удалите только конфликты, которые возникли в этой статье.(Необязательно) Просмотрите строки конфликта для интересующих статей. В зависимости от значений параметров centralized_conflicts и decentralized_conflicts , полученных на шаге 1, выполните одно из следующих действий.
На издателе в базе данных публикации выполните хранимую процедуру sp_helpmergeconflictrows. Укажите таблицу конфликтов для статьи (из шага 1) в параметре
@conflict_table
. (Необязательно) Задайте значение@publication
, чтобы ограничить возвращаемые сведения о конфликтах сведениями для определенной публикации. В результате будут возвращены данные для потерянной строки и другие сведения.На подписчике в базе данных подписки выполните хранимую процедуру sp_helpmergeconflictrows. Укажите таблицу конфликтов для статьи (из шага 1) в параметре
@conflict_table
. В результате будут возвращены данные для потерянной строки и другие сведения.
Конфликт со сбоем удаления
Выполните процедуру sp_helpmergepublicationна издателе в базе данных публикации. Запомните значения следующих столбцов в результирующем наборе.
centralized_conflicts — значение 1 показывает, что конфликтующие строки хранятся на издателе, а значение 0 показывает, что на издателе не хранятся конфликтующие строки.
decentralized_conflicts — значение 1 показывает, что конфликтующие строки хранятся на подписчике, а значение 0 показывает, что на подписчике не хранятся конфликтующие строки.
Примечание.
Способ регистрации конфликта в публикации слиянием устанавливается с помощью параметра
@conflict_logging
хранимой процедуры sp_addmergepublication. Использовать параметр@centralized_conflicts
не рекомендуется.
Выполните процедуру sp_helpmergearticleconflictsна издателе в базе данных публикации или на подписчике в базе данных подписки. Укажите значение в параметре
@publication
, чтобы получить сведения о таблице конфликтов только для статей, принадлежащих конкретной публикации. Таким образом будут получены сведения о конфликтах для статей, содержащих конфликты. Запомните значение source_object для всех интересующих статей. Если параметр conflict_table для статьи имеет значение NULL, удалите только конфликты, которые возникли в этой статье.(Необязательно) Просмотрите информацию о конфликтах удаления. В зависимости от значений параметров centralized_conflicts и decentralized_conflicts , полученных на шаге 1, выполните одно из следующих действий.
На издателе в базе данных публикации выполните хранимую процедуру sp_helpmergedeleteconflictrows. Укажите в параметре
@source_object
имя исходной таблицы (из шага 1), в которой произошел конфликт. (Необязательно) Задайте значение@publication
, чтобы ограничить возвращаемые сведения о конфликтах сведениями для определенной публикации. Таким образом возвращаются сведения о конфликте операций удаления, хранящиеся на издателе.На подписчике в базе данных подписки выполните хранимую процедуру sp_helpmergedeleteconflictrows. Укажите в параметре
@source_object
имя исходной таблицы (из шага 1), в которой произошел конфликт. (Необязательно) Задайте значение@publication
, чтобы ограничить возвращаемые сведения о конфликтах сведениями для определенной публикации. Таким образом возвращаются сведения о конфликте операций удаления, сохраненные на подписчике.