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


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

В этом разделе описывается реализация пользовательского сопоставителя конфликтов для статьи слияния в SQL Server 2014 с помощью Transact-SQL или пользовательского сопоставителя на основе COM.

В этом разделе

Использование Transact-SQL

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

Примечание.

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

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

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

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

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

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

  1. Выполните sp_addmergearticle, чтобы определить статью, указав значение хранимой процедуры MicrosoftSQL Server для параметра @article_resolver и имя хранимой процедуры, реализующей логику разрешения конфликтов для параметра @resolver_info. Дополнительные сведения см. в статье определить статью.

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

  1. Выполните sp_changemergearticle, указав @publication, @article, значение article_resolver для @property и значение хранимой процедуры MicrosoftSQL Server Для @value.

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

При помощи пользовательского арбитра конфликтов на основе COM

Пространство имен Microsoft.SqlServer.Replication.BusinessLogicSupport реализует интерфейс, позволяющий писать сложную бизнес-логику для обработки событий и разрешения конфликтов, происходящих во время синхронизации репликации слиянием. Дополнительные сведения см. в статье Реализация обработчика бизнес-логики для статьи публикации слиянием. Для разрешения конфликтов можно записать в машинном коде собственную бизнес-логику. Эта логика создается как com-компонент и компилируется в библиотеки динамических ссылок (DLL), используя такие продукты, как Microsoft Visual C++. Сопоставитель конфликтов на основе COM должен реализовывать интерфейс ICustomResolver, спроектированный специально для разрешения конфликтов.

Создание и регистрация пользовательского сопоставителя конфликтов на основе COM

  1. В COM-совместимой среде разработчика добавьте ссылки на библиотеку пользовательского сопоставителя.

  2. В проекте Visual C++ используйте директиву #import для импорта этой библиотеки.

  3. Создайте класс, реализующий интерфейс ICustomResolver .

  4. Обеспечьте выполнение соответствующих методов и свойств.

  5. Постройте проект, создающий файл библиотеки пользовательского сопоставителя.

  6. Разверните эту библиотеку в каталоге, содержащем исполняемый файл агента слияния (обычно «\Microsoft SQL Server\100\COM»).

    Примечание.

    Пользовательский сопоставитель конфликтов необходимо развернуть на подписчике для подписки по запросу, на распространителе для принудительной подписки или на веб-сервере, который используется для веб-синхронизации.

  7. Зарегистрируйте библиотеку пользовательского сопоставителя конфликтов с помощью программы regsvr32.exe из каталога развертывания следующим образом.

    regsvr32.exe mycustomresolver.dll  
    
  8. На издателе выполните sp_enumcustomresolvers (Transact-SQL), чтобы убедиться, что библиотека еще не зарегистрирована в качестве пользовательского сопоставителя конфликтов.

  9. Чтобы зарегистрировать библиотеку в качестве пользовательского сопоставителя конфликтов, выполните sp_registercustomresolver (Transact-SQL) на распространителю. Укажите понятное имя COM-объекта для @article_resolver, идентификатор библиотеки (CLSID) для @resolver_clsid и значение false для @is_dotnet_assembly.

    Примечание.

    При отсутствии необходимости настраиваемый сопоставитель конфликтов можно отменить регистрацию с помощью sp_unregistercustomresolver (Transact-SQL).

  10. В кластере повторите шаги 5-8, чтобы зарегистрировать пользовательский сопоставитель на всех узлах кластера (необязательно). Это нужно для того, чтобы пользовательский сопоставитель смог правильно загрузить посредник после отработки отказа.

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

  1. На издателе выполните sp_enumcustomresolvers (Transact-SQL) и запишите понятное имя требуемого сопоставителя.

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

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

  1. На издателе выполните sp_enumcustomresolvers (Transact-SQL) и запишите понятное имя требуемого сопоставителя.

  2. Выполните sp_changemergearticle (Transact-SQL), указав @publication, @article, значение article_resolver для @property и понятное имя сопоставителя статьи на шаге 1 для @value.

Просмотр образца пользовательского сопоставителя

  1. Пример доступен в образцах файлов SQL Server 2000. Скачайте sql2000samples.zip. Это скачивает 3 файла размером 6,9 МБ.

  2. Извлеките файлы из загруженного сжатого CAB-файла.

  3. Запустите setup.exe.

    Примечание.

    При выборе параметров установки необходимо установить только образцы Репликации . (Путь установки по умолчанию — C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\)

  4. Перейдите в папку установки. (По умолчанию используется папка C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe)

  5. Выполните программу unzip_sqlreplSP3.exe .

    Примечание.

    Пример сопоставителя com будет установлен (по умолчанию) в папку C:\Program Files (x86) \Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres .

  6. В папке subspres найдите все вхождения #include sqlres.h во всех исходных файлах и замените их значением #import "replrec.dll" no_namespace, raw_interfaces_only

См. также

Advanced Merge Replication Conflict Detection and Resolution
COM-Based Custom Resolvers
Replication Security Best Practices