Vytvoření publikace

Platí pro:SQL ServerAzure SQL Managed Instance

Tento článek popisuje, jak vytvořit publikaci v SQL Server pomocí SQL Server Management Studio, Transact-SQL nebo Replication Management Objects (RMO).

Limity a omezení

  • Názvy publikací a článků nesmí obsahovat žádné z následujících znaků: %, , *[, ], |, :, \"'/?<, nebo .> Pokud objekty v databázi obsahují některý z těchto znaků a chcete je replikovat, musíte v dialogovém okně Vlastnosti článku – >článek< zadat název článku, který se liší od názvu objektu; toto dialogové okno je dostupné na stránce Články v průvodci.

Zabezpečení

Pokud je to možné, vyzve uživatele, aby za běhu zadali přihlašovací údaje zabezpečení. Pokud musíte uchovávat přihlašovací údaje, použijte kryptografické služby poskytované Microsoft Windows .NET Frameworkem.

Použití aplikace SQL Server Management Studio

Vytvářejte publikace a definujte články pomocí Průvodce novými publikacemi. Po vytvoření publikace si prohlédněte a upravte vlastnosti publikace v dialogovém okně Vlastnosti publikace – <Publikace> . Pro informace o vytváření publikace z Oracle databáze viz Vytvořit publikaci z Oracle databáze.

Vytvoření publikace a definování článků

  1. Připojte se k publisheru v aplikaci Microsoft SQL Server Management Studio a potom rozbalte uzel serveru.

  2. Rozbalte složku Replikace a pak klikněte pravým tlačítkem na složku Lokální publikace .

  3. Vyberte Novou publikaci.

  4. Sledujte stránky v Čarodějce nových publikací, abyste:

    • Specifikujte distributora, pokud distribuce na serveru nebyla nakonfigurována. Pro více informací o konfiguraci distribuce viz Konfigurovat publikování a distribuci.

      Pokud na stránce distributora specifikujete, že server Publisher bude fungovat jako samostatný distributor (lokální distributor) a server není nakonfigurován jako distributor, průvodce novou publikací server nakonfiguruje. Na stránce Složka snímků určíte výchozí složku snímků pro Distributor. Složka snapshot je jednoduše adresář, který jste označili jako sdílený soubor; Agenti, kteří z této složky čtou a zapisují do ní, musí mít dostatečná oprávnění k jejímu přístupu. Pro více informací o správném zabezpečení složky viz Secure the Snapshot Folder.

      Pokud určíte, že jiný server má fungovat jako distributor, musíte zadat heslo na stránce Administrátorské heslo pro spojení z Publisher k distributorovi. Toto heslo musí odpovídat heslu stanovenému při aktivaci Publisher u vzdáleného distributora.

      Další informace najdete v tématu Konfigurace distribuce.

    • Vyberte databázi publikací.

    • Vyberte typ publikace. Pro více informací viz Typy replikace.

    • Specifikovat datové a databázové objekty k publikaci; volitelně filtrujte sloupce z článků v tabulce a nastavte vlastnosti článků.

    • Volitelně filtrujte řádky z článků v tabulce. Další informace najdete v tématu Filtrování publikovaných dat.

    • Nastavte rozvrh Snapshot Agent.

    • Specifikujte přihlašovací údaje, pod kterými následující replikační agenti běží a navazují spojení:

    • Volitelně napište scénář publikace. Pro více informací viz Replikace skriptování.

    • Uveďte název publikace.

Použijte Transact-SQL

Publikace lze vytvářet programově pomocí uložených procedur při replikaci. Uložené procedury, které se použijí, závisejí na typu vytvářené publikace.

Vytvořte snapshot nebo transakční publikaci

  1. Na Publisher v databázi publikací spusťte sp_replicationdboption (Transact-SQL), aby bylo možné publikovat aktuální databázi pomocí snapshotu nebo transakční replikace.

  2. U transakční publikace zjistěte, zda pro databázi publikace existuje pracovní pozice Log Reader Agent. (Tento krok není vyžadován pro snapshot publikace.)

    • Pokud pro databázi publikací existuje pracovní pozice Log Reader Agent, přejděte ke kroku 3.

    • Pokud si nejste jisti, zda existuje úloha Log Reader Agent pro publikovanou databázi, spusťte sp_helplogreader_agent (Transact-SQL) na Publisher v publikační databázi.

    • Pokud je výsledná sada prázdná, vytvořte úlohu Log Reader Agent. Na serveru Publisher proveďte sp_addlogreader_agent (Transact-SQL). Specifikujte Microsoft Windows přihlašovací údaje, pod kterými agent běží pro @job_name a @password. Pokud agent použije SQL Server Authentication při připojení k Publisher, musíte také zadat hodnotu 0 pro a @publisher_security_mode přihlašovací informace do SQL Server pro @publisher_login a @publisher_password. Přejděte ke kroku 3.

  3. Na Publisher proveďte sp_addpublication (Transact-SQL). Zadejte název publikace pro @publication, a pro @repl_freq parametr uveďte hodnotu pro snapshot snapshot publikaci nebo hodnotu pro continuous transakční publikaci. Uveďte jakékoli další možnosti publikace. To definuje publikaci.

    Note

    Názvy publikací nesmí obsahovat následující znaky:

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

  4. Na Publisher proveďte sp_addpublication_snapshot (Transact-SQL). Zadejte název publikace použitý v kroku 3 pro @publication a přihlašovací údaje systému Windows, pod nimiž běží Snapshot Agent pro @snapshot_job_name a @password. Pokud agent použije SQL Server Authentication při připojení k Publisher, musíte také zadat hodnotu 0 pro a @publisher_security_mode přihlašovací informace do SQL Server pro @publisher_login a publisher_password. To vytváří pracovní pozici Snapshot Agent pro publikaci.

    Important

    Při konfiguraci publisheru se vzdáleným distributorem se hodnoty zadané pro všechny parametry, včetně job_login a job_password, odešlou distributorovi jako prostý text. Před spuštěním této uložené procedury byste měli šifrovat připojení mezi vydavatelem a jeho vzdáleným distributorem. Další informace najdete v tématu Povolení šifrovaných připojení k databázovému stroji (SQL Server Configuration Manager).

  5. Přidejte do publikace články. Další informace najdete v tématu Definování článku.

  6. Spusťte úlohu Snapshot Agent pro vygenerování počátečního snímku pro tuto publikaci. Další informace naleznete v tématu Vytvoření a použití počátečního snímku.

Vytvořte sloučenou publikaci

  1. Na Publisher spusťte sp_replicationdboption (Transact-SQL), aby bylo možné publikovat aktuální databázi pomocí replikace sloučení.

  2. Na serveru Publisher v databázi publikace spusťte příkaz sp_addmergepublication (Transact-SQL). Uveďte název publikace pro @publication a jakékoli další možnosti publikace. To definuje publikaci.

    Note

    Názvy publikací nesmí obsahovat následující znaky:

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

  3. Na Publisher proveďte sp_addpublication_snapshot (Transact-SQL). Zadejte název publikace použitý v kroku 2 pro @publication a přihlašovací údaje Windows, pod kterými Snapshot Agent běží pro @snapshot_job_name a @password. Pokud agent použije SQL Server Authentication při připojení k Publisher, musíte také zadat hodnotu 0 pro a @publisher_security_mode přihlašovací informace do SQL Server pro @publisher_login a @publisher_password. To vytváří pracovní pozici Snapshot Agent pro publikaci.

    Important

    Při konfiguraci publisheru se vzdáleným distributorem se hodnoty zadané pro všechny parametry, včetně job_login a job_password, odešlou distributorovi jako prostý text. Před spuštěním této uložené procedury byste měli šifrovat připojení mezi vydavatelem a jeho vzdáleným distributorem. Další informace najdete v tématu Povolení šifrovaných připojení k databázovému stroji (SQL Server Configuration Manager).

  4. Přidejte do publikace články. Další informace najdete v tématu Definování článku.

  5. Spusťte úlohu Snapshot Agent pro vygenerování počátečního snímku pro tuto publikaci. Další informace naleznete v tématu Vytvoření a použití počátečního snímku.

Příklad (Transact-SQL)

Tento příklad vytváří transakční publikaci. Skriptovací proměnné se používají k předávání přihlašovacích údajů Windows, které jsou nutné k vytvoření úloh pro Snapshot Agent a Log Reader Agent.

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

