Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После инициализации публикации или подписки репликация типа "слияние" отслеживает и перечисляет все изменения данных в опубликованных таблицах. Изменения отслеживаются с помощью триггеров (которые репликация создает для каждой опубликованной таблицы) и системных таблиц в базах данных публикации и подписки. Эти таблицы системы репликации заполняются метаданными, указывающими, какие изменения следует распространять. Когда агент слияния запускается во время синхронизации, изменения определяются агентом, а затем применяются к издателю и подписчику по мере необходимости.
Отслеживание изменений
Репликация слиянием использует следующие триггеры и системные таблицы для отслеживания изменений для всех опубликованных таблиц:
-
MSmerge_ins_<GUID>
: триггер вставки (значение GUID для этого триггера и других триггеров определяется на основеsysmergearticles
) -
MSmerge_upd_<GUID>
: триггер обновления -
MSmerge_del_<GUID>
: триггер удаления MSmerge_contents
MSmerge_tombstone
MSmerge_genhistory
Репликация слиянием использует следующие дополнительные системные таблицы для отслеживания изменений в отфильтрованных таблицах.
MSmerge_partition_groups
MSmerge_current_partition_mappings
MSmerge_past_partition_mappings
Замечание
Системные таблицы используются всеми публикациями слияния и подписками в базе данных; например, если в базе данных публикаций имеется несколько публикаций, MSmerge_contents
содержит строки из статей во всех публикациях.
Отслеживание изменений для нефильтрованных таблиц
Системные таблицы
Системные таблицы, используемые для нефильтрованных и отфильтрованных таблиц, содержат следующие метаданные:
MSmerge_contents
содержит одну строку для каждой строки, вставленной или обновленной в опубликованную таблицу в базе данных.MSmerge_tombstone
содержит одну строку для каждой строки, удаленной из опубликованной таблицы в базе данных.MSmerge_genhistory
содержит одну строку для каждого поколения. Поколение — это коллекция изменений, которые доставляются издателю или подписчику. Поколения закрываются при каждом запуске агента слияния; последующие изменения в базе данных добавляются в одно или несколько открытых поколений.
Процесс отслеживания изменений
Следующий процесс отслеживания изменений используется для всех нефильтрованных таблиц:
При выполнении вставки или обновления в опубликованной таблице срабатывает триггер
MSmerge_ins_<GUID>
илиMSmerge_upd_<GUID>
, и строка вставляется в системную таблицуMSmerge_contents
. Столбецrowguid
MSmerge_contents
содержит GUID для вставленной или обновленной строки, что указывает на необходимость отправки этой соответствующей строки из пользовательской таблицы издателю или подписчикам при следующей повторной синхронизации. Если последующие обновления происходят в строке в пользовательской таблице, строкаMSmerge_contents
обновляется, чтобы отразить это состояние.При удалении в опубликованной таблице
MSmerge_del_<GUID>
триггер срабатывает и строка вставляется в системную таблицуMSmerge_tombstone
. Столбецrowguid
MSmerge_tombstone
содержит GUID для удаленной строки, указывающий на то, что при следующей синхронизации должно быть отправлено удаление издателю или подписчикам для соответствующей удаленной строки в таблице пользователя. Если удаленная строка содержится вMSmerge_contents
(так как она была вставлена или обновлена с момента последней синхронизации), строка удаляется изMSmerge_contents
.
Отслеживание изменений для фильтруемых таблиц
Системные таблицы
Помимо системных таблиц, описанных в предыдущем разделе, три таблицы в базе данных публикации содержат метаданные для отслеживания изменений в фильтруемых таблицах:
MSmerge_partition_groups
содержит одну строку для каждой секции, определенной в публикации. Секции могут быть:Определяется явным образом с помощью
sp_addmergepartition
или страницы секций данных диалогового окна "Свойства публикации".Создается автоматически при синхронизации подписчика, если для подписчика требуется раздел, в котором еще нет записи
MSmerge_partition_groups
.
MSmerge_current_partition_mappings
содержит одну строку для каждой уникальной комбинации строк вMSmerge_contents
иMSmerge_partition_groups
. Например, если строка в пользовательской таблице принадлежит двум разделам, а строка обновляется, одна строка вставляется вMSmerge_contents
, чтобы отразить обновление, а две строки вставляются вMSmerge_current_partition_mappings
, чтобы указать, что обновленная строка принадлежит двум разделам.MSmerge_past_partition_mappings
содержит одну строку для каждой строки, которая больше не принадлежит данной секции. Строка перемещается из раздела, если:Строка удаляется. Если строка удаляется из пользовательской таблицы, в
MSmerge_tombstone
вставляется строка и вMSmerge_past_partition_mappings
вставляется одна или несколько строк.Значение в столбце, используемом для фильтрации, изменилось. Например, если параметризованный фильтр основан на состоянии, в котором находится компания, и компания перемещается, строка для компании (и связанные строки в других таблицах) может выйти из раздела данных одного продавца в секцию для другого продавца. Если строка обновляется таким образом, что она больше не принадлежит разделу, строка вставляется или обновляется в
MSmerge_contents
, и вMSmerge_past_partition_mappings
вставляется одна или несколько строк.
Замечание
Если используются неперекрывающиеся разделы с одной подпиской на раздел (значение 3
для параметра @partition_options
из sp_addmergearticle
), системные таблицы MSmerge_current_partition_mappings
и MSmerge_past_partition_mappings
не используются для отслеживания сопоставлений разделов строк, так как каждая строка принадлежит только одному разделу и может быть изменена только на одном участнике.
Процесс отслеживания изменений
Описанный ранее процесс (в разделе "Отслеживание изменений для нефильтрованных таблиц") для нефильтрованных таблиц также используется для отфильтрованных таблиц со следующими дополнениями:
При вставке данных в опубликованную таблицу, помимо обновления или вставки данных в
MSmerge_contents
, для каждой секции, к которой принадлежит строка, вMSmerge_current_partition_mappings
добавляется отображение сегмента.При обновлении опубликованной таблицы, помимо обновления или вставки данных в
MSmerge_contents
, если для каждой секции, к которой относится строка, вMSmerge_current_partition_mappings
не существует сопоставления секций, то оно добавляется. Если обновление привело к перемещению строки из одной секции вMSmerge_current_partition_mappings
другую, строка обновляется и добавляется вMSmerge_past_partition_mappings
.При удалении в опубликованной таблице, дополнительно к строке, вставленной в
MSmerge_tombstone
, строка удаляется изMSmerge_current_partition_mappings
и добавляется вMSmerge_past_partition_mappings
.
Изменение перечисления
Системные таблицы и процедуры
При запуске агента слияния изменения перечисляются с помощью нескольких системных таблиц и хранимых процедур:
MSmerge_genhistory
содержит одну строку для каждого поколения. Поколение — это коллекция изменений, которые доставляются издателю или подписчику. Поколения закрываются при каждом запуске агента слияния; последующие изменения в базе данных добавляются в одно или несколько открытых поколений.sysmergesubscriptions
содержит сведения о подписках, включая запись последних поколений изменений, отправленных и полученных узлом. В базе данных публикации эта таблица содержит строку издателя и одну строку для каждого подписчика. В базе данных подписки эта таблица обычно содержит строку для подписчика и строку издателя.MSmerge_generation_partition_mappings
используется только для отфильтрованных таблиц, записывая, содержит ли данное поколение какие-либо изменения, относящиеся к заданному разделу. Эта таблица в базе данных публикации содержит одну строку для каждого уникального сочетания строк вMSmerge_genhistory
иMSmerge_partition_groups
.sp_MSmakegeneration
закрывает все открытые поколения в начале перечислительного процесса.sp_MSenumchanges
перечисляет изменения для таблиц (в этом процессе также используются несколько связанных процедур, имена которых начинаются сsp_MSenumchanges
).sp_MSgetmetadata
определяет, следует ли применять изменение с одного узла на другом узле в качестве вставки, обновления или удаления.
Процесс перечисления изменений
Во время перечисления изменений происходит следующий процесс:
Системная процедура
sp_MSmakegeneration
вызывается:Для нефильтрованных и отфильтрованных таблиц эта процедура закрывает все открытые поколения, на которые ссылается
MSmerge_genhistory
(если закрытые поколения имеют значение1
или2
в столбцеgenstatus
).Для отфильтрованных таблиц эта процедура заполняет системную таблицу
MSmerge_generation_partition_mappings
. Если поколение содержит одно или несколько изменений, относящихся к разделу, строка вставляется в системную таблицу. Если поколение не содержит никаких изменений, относящихся к данному разделу, строка не вставляется вMSmerge_generation_partition_mappings
, а изменения не перечисляются для подписчиков, получающих этот раздел.
Вызываются хранимая процедура
sp_MSenumchanges
и связанные процедуры. Эти процедуры перечисляют изменения, произошедшие с момента последней синхронизации:Процедуры сначала определяют поколение, с которого начинается перечисление, на основе столбцов
sentgen
(отправленного последнего поколения) иrecgen
(полученного последнего поколения) в таблицеsysmergesubscriptions
.Например, при определении изменений для поколений, которые должны быть перечислены для данного подписчика, сравниваются
sentgen
для подписчика (хранящиеся в базе данных публикации) иrecgen
для подписчика (хранящегося в базе данных подписки). Если значения одинаковы (что означает, что последнее поколение, отправленное издателем, успешно получено подписчиком), изменения перечисляются начиная с следующего поколения.MSmerge_genhistory
Если значения не совпадают, используется меньшее из двух значений, чтобы гарантировать отправку всех необходимых изменений.Затем процедуры перечисляют изменения:
Для нефильтрованных таблиц перечисляются все изменения, содержащиеся в поколениях, следующих после поколения в
sentgen
илиrecgen
:MSmerge_genhistory
соединяется сMSmerge_contents
, аMSmerge_tombstone
определяет, какие изменения необходимо отправить.Для отфильтрованных таблиц
MSmerge_generation_partition_mappings
присоединяется к:MSmerge_current_partition_mappings
иMSmerge_contents
; иMSmerge_past_partition_mappings
иMSmerge_tombstone
, чтобы определить, какие изменения относятся к разделу, который получает подписчик.
Хранимая процедура
sp_MSgetmetadata
вызывается, чтобы определить, следует ли применять изменение как вставку, обновление или удаление. На этом этапе выполняется обнаружение конфликтов и разрешение конфликтов; Дополнительные сведения см. в статье об обнаружении и разрешении конфликтов при репликации методом слияния.
Связанный контент
- Репликация слиянием
- MSmerge_contents (Transact-SQL)
- MSmerge_current_partition_mappings
- MSmerge_generation_partition_mappings (Transact-SQL)
- MSmerge_genhistory (Transact-SQL)
- MSmerge_partition_groups (Transact-SQL)
- MSmerge_past_partition_mappings (Transact-SQL)
- MSmerge_tombstone (Transact-SQL)
- sp_addmergearticle (Transact-SQL)
- sp_addmergepartition (Transact-SQL)
- sysmergearticles (Transact-SQL)
- sysmergesubscriptions (Transact-SQL)
- Объединение фильтров
- Параметризованные фильтры — параметризованные фильтры строк