Сопровождение тиражирования сведением в SQL Server 2000 - Служебные таблицы, процедуры и триггеры для поддержки сведения

ОГЛАВЛЕНИЕ

 

Служебные таблицы, процедуры и триггеры для поддержки сведения

В документации тиражирование сведением (слиянием) предлагается использовать в тех случаях, когда между издателем и подписчиком нет надежной постоянной связи. Хотя в версии 2000 появилась возможность применять очереди сообщений MSMQ, эта рекомендация остается актуальной. В интервалах между процедурами сведения издатель и подписчик имеют полную свободу. В результате сведения состояние данных всех участников становится одинаковым. Этой работой занимаются специальные процессы, называемые агентами сведения (Merge Agent). В зависимости от типа подписки агент Merge Agent может принадлежать либо подписчику, либо дистрибьютору. В SQL Server 2000 реализован больший параллелизм в работе агента сведения и, как следствие, обеспечено более эффективное взаимодействие между серверами.

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

Например, таблицы Sysmergepubluca-tions и Sysmergesubscriptions содержат по одной записи на каждую публикацию и подписку соответственно, а в таблице Sysmergearticles каждая запись соответствует статье. В таблицах Sysmergeschemachange и Systrans-chemas содержатся данные об изменении схемы на издателе. Основной можно считать таблицу MSmerge_contents. Именно ее в первую очередь использует агент сведения для определения изменений данных. Число записей в ней неуклонно растет в течение всего времени тиражирования. Три таблицы связаны с удалением данных: MSmerge_tombstone, MSmer-ge_delete_conflicts и MSmerge_errrorlineage. Они содержат информацию об удалении данных в тиражируемых таблицах, удалении данных в результате возникновения конфликтов и дополнительно об удалении данных на подписчике, которые еще не перенесены на сервер-издатель. Таблица MSmerge_genhistory содержит значения поколений (generations), о которых участнику тиражирования стало известно за период удержания (retention period). В течение периода удержания, по умолчанию составляющего 14 дней, подписчик и издатель обязаны синхронизироваться. В противном случае будет выполнена повторная инициализация подписки. В распоряжении администратора есть и справочные хранимые процедуры, выдающие информацию о тиражировании. Назначение процедур нетрудно понять по их именам: sp_helpmergepublication, sp_helpmergearticle, sp_helpmergearticlecolumn, sp_helpmergefilter , sp_helpmergesubscription, sp_helpmer-gepullsubscription, sp_helpmergealternatepublisher, sp_helpmergearticleconflicts, sp_helpmergeconflictrows, sp_helpmergedeleteconflictrows.

Для поддержки тиражирования на издателе и на подписчике создаются системные хранимые процедуры c префиксами sp_ins_, sp_upd_ и sp_sel_. Процедура с префиксом sel_ используется агентом сведения для выборки добавленных или измененных данных из таблиц, участвующих в тиражировании. Если данные добавляются или обновляются, служебные триггеры вызывают хранимые процедуры, а те уже вносят изменения в системные таблицы. Таким образом, каждая транзакция, вызванная пользователем, влечет за собой целую серию транзакций в системных таблицах. Это ведет к увеличению времени отклика, иногда в несколько раз, а также может вызвать проблемы с блокировками. Такова плата за тиражирование, и разработчикам и администраторам следует помнить о ней.

Процедуры с префиксом sp_cft_ служат для регистрации конфликтов. Для каждой таблицы, участвующей в тиражировании, создаются триггеры с префиксами ins_, upd_ и del_, соответствующие типу транзакции. Триггеры на издателе создаются во время подготовки снимка, а триггеры на подписчике – во время применения снимка.