Partager via


Créer un abonnement par émission (push)

S’applique à : SQL Server Azure SQL Database

Cette rubrique explique comment créer un abonnement par émission de données dans SQL Server à l’aide de SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO). Pour plus d’informations sur la création d’un abonnement par émission de données pour un abonné non-SQL Server, consultez Créer un abonnement pour un abonné non-SQL Server.

Remarque

Azure SQL Managed Instance peut être un serveur de publication, un serveur de distribution et un abonné pour la réplication transactionnelle et d’instantané. Les bases de données dans Azure SQL Database peuvent uniquement être des abonnés de type push pour la réplication transactionnelle et d’instantané. Pour plus d’informations, consultez Réplication transactionnelle avec Azure SQL Database et Réplication transactionnelle avec Azure SQL Managed Instance.

Utilisation de SQL Server Management Studio

Créez un abonnement par émission de données sur le serveur de publication ou l’abonné à l’aide de l’Assistant Nouvel abonnement. Exécutez les étapes de l'Assistant pour :

  • Spécifier le serveur de publication et la publication.

  • Sélectionner l'emplacement d'exécution des Agents de réplication. Pour un abonnement envoyé, sélectionnez Exécuter tous les agents sur le serveur de distribution (abonnements par envoi de données (push)) dans la page Emplacement de l'Agent de distribution ou la page Emplacement de l'Agent de fusion selon le type de publication.

  • Spécifiez des Abonnés et des bases de données d'abonnement.

  • Spécifiez les noms de connexion et mots de passe utilisés pour les connexions établies par les Agents de réplication :

    • Pour les abonnements aux publications d'instantané et transactionnelles, spécifiez les informations d'identification dans la page Sécurité de l'Agent de distribution .

    • Pour les abonnements aux publications de fusion, spécifiez les informations d'identification dans la page Sécurité de l'Agent de fusion .

      Pour plus d’informations sur les autorisations requises par chaque agent, consultez Modèle de sécurité de l’agent de réplication.

  • Spécifiez une planification de la synchronisation et le moment choisi pour initialiser l'Abonné.

  • Spécifiez d’autres options pour les publications de fusion : type d’abonnement et valeurs pour le filtrage paramétrable.

  • Spécifiez d’autres options pour les publications transactionnelles qui autorisent les abonnements de mise à jour. Une option consiste à décider si les abonnés doivent valider immédiatement les modifications sur le serveur de publication ou les écrire dans une file d’attente. Une autre option consiste à configurer les informations d’identification utilisées pour la connexion de l’abonné au serveur de publication.

  • Créez éventuellement un script pour l’abonnement.

Pour créer un abonnement envoyé à partir du serveur de publication

  1. Connectez-vous au serveur de publication dans Microsoft SQL Server Management Studio, puis développez le nœud du serveur.

  2. Développez le dossier Réplication , puis développez le dossier Publications locales .

  3. Cliquez avec le bouton droit sur la publication pour laquelle vous souhaitez créer un ou plusieurs abonnements, puis sélectionnez Nouveaux abonnements.

  4. Exécutez les étapes de l'Assistant Nouvel abonnement.

Pour créer un abonnement envoyé à partir de l'Abonné

  1. Connectez-vous à l’abonné dans SQL Server Management Studio, puis développez le nœud du serveur.

  2. Développez le dossier Réplication .

  3. Cliquez avec le bouton droit sur le dossier Abonnements locaux, puis sélectionnez Nouveaux abonnements.

  4. Dans la page Publication de l’Assistant Nouvel abonnement, sélectionnez <Rechercher un serveur de publication SQL> ou <Rechercher un serveur de publication Oracle> dans la liste déroulante Serveur de publication.

  5. Connectez-vous au serveur de publication dans la boîte de dialogue Se connecter au serveur .

  6. Sélectionnez une publication dans la page Publication .

  7. Exécutez les étapes de l'Assistant Nouvel abonnement.

Utilisation de Transact-SQL

Vous pouvez créer par programmation des abonnements par émission de données à l’aide de procédures stockées de réplication. Les procédures stockées utilisées dépendent du type de publication auquel l'abonnement appartient.

Important

Lorsque c'est possible, demande aux utilisateurs de fournir les informations d'identification au moment de l'exécution. Si vous devez enregistrer les informations d'identification dans un fichier de script, vous devez sécuriser le fichier pour empêcher un accès non autorisé.

