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

Применимо к:SQL Server

В этом разделе описывается создание моментального снимка публикации слиянием с параметризованными фильтрами в SQL Server с помощью SQL Server Management Studio, Transact-SQL или объектов управления репликацией (RMO).

Когда в публикации слиянием применяются параметризованные фильтры строк, репликация инициализирует каждую подписку с помощью моментального снимка, состоящего из двух частей. В первую очередь создается моментальный снимок схемы, содержащий все объекты, требуемые репликацией, и схемы опубликованных объектов, но не данные. Затем каждая подписка инициализируется с помощью моментального снимка, включающего объекты и схему из моментального снимка схемы, а также данные, принадлежащие секции подписки. Если несколько подписок получают заданную секцию (другими словами, они получают ту же схему и данные), моментальный снимок для этой секции создается один раз; несколько подписок инициализируются из одного и того же моментального снимка. Дополнительные сведения о параметризованных фильтрах строк см. в разделе Параметризованные фильтры строк.

Моментальные снимки для публикаций с параметризованными фильтрами можно создать одним из трех способов:

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

  • Разрешите подписчикам запрашивать создание моментального снимка и его применение при первоначальной синхронизации. Этот параметр позволяет новым подписчикам синхронизироваться без вмешательства администратора (агент SQL Server должен работать на издателе, чтобы разрешить создание моментального снимка).

    Примечание.

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

  • Создайте моментальный снимок вручную для каждого подписчика с помощью агента моментальных снимков. Затем подписчик должен предоставить место для размещения моментальных снимков агенту слияния, чтобы он мог получить и применить правильный моментальный снимок.

    Примечание.

    Данный параметр поддерживается для обратной совместимости и не допускает существования общих FTP-ресурсов моментальных снимков.

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

Рассмотрим Adventure Works, которая имеет мобильную рабочую силу, которая поставляет инвентаризацию в отдельные магазины. Каждый продавец на основании своего учетного имени получает подписку, в которую извлекаются данные для обслуживаемых магазинов. Администратор выбирает предварительное создание моментальных снимков и их обновление каждое воскресенье. Иногда в систему добавляется новый пользователь, и ему требуются данные для секции, которая не имеет доступного моментального снимка. Администратор также решает разрешить инициирование моментальных снимков подписчиком, чтобы исключить ситуацию, когда подписчик не может подписаться на публикацию из-за того, что моментальный снимок еще не доступен. Когда новый подписчик подключается в первый раз, моментальный снимок создается для указанной секции и применяется на подписчике (агент SQL Server должен работать на издателе, чтобы разрешить создание моментального снимка).

Чтобы создать моментальный снимок публикации с параметризованными фильтрами, см. раздел Создание моментального снимка для публикации слиянием с параметризованными фильтрами.

Настройки безопасности для агента моментальных снимков

Агент моментальных снимков создает моментальные снимки для каждой секции. Для предварительно созданных моментальных снимков и моментальных снимков, запрашиваемых подписчиком, агент запускается и подключается с учетными данными, указанными при создании задания агента моментальных снимков для публикации (задание создается мастером создания публикации или хранимой процедурой sp_addpublication_snapshot). Для изменения учетных данных используйте хранимую процедуру sp_changedynamicsnapshot_job. Дополнительные сведения см. в разделе sp_changedynamicsnapshot_job (Transact-SQL).

Рекомендации

  • При создании моментальных снимков для публикации слиянием с помощью параметризованных фильтров необходимо сначала создать стандартный моментальный снимок (схему), который будет содержать все опубликованные данные и метаданные подписчика для подписки. Дополнительные сведения см. в разделе Create and Apply the Initial Snapshot. После создания моментального снимка схемы можно создать моментальный снимок, содержащий секцию опубликованных данных для конкретного подписчика.

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

Использование среды SQL Server Management Studio

Создайте моментальные снимки для секций на странице разделов данных диалогового окна "Свойства публикации — <публикация> ". Дополнительные сведения о доступе к этому диалоговому окну см. в разделе Просмотр и изменение свойств публикации. Подписчикам можно разрешить инициировать создание и доставку или только создание моментальных снимков.

Перед созданием моментальных снимков для одной или нескольких секций необходимо следующее.

  1. Создать публикацию слиянием при помощи мастера создания публикаций и указать один или несколько параметризованных фильтров строк на странице Добавление фильтра окна мастера. Дополнительные сведения см. в статье Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.

  2. Создайте моментальный снимок схемы для публикации. По умолчанию при завершении мастера создания новой публикации создается моментальный снимок схемы; Вы также можете создать моментальный снимок схемы из SQL Server Management Studio.

Создание моментального снимка схемы

  1. Подключение издателю в Management Studio, а затем разверните узел сервера.

  2. Раскройте папку Репликация , а затем — папку Публикации .

  3. Щелкните правой кнопкой мыши публикацию, для которой нужно создать моментальный снимок, а затем выберите Просмотреть состояние агента моментальных снимков.

  4. В диалоговом окне "Вид агент моментальных снимков состояние — <публикация>" нажмите кнопку "Пуск".

    Когда агент моментальных снимков закончит создание моментального снимка, на экране появится сообщение: «[100%] Сформирован моментальный снимок 17 статей».

Разрешение подписчикам запускать создание и доставку моментальных снимков

  1. На странице разделов данных диалогового окна "Свойства публикации — публикация>" <выберите автоматически определить секцию и при необходимости создать моментальный снимок при попытке синхронизации нового подписчика.

  2. Нажмите ОК.

Создание и обновление моментальных снимков

  1. На странице "Разделы данных" диалогового окна "Свойства публикации — публикация>" <нажмите кнопку "Добавить".

  2. Введите значение HOST_NAME() или значение SUSER_SNAME() , относящееся к секции, для которой нужно создать моментальный снимок.

  3. При необходимости задайте расписание обновления моментальных снимков.

    1. Установите флажок Запланировать запуск агента моментальных снимков для этой секции в следующее время.

    2. Примите используемое по умолчанию расписание обновления моментальных снимков или щелкните Изменить , чтобы указать другое расписание.

  4. Нажмите кнопку "ОК", которая возвращает вас в диалоговое окно "Свойства публикации — <публикация> ".

  5. Выберите секцию в сетке свойств, затем щелкните Создать выбранные моментальные снимки.

  6. Нажмите ОК.

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

С помощью хранимых процедур и агента моментальных снимков можно выполнить следующие действия:

  • Разрешите подписчикам запрашивать создание моментального снимка и его применение при первоначальной синхронизации.

  • Предварительное создание моментальных снимков для каждой секции.

  • создать вручную моментальный снимок для каждого подписчика.

    Важно!

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

Создание публикации, которая позволяет подписчикам инициировать формирование и доставку моментальных снимков

  1. На издателе в базе данных публикации выполните sp_addmergepublication (Transact-SQL). Укажите следующие параметры:

    • имя публикации в качестве значения параметра @publication;

    • значение true параметра @allow_subscriber_initiated_snapshot, позволяющее подписчикам запускать процесс создания моментального снимка;

    • допустимое число параллельно выполняемых процессов динамических моментальных снимков в качестве значения параметра @max_concurrent_dynamic_snapshots(необязательно). Если выполняется максимальное число процессов и подписчик пытается создать моментальный снимок, то процесс помещается в очередь. По умолчанию число параллельных процессов не ограничено.

  2. На издателе выполните процедуру sp_addpublication_snapshot (Transact-SQL). Укажите имя публикации, используемое на шаге 1 для @publication, и учетные данные Microsoft Windows, в которых выполняется репликация агент моментальных снимков для @job_login и @password. Если агент будет использовать проверку подлинности SQL Server при подключении к издателю, необходимо также указать значение 0 для @publisher_security_mode и сведения о входе Microsoft SQL Server для @publisher_login и @publisher_password. Будет создано задание агента моментальных снимков для публикации. Дополнительные сведения о формировании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Create and Apply the Initial Snapshot.

    Важно!

    Если издатель настраивается с удаленным распространителем, то значения, передаваемые для всех аргументов, включая job_login и job_password, передаются распространителю в формате обычного (незашифрованного) текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в статье Включение шифрования соединений в компоненте Database Engine (диспетчер конфигурации SQL Server).

  3. Выполните sp_addmergearticle (Transact-SQL), чтобы добавить статьи в публикацию. Эту хранимую процедуру необходимо выполнить один раз для каждой статьи в публикации. При использовании параметризованных фильтров необходимо указать параметризованный фильтр строк для одной или нескольких статей, использующих параметр @subset_filterclause . Дополнительные сведения см. в статье Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.

  4. Если другие статьи будут отфильтрованы на основе параметризованного фильтра строк, выполните sp_addmergefilter (Transact-SQL), чтобы определить связи соединения или логической записи между статьями. Эту хранимую процедуру необходимо выполнить один раз для каждой определяемой связи. Дополнительные сведения см. в статье Определение и изменение фильтра соединения между статьями публикации слиянием.

  5. Если агент слияния запрашивает инициализацию подписчика моментальным снимком, то автоматически создается моментальный снимок для секции запрашивающей подписки.

