Поделиться через


Создание подписки по запросу

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

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

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

Создайте pull-подписку на сервере публикации или на сервере подписки, используя мастер создания новой подписки. Следуйте инструкциям на страницах мастера:

  • Укажите издателя и публикацию.

  • Выберите место выполнения агентов репликации. Для подписки на вытягивание выберите "Запуск каждого агента на подписчике" на странице "Расположение агента распространителя" или на странице "Расположение агента слияния" в зависимости от типа публикации.

  • Укажите подписчиков и базы данных подписки.

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

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

    • Для подписок на публикации слияния укажите учетные данные на странице "Безопасность агента слияния".

    Сведения о разрешениях, необходимых каждому агенту, см. в разделе "Модель безопасности агента репликации".

  • Укажите расписание синхронизации и время инициализации подписчика.

  • Укажите дополнительные параметры для публикаций слиянием: тип подписки; значения для параметризованной фильтрации; и сведения о синхронизации через HTTPS, если публикация включена для веб-синхронизации.

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

  • При необходимости скриптируйте подписку.

Чтобы создать подписку на получение данных от издателя

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

  2. Раскройте папку Репликация , а затем папку Локальные публикации .

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

  4. Заполните страницы в мастере новой подписки.

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

  1. Подключитесь к подписчику в SQL Server Management Studio и разверните узел сервера.

  2. Разверните папку Репликации.

  3. Щелкните правой кнопкой мыши папку "Локальные подписки" и выберите пункт "Создать подписки".

  4. На странице публикации мастера создания подписки выберите <"Найти издателя SQL Server" или "Найти издателя><Oracle" в раскрывающемся списке издателя.>

  5. Подключитесь к издателю в диалоговом окне "Подключение к серверу ".

  6. Выберите публикацию на странице публикации .

  7. Заполните страницы в мастере новой подписки.

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

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

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

  1. Удостоверьтесь, что публикация поддерживает витягивающие подписки, выполнив sp_helppublication (Transact-SQL).

    • Если значение allow_pull в результирующем наборе равно 1, публикация поддерживает подписки с вытягиванием.

    • Если значение allow_pull равно 0, выполните sp_changepublication (Transact-SQL), указав allow_pull для @property и true для @value.

  2. На подписчике выполните sp_addpullsubscription (Transact-SQL). Укажите @publisher и @publication. Сведения об обновлении подписок см. в статье "Создание обновляемой подписки на публикацию транзакций".

  3. На подписчике выполните sp_addpullsubscription_agent (Transact-SQL). Укажите следующее:

    • Параметры @publisher, @publisher_db и @publication .

    • Учетные данные Microsoft Windows, под которыми агент распространения у подписчика выполняется для @job_login и @job_password.

      Замечание

      Подключения, сделанные с помощью встроенной проверки подлинности Windows, всегда используют учетные данные Windows, указанные @job_login и @job_password. Агент распространителя всегда делает локальное подключение к подписчику с помощью встроенной проверки подлинности Windows. По умолчанию агент подключается к распространителю с помощью встроенной проверки подлинности Windows.

    • (Необязательно) Значение 0 для @distributor_security_mode и сведений о входе Microsoft SQL Server для @distributor_login и @distributor_password, если при подключении к распространителю необходимо использовать проверку подлинности SQL Server.

    • Расписание задания агента распространителя для этой подписки. Дополнительные сведения см. в разделе "Указание расписаний синхронизации".

  4. На сервере публикации выполните sp_addsubscription (Transact-SQL) чтобы зарегистрировать вытягивающую подписку. Укажите @publication, @subscriber и @destination_db. Укажите значение pull для @subscription_type.

