Как реализовать нестандартный арбитр конфликтов на основе хранимых процедур для статьи публикации слиянием (программирование репликации на языке Transact-SQL)
Собственный пользовательский арбитр конфликтов можно реализовать в виде хранимой процедуры Transact-SQL на каждом издателе. Во время синхронизации эта хранимая процедура вызывается при возникновении конфликтов в статье, для которой был зарегистрирован арбитр, и данные о строке с конфликтом передаются агентом слияния в необходимые параметры этой процедуры. Пользовательские арбитры конфликтов на основе хранимых процедур всегда создаются на издателе.
![]() |
---|
Арбитры на основе хранимых процедур Microsoft SQL Server вызываются только для обработки конфликтов, связанных с изменением строк. Их нельзя использовать для обработки других типов конфликтов, таких как ошибки вставки, возникшие из-за нарушения ограничений PRIMARY KEY или ограничений уникального индекса. |
Создание пользовательского арбитра конфликтов на основе хранимых процедур
На издателе в базе данных публикации или msdb создайте новую системную хранимую процедуру со следующими обязательными параметрами.
Параметр
Тип данных
Описание
@tableowner
sysname
Имя владельца таблицы, в которой разрешается конфликт. Это владелец таблицы в базе данных публикации.
@tablename
sysname
Имя таблицы, в которой разрешается конфликт.
@rowguid
uniqueidentifier
Уникальный идентификатор строки конфликта.
@subscriber
sysname
Имя сервера, с которого распространяется вызвавшее конфликт изменение.
@subscriber_db
sysname
Имя базы данных, из которой распространяется вызвавшее конфликт изменение.
@log_conflict OUTPUT
int
Определяет, должен ли процесс слияния зарегистрировать конфликт для последующего разрешения.
0 = не регистрировать конфликт.
1 = разрешение конфликта в пользу издателя.
2 = разрешение конфликта в пользу подписчика.
@conflict_message OUTPUT
nvarchar(512)
Сообщения, которые должны быть выданы о разрешении конфликта, если конфликт был зарегистрирован.
@destowner
sysname
Владелец опубликованной таблицы на подписчике.
Эта хранимая процедура использует значения, переданные агентом слияния этим параметрам для применения пользовательской логики разрешения конфликтов. Она должна вернуть результирующий набор, содержащий одну строку, соответствующий структуре базовой таблицы и содержащий значения данных для приоритетной версии строки.
Предоставьте разрешения EXECUTE на хранимую процедуру любым именам входа, используемым подписчиками для соединения с издателем.
Использование нестандартного арбитра конфликтов с новой статьей таблицы
- Выполните хранимую процедуру sp_addmergearticle, чтобы определить статью. При этом укажите значение MicrosoftSQL Server Stored Procedure Resolver в параметре @article_resolver и имя хранимой процедуры, реализующей логику арбитра конфликтов в параметре @resolver_info. Дополнительные сведения см. в разделе Как определить статью (программирование репликации на языке Transact-SQL).
Использование нестандартного арбитра конфликтов с существующей статьей таблицы
Выполните хранимую процедуру sp_changemergearticle. При этом укажите указав параметры @publication, @article, значение article_resolver в параметре @property и значение MicrosoftSQL Server Stored ProcedureResolver в параметре @value.
Выполните хранимую процедуру sp_changemergearticle, указав параметры @publication, @article, значение resolver_info в параметре @property и имя хранимой процедуры, реализующей логику арбитра конфликтов, в параметре @value.