Создание публикации и предварительное создание или автоматическое обновление моментальных снимков

  1. Выполните sp_addmergepublication (Transact-SQL), чтобы создать публикацию. Дополнительные сведения см. в разделе Create a Publication.

  2. На издателе выполните процедуру sp_addpublication_snapshot (Transact-SQL). Укажите имя публикации, использовавшееся на шаге 1, в параметре @publication , а учетные данные Windows, с которыми работает агент моментальных снимков, — в параметрах @job_login и @password. Если агент будет использовать проверку подлинности SQL Server при подключении к издателю, необходимо также указать значение 0 для @publisher_security_mode и сведения о входе SQL Server для @publisher_login и @publisher_password. Будет создано задание агента моментальных снимков для публикации. Дополнительные сведения о формировании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Create and Apply the Initial Snapshot.

    Важно!

    Если издатель настраивается с удаленным распространителем, то значения, передаваемые для всех аргументов, включая job_login и job_password, передаются распространителю в формате обычного (незашифрованного) текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в статье Включение шифрования соединений в компоненте Database Engine (диспетчер конфигурации SQL Server).

  3. Выполните sp_addmergearticle (Transact-SQL), чтобы добавить статьи в публикацию. Эту хранимую процедуру необходимо выполнить один раз для каждой статьи в публикации. При использовании параметризованных фильтров необходимо указать параметризованный фильтр строк для одной статьи, использующей параметр @subset_filterclause . Дополнительные сведения см. в статье Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.

  4. Если другие статьи будут отфильтрованы на основе параметризованного фильтра строк, выполните sp_addmergefilter (Transact-SQL), чтобы определить связи соединения или логической записи между статьями. Эту хранимую процедуру необходимо выполнить один раз для каждой определяемой связи. Дополнительные сведения см. в статье Определение и изменение фильтра соединения между статьями публикации слиянием.

  5. На издателе в базе данных публикации выполните sp_helpmergepublication (Transact-SQL), указав значение @publication из шага 1. Запомните значение параметра snapshot_jobid в результирующем наборе.

  6. Преобразуйте значение параметра snapshot_jobid , полученное в шаге 5, в тип uniqueidentifier.

  7. На издателе в базе данных msdb выполните sp_start_job (Transact-SQL), указав преобразованное значение, полученное на шаге 6 для @job_id.

  8. На издателе в базе данных публикации выполните sp_addmergepartition (Transact-SQL). Укажите имя публикации из шага 1 для @publication и значение, используемое для определения секции для @suser_sname, если SUSER_SNAME (Transact-SQL) используется в предложении фильтра или для @host_name, если HOST_NAME (Transact-SQL) используется в предложении фильтра.

  9. На издателе в базе данных публикации выполните sp_adddynamicsnapshot_job (Transact-SQL). Укажите имя публикации из шага 1 в качестве значения параметра @publication, значение параметра @suser_sname или @host_name из шага 8, а также расписание для этого задания. Будет создано задание, создающее параметризованный моментальный снимок для указанной секции. Дополнительные сведения см. в статье Specify Synchronization Schedules.

    Примечание.

    Это задание выполняется в той же учетной записи Windows, что и задание исходного моментального снимка в шаге 2. Чтобы удалить параметризованное задание моментального снимка и связанный с ним раздел данных, выполните sp_dropdynamicsnapshot_job (Transact-SQL).

  10. На издателе в базе данных публикации выполните sp_helpmergepartition (Transact-SQL), указав значение @publication из шага 1 и значение @suser_sname или @host_name из шага 8. Запомните значение параметра dynamic_snapshot_jobid в результирующем наборе.

  11. На распространитее базы данных msdb выполните sp_start_job (Transact-SQL), указав значение, полученное на шаге 9 для @job_id. Будет запущено задание параметризованного моментального снимка для данной секции.

  12. Чтобы создать секционированный снимок для каждой подписки, повторите шаги 8–11.

Создание публикации и моментальных снимков для каждой секции вручную

  1. Выполните sp_addmergepublication (Transact-SQL), чтобы создать публикацию. Дополнительные сведения см. в разделе Create a Publication.

  2. На издателе выполните процедуру sp_addpublication_snapshot (Transact-SQL). Укажите имя публикации, использовавшееся на шаге 1, в параметре @publication , а учетные данные Windows, с которыми работает агент моментальных снимков, — в параметрах @job_login и @password. Если агент будет использовать проверку подлинности SQL Server при подключении к издателю, необходимо также указать значение 0 для @publisher_security_mode и сведения о входе SQL Server для @publisher_login и @publisher_password. Будет создано задание агента моментальных снимков для публикации. Дополнительные сведения о формировании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Create and Apply the Initial Snapshot.

    Важно!

    Если издатель настраивается с удаленным распространителем, то значения, передаваемые для всех аргументов, включая job_login и job_password, передаются распространителю в формате обычного (незашифрованного) текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в статье Включение шифрования соединений в компоненте Database Engine (диспетчер конфигурации SQL Server).

  3. Выполните sp_addmergearticle (Transact-SQL), чтобы добавить статьи в публикацию. Эту хранимую процедуру необходимо выполнить один раз для каждой статьи в публикации. При использовании параметризованных фильтров необходимо указать параметризованный фильтр строк хотя бы для одной статьи, использующей параметр @subset_filterclause . Дополнительные сведения см. в статье Определение и изменение параметризованного фильтра строк для статьи публикации слиянием.

  4. Если другие статьи будут отфильтрованы на основе параметризованного фильтра строк, выполните sp_addmergefilter (Transact-SQL), чтобы определить связи соединения или логической записи между статьями. Эту хранимую процедуру необходимо выполнить один раз для каждой определяемой связи. Дополнительные сведения см. в статье Определение и изменение фильтра соединения между статьями публикации слиянием.

  5. Чтобы создать стандартную схему моментального снимка и другие файлы, запустите задание моментального снимка или агент моментальных снимков репликации из командной строки. Дополнительные сведения см. в разделе Create and Apply the Initial Snapshot.

  6. Запустите агент моментальных снимков репликации из командной строки еще раз, чтобы создать файлы массового копирования (BCP-файл); при этом укажите расположение секционированного снимка в качестве значения параметра -DynamicSnapshotLocation , а также одно или оба приведенные ниже свойства, определяющие секцию:

  7. Чтобы создать секционированный снимок для каждой подписки, повторите шаг 6.

  8. Чтобы применить исходный секционированный снимок на подписчиках, запустите агент слияния для каждой подписки; при этом укажите следующие свойства:

    • -Hostname — значение, с помощью которого определяется секция, если реальное значение параметра HOST_NAME переопределяется;

    • -DynamicSnapshotLocation — расположение динамического моментального снимка для этой секции.

