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


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

При определении статьи для публикации слиянием можно указать пользовательский арбитр конфликтов. Дополнительные сведения см. в разделе Расширенное обнаружение и разрешение конфликтов репликации слиянием. MicrosoftSQL Server включает несколько стандартных пользовательских арбитров конфликтов, кроме того, можно написать собственный. Если требуется применить пользовательскую логику, исполняемую для каждой реплицируемой строки, а не только для конфликтующих строк, см. раздел Как реализовать обработчик бизнес-логики для статьи публикации слиянием (программирование репликации).

Регистрация пользовательского арбитра конфликтов

  1. Если планируется зарегистрировать собственный пользовательский арбитр конфликтов, создайте один из следующих типов.

  2. Чтобы определить, зарегистрирован ли нужный арбитр, выполните хранимую процедуру sp_enumcustomresolvers (Transact-SQL) на издателе для любой базы данных. Будет выведено описание пользовательского арбитра, а также идентификатор класса (CLSID) для каждого арбитра на основе COM, зарегистрированного на распространителе, или сведения об управляемой сборке для каждого обработчика бизнес-логики, зарегистрированного на распространителе.

  3. Если нужный пользовательский арбитр еще не зарегистрирован, выполните хранимую процедуру sp_registercustomresolver (Transact-SQL) на распространителе. Укажите имя для арбитра в параметре @article_resolver; для обработчика бизнес-логики это будет понятное имя сборки. Для арбитров на основе COM укажите идентификатор CLSID DLL-библиотеки в параметре @resolver_clsid, а для обработчика бизнес-логики — значение true в параметре @is_dotnet_assembly, имя сборки — в параметре @dotnet_assembly_name и полное имя класса, переопределяющего свойство BusinessLogicModule, в параметре @dotnet_class_name.

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

    Если сборка обработчика бизнес-логики развернута не в том же каталоге, что и исполняемый объект агента слияния, то в каталоге приложения, синхронно запускающего агент слияния, или в глобальном кэше сборок (GAC) необходимо указать полный путь, включая имя сборки, в параметра @dotnet_assembly_name.

  4. Если арбитр является арбитром на основе COM, сделайте следующее.

    • Скопируйте DLL-библиотеку пользовательского арбитра на распространитель для принудительных подписок либо на подписчик для подписок по запросу.

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

      Пользовательские арбитры Майкрософт можно найти в каталоге C:\Program Files\Microsoft SQL Server\100\COM.

    • Используйте файл regsvr32.exe, чтобы зарегистрировать DLL-библиотеку пользовательского арбитра в операционной системе. Например, чтобы зарегистрировать аддитивный арбитр конфликтов SQL Server, введите в командной строке следующее.

      regsvr32 ssradd.dll
      
  5. Если арбитр является обработчиком бизнес-логики, разверните сборку в папке, в которой находится исполняемый файл агента слияния (replmerg.exe), в папке с приложением, вызывающим агент слияния, или в папке, указанной в параметре @dotnet_assembly_name в шаге 3.

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

    Местом установки по умолчанию исполняемого файла агента слияния является C:\Program Files\Microsoft SQL Server\100\COM.

Указание пользовательского арбитра при определении статьи публикации слиянием

  1. Если планируется использовать собственный пользовательский арбитр конфликтов, создайте и зарегистрируйте арбитр с помощью описанной выше процедуры.

  2. На издателе выполните хранимую процедуру sp_enumcustomresolvers (Transact-SQL) и запомните имя нужного пользовательского арбитра в поле value результирующего набора.

  3. В базе данных публикации на издателе выполните процедуру изменения задержки и проверки соединений для репликации транзакций (sp_addmergearticle (Transact-SQL)). Укажите имя арбитра из шага 2 в параметре @article_resolver и любые нужные входные данные для пользовательского арбитра с помощью параметра @resolver_info. Для нестандартных арбитров, основанных на хранимых процедурах, в параметре @resolver_info указывается имя хранимой процедуры. Дополнительные сведения о входных данных, необходимых для пользовательских арбитров, поставляемых корпорацией Майкрософт, см. в разделе Арбитры на базе технологии Microsoft COM.

Указание или изменение пользовательского арбитра для существующей статьи публикации слиянием

  1. Чтобы выяснить, был ли пользовательский арбитр определен для статьи, или получить имя арбитра, выполните хранимую процедуру sp_helpmergearticle (Transact-SQL). Если для статьи был определен пользовательский арбитр, его имя отобразится в поле article_resolver. Любые входные данные, переданные арбитру, будут отображены в поле resolver_info результирующего набора.

  2. На издателе выполните хранимую процедуру sp_enumcustomresolvers (Transact-SQL) и запомните имя нужного пользовательского арбитра в поле value результирующего набора.

  3. В базе данных публикации на издателе выполните процедуру изменения задержки и проверки соединений для репликации транзакций (sp_changemergearticle (Transact-SQL)). Укажите значение для article_resolver, включая полный путь к обработчику бизнес-логики, в параметре @property, и имя нужного пользовательского арбитра из шага 2 в параметре @value.

  4. Чтобы изменить необходимые входные данные для пользовательского арбитра, выполните хранимую процедуру sp_changemergearticle (Transact-SQL) еще раз. Укажите значение resolver_info в параметре @property и любые необходимые входные данные для пользовательского арбитра в параметре @value. Для нестандартных арбитров, основанных на хранимых процедурах, в параметре @resolver_info указывается имя хранимой процедуры. Дополнительные сведения о необходимых входных данных см. в разделе Арбитры на базе технологии Microsoft COM.

Отмена регистрации пользовательского арбитра конфликтов

  1. На издателе выполните хранимую процедуру sp_enumcustomresolvers (Transact-SQL) и запомните имя пользовательского арбитра, который нужно удалить, в поле value результирующего набора.

  2. Выполните процедуру sp_unregistercustomresolver (Transact-SQL) на распространителе. Укажите полное имя пользовательского арбитра из шага 1 в параметре @article_resolver.

Пример

В этом примере создается новая статья и указывается, что усредняющий арбитр конфликтов SQL Server при возникновении конфликта должен использоваться для вычисления среднего значения в столбце UnitPrice.

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';

EXEC sp_addmergearticle 
    @publication = @publication, 
    @article = @article, 
    @source_object = @article, 
    @article_resolver = 'Microsoft SQL Server Averaging Conflict Resolver', 
    @resolver_info = 'UnitPrice';
GO

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

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';

EXEC sp_changemergearticle 
    @publication = @publication, 
    @article = @article, 
    @property='article_resolver', 
    @value='Microsoft SQL Server Additive Conflict Resolver';

EXEC sp_changemergearticle 
    @publication = @publication, 
    @article = @article, 
    @property='resolver_info', 
    @value='UnitsOnOrder';
GO