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

Откуда: Москва
Сообщений: 1320
Блог
Имеется транзакционная репликация. У публикации есть подписчики, и pull и push.
В какой-то момент времени решается что изменения от издателя на определенном подписчике не нужны, и нужно предотвратить репликацию.
Звучит как бы просто, и простое решение - удалить подписку. Однако здесь начинаются сложности. Может быть так что и издатель и дистрибьютор недоступны - например потому что легла сеть между дистрибьютором и подписчиком. Этот функционал нужен как раз когда лег один из датацентров.
Возможные решения как я вижу:
1. Удалить соответствующую запись из MSreplication_subscriptions. Но это не нравится, прямое вмешательство в системные таблицы.
2. Удалить дистрибюшн джоб. Но это возможно только для pull подписок.
3. На все таблицы куда идет репликация наложить триггер который бы запретил внесения изменений для определенного дистрибьшн агента.
Сложности с подходом через триггер:
а. Не знаю как определить зная все о distribution job под каким program_name он будет коннектится.
б. Host_name() не подходит так как потенциально джоб дистрибьюции может может находится прямо на подписчике (для pull подписок)
в. Запретить все изменения от дистрибьюшн агентов для таблиц нельзя так как имеются другие публикации вносящие изменения в те же таблицы.

Сейчас склоняюсь к удалению записи из MSreplication_subscriptions, но хочется найти решение лучше. Есть ли оно?
19 мар 12, 17:53    [12276070]     Ответить | Цитировать Сообщить модератору
 Re: Как предотвратить на подписчике изменения от транзакционной репликации?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Инстедные триггера на подписчике, которые ничего не будут делать, если выполняются в репликационной сессии с определенного хоста. Проверить это у словие можно так:
if sessionproperty('replication_agent') = 1 and host_name() = 'MyDistributor'
 return
19 мар 12, 18:38    [12276416]     Ответить | Цитировать Сообщить модератору
 Re: Как предотвратить на подписчике изменения от транзакционной репликации?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
invm
Инстедные триггера на подписчике, которые ничего не будут делать, если выполняются в репликационной сессии с определенного хоста. Проверить это у словие можно так:
if sessionproperty('replication_agent') = 1 and host_name() = 'MyDistributor'
 return

Не подходит, смотри 3a в описании проблемы.
19 мар 12, 18:51    [12276487]     Ответить | Цитировать Сообщить модератору
 Re: Как предотвратить на подписчике изменения от транзакционной репликации?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
У дистрибьюшн агента есть параметр -host. Можно задать кастомное значение и использовать для идентификации.
19 мар 12, 19:16    [12276614]     Ответить | Цитировать Сообщить модератору
 Re: Как предотвратить на подписчике изменения от транзакционной репликации?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Кстати, удаление записи из MSreplication_subscriptions никак не скажется на работоспособности репликации -- она просто будет восстановлена при следующей синхронизации.
20 мар 12, 10:28    [12279264]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить