パブリケーションの作成

適用対象:yesSQL Server (サポートされているすべてのバージョン) YesAzure SQL Managed Instance

このトピックでは、SQL Server、Transact-SQL、または SQL Server Management Studio (RMO) を使用して レプリケーション管理オブジェクト を作成する方法について説明します。

このトピックの内容

はじめに

制限事項と制約事項

  • パブリケーション名およびアーティクル名には、% , * , [ , ] , | , : , " , ? を使用できません。 , ' , \ , / , < , >. データベース内のオブジェクトにこれらの文字が含まれる場合、それらをレプリケートする場合は、ウィザードの [記事] ページから使用できる [記事のプロパティ - > 記事] ダイアログ ボックスで、オブジェクト名とは異なる記事>名を指定する必要があります。

セキュリティ

可能であれば、実行時、ユーザーに対してセキュリティ資格情報の入力を要求します。 資格情報を格納する必要がある場合は、Microsoft サービスによって提供される暗号化サービスを使用Windows .NET Framework。

SQL Server Management Studio を使用する

パブリケーションの新規作成ウィザードにより、パブリケーションを作成し、アーティクルを定義します。 パブリケーションが作成された後、[パブリケーションのプロパティ - パブリケーション] ダイアログ ボックスでパブリケーションのプロパティを表示および> 変更します。 Oracle データベースからパブリケーションを作成する方法については、「Create a Publication from an Oracle Database」(Oracle データベースからパブリケーションを作成する) をご覧ください。

パブリケーションを作成し、アーティクルを定義するには

  1. Microsoft SQL Server Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。

  2. [レプリケーション] フォルダーを展開し、 [ローカル パブリケーション] フォルダーを右クリックします。

  3. [新しいパブリケーション] をクリックします。

  4. パブリケーションの新規作成ウィザードのページに従い、以下の操作を実行します。

    • サーバーでディストリビューションが構成されていない場合は、ディストリビューターを指定します。 ディストリビューションの構成の詳細については、「Configure Publishing and Distribution」(パブリッシュとディストリビューションの構成) をご覧ください。

      [ディストリビューター] ページで、パブリッシャー サーバーが独自のディストリビューター (ローカル ディストリビューター) として機能するように指定した場合、このサーバーはディストリビューターとして構成されていないため、パブリケーションの新規作成ウィザードでサーバーを構成します。 [スナップショット フォルダー] ページで、ディストリビューターの既定のスナップショット フォルダーを指定します。 スナップショット フォルダーは、共有として指定したディレクトリです。このフォルダーの読み取りと書き込みをするエージェントには、このフォルダーへのアクセスを可能にする十分な権限が必要です。 フォルダーの適切なセキュリティ保護の詳細については、「Secure the Snapshot Folder」(スナップショット フォルダーのセキュリティ保護) をご覧ください。

      別のサーバーがディストリビューターとして機能するように指定する場合は、パブリッシャーからディストリビューターへの接続のため、 [管理パスワード] ページでパスワードを入力する必要があります。 このパスワードは、リモート ディストリビューターでパブリッシャーを有効にしたときに指定したパスワードと一致する必要があります。

      詳しくは、「 Configure Distribution」を参照してください。

    • パブリケーション データベースを選択します。

    • パブリケーションの種類を選択します。 詳細については、「Types of Replication」(レプリケーションの種類) をご覧ください。

    • パブリッシュするデータおよびデータベース オブジェクトを指定します。必要に応じて、テーブル アーティクルから列をフィルター選択し、アーティクルのプロパティを設定します。

    • 必要に応じて、テーブル アーティクルから行をフィルター選択します。 詳細については、「パブリッシュされたデータのフィルター選択」を参照してください。

    • スナップショット エージェントのスケジュールを設定します。

    • 以下のレプリケーション エージェントの実行および接続に使用される資格情報を指定します。

      - すべてのパブリケーションのスナップショット エージェント

      - すべてのトランザクション パブリケーションのログ リーダー エージェント

      - 更新サブスクリプションを許可するトランザクション パブリケーションのキュー リーダー エージェント

      詳細については、「 Replication Agent Security Model 」および「 Replication Security Best Practices」を参照してください。

    • 必要に応じて、パブリケーションのスクリプトを作成します。 詳細については、「レプリケーションのスクリプト作成」を参照してください。

    • パブリケーションの名前を指定します。

Transact-SQL の使用

パブリケーションは、レプリケーションのストアド プロシージャを使用してプログラムから作成できます。 どのストアド プロシージャを使用するかは、作成するパブリケーションの種類によって異なります。

