Реализация пользовательского арбитра конфликтов для статьи слиянием
Область применения: SQL Server
В этом разделе описывается реализация пользовательского сопоставителя конфликтов для статьи слияния в SQL Server с помощью Transact-SQL или пользовательского сопоставителя на основе COM.
В этом разделе
Реализация пользовательского арбитра конфликтов для статьи слияния с помощью следующих средств:
Использование Transact-SQL
Вы можете написать собственный настраиваемый сопоставитель конфликтов как хранимую процедуру Transact-SQL на каждом издателе. При синхронизации эта хранимая процедура вызывается, когда обнаруживаются конфликты в статье, в которой был зарегистрирован арбитр. Агент слияния передает сведения о конфликтной строке в необходимые параметры процедуры. Пользовательские сопоставители конфликтов на основе хранимых процедур всегда создаются на издателе.
Примечание.
Разрешения хранимой процедуры Microsoft SQL Server вызываются только для обработки конфликтов на основе изменений строк. Их нельзя использовать для обработки других типов конфликтов, таких как ошибки вставки, возникшие из-за нарушения ограничений PRIMARY KEY или ограничений уникального индекса.
Создание пользовательского сопоставителя конфликтов на основе хранимых процедур
На издателе в базе данных публикации или msdb создайте новую системную хранимую процедуру, реализующую следующие обязательные параметры.
Параметр Тип данных Description @tableowner sysname Имя владельца таблицы, в которой разрешается конфликт. Это владелец таблицы в базе данных публикации. @tablename sysname Имя таблицы, в которой разрешается конфликт. @rowguid uniqueidentifier Уникальный идентификатор для конфликтной строки. @subscriber sysname Имя сервера, с которого распространяется вызвавшее конфликт изменение. @subscriber_db sysname Имя базы данных, с которой распространяется вызвавшее конфликт изменение. выходные данные @log_conflict int Указывает, нужно ли в процессе слияния регистрировать конфликт для последующего разрешения.
0 = не регистрировать конфликт.
1 = разрешение конфликта в пользу издателя.
2 = разрешение конфликта в пользу подписчика.выходные данные @conflict_message nvarchar(512) Сообщения, которые должны быть выданы о разрешении конфликта, если конфликт был зарегистрирован. @destowner sysname Владелец опубликованной таблицы на подписчике. Эта хранимая процедура использует значения, которые агент слияния передает в эти параметры для реализации пользовательской логики разрешения конфликтов. Процедура должна вернуть результирующий набор для одной строки, который имеет такую же структуру, как и базовая таблица, и содержит значения данных для приоритетной версии строки.
Предоставьте разрешения EXECUTE на хранимую процедуру любым именам входа, используемым подписчиками для соединения с издателем.
Применение пользовательского арбитра конфликтов с новой статьей таблицы
Выполните sp_addmergearticle для определения статьи.
Укажите значение хранимой процедуры MicrosoftSQL Server для параметра @article_resolver.
Укажите имя хранимой процедуры, реализующей логику сопоставителя конфликтов для параметра @resolver_info .
Дополнительные сведения см. в статье Определение статьи.
Использование нестандартного сопоставителя конфликтов с существующей статьей таблицы
Выполните хранимую процедуру sp_changemergearticle, указав параметры @publication, @article, значение resolver_info в параметре @propertyи имя хранимой процедуры, реализующей логику арбитра конфликтов, в параметре @value.
Использование пользовательского сопоставителя на основе COM
Пространство имен Microsoft.SqlServer.Replication.BusinessLogicSupport реализует интерфейс, позволяющий создавать сложную бизнес-логику для обработки событий и разрешения конфликтов, возникающих при синхронизации репликации слиянием. Дополнительные сведения см. в руководстве по реализации обработчика бизнес-логики для статьи слияния. Для разрешения конфликтов можно записать в машинном коде собственную бизнес-логику. Эта логика создается как com-компонент и компилируется в библиотеки динамических ссылок (DLL), используя такие продукты, как Microsoft Visual C++. Такой сопоставитель конфликтов на основе COM должен реализовывать интерфейс ICustomResolver, спроектированный специально для разрешения конфликтов.
Создание и регистрация пользовательского сопоставителя конфликтов на основе COM
В COM-совместимой среде разработчика добавьте ссылки на библиотеку пользовательского сопоставителя.
В проекте Visual C++ используйте директиву #import для импорта этой библиотеки.
Создайте класс, реализующий интерфейс ICustomResolver .
Обеспечьте выполнение соответствующих методов и свойств.
Постройте проект, создающий файл библиотеки пользовательского сопоставителя.
Разверните эту библиотеку в каталоге, содержащем исполняемый файл агента слияния (обычно \Microsoft SQL Server\100\COM).
Примечание.
Пользовательский сопоставитель конфликтов необходимо развернуть на подписчике для подписки по запросу, на распространителе для принудительной подписки или на веб-сервере, который используется для веб-синхронизации.
Зарегистрируйте библиотеку пользовательского арбитра конфликтов с помощью программы regsvr32.exe из каталога развертывания следующим образом:
regsvr32.exe mycustomresolver.dll
На издателе выполните sp_enumcustomresolvers (Transact-SQL), чтобы убедиться, что библиотека еще не зарегистрирована в качестве пользовательского сопоставителя конфликтов.
Чтобы зарегистрировать библиотеку в качестве пользовательского сопоставителя конфликтов, выполните sp_registercustomresolver (Transact-SQL) на распространителю. Укажите понятное имя COM-объекта в параметре @article_resolver, идентификатор библиотеки (CLSID) в параметре @resolver_clsidи значение false в параметре @is_dotnet_assembly.
Примечание.
Если он больше не нужен, можно отменить регистрацию пользовательского сопоставителя конфликтов с помощью sp_unregistercustomresolver (Transact-SQL).
(Необязательно) В кластере повторите шаги 6–9, чтобы зарегистрировать пользовательский арбитр на всех узлах кластера. Эти шаги нужны для того, чтобы пользовательский арбитр смог правильно загрузить посредник после отработки отказа.
Использование нестандартного сопоставителя конфликтов с новой статьей таблицы
На издателе выполните sp_enumcustomresolvers (Transact-SQL) и запишите понятное имя требуемого сопоставителя.
На издателе в базе данных публикации выполните sp_addmergearticle (Transact-SQL), чтобы определить статью. Укажите понятное имя сопоставителя статей из шага 1 в параметре @article_resolver. Дополнительные сведения см. в статье Определение статьи.
Использование нестандартного сопоставителя конфликтов с существующей статьей таблицы
На издателе выполните sp_enumcustomresolvers (Transact-SQL) и запишите понятное имя требуемого сопоставителя.
Выполните sp_changemergearticle (Transact-SQL), указав @publication, @article, значение article_resolver для @property и понятное имя сопоставителя статьи на шаге 1 для @value.