Создание принудительной подписки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создание принудительной подписки с издателя.

  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проверьте, поддерживает ли публикация принудительные подписки.

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

    • Если значение 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.

    • Расписание задания агента распространителя для этой подписки. Дополнительные сведения см. в статье Specify Synchronization Schedules.

    Важно!

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

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

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

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

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

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

    • @publication. Имя публикации.

    • @subscriber_type. Для клиентской подписки укажите local , а для серверной — global.

    • @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.

    • Расписание агента слияния для данной подписки. Дополнительные сведения см. в статье Specify Synchronization Schedules.

    Важно!

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

Примеры (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".

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

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

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

Важно!

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

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

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

  2. На основе соединения с издателем, созданного на шаге 1, создайте экземпляр класса TransPublication . Задайте свойства 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 , чтобы включить принудительные подписки.

  5. Если база данных подписки не существует, создайте ее с помощью класса Database . Дополнительные сведения см. в статье Creating, Altering, and Removing Databases (Создание, изменение и удаление баз данных).

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

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

    • соединение ( ServerConnection ) с издателем, созданное на шаге 1, в свойстве ConnectionContext;

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

    • имя подписчика в свойстве SubscriberName;

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

    • имя публикации в свойстве PublicationName;

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

      Примечание

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

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

    • (необязательно) при соединении с подписчиком с проверкой подлинности SQL Server укажите значения свойств SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPassword объекта SubscriberSecurity .

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

    Важно!

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

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

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

  2. На основе соединения с издателем, созданного на шаге 1, создайте экземпляр класса MergePublication . Задайте свойства 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 , чтобы включить принудительные подписки.

  5. Если база данных подписки не существует, создайте ее с помощью класса Database . Дополнительные сведения см. в статье Creating, Altering, and Removing Databases (Создание, изменение и удаление баз данных).

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

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

    • соединение ( ServerConnection ) с издателем, созданное на шаге 1, в свойстве ConnectionContext;

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

    • имя подписчика в свойстве SubscriberName;

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

    • имя публикации в свойстве PublicationName;

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

      Примечание

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

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

    • (необязательно) при соединении с подписчиком с проверкой подлинности SQL Server укажите значения свойств SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPassword объекта SubscriberSecurity .

    • (необязательно) при соединении с издателем с проверкой подлинности SQL Server укажите значения свойств SqlStandardLogin и SqlStandardPassword или SecureSqlStandardPassword объекта PublisherSecurity .

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

    Важно!

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

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

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

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

См. также:

Просмотр и изменение свойств принудительной подписки
Рекомендации по защите репликации
Create a Publication
Основные понятия объектов RMO
Синхронизация принудительной подписки
Подписка на публикации
Использование программы sqlcmd с переменными скрипта