Pour créer un abonnement par envoi de données vers un instantané ou une publication transactionnelle

  1. Au niveau du serveur de publication sur la base de données de publication, vérifiez que la publication prend en charge les abonnements par émission de données en exécutant sp_helppublication.

    • Si la valeur de allow_push est 1, les abonnements par envoi de données sont pris en charge.

    • Si la valeur de allow_push est 0, exécutez sp_changepublication. Spécifiez allow_push pour @property et true pour @value.

  2. Au niveau du serveur de publication sur la base de données de publication, exécutez sp_addsubscription. Spécifiez @publication, @subscriberet @destination_db. Spécifiez la valeur push pour @subscription_type. Pour plus d’informations sur la mise à jour des abonnements, consultez Créer un abonnement pouvant être mis à jour pour une publication transactionnelle.

  3. Au niveau du serveur de publication sur la base de données de publication, exécutez sp_addpushsubscription_agent. Spécifiez les détails suivants :

    • Les paramètres @subscriber, @subscriber_dbet @publication .

    • Les informations d'identification Microsoft Windows sous lesquelles l'Agent de distribution est exécuté sur le serveur de distribution pour @job_login et @job_password.

      Remarque

      Les connexions établies à l’aide de l’authentification Windows intégrée utilisent toujours les informations d’identification Windows spécifiées par @job_login et @job_password. L’Agent de distribution établit toujours la connexion locale au serveur de distribution à l’aide de l’authentification Windows intégrée. Par défaut, l’agent se connecte à l’abonné à l’aide de l’authentification Windows intégrée.

    • (Facultatif) La valeur 0 pour @subscriber_security_mode et les informations de connexion Microsoft SQL Server pour @subscriber_login et @subscriber_password. Spécifiez ces paramètres si vous devez utiliser l'authentification SQL Server lors de la connexion à l'abonné.

    • Planification du travail de l'Agent de distribution pour cet abonnement. Pour plus d’informations, consultez Spécifier des planifications de synchronisation.

Important

Lors de la création d’un abonnement par émission de données sur un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour tous les paramètres, notamment job_login et job_password, sont envoyées au serveur de distribution en texte brut. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d’exécuter cette procédure stockée. Pour plus d’informations, consultez Activer des connexions chiffrées dans le moteur de base de données (Gestionnaire de configuration SQL Server).

Pour créer un abonnement par envoi de données vers une publication de fusion

  1. Au niveau du serveur de publication sur la base de données de publication, vérifiez que la publication prend en charge les abonnements par émission de données en exécutant sp_helpmergepublication.

    • Si la valeur de allow_push est 1, la publication prend en charge les abonnements par envoi de données.

    • Si la valeur de allow_push n’est pas 1, exécutez sp_changemergepublication. Spécifiez allow_push pour @property et true pour @value.

  2. Au niveau du serveur de publication sur la base de données de publication, exécutez sp_addmergesubscription. Spécifiez les paramètres suivants :

    • @publication. Il s'agit du nom de la publication.

    • @subscriber_type. Pour un abonnement client, spécifiez local. Pour un abonnement serveur, spécifiez global.

    • @subscription_priority. Pour un abonnement serveur, spécifiez la priorité de l'abonnement (de0.00 à 99.99).

    Pour plus d’informations, consultez Détection et résolution avancées des conflits de réplication de fusion.

  3. Au niveau du serveur de publication sur la base de données de publication, exécutez sp_addmergepushsubscription_agent. Spécifiez les détails suivants :

    • Les paramètres @subscriber, @subscriber_dbet @publication .

    • Les informations d'identification Windows sous lesquelles l'Agent de fusion est exécuté sur le serveur de distribution pour @job_login et @job_password.

      Remarque

      Les connexions établies à l’aide de l’authentification Windows intégrée utilisent toujours les informations d’identification Windows spécifiées par @job_login et @job_password. L’Agent de fusion établit toujours la connexion locale au serveur de distribution à l’aide de l’authentification Windows intégrée. Par défaut, l’agent se connecte à l’abonné à l’aide de l’authentification Windows intégrée.

    • (Facultatif) La valeur 0 pour @subscriber_security_mode et les informations de connexion SQL Server pour @subscriber_login et @subscriber_password. Spécifiez ces paramètres si vous devez utiliser l'authentification SQL Server lors de la connexion à l'abonné.

    • (Facultatif) La valeur 0 pour @publisher_security_mode et les informations de connexion SQL Server pour @publisher_login et @publisher_password. Spécifiez ces valeurs si vous devez utiliser l'authentification SQL Server lors de la connexion à l'abonné.

    • Une planification du travail de l'Agent de fusion pour cet abonnement. Pour plus d’informations, consultez Spécifier des planifications de synchronisation.

Important

Lors de la création d’un abonnement par émission de données sur un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour tous les paramètres, notamment job_login et job_password, sont envoyées au serveur de distribution en texte brut. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d’exécuter cette procédure stockée. Pour plus d’informations, consultez Activer des connexions chiffrées dans le moteur de base de données (Gestionnaire de configuration SQL Server).