Tento příklad vytváří publikaci sloučení. Skriptovací proměnné se používají k předávání přihlašovacích údajů Windows, které jsou potřebné k vytvoření úlohy pro Snapshot Agent.

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

Použijte objekty pro správu replikace (RMO)

Publikace můžete vytvářet programově pomocí Replication Management Objects (RMO). RMO třídy, které použijete k vytvoření publikace, závisí na typu publikace, kterou vytvoříte.

Vytvořte snapshot nebo transakční publikaci

  1. Vytvořte připojení k Publisheru pomocí ServerConnection třídy.

  2. Vytvořte instanci třídy ReplicationDatabase pro databázi publikací, nastavte vlastnost ConnectionContext na instanci ServerConnection z kroku 1 a zavolejte metodu LoadProperties. Pokud LoadProperties vrací false, ověřte, že databáze existuje.

  3. Pokud je vlastnost EnabledTransPublishingfalse, nastavte ji na true.

  4. Pro transakční publikaci zkontrolujte hodnotu nemovitosti LogReaderAgentExists . Pokud má tato vlastnost hodnotu true, pro tuto databázi již existuje úloha agenta Log Read Agent. Pokud je tato vlastnost false, proveďte následující:

  5. Vytvořte instanci třídy TransPublication a nastavte následující vlastnosti pro tento objekt:

  6. Zavolejte metodu Create a vytvořte publikaci.

    Important

    Při konfiguraci Publisher s vzdáleným distributorem jsou hodnoty dodané pro všechny vlastnosti, včetně SnapshotGenerationAgentProcessSecurity, odesílány distributorovi jako prostý text. Před voláním metody byste měli zašifrovat připojení mezi vydavatelem a jeho vzdáleným distributorem Create . Další informace najdete v tématu Povolení šifrovaných připojení k databázovému stroji (SQL Server Configuration Manager).

  7. Zavolejte metodu CreateSnapshotAgent a vytvořte pro publikaci úlohu agenta Snapshot.

Vytvořte sloučenou publikaci

  1. Vytvořte připojení k Publisheru pomocí ServerConnection třídy.

  2. Vytvořte instanci třídy ReplicationDatabase pro databázi publikací, nastavte vlastnost ConnectionContext na instanci ServerConnection z kroku 1 a zavolejte metodu LoadProperties. Pokud LoadProperties vrací false, ověřte, že databáze existuje.

  3. Pokud je EnabledMergePublishing vlastnost false, nastavte ji na true a zavolejte CommitPropertyChanges.

  4. Vytvořte instanci třídy MergePublication a nastavte následující vlastnosti pro tento objekt:

  5. Zavolejte způsob, Create jak publikaci vytvořit.

    Important

    Při konfiguraci Publisher s vzdáleným distributorem jsou hodnoty dodané pro všechny vlastnosti, včetně SnapshotGenerationAgentProcessSecurity, odesílány distributorovi jako prostý text. Před voláním metody byste měli zašifrovat připojení mezi vydavatelem a jeho vzdáleným distributorem Create . Další informace najdete v tématu Povolení šifrovaných připojení k databázovému stroji (SQL Server Configuration Manager).

  6. Zavolejte metodu CreateSnapshotAgent pro vytvoření práce Snapshot Agent pro publikaci.

Příklady (RMO)

Tento příklad umožňuje databázi AdventureWorks pro transakční publikování, definuje úlohu Log Reader Agenta a vytváří publikaci AdvWorksProductTran . Pro tuto publikaci musí být definován článek. Přihlašovací údaje k Windows účtům potřebné k vytvoření úlohy Log Reader Agent a Snapshot Agent jsou předávány za běhu. Chcete-li se naučit, jak použít RMO k definování snapshotů a transakčních článků, viz Definujte článek.

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

Tento příklad povolí databázi AdventureWorks pro publikování sloučením a vytvoří publikaci AdvWorksSalesOrdersMerge. Články musí být pro tuto publikaci stále definovány. Přihlašovací údaje k Windows účtu potřebné k vytvoření úlohy Snapshot Agent jsou předávány za běhu. Chcete-li se naučit, jak použít RMO k definování článků pro sloučení, viz Definujte článek.

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