Примечание.

Дополнительные сведения о программировании агентов репликации см. в статье Основные понятия исполняемых файлов агента репликации.

Примеры (Transact-SQL)

В этом примере создается публикация слиянием с параметризованными фильтрами, где подписчики запускают процесс создания моментальных снимков. Значения для параметров @job_login и @job_password передаются с использованием переменных сценария.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule. 
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'true',
  @publication_compatibility_level = N'90RTM';

-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains salesperson information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time 
-- the subscription is synchronized. 
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

В этом примере публикация создается с помощью параметризованного фильтра, где для каждого подписчика с помощью хранимой процедуры sp_addmergepartition определена своя секция, а также путем выполнения хранимой процедуры sp_adddynamicsnapshot_job , передающей сведения о секционировании, создано фильтруемое задание моментального снимка. Значения для параметров @job_login и @job_password передаются с использованием переменных сценария.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication.  
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'false';

-- Create a new snapshot job for the publication, using the 
-- default schedule. Pass credentials at runtime using 
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(Login), 
  @job_password = $(password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains customer information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO

-- Start the snapshot agent job.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';

EXEC sp_startpublication_snapshot 
  @publication = @publication;
GO

PRINT '*** Waiting for the initial snapshot.';
GO

-- Create a temporary table to store the filtered data snapshot 
-- job information.
CREATE TABLE #temp (id int,
    job_name sysname,
    job_id uniqueidentifier,
    dynamic_filter_login sysname NULL,
    dynamic_filter_hostname sysname NULL,
    dynamic_snapshot_location nvarchar(255),
    frequency_type int, 
    frequency_interval int, 
    frequency_subday_type int,
    frequency_subday_interval int, 
    frequency_relative_interval int, 
    frequency_recurrence_factor int, 
    active_start_date int, 
    active_end_date int, 
    active_start_time int, 
    active_end_time int
)

-- Create each snapshot for a partition 
-- The initial snapshot must already be generated.
DECLARE @publication AS sysname;
DECLARE @jobname AS sysname
DECLARE @hostname AS sysname
SET @publication = N'AdvWorksSalesPersonMerge';
SET @hostname = N'adventure-works\Fernando';

WHILE NOT EXISTS(SELECT * FROM sysmergepublications 
    WHERE [name] = @publication 
    AND snapshot_ready = 1)
BEGIN
    WAITFOR DELAY '00:00:05'
END

-- Create a data partition by overriding HOST_NAME().
EXEC sp_addmergepartition 
  @publication = @publication,
  @host_name = @hostname;

-- Create the filtered data snapshot job, and use the returned 
-- information to start the job.
EXEC sp_adddynamicsnapshot_job 
  @publication = @publication,
  @host_name = @hostname;

INSERT INTO #temp (id, job_name, job_id, dynamic_filter_login,
    dynamic_filter_hostname, dynamic_snapshot_location,
    frequency_type,	frequency_interval, frequency_subday_type,
    frequency_subday_interval, frequency_relative_interval, 
    frequency_recurrence_factor, active_start_date,	active_end_date, 
    active_start_time,active_end_time)
EXEC sp_helpdynamicsnapshot_job;

SELECT @jobname = (SELECT DISTINCT job_name FROM #temp WHERE dynamic_filter_hostname = @hostname);

EXEC msdb..sp_start_job @job_name = @jobname;
DROP TABLE #temp;
GO

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

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;

SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';

USE [AdventureWorks2022];

-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
  @dbname = @publicationdb,
  @optname = N'merge publish',
  @value = N'true';  

-- Create new merge publication.  
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication of AdventureWorks2022.', 
  @allow_subscriber_initiated_snapshot = N'false';

-- Create a new snapshot job for the publication, using the 
-- default schedule. Pass credentials at runtime using 
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = $(Login), 
  @job_password = $(Password);

-- Add an article for the Employee table, 
-- which is horizontally partitioned using 
-- a parameterized row filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_owner = @schema_hr, 
  @source_object = @table1, 
  @type = N'table', 
  @description = 'contains employee information', 
  @subset_filterclause = N'[LoginID] = HOST_NAME()';

-- Add an article for the SalesPerson table, 
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_owner = @schema_sales, 
  @source_object = @table2, 
  @type = N'table', 
  @description = 'contains customer information';

-- Add a join filter between the two articles.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table1, 
  @filtername = @filter, 
  @join_articlename = @table2, 
  @join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]', 
  @join_unique_key = 1, 
  @filter_type = 1;
GO
  