Чтобы создать подписку на выборку для публикации слияния

  1. В издателе убедитесь, что публикация поддерживает подписки по вытягиванию, выполнив sp_helpmergepublication (Transact-SQL).

    • Если значение allow_pull в результирующем наборе равно 1, публикация поддерживает пул подписки.

    • Если значение allow_pull равно 0, выполните sp_changemergepublication (Transact-SQL), указав allow_pull для @property и true для @value.

  2. На подписчике выполните sp_addmergepullsubscription (Transact-SQL). Укажите @publisher, @publisher_db, @publication и следующие параметры:

    • @subscriber_type — укажите локальную подписку клиента и глобальную для подписки сервера.

    • @subscription_priority . Укажите приоритет подписки (0.00 до 99.99). Это требуется только для серверной подписки.

      Для получения дополнительной информации см. Advanced Merge Replication Conflict Detection and Resolution.

  3. На подписчике выполните sp_addmergepullsubscription_agent (Transact-SQL). Укажите следующие параметры:

    • @publisher, @publisher_db и @publication.

    • Учетные данные Windows, под которыми агент слияния выполняется на подписчике для @job_login и @job_password.

      Замечание

      Подключения, сделанные с помощью встроенной проверки подлинности Windows, всегда используют учетные данные Windows, указанные @job_login и @job_password. Агент слияния всегда устанавливает локальное подключение к подписчику, используя встроенную проверку подлинности Windows. По умолчанию агент подключается к распространителю и издателю с помощью встроенной проверки подлинности Windows.

    • (Необязательно) Значение 0 для @distributor_security_mode и сведений о входе SQL Server для @distributor_login и @distributor_password, если необходимо использовать проверку подлинности SQL Server при подключении к распространителю.

    • (Необязательно) Значение 0 для @publisher_security_mode и сведений о входе SQL Server для @publisher_login и @publisher_password, если необходимо использовать проверку подлинности SQL Server при подключении к издателю.

    • Расписание задания агента слияния для этой подписки. Дополнительные сведения см. в статье "Создание обновляемой подписки на публикацию транзакций".

  4. На публикаторе выполните sp_addmergesubscription (Transact-SQL). Укажите @publication, @subscriber, @subscriber_db и значение pull для @subscription_type. При этом регистрируется подписка на получение.

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

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

-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). 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".

-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2012';

-- At the subscription database, create a pull subscription 
-- to a transactional publication.
USE [AdventureWorks2012Replica]
EXEC sp_addpullsubscription 
  @publisher = @publisher, 
  @publication = @publication, 
  @publisher_db = @publicationDB;

-- Add an agent job to synchronize the pull subscription.
EXEC sp_addpullsubscription_agent 
  @publisher = @publisher, 
  @publisher_db = @publicationDB, 
  @publication = @publication, 
  @distributor = @publisher, 
  @job_login = $(Login), 
  @job_password = $(Password);
GO
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). 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".

-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2012Replica';

-- At the Publisher, register the subscription, using the defaults.
EXEC sp_addsubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @destination_db = @subscriptionDB, 
  @subscription_type = N'pull',
  @status = N'subscribed';
GO

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


-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). 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".

-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
DECLARE @hostname AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2012';
SET @hostname = N'adventure-works\david8';

-- At the subscription database, create a pull subscription 
-- to a merge publication.
USE [AdventureWorks2012Replica]
EXEC sp_addmergepullsubscription 
  @publisher = @publisher, 
  @publication = @publication, 
  @publisher_db = @publicationDB;

-- Add an agent job to synchronize the pull subscription. 
EXEC sp_addmergepullsubscription_agent 
  @publisher = @publisher, 
  @publisher_db = @publicationDB, 
  @publication = @publication, 
  @distributor = @publisher, 
  @job_login = $(Login), 
  @job_password = $(Password),
  @hostname = @hostname;
GO
-- Execute this batch at the Publisher.
DECLARE @myMergePub  AS sysname;
DECLARE @mySub       AS sysname;
DECLARE @mySubDB     AS sysname;

SET @myMergePub = N'AdvWorksSalesOrdersMerge';
SET @mySub = N'MYSUBSERVER';
SET @mySubDB = N'AdventureWorks2012Replica';

-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks2012]
EXEC sp_addmergesubscription @publication = @myMergePub, 
@subscriber = @mySub, @subscriber_db = @mySubDB, 
@subscription_type = N'pull';
GO

