Поделиться через


Как реализовать нестандартный арбитр конфликтов на основе хранимых процедур для статьи публикации слиянием (программирование репликации на языке Transact-SQL)

Собственный пользовательский арбитр конфликтов можно реализовать в виде хранимой процедуры Transact-SQL на каждом издателе. Во время синхронизации эта хранимая процедура вызывается при возникновении конфликтов в статье, для которой был зарегистрирован арбитр, и данные о строке с конфликтом передаются агентом слияния в необходимые параметры этой процедуры. Пользовательские арбитры конфликтов на основе хранимых процедур всегда создаются на издателе.

ПримечаниеПримечание

Арбитры на основе хранимых процедур MicrosoftSQL Server вызываются только для обработки конфликтов, связанных с изменением строк. Их нельзя использовать для обработки других типов конфликтов, таких как ошибки вставки, возникшие из-за нарушения ограничений PRIMARY KEY или ограничений уникального индекса.

Создание пользовательского арбитра конфликтов на основе хранимых процедур

  1. На издателе в базе данных публикации или 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

    Владелец опубликованной таблицы на подписчике.

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

  2. Предоставьте разрешения EXECUTE на хранимую процедуру любым именам входа, используемым подписчиками для соединения с издателем.

Использование нестандартного арбитра конфликтов с новой статьей таблицы

Использование нестандартного арбитра конфликтов с существующей статьей таблицы

  1. Выполните хранимую процедуру sp_changemergearticle. При этом укажите указав параметры @publication, @article, значение article_resolver в параметре @property и значение MicrosoftSQL Server Stored ProcedureResolver в параметре @value.

  2. Выполните хранимую процедуру sp_changemergearticle, указав параметры @publication, @article, значение resolver_info в параметре @property и имя хранимой процедуры, реализующей логику арбитра конфликтов, в параметре @value.