REM Line breaks are added to improve readability.   
REM In a batch file, commands must be made in a single line.  
REM Run the Snapshot agent from the command line to generate the standard snapshot   
REM schema and other files.   
SET DistPub=%computername%  
SET PubDB=AdventureWorks2022   
SET PubName=AdvWorksSalesPersonMerge  
  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %PubName%    
-Publisher %DistPub% -Distributor  %DistPub%  -PublisherDB %PubDB%  -ReplicationType 2    
-OutputVerboseLevel 1  -DistributorSecurityMode 1  
  
PAUSE  
  
  
REM Run the Snapshot agent from the command line, this time to generate   
REM the bulk copy (.bcp) data for each Subscriber partition.    
SET DistPub=%computername%  
SET PubDB=AdventureWorks2022   
SET PubName=AdvWorksSalesPersonMerge  
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando  
  
MD %SnapshotDir%  
  
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %PubName%    
-Publisher %DistPub%  -Distributor  %DistPub%  -PublisherDB %PubDB%  -ReplicationType 2    
-OutputVerboseLevel 1  -DistributorSecurityMode 1  -DynamicFilterHostName "adventure-works\Fernando"    
-DynamicSnapshotLocation %SnapshotDir%  
  
PAUSE  
  
  
REM Run the Merge Agent for each subscription to apply the partitioned   
REM snapshot for each Subscriber.    
SET Publisher = %computername%  
SET Subscriber = %computername%  
SET PubDB = AdventureWorks2022   
SET SubDB = AdventureWorks2022Replica   
SET PubName = AdvWorksSalesPersonMerge   
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando  
  
"C:\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE" -Publisher  %Publisher%    
-Subscriber  %Subscriber%  -Distributor %Publisher%  -PublisherDB %PubDB%    
-SubscriberDB %SubDB% -Publication %PubName%  -PublisherSecurityMode 1  -OutputVerboseLevel 3    
-Output -SubscriberSecurityMode 1  -SubscriptionType 3 -DistributorSecurityMode 1    
-Hostname "adventure-works\Fernando"  -DynamicSnapshotLocation %SnapshotDir%  
  
PAUSE  
  

При помощи объектов RMO

Для программного создания секционированных снимков можно использовать объекты RMO следующими способами.

  • Разрешите подписчикам запрашивать создание моментального снимка и его применение при первоначальной синхронизации.

  • Предварительное создание моментальных снимков для каждой секции.

  • Создайте моментальный снимок вручную для каждого подписчика при помощи агента моментальных снимков.

Примечание.

Если фильтрация статьи приводит к образованию неперекрывающихся секций, уникальных для каждой подписки (если указано значение F:Microsoft.SqlServer.Replication.PartitionOptions.NonOverlappingSingleSubscription для P:Microsoft.SqlServer.Replication.MergeArticle.PartitionOption при создании статьи публикации слиянием), метаданные очищаются при запуске агента слияния. Это означает, что срок действия секционированного снимка истекает быстрее. Если выбран этот режим, рекомендуется рассмотреть возможность разрешения подписчикам создания моментальных снимков. Дополнительные сведения см. в подразделе «Использование соответствующих параметров фильтрации» раздела Parameterized Row Filters.

Важно!

По возможности предлагайте пользователям вводить учетные данные системы безопасности во время выполнения приложения. Если необходимо сохранить учетные данные, используйте криптографические службы, предоставляемые microsoft Windows платформа .NET Framework.

