Megosztás a következőn keresztül:


Push előfizetés létrehozása

A következőkre vonatkozik:SQL ServerAzure SQL Database

Ez a témakör azt ismerteti, hogyan hozhat létre leküldéses előfizetést az SQL Server Management Studio, Transact-SQL vagy Replikációkezelési objektumok (RMO) használatával az SQL Serverben. A nem SQL Server-előfizetők leküldéses előfizetésének létrehozásáról további információt a nem SQL Server-előfizetők előfizetésének létrehozása című témakörben talál.

Megjegyzés:

A felügyelt Azure SQL-példány közzétevő, terjesztő és előfizető lehet a pillanatképek és a tranzakciós replikáció számára. Az Azure SQL Database adatbázisai csak pillanatkép- és tranzakciós replikáció push előfizetői lehetnek. További információ: Tranzakciós replikáció az Azure SQL Database-sel és a felügyelt Azure SQL-példányokkal.

Az SQL Server Management Studio használata

Hozzon létre leküldéses előfizetést a Publisherben vagy az Előfizetőben az Új előfizetés varázslóval. Kövesse a varázsló lapjait a következőhöz:

  • Adja meg a Közzétevőt és a kiadványt.

  • Válassza ki, hogy a replikációs ügynökök hol fognak futni. Leküldéses előfizetés esetén válassza az Összes ügynök futtatása a Terjesztésiügynök helye lapon vagy az Ügynök helyének egyesítése lapon a kiadvány típusától függően.

  • Adja meg az előfizetőket és az előfizetési adatbázisokat.

  • Adja meg a replikációs ügynökök által létrehozott kapcsolatokhoz használt bejelentkezéseket és jelszavakat:

    • A pillanatfelvételekre és tranzakciós kiadványokra való előfizetésekhez adja meg a hitelesítő adatokat a Terjesztési ügynök biztonsági beállításai oldalán.

    • A kiadványokat egyesítő előfizetésekhez adja meg a hitelesítő adatokat az Ügynök egyesítése biztonsági oldalon.

      Az egyes ügynökök engedélyeiről további információt a replikációs ügynök biztonsági modelljében talál.

  • Adja meg a szinkronizálás ütemezését, és hogy mikor kell inicializálni az előfizetőt.

  • Adjon meg további lehetőségeket a kiadványok egyesítéséhez: az előfizetés típusa és a paraméteres szűrés értékei.

  • Adjon meg további lehetőségeket az előfizetések frissítését lehetővé tevő tranzakciós kiadványokhoz. Az egyik lehetőség annak eldöntése, hogy az előfizetőknek azonnal véglegesíteniük kell-e a módosításokat a Publisherben, vagy egy üzenetsorba kell őket írniuk. Egy másik lehetőség az előfizetőtől a Publisherhez való csatlakozáshoz használt hitelesítő adatok beállítása.

  • Igény szerint szkriptelje az előfizetést.

Leküldéses előfizetés létrehozása a Publisherből

  1. Csatlakozzon a Publisherhez a Microsoft SQL Server Management Studióban, majd bontsa ki a kiszolgálócsomópontot.

  2. Bontsa ki a Replikáció mappát, majd bontsa ki a Helyi kiadványok mappát.

  3. Kattintson a jobb gombbal arra a kiadványra, amelyhez egy vagy több előfizetést szeretne létrehozni, majd válassza az Új előfizetések lehetőséget.

  4. Töltse ki a lapokat az Új előfizetés varázslóban.

Push előfizetés létrehozása az előfizető részéről

  1. Csatlakozzon az előfizetőhöz az SQL Server Management Studióban, majd bontsa ki a kiszolgálócsomópontot.

  2. Nyissa meg a Replikáció mappát.

  3. Kattintson a jobb gombbal a Helyi előfizetések mappára, majd válassza az Új előfizetések lehetőséget.

  4. Az Új előfizetés varázsló Közzététel lapján válassza <az SQL Server Publisher> keresése vagy <az Oracle Publisher> keresése lehetőséget a Publisher legördülő listából.

  5. Csatlakozás a Publisherhez a Csatlakozás a kiszolgálóhoz párbeszédpanelen.

  6. Válasszon ki egy kiadványt a Kiadvány lapon.

  7. Töltse ki a lapokat az Új előfizetés varázslóban.