Использование объектов управления репликацией (RMO)

Классы RMO, используемые для создания запроса на подписку, зависят от типа публикации, которой принадлежит этот запрос.

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

  1. Создайте подключения как к подписчику, так и к издателю, используя класс ServerConnection.

  2. Создайте экземпляр TransPublication класса с помощью подключения Издателя на шаге 1. Укажите Name, DatabaseName и ConnectionContext.

  3. Вызовите метод LoadProperties . Если этот метод возвращается false, свойства, указанные на шаге 2, неверны или публикация не существует на сервере.

  4. Выполните побитовую логическую операцию AND (& в Visual C# и And в Visual Basic) между свойством Attributes и AllowPull. Если результат имеет значение None, задайте Attributes результат побитового логического ИЛИ (| в Visual C# и Or Visual Basic) между Attributes и AllowPull. Затем вызовите CommitPropertyChanges, чтобы включить подписки по запросу.

  5. Если база данных подписки не существует, создайте ее с помощью Database класса. Дополнительные сведения см. в разделе "Создание, изменение и удаление баз данных".

  6. Создайте экземпляр класса TransPullSubscription.

  7. Задайте следующие свойства подписки:

    • Подписка ServerConnection, созданная на шаге 1 для ConnectionContext.

    • Имя базы данных подписки для DatabaseName.

    • Имя издателя для PublisherName.

    • Название базы данных публикаций для PublicationDBName.

    • Название публикации для PublicationName.

    • Поля Login, Password или SecurePassword* в SynchronizationAgentProcessSecurity предназначены для предоставления учетных данных учетной записи Microsoft Windows, под которой агент распространения работает на подписчике. Эта учетная запись используется для создания локальных подключений к подписчику и для удаленного подключения с помощью проверки подлинности Windows.

      Замечание

      Параметр SynchronizationAgentProcessSecurity не требуется, если подписка создается членом sysadmin фиксируемых ролей сервера, однако его использование рекомендуется. В этом случае агент будет выполнять работу от имени учетной записи агента SQL Server. Дополнительные сведения см. в статье Replication Agent Security Model.

    • (Необязательно) Значение true в CreateSyncAgentByDefault для создания задания агента, используемого для синхронизации подписки. Если задано false (значение по умолчанию), подписка может синхронизироваться только программным способом, и при доступе к этому объекту из свойства SynchronizationAgent необходимо указать дополнительные свойства TransSynchronizationAgent. Дополнительные сведения см. в разделе "Синхронизация подписки по запросу".

      Замечание

      Агент SQL Server недоступен в каждом выпуске MicrosoftSQL Server. Список функций, поддерживаемых выпусками SQL Server, см. в разделе "Функции, поддерживаемые выпусками SQL Server 2014". При указании значения true для абонентов Express, задание агента не создается. Однако важные метаданные, связанные с подпиской, хранятся на подписчике.

    • (Необязательно) Установите значения для полей SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPassword в DistributorSecurity при использовании проверки подлинности SQL Server для подключения к распространителю.

  8. Вызовите метод Create .

  9. Используя экземпляр TransPublication класса из шага 2, вызовите MakePullSubscriptionWellKnown метод, чтобы зарегистрировать пул-подписку у издателя. Если эта регистрация уже существует, возникает исключение.

Чтобы создать подписку на вытягивание данных к публикации объединения

  1. Подключитесь к подписчику и издателю с помощью класса ServerConnection.

  2. Создайте экземпляр MergePublication класса с помощью подключения Издателя на шаге 1. Укажите Name, DatabaseNameи ConnectionContext.

  3. Вызовите метод LoadProperties . Если этот метод возвращается false, свойства, указанные на шаге 2, неверны или публикация не существует на сервере.

  4. Выполните побитовую логическую операцию AND (& в Visual C# и And в Visual Basic) между свойством Attributes и AllowPull. Если результат имеет значение None, задайте Attributes результат побитового логического ИЛИ (| в Visual C# и Or Visual Basic) между Attributes и AllowPull. Затем вызовите CommitPropertyChanges, чтобы включить подписки по запросу.

  5. Если база данных подписки не существует, создайте ее с помощью Database класса. Дополнительные сведения см. в разделе "Создание, изменение и удаление баз данных".

  6. Создайте экземпляр класса MergePullSubscription.

  7. Задайте следующие свойства подписки:

    • ServerConnection для Подписчика, созданного на шаге 1, для ConnectionContext.

    • Имя базы данных подписки для DatabaseName.

    • Имя издателя для PublisherName.

    • Название базы данных публикаций для PublicationDBName.

    • Название публикации для PublicationName.

    • Поля Login и Password, а также SecurePassword* элемента SynchronizationAgentProcessSecurity служат для предоставления учетных данных для учетной записи Microsoft Windows, под которой агент слияния выполняется на подписчике. Эта учетная запись используется для создания локальных подключений к подписчику и для удаленного подключения с помощью проверки подлинности Windows.

      Замечание

      Параметр SynchronizationAgentProcessSecurity не требуется, если подписка создается членом sysadmin фиксируемых ролей сервера, однако его использование рекомендуется. В этом случае агент будет выполнять работу от имени учетной записи агента SQL Server. Дополнительные сведения см. в статье Replication Agent Security Model.

    • (Необязательно) Значение true для CreateSyncAgentByDefault создания задания агента, используемого для синхронизации подписки. Если указано false (значение по умолчанию), подписка может быть синхронизирована исключительно программным способом, и при доступе к этому объекту в свойстве SynchronizationAgent необходимо указать дополнительные свойства MergeSynchronizationAgent. Дополнительные сведения см. в разделе "Синхронизация подписки по запросу".

    • (Необязательно) Задайте значения полей SqlStandardLogin и/или SqlStandardPassword или SecureSqlStandardPassword в DistributorSecurity при использовании SQL Server для аутентификации подключения к распространителю.

    • (Необязательно) Установите поля SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPasswordPublisherSecurity при использовании проверки подлинности SQL Server для подключения к Издателю.

  8. Вызовите метод Create .

  9. Используя экземпляр MergePublication класса из шага 2, вызовите MakePullSubscriptionWellKnown метод, чтобы зарегистрировать пул-подписку у издателя. Если эта регистрация уже существует, возникает исключение.

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

В этом примере создается подписка pull на транзакционную публикацию. Учетные данные учетной записи Microsoft Windows, используемые для создания задания агента распространения, передаются на этапе выполнения.

// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";

//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);

// Create the objects that we need.
TransPublication publication;
TransPullSubscription subscription;

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

    // Ensure that the publication exists and that 
    // it supports pull subscriptions.
    publication = new TransPublication();
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = publisherConn;

    if (publication.IsExistingObject)
    {
        if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowPull;
        }

        // Define the pull subscription.
        subscription = new TransPullSubscription();
        subscription.ConnectionContext = subscriberConn;
        subscription.PublisherName = publisherName;
        subscription.PublicationName = publicationName;
        subscription.PublicationDBName = publicationDbName;
        subscription.DatabaseName = subscriptionDbName;

        // Specify the Windows login credentials for the Distribution Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword;

        // Make sure that the agent job for the subscription is created.
        subscription.CreateSyncAgentByDefault = true;

        // By default, subscriptions to transactional publications are synchronized 
        // continuously, but in this case we only want to synchronize on demand.
        subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand;

        // Create the pull subscription at the Subscriber.
        subscription.Create();

        Boolean registered = false;

        // Verify that the subscription is not already registered.
        foreach (TransSubscription existing
            in publication.EnumSubscriptions())
        {
            if (existing.SubscriberName == subscriberName
                && existing.SubscriptionDBName == subscriptionDbName)
            {
                registered = true;
            }
        }
        if (!registered)
        {
            // Register the subscription with the Publisher.
            publication.MakePullSubscriptionWellKnown(
                subscriberName, subscriptionDbName,
                SubscriptionSyncType.Automatic,
                TransSubscriberType.ReadOnly);
        }
    }
    else
    {
        // Do something here if the publication does not exist.
        throw new ApplicationException(String.Format(
            "The publication '{0}' does not exist on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Implement the appropriate error handling here.
    throw new ApplicationException(String.Format(
        "The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
    subscriberConn.Disconnect();
    publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksProductTran"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"

'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)

' Create the objects that we need.
Dim publication As TransPublication
Dim subscription As TransPullSubscription

Try
    ' Connect to the Publisher and Subscriber.
    subscriberConn.Connect()
    publisherConn.Connect()

    ' Ensure that the publication exists and that 
    ' it supports pull subscriptions.
    publication = New TransPublication()
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = publisherConn

    If publication.IsExistingObject Then
        If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
            publication.Attributes = publication.Attributes _
            Or PublicationAttributes.AllowPull
        End If

        ' Define the pull subscription.
        subscription = New TransPullSubscription()
        subscription.ConnectionContext = subscriberConn
        subscription.PublisherName = publisherName
        subscription.PublicationName = publicationName
        subscription.PublicationDBName = publicationDbName
        subscription.DatabaseName = subscriptionDbName
        subscription.Description = "Pull subscription to " + publicationDbName _
        + " on " + subscriberName + "."

        ' Specify the Windows login credentials for the Distribution Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword

        ' Make sure that the agent job for the subscription is created.
        subscription.CreateSyncAgentByDefault = True

        ' By default, subscriptions to transactional publications are synchronized 
        ' continuously, but in this case we only want to synchronize on demand.
        subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand

        ' Create the pull subscription at the Subscriber.
        subscription.Create()

        Dim registered As Boolean = False

        ' Verify that the subscription is not already registered.
        For Each existing As TransSubscription In publication.EnumSubscriptions()
            If existing.SubscriberName = subscriberName And _
                existing.SubscriptionDBName = subscriptionDbName Then
                registered = True
            End If
        Next existing
        If Not registered Then
            ' Register the subscription with the Publisher.
            publication.MakePullSubscriptionWellKnown( _
             subscriberName, subscriptionDbName, _
             SubscriptionSyncType.Automatic, _
             TransSubscriberType.ReadOnly)
        End If
    Else
        ' Do something here if the publication does not exist.
        Throw New ApplicationException(String.Format( _
         "The publication '{0}' does not exist on {1}.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Implement the appropriate error handling here.
    Throw New ApplicationException(String.Format( _
        "The subscription to {0} could not be created.", publicationName), ex)
Finally
    subscriberConn.Disconnect()
    publisherConn.Disconnect()
End Try

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

// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
string hostname = @"adventure-works\garrett1";

//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);

// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;

try
{
    // Connect to the Subscriber.
    subscriberConn.Connect();

    // Ensure that the publication exists and that 
    // it supports pull subscriptions.
    publication = new MergePublication();
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = publisherConn;

    if (publication.LoadProperties())
    {
        if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowPull;
        }

        // Define the pull subscription.
        subscription = new MergePullSubscription();
        subscription.ConnectionContext = subscriberConn;
        subscription.PublisherName = publisherName;
        subscription.PublicationName = publicationName;
        subscription.PublicationDBName = publicationDbName;
        subscription.DatabaseName = subscriptionDbName;
        subscription.HostName = hostname;

        // Specify the Windows login credentials for the Merge Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword;

        // Make sure that the agent job for the subscription is created.
        subscription.CreateSyncAgentByDefault = true;

        // Create the pull subscription at the Subscriber.
        subscription.Create();

        Boolean registered = false;

        // Verify that the subscription is not already registered.
        foreach (MergeSubscription existing
            in publication.EnumSubscriptions())
        {
            if (existing.SubscriberName == subscriberName
                && existing.SubscriptionDBName == subscriptionDbName
                && existing.SubscriptionType == SubscriptionOption.Pull)
            {
                registered = true;
            }
        }
        if (!registered)
        {
            // Register the local subscription with the Publisher.
            publication.MakePullSubscriptionWellKnown(
                subscriberName, subscriptionDbName,
                SubscriptionSyncType.Automatic,
                MergeSubscriberType.Local, 0);
        }
    }
    else
    {
        // Do something here if the publication does not exist.
        throw new ApplicationException(String.Format(
            "The publication '{0}' does not exist on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Implement the appropriate error handling here.
    throw new ApplicationException(String.Format(
        "The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
    subscriberConn.Disconnect();
    publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
Dim hostname As String = "adventure-works\garrett1"

'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)

' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription

Try
    ' Connect to the Subscriber.
    subscriberConn.Connect()

    ' Ensure that the publication exists and that 
    ' it supports pull subscriptions.
    publication = New MergePublication()
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = publisherConn

    If publication.LoadProperties() Then
        If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
            publication.Attributes = publication.Attributes _
            Or PublicationAttributes.AllowPull
        End If

        ' Define the pull subscription.
        subscription = New MergePullSubscription()
        subscription.ConnectionContext = subscriberConn
        subscription.PublisherName = publisherName
        subscription.PublicationName = publicationName
        subscription.PublicationDBName = publicationDbName
        subscription.DatabaseName = subscriptionDbName
        subscription.HostName = hostname

        ' Specify the Windows login credentials for the Merge Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword

        ' Make sure that the agent job for the subscription is created.
        subscription.CreateSyncAgentByDefault = True

        ' Create the pull subscription at the Subscriber.
        subscription.Create()

        Dim registered As Boolean = False

        ' Verify that the subscription is not already registered.
        For Each existing As MergeSubscription In _
        publication.EnumSubscriptions()
            If existing.SubscriberName = subscriberName Then
                registered = True
            End If
        Next
        If Not registered Then
            ' Register the local subscription with the Publisher.
            publication.MakePullSubscriptionWellKnown( _
             subscriberName, subscriptionDbName, _
             SubscriptionSyncType.Automatic, _
             MergeSubscriberType.Local, 0)
        End If
    Else
        ' Do something here if the publication does not exist.
        Throw New ApplicationException(String.Format( _
         "The publication '{0}' does not exist on {1}.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Implement the appropriate error handling here.
    Throw New ApplicationException(String.Format( _
        "The subscription to {0} could not be created.", publicationName), ex)
Finally
    subscriberConn.Disconnect()
    publisherConn.Disconnect()
End Try

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

// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";

//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);

// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;

try
{
    // Connect to the Subscriber.
    subscriberConn.Connect();

    // Ensure that the publication exists and that 
    // it supports pull subscriptions.
    publication = new MergePublication();
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = publisherConn;

    if (publication.LoadProperties())
    {
        if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowPull;
        }

        // Define the pull subscription.
        subscription = new MergePullSubscription();
        subscription.ConnectionContext = subscriberConn;
        subscription.PublisherName = publisherName;
        subscription.PublicationName = publicationName;
        subscription.PublicationDBName = publicationDbName;
        subscription.DatabaseName = subscriptionDbName;

        // Specify that an agent job not be created for this subscription. The
        // subscription can only be synchronized by running the Merge Agent directly.
        // Subscripition metadata stored in MSsubscription_properties will not
        // be available and must be specified at run time.
        subscription.CreateSyncAgentByDefault = false;

        // Create the pull subscription at the Subscriber.
        subscription.Create();

        Boolean registered = false;

        // Verify that the subscription is not already registered.
        foreach (MergeSubscription existing
            in publication.EnumSubscriptions())
        {
            if (existing.SubscriberName == subscriberName
                && existing.SubscriptionDBName == subscriptionDbName
                && existing.SubscriptionType == SubscriptionOption.Pull)
            {
                registered = true;
            }
        }
        if (!registered)
        {
            // Register the local subscription with the Publisher.
            publication.MakePullSubscriptionWellKnown(
                subscriberName, subscriptionDbName,
                SubscriptionSyncType.Automatic,
                MergeSubscriberType.Local, 0);
        }
    }
    else
    {
        // Do something here if the publication does not exist.
        throw new ApplicationException(String.Format(
            "The publication '{0}' does not exist on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Implement the appropriate error handling here.
    throw new ApplicationException(String.Format(
        "The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
    subscriberConn.Disconnect();
    publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"

'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)

' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription

Try
    ' Connect to the Subscriber.
    subscriberConn.Connect()

    ' Ensure that the publication exists and that 
    ' it supports pull subscriptions.
    publication = New MergePublication()
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = publisherConn

    If publication.LoadProperties() Then
        If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
            publication.Attributes = publication.Attributes _
            Or PublicationAttributes.AllowPull
        End If

        ' Define the pull subscription.
        subscription = New MergePullSubscription()
        subscription.ConnectionContext = subscriberConn
        subscription.PublisherName = publisherName
        subscription.PublicationName = publicationName
        subscription.PublicationDBName = publicationDbName
        subscription.DatabaseName = subscriptionDbName

        ' Specify that an agent job not be created for this subscription. The
        ' subscription can only be synchronized by running the Merge Agent directly.
        ' Subscripition metadata stored in MSsubscription_properties will not
        ' be available and must be specified at run time.
        subscription.CreateSyncAgentByDefault = False

        ' Create the pull subscription at the Subscriber.
        subscription.Create()

        Dim registered As Boolean = False

        ' Verify that the subscription is not already registered.
        For Each existing As MergeSubscription In _
        publication.EnumSubscriptions()
            If existing.SubscriberName = subscriberName Then
                registered = True
            End If
        Next
        If Not registered Then
            ' Register the local subscription with the Publisher.
            publication.MakePullSubscriptionWellKnown( _
             subscriberName, subscriptionDbName, _
             SubscriptionSyncType.Automatic, _
             MergeSubscriberType.Local, 0)
        End If
    Else
        ' Do something here if the publication does not exist.
        Throw New ApplicationException(String.Format( _
         "The publication '{0}' does not exist on {1}.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Implement the appropriate error handling here.
    Throw New ApplicationException(String.Format( _
     "The subscription to {0} could not be created.", publicationName), ex)
Finally
    subscriberConn.Disconnect()
    publisherConn.Disconnect()
End Try

В этом примере создается подписка на выборку для публикации слияния, которую можно синхронизировать через Интернет с помощью веб-синхронизации. Учетные данные учетной записи Windows, используемые для создания задания агента слияния, передаются во время запуска. Дополнительные сведения см. в разделе "Настройка веб-синхронизации".

// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
string hostname = @"adventure-works\garrett1";
string webSyncUrl = "https://" + publisherInstance + "/WebSync/replisapi.dll";

//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);

// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;

try
{
    // Connect to the Subscriber.
    subscriberConn.Connect();

    // Ensure that the publication exists and that 
    // it supports pull subscriptions and Web synchronization.
    publication = new MergePublication();
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;
    publication.ConnectionContext = publisherConn;

    if (publication.LoadProperties())
    {
        if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowPull;
        }
        if ((publication.Attributes & PublicationAttributes.AllowWebSynchronization) == 0)
        {
            publication.Attributes |= PublicationAttributes.AllowWebSynchronization;
        }

        // Define the pull subscription.
        subscription = new MergePullSubscription();
        subscription.ConnectionContext = subscriberConn;
        subscription.PublisherName = publisherName;
        subscription.PublicationName = publicationName;
        subscription.PublicationDBName = publicationDbName;
        subscription.DatabaseName = subscriptionDbName;
        subscription.HostName = hostname;

        // Specify the Windows login credentials for the Merge Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword;

        // Enable Web synchronization.
        subscription.UseWebSynchronization = true;
        subscription.InternetUrl = webSyncUrl;

        // Specify the same Windows credentials to use when connecting to the
        // Web server using HTTPS Basic Authentication.
        subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication;
        subscription.InternetLogin = winLogin;
        subscription.InternetPassword = winPassword;

        // Ensure that we create a job for this subscription.
        subscription.CreateSyncAgentByDefault = true;

        // Create the pull subscription at the Subscriber.
        subscription.Create();

        Boolean registered = false;

        // Verify that the subscription is not already registered.
        foreach (MergeSubscription existing
            in publication.EnumSubscriptions())
        {
            if (existing.SubscriberName == subscriberName
                && existing.SubscriptionDBName == subscriptionDbName
                && existing.SubscriptionType == SubscriptionOption.Pull)
            {
                registered = true;
            }
        }
        if (!registered)
        {
            // Register the local subscription with the Publisher.
            publication.MakePullSubscriptionWellKnown(
                subscriberName, subscriptionDbName,
                SubscriptionSyncType.Automatic,
                MergeSubscriberType.Local, 0);
        }
    }
    else
    {
        // Do something here if the publication does not exist.
        throw new ApplicationException(String.Format(
            "The publication '{0}' does not exist on {1}.",
            publicationName, publisherName));
    }
}
catch (Exception ex)
{
    // Implement the appropriate error handling here.
    throw new ApplicationException(String.Format(
        "The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
    subscriberConn.Disconnect();
    publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
Dim hostname As String = "adventure-works\garrett1"
Dim webSyncUrl As String = "https://" + publisherInstance + "/WebSync/replisapi.dll"

'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)

' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription

Try
    ' Connect to the Subscriber.
    subscriberConn.Connect()

    ' Ensure that the publication exists and that 
    ' it supports pull subscriptions and Web synchronization.
    publication = New MergePublication()
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName
    publication.ConnectionContext = publisherConn

    If publication.LoadProperties() Then
        If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
            publication.Attributes = publication.Attributes _
            Or PublicationAttributes.AllowPull
        End If
        If (publication.Attributes And PublicationAttributes.AllowWebSynchronization) = 0 Then
            publication.Attributes = publication.Attributes _
            Or PublicationAttributes.AllowWebSynchronization
        End If

        ' Define the pull subscription.
        subscription = New MergePullSubscription()
        subscription.ConnectionContext = subscriberConn
        subscription.PublisherName = publisherName
        subscription.PublicationName = publicationName
        subscription.PublicationDBName = publicationDbName
        subscription.DatabaseName = subscriptionDbName
        subscription.HostName = hostname
        subscription.CreateSyncAgentByDefault = True

        ' Specify the Windows login credentials for the Merge Agent job.
        subscription.SynchronizationAgentProcessSecurity.Login = winLogin
        subscription.SynchronizationAgentProcessSecurity.Password = winPassword

        ' Enable Web synchronization.
        subscription.UseWebSynchronization = True
        subscription.InternetUrl = webSyncUrl

        ' Specify the same Windows credentials to use when connecting to the
        ' Web server using HTTPS Basic Authentication.
        subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication
        subscription.InternetLogin = winLogin
        subscription.InternetPassword = winPassword

        ' Create the pull subscription at the Subscriber.
        subscription.Create()

        Dim registered As Boolean = False

        ' Verify that the subscription is not already registered.
        For Each existing As MergeSubscription In _
        publication.EnumSubscriptions()
            If existing.SubscriberName = subscriberName Then
                registered = True
            End If
        Next
        If Not registered Then
            ' Register the local subscription with the Publisher.
            publication.MakePullSubscriptionWellKnown( _
             subscriberName, subscriptionDbName, _
             SubscriptionSyncType.Automatic, _
             MergeSubscriberType.Local, 0)
        End If
    Else
        ' Do something here if the publication does not exist.
        Throw New ApplicationException(String.Format( _
         "The publication '{0}' does not exist on {1}.", _
         publicationName, publisherName))
    End If
Catch ex As Exception
    ' Implement the appropriate error handling here.
    Throw New ApplicationException(String.Format( _
     "The subscription to {0} could not be created.", publicationName), ex)
Finally
    subscriberConn.Disconnect()
    publisherConn.Disconnect()
End Try

См. также

Концепции объектов управления репликацией
Просмотр и изменение свойств подписки по запросу
Настройка веб-синхронизации
Подписка на публикации
Рекомендации по обеспечению безопасности репликации