スナップショット パブリケーションまたはトランザクション パブリケーションを作成するには

  1. パブリケーション データベースPublisherで sp_replicationdboption (Transact-SQL) を実行して、スナップショットレプリケーションまたはトランザクション レプリケーションを使用して現在のデータベースのパブリケーションを有効にします。

  2. トランザクション パブリケーションの場合は、パブリケーション データベースのログ リーダー エージェント ジョブが存在するかどうかを確認します。 スナップショット パブリケーションの場合、この手順は不要です。

    • パブリケーション データベースのログ リーダー エージェント ジョブが存在する場合は、手順 3. に進みます。

    • パブリッシュされたデータベースに対して ログ リーダー エージェント ジョブが存在するかどうかが不明な場合は、パブリケーション データベースの Publisher で sp_helplogreader_agent (Transact-SQL) を実行します。

    • 結果セットが空の場合は、ログ リーダー エージェント ジョブを作成します。 次のPublisher、sp_addlogreader_agent (Transact-SQL) を実行します。 エージェントを実行Windowsに使用する Microsoft @job_name資格情報@password エージェントが Publisher に接続するときに SQL Server 認証を使用する場合は、@publisher_security_mode0 を指定し、@publisher_login と @publisher_password に Microsoft SQL Server ログイン情報指定する必要があります。 手順 3. に進みます。

  3. 次のPublisher、sp_addpublication (Transact-SQL) を実行します@publication のパブリケーション名を指定し、@repl_freq パラメーターにはスナップショット パブリケーションのスナップショットの値を指定し、トランザクション パブリケーションの場合は continuous を指定します。 必要に応じて、その他のパブリケーション オプションを指定してください。 これにより、パブリケーションが定義されます。

    Note

    パブリケーション名に、次の文字を含めることはできません。

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

  4. パブリッシャーで sp_addpublication_snapshot (Transact-SQL) を実行します。 手順 3. で使用するパブリケーション名を @publication に指定し、スナップショット エージェント が @snapshot_job_name および @password に対して実行される Windows 資格情報を指定します。 エージェントが Publisher に接続するときに SQL Server 認証を使用する場合は、@publisher_security_mode に 0 を指定し、@publisher_login と @publisher_password に SQL Server ログイン情報を指定する必要があります これにより、パブリケーション用のスナップショット エージェント ジョブが作成されます。

    重要

    リモート ディストリビューターを使用するパブリッシャーを構成する場合は、 job_login および job_passwordを含むすべてのパラメーターに指定された値がディストリビューターにプレーン テキストとして送信されます。 このストアド プロシージャを実行する前に、パブリッシャーとリモート ディストリビューターの間の接続を暗号化する必要があります。 詳細については、「データベース エンジンへの暗号化接続の有効化 (SQL Server 構成マネージャー)」を参照してください。

  5. パブリケーションにアーティクルを追加します。 詳しくは、「 アーティクルを定義」をご覧ください。

  6. スナップショット エージェント ジョブを起動して、このパブリケーションの初期スナップショットを生成します。 詳しくは、「 初期スナップショットの作成および適用」をご覧ください。

マージ パブリケーションを作成するには

  1. 次のPublisher、sp_replicationdboption (Transact-SQL) を実行して、マージ レプリケーションを使用して現在のデータベースのパブリケーションを有効にします。

  2. パブリケーション データベースPublisherに対して、sp_addmergepublication (Transact-SQL) を実行します。 パブリケーションの名前を指定し 、@publicationパブリケーション オプションを指定します。 これにより、パブリケーションが定義されます。

    Note

    パブリケーション名に、次の文字を含めることはできません。

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

  3. パブリッシャーで sp_addpublication_snapshot (Transact-SQL) を実行します。 手順 2. で使用したパブリケーション名を @publication に指定し、スナップショット エージェント を @snapshot_job_name および @password に対して実行する Windows 資格情報を指定します。 エージェントが Publisher に接続するときに SQL Server 認証を使用する場合は、@publisher_security_mode に 0 を指定し、@publisher_login と @publisher_password に SQL Server ログイン情報を指定する必要があります これにより、パブリケーション用のスナップショット エージェント ジョブが作成されます。

    重要

    リモート ディストリビューターを使用するパブリッシャーを構成する場合は、 job_login および job_passwordを含むすべてのパラメーターに指定された値がディストリビューターにプレーン テキストとして送信されます。 このストアド プロシージャを実行する前に、パブリッシャーとリモート ディストリビューターの間の接続を暗号化する必要があります。 詳細については、「データベース エンジンへの暗号化接続の有効化 (SQL Server 構成マネージャー)」を参照してください。

  4. パブリケーションにアーティクルを追加します。 詳しくは、「 アーティクルを定義」をご覧ください。

  5. スナップショット エージェント ジョブを起動して、このパブリケーションの初期スナップショットを生成します。 詳しくは、「 初期スナップショットの作成および適用」をご覧ください。

例 (Transact-SQL)

この例では、トランザクション パブリケーションを作成します。 スナップショット エージェント ジョブおよびログ リーダー エージェント ジョブの作成に必要な Windows 資格情報は、スクリプト変数を使用して渡しています。

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

この例では、マージ パブリケーションを作成します。 スナップショット エージェント ジョブの作成に必要な Windows 資格情報は、スクリプト変数を使用して渡しています。