Transact-SQL használata

A push alapú előfizetéseket programozási úton hozhatja létre replikációs tárolt eljárások használatával. A használt tárolt eljárások attól függenek, hogy milyen típusú kiadványhoz tartozik az előfizetés.

Fontos

Ha lehetséges, kérje meg a felhasználókat, hogy futásidőben adjanak meg biztonsági hitelesítő adatokat. Ha szkriptfájlban kell tárolnia a hitelesítő adatokat, a jogosulatlan hozzáférés megakadályozása érdekében biztonságossá kell tennie a fájlt.

Összefoglalás vagy tranzakciós kiadvány push előfizetésének létrehozása

  1. A közzétételi adatbázisban ellenőrizze, hogy a kiadvány támogatja-e a leküldéses előfizetéseket a sp_helppublication futtatásával.

    • Ha a allow_push értéke 1, a leküldéses előfizetések támogatottak.

    • Ha a allow_push értéke 0, futtassa sp_changepublication. Adja meg a allow_push értékét @property, és igaz értéket a @value-hoz.

  2. A közzétételi adatbázisban a Publisheren futtassa a sp_addsubscription-t. Adja meg @publication, @subscriber és @destination_db. Adja meg a leküldéses értéket a @subscription_type-hez. További információ az előfizetések frissítéséről: Frissíthető előfizetés létrehozása tranzakciós kiadványhoz.

  3. Futtassa a sp_addpushsubscription_agent a publisherben a közzétételi adatbázisban. Adja meg a következőket:

    • A @subscriber, @subscriber_db és @publication paraméterek.

    • A Microsoft Windows hitelesítő adatok, amelyek alatt a Distribution Agent a Disztribútoron @job_login és @job_password szerint fut.

      Megjegyzés:

      A Windows integrált hitelesítéssel létesített kapcsolatok mindig a @job_login és @job_password által megadott Windows-hitelesítő adatokat használják. A terjesztési ügynök mindig a Helyi kapcsolatot hozza létre a forgalmazóval a Windows integrált hitelesítés használatával. Alapértelmezés szerint az ügynök a Windows integrált hitelesítés használatával csatlakozik az előfizetőhöz.

    • (Nem kötelező) A @subscriber_security_mode értéke 0, a Microsoft SQL Server bejelentkezési adatai pedig @subscriber_login és @subscriber_password. Adja meg ezeket a paramétereket, ha SQL Server-hitelesítést kell használnia az előfizetőhöz való csatlakozáskor.

    • Az előfizetés terjesztési ügynök feladatának ütemezése. További információ: Szinkronizálási ütemezések megadása.

Fontos

Ha egy távoli terjesztővel rendelkező Közzétevőnél push-előfizetést hoz létre, a rendszer az összes paraméterhez megadott értéket, beleértve a job_login és job_password, szövegként küldi el a terjesztőnek. A tárolt eljárás futtatása előtt titkosítania kell a Publisher és a távoli terjesztő közötti kapcsolatot. További információ: Titkosított kapcsolatok engedélyezése az adatbázismotorhoz (SQL Server Configuration Manager)

