Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Репликация слиянием. Реинициализация.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1759
Добрый вечер.
Возникла проблема при репликации слиянием.
Есть публикация. В свойствах выставлено Drop existing object and create a new one.
При реинициализации, на подписчике соответственно дропаются таблицы со всеми ключами, дефолтами и.т.п.
Существуют таблицы, которые не ходят по репликации, но имеют FK на эти таблицы. Чтобы корректно репликация смогла удалить таблицы, для удаления и восстановления этих FK мы использует Before/After скрипты при применении Snapshot.
В итоге все красиво потом восстанавливается.

Однако есть другая проблема.
Таблицы в репликации на подписчике могут иметь FK на таблицы не в репликации и отсутствующие на издателе.
Такие FK при реинициализации удаляются. И на момент применения Before скрипта их уже не существует. Т.е. репликация до применения снапшота и соответственно скрипта Before уже удалила FK таблиц в репликации.

Вопрос:
Каким образом сохранить эти FK и потом их восстановить при реинициализации не затрагивая внешние механизмы, типа создать скрипт на создание этих FK и выполнить его в After скрипте. Это не подойдет, т.к. мы на момент реинициализации не знаем какие FK есть. Имена FK необходимо получать строго из системных таблиц, как мы делаем в случае выше.
15 янв 13, 19:59    [13774591]     Ответить | Цитировать Сообщить модератору
 Re: Репликация слиянием. Реинициализация.  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Это особенность репликации слиянием. В транзакционной Before-скрипт выполняется до дропа констрейнтов.
Например, если позволит версия сервера, то на подписчике напишите DDL-триггер, отслеживающий дропы FK, если sessionproperty('replication_agent') = 1.
15 янв 13, 20:31    [13774683]     Ответить | Цитировать Сообщить модератору
 Re: Репликация слиянием. Реинициализация.  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Тьху, заработался...
В триггере констрейнта уже не будет...
15 янв 13, 20:33    [13774693]     Ответить | Цитировать Сообщить модератору
 Re: Репликация слиянием. Реинициализация.  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Можете реализовать простейшую схему: в репликацию включить служебную таблицу, содержащую метаданные для генерации FK на подписчиках. Тогда в After-скрипте сможете воссоздать FK.
15 янв 13, 20:39    [13774716]     Ответить | Цитировать Сообщить модератору
 Re: Репликация слиянием. Реинициализация.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1759
Включить служебную таблицу не получится, т.к. на сервере много репликаций (разделены по логическим сущностям). А таблицу получится включить только в одну из них.

Может попробовать использовать Database Trigger и отлавливать ALTER TABEL DROP CONSTRAINT на таблицах в репликации и затем в After скрипте восстанавливать. Но тут загводздка будет в следующем:

Есть две таблицы А и Б, где Б имеет FK на A. обе таблицы ходят по репликации но в разных.
Если сделать реинициализацию репликации с таблицей Б, то FK удалится и не восстановится. В этом случае поможет способ предложенный мной выше. Но если мы сами на издателе захотим удалить этот FK, то на подписчике в таком случае триггер подумает, что это репликация дропнула и восстановит его.
16 янв 13, 13:56    [13778065]     Ответить | Цитировать Сообщить модератору
 Re: Репликация слиянием. Реинициализация.  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
X-Cite,

Тогда, ИМХО, проще всего в каждой БД-подписчике иметь процедуру с одним и тем же именем, восстанавливающую FK. А эту процедуру уже дергать из After-скрипта.
16 янв 13, 14:48    [13778586]     Ответить | Цитировать Сообщить модератору
 Re: Репликация слиянием. Реинициализация.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1759
Да, в триггере в момент отлова удаления FK его уже не существует. Обидно.

Пока вижу вариант это перевод всех таблиц стоящих по иерархии выше репликационных таблиц в единое IDENTITY пространство. Перенос таблиц на издателя и создания FK там.
Затем в After-скрипте удаленно получать данные с издателя по ключам из служебных view и восстанавливать то, что еще не восстановилось.
16 янв 13, 16:43    [13779678]     Ответить | Цитировать Сообщить модератору
 Re: Репликация слиянием. Реинициализация.  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Если используются push-подписки по расписанию, то есть один извращенный вариант: У процедуры sp_addmergesubscriptions есть параметр @hostname. Если для каждой подписки задавать для него уникальное значение в пределах сервера-подписчика, то можно будет в триггере входа, с помощью host_name() и sessionproperty(), определять сеанс merge-агента и скриптовать куда-нибудь нужные FK.
16 янв 13, 18:40    [13780553]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить