Créer une publication

S’applique à : SQL Server Azure SQL Managed Instance

Cet article décrit comment créer une publication dans SQL Server en utilisant SQL Server Management Studio, Transact-SQL ou Replication Management Objects (RMO).

Limitations et restrictions

  • Les noms de publications et d'articles ne peuvent inclure aucun des caractères suivants : %, *, [, ], |, :, ", ?, ', \, /, <, or >. Si les objets de la base de données contiennent l’un de ces caractères, et si vous voulez les répliquer, vous devez spécifier un nom d’article différent du nom de l’objet dans la boîte de dialogue Propriétés de l’article - <Article>, qui est disponible dans la page Articles de l’Assistant.

Sécurité

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.

Utiliser SQL Server Management Studio

Créez des publication et définissez des articles avec l'Assistant Nouvelle publication. Après avoir créé une publication, affichez et modifiez les propriétés de publication dans la boîte de dialogue Propriétés de la publication - <Publication>. Pour plus d’informations sur la création d’une publication à partir d’une base de données Oracle, consultez Créer une publication à partir d’une base de données Oracle.

Créer une publication et définir des articles

  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 cliquez avec le bouton droit sur le dossier Publications locales .

  3. Sélectionnez Nouvelle publication .

  4. Exécutez les pages de l'Assistant Nouvelle publication pour.

    • Spécifier un serveur de distribution si la distribution n'a pas été configurée sur le serveur. Pour plus d’informations sur la configuration de la distribution, consultez Configurer la publication et la distribution.

      Si vous spécifiez dans la page Serveur de distribution que le serveur de publication se comportera comme son propre serveur de distribution (serveur de distribution local), et si ce serveur n'est pas configuré comme serveur de distribution, l'Assistant Nouvelle publication configurera ce serveur. Vous spécifierez un dossier d'instantanés par défaut pour le serveur de distribution dans la page Dossier d'instantanés . Le dossier d'instantanés correspond à un simple répertoire que vous définissez sous la forme d'un partage ; les agents qui lisent et écrivent dans le dossier doivent disposer des autorisations suffisantes pour pouvoir y accéder. Pour plus d’informations sur une sécurisation appropriée du dossier, consultez Sécuriser le dossier d’instantanés.

      Si vous spécifiez qu'un autre serveur doit jouer le rôle de serveur de distribution, vous devez entrer un mot de passe dans la page Mot de passe d'administration pour les connexions effectuées du serveur de publication sur le serveur de distribution. Ce mot de passe doit correspondre à celui qui a été spécifié lorsque le serveur de publication a été activé sur le serveur de distribution distant.

      Pour plus d'informations, voir Configure Distribution.

    • Choisissez une base de données de publication.

    • Sélectionnez un type de publication. Pour plus d’informations, consultez Types de réplication.

    • Spécifiez les données et les objets de base de données à publier ; en option, filtrez les colonnes des articles des tables, et définissez des propriétés d'articles.

    • En option, filtrez les lignes des articles des tables. Pour plus d’informations, consultez Filtrer des données publiées.

    • Définissez la planification de l'Agent d'instantané.

    • Spécifiez les informations de connexion sous lesquelles les Agents de réplication suivants s'exécuteront et se connecteront :

      • Agent d’instantané pour toutes les publications.

      • Agent de lecture du journal pour toutes les publications transactionnelles.

      • Agent de lecture de la file d’attente pour les publications transactionnelles acceptant les abonnements avec mise à jour.

        Pour plus d'informations, consultez Replication Agent Security Model et Replication Security Best Practices.

    • En option, scriptez la publication. Pour plus d'informations, voir Scripting Replication.

    • Spécifiez le nom de la publication.

Utiliser Transact-SQL

Il est possible de créer des publications par programme en utilisant les procédures stockées de réplication. Les procédures stockées à utiliser dépendent du type de publication à créer.

Créez une publication d'instantané ou une publication transactionnelle

  1. Dans la base de données de publication sur le serveur de publication, exécutez sp_replicationdboption (Transact-SQL) pour activer la publication de la base de données actuelle à l’aide de la réplication transactionnelle ou d’instantané.

  2. Pour une publication transactionnelle, déterminez si un travail de l'Agent de lecture du journal existe pour la base de données de publication. (Cette étape n'est pas requise pour les publications d'instantané.)

    • Si un travail de l'Agent de lecture du journal existe pour la base de données de publication, passez à l'étape 3.

    • Si vous ne savez pas si un travail de l'Agent de lecture du journal existe pour une base de données publiée, exécutez sp_helplogreader_agent (Transact-SQL) au niveau du serveur de publication dans la base de données de publication.

    • Si le jeu de résultats est vide, créez un travail de l'Agent de lecture du journal. Sur le serveur de publication, exécutez sp_addlogreader_agent (Transact-SQL). Spécifiez les informations d'identification Windows sous lesquelles l'agent s'exécute pour @job_name et @password. Si l'agent utilise l'authentification SQL Server lors de la connexion au serveur de publication, vous devez également affecter la valeur ou 0 pour @publisher_security_mode et spécifier les informations de connexion SQL Server pour @publisher_login et @publisher_password. Passez à l'étape 3.

  3. Sur le serveur de publication, exécutez sp_addpublication (Transact-SQL). Spécifiez un nom de publication pour @publication et, pour le paramètre @repl_freq , spécifiez la valeur snapshotsnapshot pour une publication d'instantané ou la valeur ou continuous pour une publication transactionnelle. Spécifiez d'autres options de publication éventuelles. Cela définit la publication.

    Remarque

    Un nom de publication ne doit pas contenir les caractères suivants :

    %, *, [, ], |, :, ", ?, \, /, <, or >.

  4. Sur le serveur de publication, exécutez sp_addpublication_snapshot (Transact-SQL). Spécifiez le nom de publication utilisé à l'étape 3 pour @publication et les informations d’identification Windows sous lesquelles l’Agent d’instantané s’exécute pour @snapshot_job_name et @password. Si l'agent utilise l'authentification SQL Server lors de la connexion au serveur de publication, vous devez également affecter la valeur ou 0 pour @publisher_security_mode et spécifier les informations de connexion SQL Server pour @publisher_login et publisher_password. Il s'ensuit la création d'un travail de l'Agent d'instantané pour la publication.

    Important

    Lors de la configuration d'un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour tous les paramètres, y compris job_login et job_password, sont envoyées en texte brut au serveur de distribution. 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).

  5. Ajoutez des articles à la publication. Pour plus d’informations, consultez définir un Article.

  6. Démarrez le travail de l'Agent d'instantané pour générer l'instantané initial pour cette publication. Pour plus d’informations, voir Create and Apply the Initial Snapshot.

Créer une publication de fusion

  1. Sur le serveur de publication, exécutez sp_replicationdboption (Transact-SQL) pour activer la publication de la base de données actuelle à l’aide de la réplication de fusion.

  2. Dans la base de données de publication sur le serveur de publication, exécutez sp_addmergepublication (Transact-SQL). Spécifiez le nom de la publication pour @publication et d'autres options de publication éventuelles. Cela définit la publication.

    Remarque

    Un nom de publication ne doit pas contenir les caractères suivants :

    %, *, [, ], |, :, ", ?, \, /, <, or >.

  3. Sur le serveur de publication, exécutez sp_addpublication_snapshot (Transact-SQL). Spécifiez le nom de publication utilisé à l’étape 2 pour @publication et les informations d’identification Windows sous lesquelles l’Agent d’instantané s’exécute pour @snapshot_job_name et @password. Si l'agent utilise l'authentification SQL Server lors de la connexion au serveur de publication, vous devez également affecter la valeur ou 0 pour @publisher_security_mode et spécifier les informations de connexion SQL Server pour @publisher_login et @publisher_password. Il s'ensuit la création d'un travail de l'Agent d'instantané pour la publication.

    Important

    Lors de la configuration d'un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour tous les paramètres, y compris job_login et job_password, sont envoyées en texte brut au serveur de distribution. 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).

  4. Ajoutez des articles à la publication. Pour plus d’informations, consultez définir un Article.

  5. Démarrez le travail de l'Agent d'instantané pour générer l'instantané initial pour cette publication. Pour plus d’informations, voir Create and Apply the Initial Snapshot.

Exemple (Transact-SQL)

Cet exemple crée une publication transactionnelle. Des variables de script sont utilisées pour transmettre les informations d'identification Windows nécessaires pour créer les travaux pour l'Agent d'instantané et l'Agent de lecture du journal.

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. 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 @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks'; 
SET @publication = N'AdvWorksProductTran'; 
-- Windows account used to run the Log Reader and Snapshot Agents.
SET @login = $(Login); 
-- This should be passed at runtime.
SET @password = $(Password); 

-- Enable transactional or snapshot replication on the publication database.
EXEC sp_replicationdboption 
    @dbname=@publicationDB, 
    @optname=N'publish',
    @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;

-- Create a new transactional publication with the required properties. 
EXEC sp_addpublication 
    @publication = @publication, 
    @status = N'active',
    @allow_push = N'true',
    @allow_pull = N'true',
    @independent_agent = N'true';

-- Create a new snapshot job for the publication, using a default schedule.
EXEC sp_addpublication_snapshot 
    @publication = @publication, 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;
GO

Cet exemple crée une publication de fusion. Des variables de script sont utilisées pour transmettre les informations d'identification Windows nécessaires pour créer le travail pour l'Agent d'instantané.

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. 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".

--Declarations for adding a merge publication
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database, using defaults.
USE master
EXEC sp_replicationdboption 
  @dbname=@publicationDB, 
  @optname=N'merge publish',
  @value = N'true' 

-- Create a new merge publication, explicitly setting the defaults. 
USE [AdventureWorks2022]
EXEC sp_addmergepublication 
-- These parameters are optional.
  @publication = @publication,
  -- optional parameters 
  @description = N'Merge publication of AdventureWorks2022.',
  @publication_compatibility_level  = N'120RTM';

-- Create a new snapshot job for the publication.
EXEC sp_addpublication_snapshot 
  @publication = @publication, 
  @job_login = @login, 
  @job_password = @password;
GO

Utiliser des objets RMO (Replication Management Objects)

Vous pouvez créer des publications par programme à l'aide d'objets RMO (Replication Management Objects). Les classes RMO que vous utilisez pour créer une publication dépendent du type de publication créé.

Créez une publication d'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 ReplicationDatabase pour la base de données de publication, affectez à la propriété ConnectionContext l'instance de ServerConnection créée à l'étape 1, puis appelez la méthode LoadProperties . Si LoadProperties retourne false, vérifiez que la base de données existe.

  3. Si la propriété EnabledTransPublishing est false, réglez-la sur true.

  4. Pour une publication transactionnelle, vérifiez la valeur de la propriété LogReaderAgentExists . Si elle a la valeur true, un travail de l'Agent de lecture du journal existe déjà pour cette base de données. Si elle a la valeur false, procédez comme suit :

  5. Créez une instance de la classe TransPublication et définissez les propriétés suivantes pour cet objet :

  6. Appelez la méthode Create pour créer la publication.

    Important

    Lors de la configuration d'un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour toutes les propriétés, y compris SnapshotGenerationAgentProcessSecurity, sont envoyées sous forme de texte brut au serveur de distribution. 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).

  7. Appelez la méthode CreateSnapshotAgent pour créer le travail de l'Agent d'instantané pour le serveur de publication.

