Yayın oluşturma

Şunlar için geçerlidir: SQL Server Azure SQL Yönetilen Örneği

Bu makale, SQL Server Management Studio, Transact-SQL veya Replication Management Objects (RMO) kullanılarak SQL Server'da yayın oluşturulmasının nasıl yapılacağını açıklar.

Sınırlamalar ve kısıtlamalar

  • Yayın ve makale adlarında aşağıdaki karakterlerin hiçbiri yer alamaz: %, *, [, :"?|]\/'<veya .> Veritabanındaki nesnelerde bu karakterlerden herhangi biri varsa ve onları çoğaltmak istiyorsanız, sihirbazdaki Makaleler sayfasından erişilebilir olan Makale Özellikleri - <Makale> iletişim kutusundaki nesne adından farklı bir makale adı belirtmeniz gerekir.

Security

Mümkün olduğunda, kullanıcılardan çalışma zamanında güvenlik kimlik bilgilerini girmelerini iste. Kimlik bilgilerini depolamanız gerekiyorsa, Microsoft Windows .NET Framework tarafından sağlanan şifreleme hizmetlerini kullanın.

SQL Server Management Studio'yu kullanma

Yeni Yayın Sihirbazı ile yayınlar oluşturun ve makaleleri tanımlayın. Bir yayın oluşturulduktan sonra, Yayın Özellikleri - <Yayın> iletişim kutusunda yayın özelliklerini görüntüleyin ve değiştirin. Oracle veritabanından yayın oluşturma hakkında bilgi için bkz. Bir Oracle Veritabanından Yayın Oluşturma.

Yayın oluşturma ve makaleleri tanımlama

  1. Microsoft SQL Server Management Studio'da Publisher'a bağlanın ve ardından sunucu düğümünü genişletin.

  2. Replikasyon klasörünü genişletin ve ardından Yerel Yayınlar klasörünü sağ tıklayın.

  3. Yeni Yayını seçin.

  4. Yeni Yayın Sihirbazı'ndaki sayfaları takip edin:

    • Sunucuda dağıtım yapılandırılmadıysa bir Dağıtıcı belirtin. Dağıtımın yapılandırılması hakkında daha fazla bilgi için Yayınlama ve Dağıtımı Konfigüre Et.

      Eğer Dağıtım sayfasında Publisher sunucusunun kendi Dağıtıcısı (yerel bir Distributor) olarak hareket edeceğini belirtirseniz ve sunucu Distributor olarak yapılandırılmamışsa, Yeni Yayın Büyücüsü sunucuyu yapılandıracaktır. Dağıtıcı için Snapshot Klasörü sayfasında varsayılan bir snapshot klasörü belirteceksiniz. Snapshot klasörü, sadece paylaşma olarak belirlediğiniz bir dizindir; Bu klasörden okuyan ve yazan ajanların ona erişmek için yeterli izinlere sahip olması gerekir. Klasörü uygun şekilde güvence altına almak hakkında daha fazla bilgi için Anlık Fotoğraf Klasörünü Güvence Altına Alın bkz.

      Başka bir sunucunun Dağıtıcı olarak görev yapması gerektiğini belirtirseniz, Publisher'dan Distributor'a yapılan bağlantılar için Yönetici Şifre sayfasına bir şifre girmeniz gerekir. Bu şifre, Publisher uzak Dağıtıcıda etkinleştirildiğinde belirtilen şifreyle eşleşmelidir.

      Daha fazla bilgi için bkz. Dağıtımı Yapılandırma.

    • Bir yayın veritabanı seçin.

    • Bir yayın türü seçin. Daha fazla bilgi için Çoğaltma Türleri bölümünü inceleyebilirsiniz.

    • Yayınlanacak veri ve veritabanı nesnelerini belirtin; isteğe bağlı olarak tablo makalelerinden sütunları filtreleyebilir ve makale özelliklerini ayarlayabilir.

    • Isteğe bağlı olarak tablo makalelerinden satır filtreleyebilirsiniz. Daha fazla bilgi için bkz . Yayımlanan Verileri Filtreleme.

    • Snapshot Agent zamanlamasını ayarlayın.

    • Aşağıdaki replikasyon ajanlarının çalıştığı ve bağlantı kurduğu kimlik bilgilerini belirtin:

    • İsteğe bağlı olarak yayını komut dosyasıyla oluşturabilirsiniz. Daha fazla bilgi için Scripting Replication bölümüne bakınız.

    • Yayın için bir isim belirtin.

Transact-SQL kullanma

Yayınlar, çoğaltma depolanan prosedürler kullanılarak programatik olarak oluşturulabilir. Kullanılan saklanan prosedürler, oluşturulan yayın türüne bağlıdır.

Bir anlık görüntü veya işlemsel yayın oluşturun

  1. Publisher'da, yayın veritabanı üzerinde, geçerli veritabanının anlık görüntü veya işlemsel çoğaltma kullanılarak yayımlanmasını etkinleştirmek için sp_replicationdboption (Transact-SQL) komutunu çalıştırın.

  2. İşlemsel bir yayın için, yayın veritabanı için bir Log Reader Agent işi olup olmadığını belirleyin. (Bu adım anlık yayınlar için zorunlu değildir.)

    • Yayın veritabanı için bir Log Reader Agent işi varsa, 3. adıma geçin.

    • Yayınlanmış bir veritabanı için Log Reader Agent işi olup olmadığından emin değilseniz, yayın veritabanındaki Publisher sp_helplogreader_agent (Transact-SQL) çalıştırın.

    • Sonuç kümesi boşsa, bir Log Reader Agent işi oluşturun. Publisher'da sp_addlogreader_agent (Transact-SQL) çalıştırın. @job_name ve @password için ajanın çalıştığı Microsoft Windows kimlik bilgilerini belirtin. Ajan, Yayımlayıcı'ya bağlanırken SQL Server Kimlik Doğrulaması'nı kullanacaksa, 0 için de @publisher_security_mode değerini ve @publisher_login ile @publisher_password için SQL Server oturum açma bilgilerini belirtmeniz gerekir. 3\. adıma geçin.

  3. Yayımcıda sp_addpublication (Transact-SQL) çalıştırın. @publication için bir yayın adı belirtin ve @repl_freq parametresi için, anlık görüntü yayınına yönelik olarak snapshot değerini veya işlemsel yayına yönelik olarak continuous değerini belirtin. Diğer yayın seçeneklerini belirtin. Bu, yayını tanımlar.

    Note

    Yayın adları aşağıdaki karakterleri içeremez:

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

  4. Publisher sırasında sp_addpublication_snapshot (Transact-SQL) uygula. 3. adımda @publication için kullanılan yayın adını ve Snapshot Agent’ın @snapshot_job_name ve @password için çalıştığı Windows kimlik bilgilerini belirtin. Eğer aracı, Publisher'a bağlanırken SQL Server Kimlik Doğrulaması'nı kullanacaksa, ayrıca 0 için @publisher_security_mode değerini ve @publisher_login ile publisher_password için SQL Server oturum açma bilgilerini de belirtmeniz gerekir. Bu, yayın için bir Snapshot Agent görevi oluşturur.

    Important

    Publisher'ı uzak bir Dağıtımcı ile yapılandırırken, job_login ve job_password dahil olmak üzere tüm parametreler için sağlanan değerler Dağıtımcıya düz metin olarak gönderilir. Bu saklı yordamı yürütmeden önce Yayımcı ile uzak Dağıtımcı arasındaki bağlantıyı şifrelemeniz gerekir. Daha fazla bilgi için bkz. Veritabanı Altyapısına Şifreli Bağlantıları Etkinleştirme (SQL Server Yapılandırma Yöneticisi).

  5. Yayına makale ekleyin. Daha fazla bilgi için bkz. Makale Tanımlama.

  6. Bu yayının ilk anlık görüntüsünü oluşturmak için Snapshot Agent işini başlatın. Daha fazla bilgi için bkz. İlk Anlık Görüntünün Oluşturulması ve Uygulanması.

Bir birleştirme yayını oluşturun

  1. Publisher’da, geçerli veritabanının birleştirme çoğaltması kullanılarak yayımlanmasını etkinleştirmek için sp_replicationdboption (Transact-SQL) komutunu çalıştırın.

  2. Publisher üzerinde, yayın veritabanında sp_addmergepublication (Transact-SQL) komutunu çalıştırın. @publication için yayına bir ad ve diğer yayın seçeneklerini belirtin. Bu, yayını tanımlar.

    Note

    Yayın adları aşağıdaki karakterleri içeremez:

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

  3. Publisher sırasında sp_addpublication_snapshot (Transact-SQL) uygula. Adım 2'de @publication için kullanılan yayın adını ve @snapshot_job_name ile @password için Snapshot Agent'ın altında çalıştığı Windows kimlik bilgilerini belirtin. Eğer aracı, Publisher'a bağlanırken SQL Server Kimlik Doğrulaması'nı kullanacaksa, ayrıca 0 için @publisher_security_mode değerini ve @publisher_login ile @publisher_password için SQL Server oturum açma bilgilerini de belirtmeniz gerekir. Bu, yayın için bir Snapshot Agent görevi oluşturur.

    Important

    Publisher'ı uzak bir Dağıtımcı ile yapılandırırken, job_login ve job_password dahil olmak üzere tüm parametreler için sağlanan değerler Dağıtımcıya düz metin olarak gönderilir. Bu saklı yordamı yürütmeden önce Yayımcı ile uzak Dağıtımcı arasındaki bağlantıyı şifrelemeniz gerekir. Daha fazla bilgi için bkz. Veritabanı Altyapısına Şifreli Bağlantıları Etkinleştirme (SQL Server Yapılandırma Yöneticisi).

  4. Yayına makale ekleyin. Daha fazla bilgi için bkz. Makale Tanımlama.

  5. Bu yayının ilk anlık görüntüsünü oluşturmak için Snapshot Agent işini başlatın. Daha fazla bilgi için bkz. İlk Anlık Görüntünün Oluşturulması ve Uygulanması.

Örnek (Transact-SQL)

Bu örnek işlemsel bir yayın oluşturur. Scripting değişkenleri, Snapshot Agent ve Log Reader Agent için iş oluşturmak için gereken Windows kimlik bilgilerini geçirmek için kullanılır.

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

Bu örnek bir birleşme yayını oluşturur. Scripting değişkenleri, Snapshot Agent için işi oluşturmak için gereken Windows kimlik bilgilerini aktarmak için kullanılır.

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

Replikasyon Yönetim Nesneleri (RMO) Kullanın

Replikasyon Yönetim Nesneleri (RMO) kullanarak programatik olarak yayınlar oluşturabilirsiniz. Bir yayın oluşturmak için kullandığınız RMO sınıfları, oluşturduğunuz yayın türüne bağlıdır.

Bir anlık görüntü veya işlemsel yayın oluşturun

  1. sınıfını kullanarak ServerConnection Publisher'a bir bağlantı oluşturun.

  2. Yayın veritabanı için ReplicationDatabase sınıfının bir örneğini oluşturun, ConnectionContext özelliğini 1. adımdaki ServerConnection örneğine ayarlayın ve LoadProperties metodunu çağırın. Eğer LoadProperties dönerse false, veritabanının var olup olmadığını doğrulayın.

  3. Eğer EnabledTransPublishing özelliği false ise, onu true olarak ayarlayın.

  4. İşlemsel bir yayın için, LogReaderAgentExists özelliğinin değerini kontrol edin. Bu özellik true ise, bu veritabanı için zaten bir Log Read Agent görevi vardır. Eğer bu özellik ise false, aşağıdakileri yapın:

  5. Sınıfın TransPublication bir örneğini oluşturun ve bu nesne için aşağıdaki özellikleri belirleyin:

  6. Yayını oluşturmak için Create yöntemini çağırın.

    Important

    Bir Yayımcı uzak bir Dağıtıcı ile yapılandırılırken, SnapshotGenerationAgentProcessSecurity dahil olmak üzere tüm özellikler için sağlanan değerler Dağıtıcıya düz metin olarak gönderilir. Yöntemini çağırmadan Create önce Publisher ile uzak Dağıtımcı arasındaki bağlantıyı şifrelemeniz gerekir. Daha fazla bilgi için bkz. Veritabanı Altyapısına Şifreli Bağlantıları Etkinleştirme (SQL Server Yapılandırma Yöneticisi).

  7. Yayın için Snapshot Agent işini oluşturmak üzere CreateSnapshotAgent yöntemini çağırın.

Bir birleştirme yayını oluşturun

  1. sınıfını kullanarak ServerConnection Publisher'a bir bağlantı oluşturun.

  2. Yayın veritabanı için ReplicationDatabase sınıfının bir örneğini oluşturun, ConnectionContext özelliğini 1. adımdaki ServerConnection örneğine ayarlayın ve LoadProperties metodunu çağırın. Eğer LoadProperties dönerse false, veritabanının var olup olmadığını doğrulayın.

  3. Eğer EnabledMergePublishing Özelliği false ise, onu true olarak ayarlayın ve CommitPropertyChanges'ü çağırın.

  4. Sınıfın MergePublication bir örneğini oluşturun ve bu nesne için aşağıdaki özellikleri belirleyin:

  5. Yayını oluşturmak için Create metodunu çağırın.

    Important

    Bir Yayımcı uzak bir Dağıtıcı ile yapılandırılırken, SnapshotGenerationAgentProcessSecurity dahil tüm özellikler için sağlanan değerler Dağıtıcıya düz metin olarak gönderilir. Yöntemini çağırmadan Create önce Publisher ile uzak Dağıtımcı arasındaki bağlantıyı şifrelemeniz gerekir. Daha fazla bilgi için bkz. Veritabanı Altyapısına Şifreli Bağlantıları Etkinleştirme (SQL Server Yapılandırma Yöneticisi).

  6. Yayın için Snapshot Agent işini oluşturmak üzere CreateSnapshotAgent yöntemini çağırın.

Örnekler (RMO)

Bu örnek, AdventureWorks veritabanını işlemsel yayımlama için etkinleştirir, bir Log Reader Agent işi tanımlar ve AdvWorksProductTran yayımını oluşturur. Bu yayın için bir makale tanımlanmalıdır. Log Reader Agent işi ile Snapshot Agent işini oluşturmak için gerekli olan Windows hesabı kimlik bilgileri çalışma zamanında iletilir. RMO'yu anlık ve işlemsel makaleleri tanımlamak için nasıl kullanılacağını öğrenmek için Bir Makale Tanımla'ya bakınız.

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

Bu örnek, AdventureWorks veritabanını birleştirme yayımlaması için etkinleştirir ve AdvWorksSalesOrdersMerge yayımını oluşturur. Bu yayın için makaleler yine de tanımlanmalıdır. Snapshot Agent işini oluşturmak için gereken Windows hesabına ait kimlik bilgileri çalışma zamanında iletilir. Birleştirme makalelerini tanımlamak için RMO’nun nasıl kullanılacağını öğrenmek için Bir Makale Tanımlama bölümüne bakın.

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