Бөлісу құралы:


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

Область применения: SQL Server База данных SQL Azure

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

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  4. Выполните инструкции на страницах мастера создания подписки.

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

  1. Подключитесь к подписчику в среде Microsoft 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.

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

Внимание

При создании принудительной подписки в издателе с удаленным распространителем значения, указываемые для всех параметров, включая job_login и job_password, передаются распространителю в виде обычного текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в разделе "Включение зашифрованных подключений к ядру СУБД" (диспетчер конфигурации 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).

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

  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.

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

Внимание

При создании принудительной подписки в издателе с удаленным распространителем значения, указываемые для всех параметров, включая job_login и job_password, передаются распространителю в виде обычного текста. Прежде чем выполнять эту хранимую процедуру, необходимо зашифровать соединение между издателем и его удаленным распространителем. Дополнительные сведения см. в разделе "Включение зашифрованных подключений к ядру СУБД" (диспетчер конфигурации 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'AdventureWorks2022Replica';

--Add a push subscription to a transactional publication.
USE [AdventureWorks2022]
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 [AdventureWorks2022];
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, используемые для этого, зависят от типа публикации, для которой создается подписка.

Внимание

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

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

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

  2. На основе соединения с издателем, созданного на шаге 1, создайте экземпляр класса TransPublication . Задайте свойства Name, DatabaseNameи ConnectionContext.

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

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

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

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

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

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

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

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

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

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

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

      Примечание.

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

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

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

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

Внимание

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

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

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

  2. На основе соединения с издателем, созданного на шаге 1, создайте экземпляр класса MergePublication . Задайте свойства Name, DatabaseNameи ConnectionContext.

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

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

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

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

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

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

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

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

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

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

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

      Примечание.

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

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

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

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

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

Внимание

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

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

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

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

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

           // 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 = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"

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

' 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 = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";
string hostname = @"adventure-works\garrett1";

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

// 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 = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"
Dim hostname As String = "adventure-works\garrett1"

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

' 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