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


Создание push-подписки

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

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

Создайте push-подписку на узле издателя или узле подписчика с помощью Мастера создания новых подписок. Следуйте инструкциям на страницах мастера:

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

  • Выберите место выполнения агентов репликации. Для push-подписки выберите Запустить все агенты на распространителе (push-подписки) на странице Расположение агента распространителя или на странице Расположение агента слияния, в зависимости от типа публикации.

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

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

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

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

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

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

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

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

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

Создание push-подписки от публикатора

  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

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

Это важно

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

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

  1. На издателе в базе данных публикации убедитесь, что публикация поддерживает push-подписки, выполнив sp_helppublication.

    • Если значение allow_push равно 1, поддерживаются push-подписки.

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

  2. На сервере издателя в базе данных публикации выполните sp_addsubscription. Укажите @publication, @subscriber и @destination_db. Укажите значение push для @subscription_type. Сведения об обновлении подписок см. в статье "Создание обновляемой подписки на публикацию транзакций"

  3. На сервере издателя в базе данных публикации выполните sp_addpushsubscription_agent. Укажите следующее:

    • Параметры @subscriber, @subscriber_db и @publication .

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

      Замечание

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

    • (Необязательно) Значение 0 для @subscriber_security_mode и сведений о входе Microsoft SQL Server для @subscriber_login и @subscriber_password. Укажите эти параметры, если при подключении к подписчику необходимо использовать проверку подлинности SQL Server.

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

    Это важно

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

Создание пуш-подписки на публикацию на основе слияния

  1. В базе данных издателя убедитесь, что публикация поддерживает push-уведомления, выполнив sp_helpmergepublication.

    • Если значение allow_push равно 1, публикация поддерживает push-подписки.

    • Если значение allow_push не равно 1, выполните sp_changemergepublication, указав allow_push для @property и true для @value.

  2. На сервере издателя в базе данных публикации выполните команду sp_addmergesubscription, указав следующие параметры.

    • @publication. Это название публикации.

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

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

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

  3. На издателе в базе данных публикации выполните sp_addmergepushsubscription_agent. Укажите следующее:

    • Параметры @subscriber, @subscriber_db и @publication .

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

      Замечание

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

    • (Необязательно) Значение 0 для @subscriber_security_mode и сведений о входе SQL Server для @subscriber_login и @subscriber_password. Укажите эти параметры, если при подключении к подписчику необходимо использовать проверку подлинности SQL Server.

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

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

    Это важно

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

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

В следующем примере создается push-подписка на публикацию транзакций. Значения входа и пароля предоставляются во время выполнения с помощью переменных скриптов 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".

DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2012Replica';

--Add a push subscription to a transactional publication.
USE [AdventureWorks2012]
EXEC sp_addsubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @destination_db = @subscriptionDB, 
  @subscription_type = N'push';

--Add an agent job to synchronize the push subscription.
EXEC sp_addpushsubscription_agent 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB, 
  @job_login = $(Login), 
  @job_password = $(Password);
GO

В следующем примере создается push-подписка на публикацию для слияния. Значения входа и пароля предоставляются во время выполнения с помощью переменных скриптов 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".

DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
DECLARE @hostname AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorksReplica'; 
SET @hostname = N'adventure-works\david8'

-- Add a push subscription to a merge publication.
USE [AdventureWorks2012];
EXEC sp_addmergesubscription 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB, 
  @subscription_type = N'push',
  @hostname = @hostname;

--Add an agent job to synchronize the push subscription.
EXEC sp_addmergepushsubscription_agent 
  @publication = @publication, 
  @subscriber = @subscriber, 
  @subscriber_db = @subscriptionDB, 
  @job_login = $(Login), 
  @job_password = $(Password);
GO

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

Вы можете создавать push-подписки программным способом с помощью объектов управления репликацией (RMO). Классы RMO, используемые для создания принудительной подписки, зависят от типа публикации, для которой создается подписка.

Это важно

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

Для создания push-подписки на снимок состояния или транзакционную публикацию

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

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

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

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

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

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

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

    • ИздательServerConnection, созданный на шаге 1 для ConnectionContext.

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

    • Имя подписчика для SubscriberName.

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

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

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

      Замечание

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

    • (Необязательно) Значение true (по умолчанию) для CreateSyncAgentByDefault, чтобы создать задание агента, используемое для синхронизации подписки. При указании falseподписка может быть синхронизирована только программным способом.

    • (Необязательно) Установите поля SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPassword в SubscriberSecurity, когда используете аутентификацию SQL Server для подключения к подписчику.

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

    Это важно

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