-- 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'AdventureWorks2012'; 
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 [AdventureWorks2012]
EXEC sp_addmergepublication 
-- These parameters are optional.
  @publication = @publication,
  -- optional parameters 
  @description = N'Merge publication of AdventureWorks2012.',
  @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

レプリケーション管理オブジェクト (RMO) の使用

レプリケーション管理オブジェクト (RMO) を使用することで、プログラムによってパブリケーションを作成できます。 パブリケーションの作成に使用する RMO クラスは、作成するパブリケーションの種類によって異なります。

スナップショット パブリケーションまたはトランザクション パブリケーションを作成するには

  1. ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。

  2. パブリケーション データベースに ReplicationDatabase クラスのインスタンスを作成するには、 ConnectionContext プロパティに手順 1. の ServerConnection インスタンスを設定し、 LoadProperties メソッドを呼び出します。 が LoadProperties false を LoadPropertiesは、データベースが存在することを確認します。

  3. プロパティが EnabledTransPublishing false の EnabledTransPublishingtrue に設定 します

  4. トランザクション パブリケーションの場合は、LogReaderAgentExists プロパティの値を確認します。 このプロパティが trueの場合、このデータベースに対するログ リーダー エージェント ジョブが既に存在しています。 このプロパティが falseの場合、次の操作を実行してください。

  5. TransPublication クラスのインスタンスを作成し、このオブジェクトに次のプロパティを設定します。

  6. Create メソッドを呼び出して、パブリケーションを作成します。

    重要

    リモート ディストリビューターを使用するパブリッシャーを構成する場合は、 SnapshotGenerationAgentProcessSecurityを含むすべてのプロパティに指定された値がディストリビューターにプレーンテキストとして送信されます。 Create メソッドを呼び出す前に、パブリッシャーとリモート ディストリビューター間の接続を暗号化する必要があります。 詳細については、「データベース エンジンへの暗号化接続の有効化 (SQL Server 構成マネージャー)」を参照してください。

  7. CreateSnapshotAgent メソッドを呼び出して、パブリケーションに対するスナップショット エージェント ジョブを作成します。

マージ パブリケーションを作成するには

  1. ServerConnection クラスを使用して、パブリッシャーへの接続を作成します。

  2. パブリケーション データベースに ReplicationDatabase クラスのインスタンスを作成するには、 ConnectionContext プロパティに手順 1. の ServerConnection インスタンスを設定し、 LoadProperties メソッドを呼び出します。 が LoadProperties false を LoadPropertiesは、データベースが存在することを確認します。

  3. Property EnabledMergePublishingEnabledMergePublishingtrue に設定 、 を呼び出します

  4. MergePublication クラスのインスタンスを作成し、このオブジェクトに次のプロパティを設定します。

  5. Create メソッドを呼び出して、パブリケーションを作成します。

    重要

    リモート ディストリビューターを使用するパブリッシャーを構成する場合は、 SnapshotGenerationAgentProcessSecurityを含むすべてのプロパティに指定された値がディストリビューターにプレーンテキストとして送信されます。 Create メソッドを呼び出す前に、パブリッシャーとリモート ディストリビューター間の接続を暗号化する必要があります。 詳細については、「データベース エンジンへの暗号化接続の有効化 (SQL Server 構成マネージャー)」を参照してください。

  6. CreateSnapshotAgent メソッドを呼び出して、パブリケーションに対するスナップショット エージェント ジョブを作成します。

例 (RMO)

次の例では、AdventureWorks データベースでトランザクション パブリッシュを有効にして、ログ リーダー エージェント ジョブを定義し、AdvWorksProductTran パブリケーションを作成します。 このパブリケーションには、アーティクルを定義する必要があります。 ログ リーダー エージェント ジョブとスナップショット エージェント ジョブの作成に必要な Windows アカウントの資格情報は、実行時に渡されます。 RMO を使用してスナップショット アーティクルとトランザクション アーティクルを定義する方法については、「 Define an Article」を参照してください。

// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2012";
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 AdventureWorks2012 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 = "AdventureWorks2012"
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 AdventureWorks2012 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

次の例では、AdventureWorks データベースでマージ パブリッシュを有効にし、AdvWorksSalesOrdersMerge パブリケーションを作成します。 このパブリケーションには、アーティクルを定義する必要があります。 スナップショット エージェント ジョブの作成に必要な Windows アカウントの資格情報は、実行時に渡されます。 RMO を使用してマージ アーティクルを定義する方法については、「 Define an Article」を参照してください。

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

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 = "AdventureWorks2012"

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

参照

sqlcmd でのスクリプト変数の使用
データとデータベース オブジェクトのパブリッシュ
レプリケーション管理オブジェクトの概念
アーティクルの定義
パブリケーション プロパティの表示および変更
[ディストリビューションの構成]
ディストリビューターのセキュリティ保護
パブリッシャーのセキュリティ保護