Előfizetés létrehozása egy egyesítési publikációhoz

  1. A közzétételi adatbázisban ellenőrizze, hogy a kiadvány támogatja-e a leküldéses előfizetéseket a sp_helpmergepublication futtatásával.

    • Ha a allow_push értéke 1, a kiadvány támogatja a leküldéses előfizetéseket.

    • Ha a allow_push értéke nem 1, futtassa sp_changemergepublication. Adja meg a allow_push értéket a @property-hoz, és a true értéket a @value-hoz.

  2. Futtassa a közzétételi adatbázisban lévő Publisherben az sp_addmergesubscription parancsot. Adja meg a következő paramétereket:

    • @publication. Ez a kiadvány neve.

    • @subscriber_type. Ügyfél-előfizetés esetén adja meg a helyi értéket. Kiszolgáló-előfizetés esetén adja meg a globális értéket.

    • @subscription_priority. Kiszolgáló-előfizetés esetén adja meg az előfizetés prioritását (0.0099.99).

    További információ: Fejlett összevonási replikációs ütközésészlelés és -feloldás.

  3. A publisherben a közzétételi adatbázisban futtassa a sp_addmergepushsubscription_agent. Adja meg a következőket:

    • A @subscriber, @subscriber_db és @publication paraméterek.

    • Azok a Windows-hitelesítő adatok, amelyek alatt a Merge Agent a forgalmazónál @job_login és @job_password működik.

      Megjegyzés:

      A Windows integrált hitelesítéssel létesített kapcsolatok mindig a @job_login és @job_password által megadott Windows-hitelesítő adatokat használják. Az egyesítési ügynök mindig a Windows integrált hitelesítés használatával hozza létre a helyi kapcsolatot a forgalmazóval. Alapértelmezés szerint az ügynök a Windows integrált hitelesítés használatával csatlakozik az előfizetőhöz.

    • (Nem kötelező) A @subscriber_security_mode értéke 0, az SQL Server bejelentkezési adatai pedig @subscriber_login és @subscriber_password. Adja meg ezeket a paramétereket, ha SQL Server-hitelesítést kell használnia az előfizetőhöz való csatlakozáskor.

    • (Nem kötelező) A 0 érték a @publisher_security_mode, valamint az SQL Server bejelentkezési adatai: @publisher_login és @publisher_password. Adja meg ezeket az értékeket, ha SQL Server-hitelesítést kell használnia a Publisherhez való csatlakozáskor.

    • Az ennek az előfizetésnek szóló Merge Agent feladat ütemezése. További információ: Szinkronizálási ütemezések megadása.

Fontos

Ha push előfizetést hoz létre egy közzétevőnél, amelynek távoli terjesztője van, az összes paraméterhez megadott érték, beleértve a job_login és job_password, egyszerű szövegként van elküldve a terjesztőnek. A tárolt eljárás futtatása előtt titkosítania kell a Publisher és a távoli terjesztő közötti kapcsolatot. További információ: Titkosított kapcsolatok engedélyezése az adatbázismotorhoz (SQL Server Configuration Manager)

Példák (Transact-SQL)

Az alábbi példa leküldéses előfizetést hoz létre egy tranzakciós kiadványhoz. A bejelentkezési és jelszóértékek futásidőben, sqlcmd szkriptelési változókon keresztül lesznek megadva.

-- 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

Az alábbi példa egy push típusú előfizetést hoz létre egy egyesítési kiadványhoz. A bejelentkezési és jelszóértékek futásidőben, sqlcmd szkriptelési változókon keresztül lesznek megadva.

-- 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

Replikációkezelési objektumok használata

Leküldéses előfizetéseket programozott módon hozhat létre a Replikációkezelési objektumok (RMO) használatával. A leküldéses előfizetés létrehozásához használt RMO-osztályok attól függenek, hogy milyen típusú kiadványhoz készült az előfizetés.

Fontos

Ha lehetséges, kérje meg a felhasználókat, hogy futásidőben adjanak meg biztonsági hitelesítő adatokat. Ha hitelesítő adatokat kell tárolnia, használja a Microsoft Windows .NET-keretrendszer által biztosított titkosítási szolgáltatásokat .