Créer 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 ReplicationDatabase pour la base de données de publication, affectez à la propriété ConnectionContext l'instance de ServerConnection créée à l'étape 1, puis appelez la méthode LoadProperties . Si LoadProperties retourne false, vérifiez que la base de données existe.

  3. Si la propriété EnabledMergePublishing a la valeur false, affectez-lui la valeur true et l’appelez CommitPropertyChanges.

  4. Créez une instance de la classe MergePublication et définissez les propriétés suivantes pour cet objet :

    • La classe ServerConnection créée à l'étape 1 pour la propriété ConnectionContext.

    • Le nom de la base de données publiée pour DatabaseName.

    • Le nom de la publication pour Name.

    • Les champs Login et Password de SnapshotGenerationAgentProcessSecurity pour fournir les informations d'identification pour le compte Windows sous lequel le travail de l'Agent d'instantané s'exécute. Ce compte est également utilisé lorsque l'Agent d'instantané établit des connexions au serveur de distribution local et pour toute connexion distante lors de l'utilisation de l'authentification Windows.

      Remarque

      Il n'est pas nécessaire de définir SnapshotGenerationAgentProcessSecurity lorsque la publication est créée par un membre du rôle serveur fixe sysadmin . Pour plus d’informations, voir Replication Agent Security Model.

    • (Facultatif) Utilisez l'opérateur OR logique inclusif (| en Visual C# et Or en Visual Basic) et l'opérateur OR logique exclusif (^ en Visual C# et Xor en Visual Basic) pour définir les valeurs PublicationAttributes de la propriété Attributes.

  5. Appelez la méthode Create pour créer la publication.

    Important

    Lors de la configuration d'un serveur de publication avec un serveur de distribution distant, les valeurs fournies pour toutes les propriétés, y compris SnapshotGenerationAgentProcessSecurity, sont envoyées sous forme de texte brut au serveur de distribution. 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).

  6. Appelez la méthode CreateSnapshotAgent pour créer le travail de l'Agent d'instantané pour le serveur de publication.

Exemples (RMO)

Cet exemple active la base de données AdventureWorks pour une publication transactionnelle, définit un travail de l'Agent de lecture du journal et crée la publication AdvWorksProductTran. Un article doit être défini pour cette publication. Les informations d'identification du compte Windows nécessaires pour créer le travail de l'Agent de lecture du journal et de l'Agent d'instantané sont passées au moment de l'exécution. Pour savoir comment utiliser des objets RMO pour définir des articles d'instantané et des articles transactionnels, consultez Define an Article.

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;

ReplicationDatabase publicationDb;
TransPublication publication;

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


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

    // Enable the AdventureWorks2022 database for transactional publishing.
    publicationDb = new ReplicationDatabase(publicationDbName, conn);

    // If the database exists and is not already enabled, 
    // enable it for transactional publishing.
    if (publicationDb.LoadProperties())
    {
        if (!publicationDb.EnabledTransPublishing)
        {
            publicationDb.EnabledTransPublishing = true;
        }

        // If the Log Reader Agent does not exist, create it.
        if (!publicationDb.LogReaderAgentExists)
        {
            // Specify the Windows account under which the agent job runs.
            // This account will be used for the local connection to the 
            // Distributor and all agent connections that use Windows Authentication.
            publicationDb.LogReaderAgentProcessSecurity.Login = winLogin;
            publicationDb.LogReaderAgentProcessSecurity.Password = winPassword;

            // Explicitly set authentication mode for the Publisher connection
            // to the default value of Windows Authentication.
            publicationDb.LogReaderAgentPublisherSecurity.WindowsAuthentication = true;

            // Create the Log Reader Agent job.
            publicationDb.CreateLogReaderAgent();
        }
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} database does not exist at {1}.",
            publicationDb, publisherName));
    }

    // Set the required properties for the transactional publication.
    publication = new TransPublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    // Specify a transactional publication (the default).
    publication.Type = PublicationType.Transactional;

    // Activate the publication so that we can add subscriptions.
    publication.Status = State.Active;

    // Enable push and pull subscriptions and independent Distribition Agents.
    publication.Attributes |= PublicationAttributes.AllowPull;
    publication.Attributes |= PublicationAttributes.AllowPush;
    publication.Attributes |= PublicationAttributes.IndependentAgent;

    // Specify the Windows account under which the Snapshot Agent job runs.
    // This account will be used for the local connection to the 
    // Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;

    // Explicitly set the security mode for the Publisher connection
    // Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;

    if (!publication.IsExistingObject)
    {
        // Create the transactional publication.
        publication.Create();

        // Create a Snapshot Agent job for the publication.
        publication.CreateSnapshotAgent();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication already exists.", publicationName));
    }
}

catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "The publication {0} could not be created.", publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksProductTran"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance

Dim publicationDb As ReplicationDatabase
Dim publication As TransPublication

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

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

    ' Enable the AdventureWorks2022 database for transactional publishing.
    publicationDb = New ReplicationDatabase(publicationDbName, conn)

    ' If the database exists and is not already enabled, 
    ' enable it for transactional publishing.
    If publicationDb.LoadProperties() Then
        If Not publicationDb.EnabledTransPublishing Then
            publicationDb.EnabledTransPublishing = True
        End If

        ' If the Log Reader Agent does not exist, create it.
        If Not publicationDb.LogReaderAgentExists Then
            ' Specify the Windows account under which the agent job runs.
            ' This account will be used for the local connection to the 
            ' Distributor and all agent connections that use Windows Authentication.
            publicationDb.LogReaderAgentProcessSecurity.Login = winLogin
            publicationDb.LogReaderAgentProcessSecurity.Password = winPassword

            ' Explicitly set authentication mode for the Publisher connection
            ' to the default value of Windows Authentication.
            publicationDb.LogReaderAgentPublisherSecurity.WindowsAuthentication = True

            ' Create the Log Reader Agent job.
            publicationDb.CreateLogReaderAgent()
        End If
    Else
        Throw New ApplicationException(String.Format( _
         "The {0} database does not exist at {1}.", _
         publicationDb, publisherName))
    End If

    ' Set the required properties for the transactional publication.
    publication = New TransPublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' Specify a transactional publication (the default).
    publication.Type = PublicationType.Transactional

    'Enable push and pull subscriptions and independent Distribition Agents.
    publication.Attributes = _
    publication.Attributes Or PublicationAttributes.AllowPull
    publication.Attributes = _
    publication.Attributes Or PublicationAttributes.AllowPush
    publication.Attributes = _
    publication.Attributes Or PublicationAttributes.IndependentAgent

    ' Activate the publication so that we can add subscriptions.
    publication.Status = State.Active

    ' Specify the Windows account under which the Snapshot Agent job runs.
    ' This account will be used for the local connection to the 
    ' Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword

    ' Explicitly set the security mode for the Publisher connection
    ' Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True

    If Not publication.IsExistingObject Then
        ' Create the transactional publication.
        publication.Create()

        ' Create a Snapshot Agent job for the publication.
        publication.CreateSnapshotAgent()
    Else
        Throw New ApplicationException(String.Format( _
            "The {0} publication already exists.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
        "The publication {0} could not be created.", publicationName), ex)
Finally
    conn.Disconnect()
End Try

Cet exemple active la base de données AdventureWorks pour la publication de fusion et crée la publication AdvWorksSalesOrdersMerge. Des articles doivent encore être définis pour cette publication. Les informations d'identification du compte Windows nécessaires pour créer le travail de l'Agent d'instantané sont passées au moment de l'exécution. Pour savoir comment utiliser des objets RMO pour définir des articles de fusion, consultez Define an Article.

// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";

