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


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

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

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

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

    Transact-SQL

    Арбитр конфликтов на основе COM

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

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

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

Сопоставители на основе хранимых процедур Microsoft SQL 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 на хранимую процедуру любым именам входа, используемым подписчиками для соединения с издателем.

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

  • Выполните хранимую процедуру sp_addmergearticle, чтобы определить статью. При этом укажите значение MicrosoftSQL Server Stored Procedure Resolver в параметре @article_resolver и имя хранимой процедуры, реализующей логику сопоставителя конфликтов в параметре @resolver_info. Дополнительные сведения см. в разделе Определение статьи.

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

  1. Выполните хранимую процедуру sp_changemergearticle. При этом укажите указав параметры @publication, @article, значение article_resolver в параметре @property и значение MicrosoftSQL Server Stored ProcedureResolver в параметре @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.cab из обновленных образцов для пакета обновления 3 для SQL Server 2000. При этом будет загружено 8 файлов общим объемом в 6,9 МБ.

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

  3. Выполнить setup.exe

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

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

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

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

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

    Образец пользовательского сопоставителя по умолчанию устанавливается в папку C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1049\sqlrepl\resolver\subspres.

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

См. также

Основные понятия

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

Пользовательские сопоставители на основе технологии COM

Рекомендации по защите репликации