Leküldéses előfizetés létrehozása pillanatképhez vagy tranzakciós kiadványhoz

  1. Hozzon létre kapcsolatot a Publisherrel az ServerConnection osztály használatával.

  2. Példányosítsa az TransPublication osztályt az 1. lépésben használt Publisher-kapcsolat segítségével. Adja meg Namea , DatabaseNameés ConnectionContexta .

  3. Hívja meg a LoadProperties metódust. Ha ez a metódus hamis értéket ad vissza, a 2. lépésben megadott tulajdonságok helytelenek, vagy a kiadvány nem létezik a kiszolgálón.

  4. Bitenkénti logikai ÉS művelet végrehajtása (& a Visual C# nyelvben és And a Visual Basic nyelvben) a Attributes tulajdonság és AllowPush között. Ha az eredmény None, állítsa be Attributes értékét az Attributes és AllowPush közötti bitenkénti logikai OR művelet eredményére (| a Visual C#-ben és Or a Visual Basic-ben). Ezután hívja meg CommitPropertyChanges a leküldéses előfizetések engedélyezéséhez.

  5. Ha az előfizetési adatbázis nem létezik, hozza létre az Database osztály használatával. További információ: Adatbázisok létrehozása, módosítása és eltávolítása.

  6. Hozzon létre egy példányt a TransSubscription osztályból.

  7. Adja meg a következő előfizetési tulajdonságokat:

  8. Hívja meg a Create metódust.

Fontos

Ha push előfizetést hoz létre egy távoli Forgalmazóval rendelkező Közzétevőnél, az összes tulajdonsághoz megadott értéket, köztük SynchronizationAgentProcessSecurity, egyszerű szövegként küldi el a Forgalmazónak. A metódus meghívása előtt titkosítania kell a Publisher és a Create távoli terjesztő közötti kapcsolatot. További információ: Titkosított kapcsolatok engedélyezése az adatbázismotorhoz (SQL Server Configuration Manager)

Előfizetés létrehozása egy egyesítési publikációhoz

  1. Hozzon létre kapcsolatot a Publisherrel az ServerConnection osztály használatával.

  2. Példányosítsa az MergePublication osztályt az 1. lépésben használt Publisher-kapcsolat segítségével. Adja meg Namea , DatabaseNameés ConnectionContexta .

  3. Hívja meg a LoadProperties metódust. Ha ez a metódus hamis értéket ad vissza, a 2. lépésben megadott tulajdonságok helytelenek, vagy a kiadvány nem létezik a kiszolgálón.

  4. Végezze el a bitenkénti logikai ÉS (& a Visual C#-ban és And a Visual Basicben) műveletet a Attributes tulajdonság és a AllowPush között. Ha az eredmény None, állítsa be a Attributes-et a Attributes és AllowPush közötti bitenkénti logikai OR művelet eredményére (| Visual C#-ben és Or Visual Basic-ben). Ezután hívja meg a CommitPropertyChanges, hogy engedélyezze a leküldéses előfizetéseket.

  5. Ha az előfizetési adatbázis nem létezik, hozza létre az Database osztály használatával. További információ: Adatbázisok létrehozása, módosítása és eltávolítása.

  6. Hozzon létre egy példányt a MergeSubscription osztályból.

  7. Adja meg a következő előfizetési tulajdonságokat:

  8. Hívja meg a Create metódust.

Fontos

Ha push típusú előfizetést hoz létre egy távoli terjesztővel rendelkező közzétevőnél, a rendszer az összes tulajdonsághoz megadott értéket, beleértve a SynchronizationAgentProcessSecurity helyőrzőt is, egyszerű szövegként küldi el a terjesztőnek. A metódus meghívása előtt titkosítania kell a Publisher és a Create távoli terjesztő közötti kapcsolatot. További információ: Titkosított kapcsolatok engedélyezése az adatbázismotorhoz (SQL Server Configuration Manager)

Példák (RMO)

Ez a példa létrehoz egy új leküldéses előfizetést egy tranzakciós kiadványhoz. A Terjesztési ügynök feladat futtatásához használt Windows-fiók hitelesítő adatai futásidőben lesznek átadva.

           // 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

Ez a példa létrehoz egy új leküldéses előfizetést egy egyesítési kiadványhoz. Az Egyesítési ügynök feladat futtatásához használt Windows-fiók hitelesítő adatai futásidőben lesznek átadva.

// 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