ReplicationDatabase publicationDb;
MergePublication publication;

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

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

    // Enable the database for merge publication.				
    publicationDb = new ReplicationDatabase(publicationDbName, conn);
    if (publicationDb.LoadProperties())
    {
        if (!publicationDb.EnabledMergePublishing)
        {
            publicationDb.EnabledMergePublishing = true;
        }
    }
    else
    {
        // Do something here if the database does not exist. 
        throw new ApplicationException(String.Format(
            "The {0} database does not exist on {1}.",
            publicationDb, publisherName));
    }

    // Set the required properties for the merge publication.
    publication = new MergePublication();
    publication.ConnectionContext = conn;
    publication.Name = publicationName;
    publication.DatabaseName = publicationDbName;

    // Enable precomputed partitions.
    publication.PartitionGroupsOption = PartitionGroupsOption.True;

    // Specify the Windows account under which the Snapshot Agent job runs.
    // This account will be used for the local connection to the 
    // Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;

    // Explicitly set the security mode for the Publisher connection
    // Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;

    // Enable Subscribers to request snapshot generation and filtering.
    publication.Attributes |= PublicationAttributes.AllowSubscriberInitiatedSnapshot;
    publication.Attributes |= PublicationAttributes.DynamicFilters;

    // Enable pull and push subscriptions.
    publication.Attributes |= PublicationAttributes.AllowPull;
    publication.Attributes |= PublicationAttributes.AllowPush;

    if (!publication.IsExistingObject)
    {
        // Create the merge publication.
        publication.Create();
        
        // Create a Snapshot Agent job for the publication.
        publication.CreateSnapshotAgent();
    }
    else
    {
        throw new ApplicationException(String.Format(
            "The {0} publication already exists.", publicationName));
    }
}

catch (Exception ex)
{
    // Implement custom application error handling here.
    throw new ApplicationException(String.Format(
        "The publication {0} could not be created.", publicationName), ex);
}
finally
{
    conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"

Dim publicationDb As ReplicationDatabase
Dim publication As MergePublication

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

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

    ' Enable the database for merge publication.				
    publicationDb = New ReplicationDatabase(publicationDbName, conn)
    If publicationDb.LoadProperties() Then
        If Not publicationDb.EnabledMergePublishing Then
            publicationDb.EnabledMergePublishing = True
        End If
    Else
        ' Do something here if the database does not exist. 
        Throw New ApplicationException(String.Format( _
         "The {0} database does not exist on {1}.", _
         publicationDb, publisherName))
    End If

    ' Set the required properties for the merge publication.
    publication = New MergePublication()
    publication.ConnectionContext = conn
    publication.Name = publicationName
    publication.DatabaseName = publicationDbName

    ' Enable precomputed partitions.
    publication.PartitionGroupsOption = PartitionGroupsOption.True

    ' Specify the Windows account under which the Snapshot Agent job runs.
    ' This account will be used for the local connection to the 
    ' Distributor and all agent connections that use Windows Authentication.
    publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
    publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword

    ' Explicitly set the security mode for the Publisher connection
    ' Windows Authentication (the default).
    publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True

    ' Enable Subscribers to request snapshot generation and filtering.
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowSubscriberInitiatedSnapshot
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.DynamicFilters

    ' Enable pull and push subscriptions
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowPull
    publication.Attributes = publication.Attributes Or _
        PublicationAttributes.AllowPush

    If Not publication.IsExistingObject Then
        ' Create the merge publication.
        publication.Create()

        ' Create a Snapshot Agent job for the publication.
        publication.CreateSnapshotAgent()
    Else
        Throw New ApplicationException(String.Format( _
            "The {0} publication already exists.", publicationName))
    End If
Catch ex As Exception
    ' Implement custom application error handling here.
    Throw New ApplicationException(String.Format( _
        "The publication {0} could not be created.", publicationName), ex)
Finally
    conn.Disconnect()
End Try