Exemples (Transact-SQL)

L'exemple suivant crée un abonnement par envoi de données vers une publication transactionnelle. Les valeurs de connexion et de mot de passe sont fournies lors de l’exécution à l’aide des variables de script 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

L'exemple suivant crée un abonnement par envoi de données vers une publication de fusion. Les valeurs de connexion et de mot de passe sont fournies lors de l’exécution à l’aide des variables de script 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

Utilisation d’objets RMO (Replication Management Object)

Vous pouvez créer par programme des abonnements par émission de données (push) à l'aide d'objets RMO (Replication Management Objects). Les classes RMO que vous utilisez pour créer un abonnement par émission de données dépendent du type de publication sur laquelle l’abonnement est créé.

Important

Lorsque c'est possible, demande aux utilisateurs de fournir les informations d'identification au moment de l'exécution. Si vous devez stocker des informations d’identification, utilisez les services de chiffrement fournis par Microsoft Windows .NET Framework.

Pour créer un abonnement par envoi de données vers un instantané ou une publication transactionnelle

  1. Créez une connexion au serveur de publication en utilisant la classe ServerConnection .

  2. Créez une instance de la classe TransPublication en utilisant la connexion au serveur de publication de l'étape 1. Spécifiez Name, DatabaseNameet ConnectionContext.

  3. Appelez la méthode LoadProperties . Si cette méthode retourne false, les propriétés spécifiées à l'étape 2 sont incorrectes ou la publication n'existe pas sur le serveur.

  4. Effectuez une opération AND logique au niveau du bit (& dans Visual C# et And dans Visual Basic) entre la propriété Attributes et AllowPush. Si le résultat est None, appliquez à Attributes le résutat d'une opération OR logique au niveau du bit (| dans Visual C# et Or dans Visual Basic) entre Attributes et AllowPush. Appelez ensuite CommitPropertyChanges pour activer les abonnements par envoi de données.

  5. Si la base de données d'abonnements n'existe pas, créez-la en utilisant la classe Database . Pour plus d’informations, consultez Création, modification et suppression de bases de données.

  6. Créez une instance de la classe TransSubscription.

  7. Définissez les propriétés suivantes des abonnements :

  8. Appelez la méthode Create .

Important

Lors de la création d’un abonnement par émission de données sur un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour toutes les propriétés, notamment SynchronizationAgentProcessSecurity, sont envoyées au serveur de distribution en texte brut. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d'appeler la méthode Create . Pour plus d’informations, consultez Activer des connexions chiffrées dans le moteur de base de données (Gestionnaire de configuration SQL Server).

Pour créer un abonnement par envoi de données vers une publication de fusion

  1. Créez une connexion au serveur de publication en utilisant la classe ServerConnection .

  2. Créez une instance de la classe MergePublication en utilisant la connexion au serveur de publication de l'étape 1. Spécifiez Name, DatabaseNameet ConnectionContext.

  3. Appelez la méthode LoadProperties . Si cette méthode retourne false, les propriétés spécifiées à l'étape 2 sont incorrectes ou la publication n'existe pas sur le serveur.

  4. Effectuez une opération AND logique au niveau du bit (& dans Visual C# et And dans Visual Basic) entre la propriété Attributes et AllowPush. Si le résultat est None, appliquez à Attributes le résutat d'une opération OR logique au niveau du bit (| dans Visual C# et Or dans Visual Basic) entre Attributes et AllowPush. Appelez ensuite CommitPropertyChanges pour activer les abonnements par envoi de données.

  5. Si la base de données d'abonnements n'existe pas, créez-la en utilisant la classe Database . Pour plus d’informations, consultez Création, modification et suppression de bases de données.

  6. Créez une instance de la classe MergeSubscription.

  7. Définissez les propriétés suivantes des abonnements :

  8. Appelez la méthode Create .

Important

Lors de la création d’un abonnement par émission de données sur un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour toutes les propriétés, notamment SynchronizationAgentProcessSecurity, sont envoyées au serveur de distribution en texte brut. Vous devez chiffrer la connexion entre le serveur de publication et son serveur de distribution distant avant d'appeler la méthode Create . Pour plus d’informations, consultez Activer des connexions chiffrées dans le moteur de base de données (Gestionnaire de configuration SQL Server).

Exemples (RMO)

Cet exemple crée un nouvel abonnement par envoi de données vers une publication transactionnelle. Les informations d’identification du compte Windows que vous utilisez pour exécuter le travail de l’Agent de distribution sont transmises lors de l’exécution.

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

Cet exemple crée un nouvel abonnement par envoi de données vers une publication de fusion. Les informations d’identification du compte Windows que vous utilisez pour exécuter le travail de l’Agent de fusion sont transmises lors de l’exécution.

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