Создание публикации, которая позволяет подписчикам инициировать формирование и доставку моментальных снимков

  1. Создайте соединение с издателем с помощью класса ServerConnection .

  2. Создайте экземпляр класса ReplicationDatabase для базы данных публикации, установите в качестве значения свойства ConnectionContext экземпляр соединения ServerConnection , созданный на шаге 1, и вызовите метод LoadProperties . If LoadProperties возвращает значение false, убедитесь, что база данных существует.

  3. If EnabledMergePublishing присвоено значение false, укажите значение true и вызовите CommitPropertyChanges.

  4. Создайте экземпляр класса MergePublication и укажите для него следующие свойства:

    • Соединение ServerConnection , созданное на шаге 1, в качестве значения свойства ConnectionContext.

    • имя опубликованной базы данных в свойстве DatabaseName;

    • имя публикации в качестве значения свойства Name;

    • Максимальное количество заданий динамических моментальных снимков, которые должны быть выполнены MaxConcurrentDynamicSnapshots. Поскольку инициированные подписчиком запросы на моментальные снимки могут возникнуть в любое время, это свойство ограничивает количество заданий агента моментальных снимков, которые могут выполняться одновременно, когда несколько подписчиков запрашивают секционированные снимки в одно и то же время. Если выполняется максимальное количество заданий, дополнительные запросы на секционированные моментальные снимки помещаются в очередь, пока одно из выполняющихся заданий не будет завершено.

    • Используйте оператор побитового логического ИЛИ (| в Visual C# и Or в Visual Basic), чтобы добавить значение AllowSubscriberInitiatedSnapshot в Attributes.

    • Password Поля Login для предоставления SnapshotGenerationAgentProcessSecurity учетных данных для учетной записи Microsoft Windows, в которой выполняется задание агент моментальных снимков.

      Примечание.

      Рекомендуется указывать свойство SnapshotGenerationAgentProcessSecurity , если публикация создается членом предопределенной роли сервера sysadmin . Дополнительные сведения см. в статье Replication Agent Security Model.

  5. Чтобы создать публикацию, вызовите метод Create .

    Важно!

    При настройке издателя с удаленным распространителем значения, передаваемые для всех свойств, включая SnapshotGenerationAgentProcessSecurity, отправляются распространителю в виде обычного текста. Перед вызовом метода Create следует зашифровать подключение между издателем и его удаленным распространителем. Дополнительные сведения см. в статье Включение шифрования соединений в компоненте Database Engine (диспетчер конфигурации SQL Server).

  6. Чтобы добавить статьи к публикации, используйте свойство MergeArticle . Укажите свойство FilterClause хотя бы для одной статьи, определяющей параметризованный фильтр. (Необязательно) Создайте объекты MergeJoinFilter , определяющие фильтры соединения между статьями. Дополнительные сведения см. в статье определить статью.

  7. Если для свойства SnapshotAgentExists указано значение false, вызовите CreateSnapshotAgent , чтобы создать исходное задание агента моментального снимка для этой публикации.

  8. Вызовите метод StartSnapshotGenerationAgentJob объекта MergePublication , созданного на шаге 4. Запустится задание агента по созданию исходного моментального снимка. Дополнительные сведения о формировании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Create and Apply the Initial Snapshot.

  9. (Необязательно) Проверьте, указано ли значение true для свойства SnapshotAvailable , чтобы определить, когда исходный моментальный снимок будет готов к использованию.

  10. Когда агент слияния для подписчика подключается в первый раз, секционированный моментальный снимок создается автоматически.

Создание публикации и предварительное создание или автоматическое обновление моментальных снимков

  1. Чтобы определить публикацию слиянием, используйте экземпляр класса MergePublication . Дополнительные сведения см. в разделе Create a Publication.

  2. Чтобы добавить статьи к публикации, используйте свойство MergeArticle . Укажите свойство FilterClause хотя бы для одной статьи, определяющей параметризованный фильтр, и создайте любые объекты MergeJoinFilter , определяющие фильтры соединения между статьями. Дополнительные сведения см. в статье определить статью.

  3. Если для свойства SnapshotAgentExists указано значение false, вызовите CreateSnapshotAgent .

  4. Вызовите метод StartSnapshotGenerationAgentJob объекта MergePublication , созданного в шаге 1. Этот метод запускает задание агента по созданию исходного моментального снимка. Дополнительные сведения о создании исходного моментального снимка и определении пользовательского расписания для агента моментальных снимков см. в разделе Создание и применение исходного моментального снимка.

  5. Проверьте, указано ли значение true для свойства SnapshotAvailable , чтобы определить, когда исходный моментальный снимок будет готов к использованию.

  6. Создайте экземпляр класса MergePartition и укажите критерии параметризованного фильтра для подписчика, используя одно или оба следующих свойства.

  7. Создайте экземпляр класса MergeDynamicSnapshotJob и укажите то же свойство, что и в шаге 6.

  8. Используйте класс ReplicationAgentSchedule , чтобы определить расписание создания фильтрованных моментальных снимков для секции подписчика.

  9. Используя экземпляр MergePublication из шага 1, вызовите метод AddMergePartition. Передайте объект MergePartition , созданный на шаге 6.

  10. Используя экземпляр MergePublication из шага 1, вызовите метод AddMergeDynamicSnapshotJob . Передайте объект MergeDynamicSnapshotJob из шага 7 и объект ReplicationAgentSchedule из шага 8.

  11. Вызовите метод EnumMergeDynamicSnapshotJobsи найдите объект MergeDynamicSnapshotJob для вновь добавленного задания секционированного моментального снимка в возвращенном массиве.

  12. Получите свойство Name для этого задания.

  13. Создайте соединение с распространителем с помощью класса ServerConnection .

  14. Создайте экземпляр класса Server управляющих объектов SQL Server, передав объект ServerConnection из шага 13.

  15. Создайте экземпляр класса Job , передав свойство JobServer объекта Server из шага 14 и имя задания из шага 12.

  16. Вызовите метод Start , чтобы запустить задание секционированного моментального снимка.

  17. Повторите шаги 6 — 16 для каждого подписчика.

Создание публикации и моментальных снимков для каждой секции вручную

  1. Чтобы определить публикацию слиянием, используйте экземпляр класса MergePublication . Дополнительные сведения см. в разделе Create a Publication.

  2. Чтобы добавить статьи в публикацию, используйте свойство MergeArticle . Укажите свойство FilterClause хотя бы для одной статьи, определяющей параметризованный фильтр, и создайте любые объекты MergeJoinFilter , определяющие фильтры соединения между статьями. Дополнительные сведения см. в статье определить статью.

  3. Создайте исходный моментальный снимок. Дополнительные сведения см. в разделе Create and Apply the Initial Snapshot.

  4. Создайте экземпляр класса SnapshotGenerationAgent и укажите следующие необходимые свойства.

    • Publisher — имя издателя.

    • PublisherDatabase — имя базы данных публикации.

    • Publication — имя публикации.

    • Distributor — имя распространителя.

    • PublisherSecurityMode — значение Integrated для использования встроенной проверки подлинности Windows или значение Standard для использования проверки подлинности SQL Server.

    • DistributorSecurityMode — значение Integrated для использования встроенной проверки подлинности Windows или значение Standard для использования проверки подлинности SQL Server.

  5. Укажите значение Merge в параметре ReplicationType.

  6. Задайте одно или несколько следующих свойств, чтобы определить параметры секционирования.

  7. Вызовите метод GenerateSnapshot .

  8. Повторите шаги 4–7 для каждого подписчика.

Примеры (объекты RMO)

В этом примере создается публикация слиянием, позволяющая подписчикам запрашивать создание моментальных снимков.

// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";

ReplicationDatabase publicationDb;
MergePublication publication;

// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);

try
{
    // Connect to the Publisher.
    conn.Connect();

    // Enable the database for merge publication.				
    publicationDb = new ReplicationDatabase(publicationDbName, conn);
    if (publicationDb.LoadProperties())
    {
        if (!publicationDb.EnabledMergePublishing)
        {
            publicationDb.EnabledMergePublishing = true;
        }
    }
    else
    {
        // Do something here if the database does not exist. 
        throw new ApplicationException(String.Format(
            "The {0} database does not exist on {1}.",
            publicationDb, publisherName));
    }

    // Set the required properties for the merge publication.
    publication = new MergePublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    // Enable precomputed partitions.
    publication.PartitionGroupsOption = PartitionGroupsOption.True;

    // Specify the Windows account under which the Snapshot Agent job runs.
    // This account will be used for the local connection to the 
    // Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;

    // Explicitly set the security mode for the Publisher connection
    // Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;

    // Enable Subscribers to request snapshot generation and filtering.
    publication.Attributes |= PublicationAttributes.AllowSubscriberInitiatedSnapshot;
    publication.Attributes |= PublicationAttributes.DynamicFilters;

    // Enable pull and push subscriptions.
    publication.Attributes |= PublicationAttributes.AllowPull;
    publication.Attributes |= PublicationAttributes.AllowPush;

    if (!publication.IsExistingObject)
    {
        // Create the merge publication.
        publication.Create();
        
        // Create a Snapshot Agent job for the publication.
        publication.CreateSnapshotAgent();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication already exists.", publicationName));
    }
}

catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "The publication {0} could not be created.", publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"

Dim publicationDb As ReplicationDatabase
Dim publication As MergePublication

' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)

Try
    ' Connect to the Publisher.
    conn.Connect()

    ' Enable the database for merge publication.				
    publicationDb = New ReplicationDatabase(publicationDbName, conn)
    If publicationDb.LoadProperties() Then
        If Not publicationDb.EnabledMergePublishing Then
            publicationDb.EnabledMergePublishing = True
        End If
    Else
        ' Do something here if the database does not exist. 
        Throw New ApplicationException(String.Format( _
         "The {0} database does not exist on {1}.", _
         publicationDb, publisherName))
    End If

    ' Set the required properties for the merge publication.
    publication = New MergePublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' Enable precomputed partitions.
    publication.PartitionGroupsOption = PartitionGroupsOption.True

    ' Specify the Windows account under which the Snapshot Agent job runs.
    ' This account will be used for the local connection to the 
    ' Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword

    ' Explicitly set the security mode for the Publisher connection
    ' Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True

    ' Enable Subscribers to request snapshot generation and filtering.
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowSubscriberInitiatedSnapshot
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.DynamicFilters

    ' Enable pull and push subscriptions
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowPull
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowPush

    If Not publication.IsExistingObject Then
        ' Create the merge publication.
        publication.Create()

        ' Create a Snapshot Agent job for the publication.
        publication.CreateSnapshotAgent()
    Else
        Throw New ApplicationException(String.Format( _
            "The {0} publication already exists.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
        "The publication {0} could not be created.", publicationName), ex)
Finally
    conn.Disconnect()
End Try

В этом примере вручную создается секция подписчика и фильтрованный моментальный снимок для публикации слиянием с параметризованными фильтрами строк.

// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string distributorName = publisherInstance;

MergePublication publication;
MergePartition partition;
MergeDynamicSnapshotJob snapshotAgentJob;
ReplicationAgentSchedule schedule;

// Create a connection to the Publisher.
ServerConnection publisherConn = new ServerConnection(publisherName);

// Create a connection to the Distributor to start the Snapshot Agent.
ServerConnection distributorConn = new ServerConnection(distributorName);

try
{
    // Connect to the Publisher.
    publisherConn.Connect();

    // Set the required properties for the publication.
    publication = new MergePublication();
    publication.ConnectionContext = publisherConn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;


    // If we can't get the properties for this merge publication, 
    // then throw an application exception.
    if (publication.LoadProperties() || publication.SnapshotAvailable)
    {
        // Set a weekly schedule for the filtered data snapshot.
        schedule = new ReplicationAgentSchedule();
        schedule.FrequencyType = ScheduleFrequencyType.Weekly;
        schedule.FrequencyRecurrenceFactor = 1;
        schedule.FrequencyInterval = Convert.ToInt32(0x001);

        // Set the value of Hostname that defines the data partition. 
        partition = new MergePartition();
        partition.DynamicFilterHostName = hostname;
        snapshotAgentJob = new MergeDynamicSnapshotJob();
        snapshotAgentJob.DynamicFilterHostName = hostname;

        // Create the partition for the publication with the defined schedule.
        publication.AddMergePartition(partition);
        publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule);
    }
    else
    {
        throw new ApplicationException(String.Format(
            "Settings could not be retrieved for the publication, " +
            " or the initial snapshot has not been generated. " +
            "Ensure that the publication {0} exists on {1} and " +
            "that the Snapshot Agent has run successfully.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Do error handling here.
    throw new ApplicationException(string.Format(
        "The partition for '{0}' in the {1} publication could not be created.",
        hostname, publicationName), ex);
}
finally
{
    publisherConn.Disconnect();
    if (distributorConn.IsOpen) distributorConn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim distributorName As String = publisherInstance

Dim publication As MergePublication
Dim partition As MergePartition
Dim snapshotAgentJob As MergeDynamicSnapshotJob
Dim schedule As ReplicationAgentSchedule

' Create a connection to the Publisher.
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)

' Create a connection to the Distributor to start the Snapshot Agent.
Dim distributorConn As ServerConnection = New ServerConnection(distributorName)

Try
    ' Connect to the Publisher.
    publisherConn.Connect()

    ' Set the required properties for the publication.
    publication = New MergePublication()
    publication.ConnectionContext = publisherConn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName


    ' If we can't get the properties for this merge publication, 
    ' then throw an application exception.
    If (publication.LoadProperties() Or publication.SnapshotAvailable) Then
        ' Set a weekly schedule for the filtered data snapshot.
        schedule = New ReplicationAgentSchedule()
        schedule.FrequencyType = ScheduleFrequencyType.Weekly
        schedule.FrequencyRecurrenceFactor = 1
        schedule.FrequencyInterval = Convert.ToInt32("0x001", 16)

        ' Set the value of Hostname that defines the data partition. 
        partition = New MergePartition()
        partition.DynamicFilterHostName = hostname
        snapshotAgentJob = New MergeDynamicSnapshotJob()
        snapshotAgentJob.DynamicFilterHostName = hostname

        ' Create the partition for the publication with the defined schedule.
        publication.AddMergePartition(partition)
        publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule)
    Else
        Throw New ApplicationException(String.Format( _
         "Settings could not be retrieved for the publication, " + _
         " or the initial snapshot has not been generated. " + _
         "Ensure that the publication {0} exists on {1} and " + _
         "that the Snapshot Agent has run successfully.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Do error handling here.
    Throw New ApplicationException(String.Format( _
     "The partition for '{0}' in the {1} publication could not be created.", _
     hostname, publicationName), ex)
Finally
    publisherConn.Disconnect()
    If distributorConn.IsOpen Then
        distributorConn.Disconnect()
    End If
End Try

В этом примере вручную запускается агент моментальных снимков для создания фильтрованного моментального снимка данных для подписчика на публикацию слиянием с параметризованными фильтрами строк.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
string distributorName = publisherInstance;

SnapshotGenerationAgent agent;

try
{
    // Set the required properties for Snapshot Agent.
    agent = new SnapshotGenerationAgent();
    agent.Distributor = distributorName;
    agent.DistributorSecurityMode = SecurityMode.Integrated;
    agent.Publisher = publisherName;
    agent.PublisherSecurityMode = SecurityMode.Integrated;
    agent.Publication = publicationName;
    agent.PublisherDatabase = publicationDbName;
    agent.ReplicationType = ReplicationType.Merge;

    // Specify the partition information to generate a 
    // filtered snapshot based on Hostname.
    agent.DynamicFilterHostName = hostname;

    // Start the agent synchronously.
    agent.GenerateSnapshot();
}
catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "A snapshot could not be generated for the {0} publication."
        , publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance

Dim agent As SnapshotGenerationAgent

Try
    ' Set the required properties for Snapshot Agent.
    agent = New SnapshotGenerationAgent()
    agent.Distributor = distributorName
    agent.DistributorSecurityMode = SecurityMode.Integrated
    agent.Publisher = publisherName
    agent.PublisherSecurityMode = SecurityMode.Integrated
    agent.Publication = publicationName
    agent.PublisherDatabase = publicationDbName
    agent.ReplicationType = ReplicationType.Merge

    ' Specify the partition information to generate a 
    ' filtered snapshot based on Hostname.
    agent.DynamicFilterHostName = hostname

    ' Start the agent synchronously.
    agent.GenerateSnapshot()
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
     "A snapshot could not be generated for the {0} publication." _
     , publicationName), ex)
End Try

См. также

Параметризованные фильтры строк
Replication System Stored Procedures Concepts
Replication Security Best Practices