Чтобы создать push-подписку на объединяющую публикацию

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

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

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

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

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

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

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

    • Издатель ServerConnection, созданный на шаге 1 для ConnectionContext.

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

    • Имя подписчика для SubscriberName.

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

    • Имя публикации для PublicationName.

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

      Замечание

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

    • (Необязательно) Значение true (по умолчанию) для CreateSyncAgentByDefault, чтобы создать задание агента, используемое для синхронизации подписки. При указании falseподписка может быть синхронизирована только программным способом.

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

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

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

    Это важно

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

Примеры (RMO)

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

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

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

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

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

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

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

                   // Define the push subscription.
                   subscription = new TransSubscription();
                   subscription.ConnectionContext = conn;
                   subscription.SubscriberName = subscriberName;
                   subscription.PublicationName = publicationName;
                   subscription.DatabaseName = publicationDbName;
                   subscription.SubscriptionDBName = subscriptionDbName;

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

                   // 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 push subscription.
                   subscription.Create();
               }
               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
           {
               conn.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 a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

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

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

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

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

        ' Define the push subscription.
        subscription = New TransSubscription()
        subscription.ConnectionContext = conn
        subscription.SubscriberName = subscriberName
        subscription.PublicationName = publicationName
        subscription.DatabaseName = publicationDbName
        subscription.SubscriptionDBName = subscriptionDbName

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

        ' 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 push subscription.
        subscription.Create()
    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
    conn.Disconnect()
End Try

В этом примере создается новая push-подписка на публикацию слияния. Учетные данные учетной записи 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 a connection to the Publisher.
ServerConnection conn = new ServerConnection(subscriberName);

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

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

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

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

        // Define the push subscription.
        subscription = new MergeSubscription();
        subscription.ConnectionContext = conn;
        subscription.SubscriberName = subscriberName;
        subscription.PublicationName = publicationName;
        subscription.DatabaseName = publicationDbName;
        subscription.SubscriptionDBName = subscriptionDbName;
        subscription.HostName = hostname;

        // Set a schedule to synchronize the subscription every 2 hours
        // during weekdays from 6am to 10pm.
        subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.Weekly;
        subscription.AgentSchedule.FrequencyInterval = Convert.ToInt32(0x003E);
        subscription.AgentSchedule.FrequencyRecurrenceFactor = 1;
        subscription.AgentSchedule.FrequencySubDay = ScheduleFrequencySubDay.Hour;
        subscription.AgentSchedule.FrequencySubDayInterval = 2;
        subscription.AgentSchedule.ActiveStartDate = 20051108;
        subscription.AgentSchedule.ActiveEndDate = 20071231;
        subscription.AgentSchedule.ActiveStartTime = 060000;
        subscription.AgentSchedule.ActiveEndTime = 100000;

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

        // Create the push subscription.
        subscription.Create();
    }
    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
{
    conn.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 a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(subscriberName)

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

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

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

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

        ' Define the push subscription.
        subscription = New MergeSubscription()
        subscription.ConnectionContext = conn
        subscription.SubscriberName = subscriberName
        subscription.PublicationName = publicationName
        subscription.DatabaseName = publicationDbName
        subscription.SubscriptionDBName = subscriptionDbName
        subscription.HostName = hostname

        ' Set a schedule to synchronize the subscription every 2 hours
        ' during weekdays from 6am to 10pm.
        subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.Weekly
        subscription.AgentSchedule.FrequencyInterval = Convert.ToInt32("0x003E", 16)
        subscription.AgentSchedule.FrequencyRecurrenceFactor = 1
        subscription.AgentSchedule.FrequencySubDay = ScheduleFrequencySubDay.Hour
        subscription.AgentSchedule.FrequencySubDayInterval = 2
        subscription.AgentSchedule.ActiveStartDate = 20051108
        subscription.AgentSchedule.ActiveEndDate = 20071231
        subscription.AgentSchedule.ActiveStartTime = 60000
        subscription.AgentSchedule.ActiveEndTime = 100000

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

        ' Create the push subscription.
        subscription.Create()
    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
    conn.Disconnect()
End Try

См. также

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