データとデータベース オブジェクトのパブリッシュ

パブリケーションの作成時には、パブリッシュするテーブルやその他のデータベース オブジェクトを選択します。レプリケーションを使用すると、以下のデータベース オブジェクトをパブリッシュできます。

データベース オブジェクト

スナップショット レプリケーションおよびトランザクション レプリケーション

マージ レプリケーション

テーブル

X

X

パーティション テーブル

X

X

ストアド プロシージャ - 定義 (Transact-SQL および CLR)

X

X

ストアド プロシージャ - 実行 (Transact-SQL および CLR)

X

不可

ビュー

X

X

インデックス付きビュー

X

X

テーブルとしてのインデックス付きビュー

X

不可

ユーザー定義型 (CLR)

X

X

ユーザー定義関数 (Transact-SQL および CLR)

X

X

別名データ型

X

X

フルテキスト インデックス

X

X

スキーマ オブジェクト (制約、インデックス、ユーザー DML トリガ、拡張プロパティ、および照合順序)

X

X

パブリケーションの作成

パブリケーションを作成するには、次の情報を指定します。

  • ディストリビュータ。

  • スナップショット ファイルの場所。

  • パブリケーション データベース。

  • 作成するパブリケーションの種類 (スナップショット、トランザクション、更新可能なサブスクリプションを含むトランザクション、またはマージ)。

  • パブリケーションに含めるデータとデータベース オブジェクト (アーティクル)。

  • すべての種類のパブリケーションの静的行フィルタと列フィルタ、およびマージ パブリケーションのパラメータ化された行フィルタと結合フィルタ。

  • スナップショット エージェントのスケジュール。

  • エージェントの実行に使用するアカウント。対象となるエージェントは、スナップショット エージェント (すべてのパブリケーション用)、ログ リーダー エージェント (すべてのトランザクション パブリケーション用)、およびキュー リーダー エージェント (サブスクリプションの更新が許可されているトランザクション パブリケーション用) です。

  • パブリケーションの名前と説明。

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

パブリケーションおよびアーティクルを変更するには

パブリケーションおよびアーティクルを削除するには

注意注意

アーティクルまたはパブリケーションを削除しても、オブジェクトはサブスクライバから削除されません。

テーブルのパブリッシュ

パブリッシュされるオブジェクトで最も一般的なのはテーブルです。以下のリンクは、テーブルのパブリッシュに関連する分野についての情報を提供します。

レプリケーションでテーブルをパブリッシュする場合、宣言された参照整合性 (主キー制約、参照に関する制約、一意制約)、インデックス、ユーザー DML トリガ (DDL トリガはレプリケートできません)、拡張プロパティ、照合順序などの、サブスクライバにコピーするスキーマ オブジェクトを指定できます。拡張プロパティのレプリケートは、パブリッシャとサブスクライバの間での初期同期中にのみ行われます。初期同期後に拡張プロパティを追加または変更した場合、その変更はレプリケートされません。

スキーマ オプションを指定するには

パーティション テーブルとパーティション インデックス

レプリケーションでは、パーティション テーブルとパーティション インデックスのパブリッシュがサポートされます。サポート レベルは、使用するレプリケーションの種類、パブリケーションに指定するオプション、およびパーティション テーブルに関連付けられたアーティクルによって異なります。詳細については、「パーティション テーブルとパーティション インデックスのレプリケート」を参照してください。

ストアド プロシージャのパブリッシュ

すべての種類のレプリケーションで、ストアド プロシージャの定義をレプリケートできます。各サブスクライバに CREATE PROCEDURE がコピーされます。共通言語ランタイム (CLR) ストアド プロシージャの場合は、関連するアセンブリもコピーされます。プロシージャの変更はサブスクライバにレプリケートされますが、関連するアセンブリの変更はレプリケートされません。

トランザクション レプリケーションでは、ストアド プロシージャの定義の他に、ストアド プロシージャの実行もレプリケートできます。これは、大量のデータに影響を与えるメンテナンス用ストアド プロシージャの結果をレプリケートする場合に便利です。詳細については、「トランザクション レプリケーションにおけるパブリッシング ストアド プロシージャの実行」を参照してください。

ビューのパブリッシュ

すべての種類のレプリケーションで、ビューをレプリケートできます。ビュー (インデックス付きビューの場合は付属するインデックスも含む) はサブスクライバにコピーできますが、ベース テーブルもレプリケートする必要があります。

トランザクション レプリケーションでは、インデックス付きビューをビューではなくテーブルとしてレプリケートできます。この場合、ベース テーブルをレプリケートする必要はありません。インデックス付きビューをテーブルとしてレプリケートするには、「sp_addarticle (Transact-SQL)」の @type パラメータに "indexed view logbased" のいずれかのオプションを指定します。sp_addarticle の使用方法の詳細については、「アーティクルを定義する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。

ユーザー定義関数のパブリッシュ

CLR 関数および Transact-SQL 関数の CREATE FUNCTION ステートメントが各サブスクライバにコピーされます。CLR 関数の場合は、関連するアセンブリもコピーされます。関数の変更はサブスクライバにレプリケートされますが、関連するアセンブリの変更はレプリケートされません。

ユーザー定義型および別名データ型のパブリッシュ

ユーザー定義型または別名データ型を使用する列は、他の列と同様にサブスクライバにレプリケートされます。レプリケートされた各データ型の CREATE TYPEステートメントがテーブルの作成前にサブスクライバで実行されます。ユーザー定義型の場合は、関連するアセンブリも各サブスクライバにコピーされます。ユーザー定義型および別名データ型の変更はサブスクライバにレプリケートされません。

データベースで型が定義されている場合でも、パブリケーションの作成時に列で参照されていなければ、その型はサブスクライバにコピーされません。この型を使用する列を後でデータベースに作成してレプリケートする場合、最初にこの型 (ユーザー定義型の場合は関連するアセンブリも含む) を手動で各サブスクライバにコピーする必要があります。

フルテキスト インデックスのパブリッシュ

CREATE FULLTEXT INDEX ステートメントが各サブスクライバにコピーされ、フルテキスト インデックスがサブスクライバに作成されます。ALTER FULLTEXT INDEX を使用して行われたフルテキスト インデックスの変更はレプリケートされません。

パブリッシュされたオブジェクトに対するスキーマの変更

レプリケーションは、パブリッシュされたオブジェクトに対するさまざまなスキーマ変更をサポートしています。パブリッシュされた適切なオブジェクトに対して、以下に示すスキーマ変更を SQL Server パブリッシャで実行した場合、既定ではすべての SQL Server サブスクライバにその変更が反映されます。

  • ALTER TABLE

  • ALTER VIEW

  • ALTER PROCEDURE

  • ALTER FUNCTION

  • ALTER TRIGGER

詳細については、「パブリケーション データベースでのスキーマの変更」を参照してください。

パブリッシングに関する注意点

データベース オブジェクトをパブリッシュするときは、以下の点に注意してください。

  • パブリケーションおよび初期スナップショットの作成中でもユーザーはデータベースにアクセスできますが、パブリッシャの利用状況が低い時間帯にパブリケーションを作成することをお勧めします。

  • データベースにパブリケーションを作成した後で、そのデータベースの名前を変更することはできません。データベース名を変更するには、まずデータベースからレプリケーションを削除する必要があります。詳細については、「レプリケーションの削除」を参照してください。

  • 1 つまたは複数の他のデータベース オブジェクトに依存するデータベース オブジェクトをパブリッシュする場合、参照されているオブジェクトをすべてパブリッシュする必要があります。たとえば、テーブルに依存しているビューをパブリッシュする場合は、そのテーブルもパブリッシュする必要があります。

    注意注意

    マージ パブリケーションにアーティクルを追加する際に、その新しいアーティクルに既存のアーティクルが依存している場合は、sp_addmergearticle および sp_changemergearticle@processing_order パラメータを使用して、両方のアーティクルの処理順序を指定する必要があります。たとえば、テーブルをパブリッシュし、テーブルが参照している関数はパブリッシュしない場合を考えます。この関数をパブリッシュしないと、サブスクライバ側でテーブルを作成できないとします。この場合は、この関数をパブリケーションに追加するときに、sp_addmergearticle@processing_order パラメータに値 1 を指定し、sp_changemergearticle@processing_order パラメータに値 2 を指定します。パラメータ @article にはテーブル名を指定します。この処理順序により、サブスクライバ側で関数に依存するテーブルを作成する前に、関数の作成が求められるようになります。各アーティクルに使用する値は、関数の値がテーブルの値より小さければ、別の値でもかまいません。

  • パブリケーション名に、% * [ ] | : " ? \ / < > を含めることはできません。

オブジェクトのパブリッシュに関する制限事項

  • パブリッシュできるアーティクルおよび列の最大数は、パブリケーションの種類によって異なります。詳細については、「SQL Server の最大容量仕様」の「レプリケーション オブジェクト」を参照してください。

  • WITH ENCRYPTION として定義されているストアド プロシージャ、ビュー、トリガ、およびユーザー定義関数は、SQL Server レプリケーションの一部としてパブリッシュすることはできません。

  • XML スキーマ コレクションはレプリケートできますが、初期スナップショットの後で変更をレプリケートすることはできません。

  • トランザクション レプリケーションでは、パブリッシュされたテーブルは主キーを持たなければなりません。テーブルがトランザクション レプリケーションのパブリケーションにある場合、主キー列に関連付けられたインデックスを無効にできません。これらのインデックスはレプリケーションで必要です。インデックスを無効にするには、まずパブリケーションからテーブルを削除する必要があります。

  • sp_bindefault (Transact-SQL) で作成されたバインドされたデフォルトはレプリケートできません (バインドされたデフォルトは非推奨のため、ALTER TABLE または CREATE TABLE の DEFAULT オプションで作成されたデフォルトを使用してください)。

スキーマおよびオブジェクトの所有権

既定では、パブリケーションの新規作成ウィザードは、スキーマとオブジェクトの所有権に関して、以下のように動作します。

  • 互換性レベル 90 以上のマージ パブリケーションと、スナップショット パブリケーション、およびトランザクション パブリケーションのアーティクルの場合、既定では、サブスクライバでのオブジェクト所有者は、パブリッシャでの対応するオブジェクトの所有者と同じになります。オブジェクトを所有するスキーマがサブスクライバに存在しない場合は、スキーマが自動的に作成されます。

  • 互換性が 90 未満のマージ パブリケーションのアーティクルの場合は、既定で所有者は空白になり、サブスクライバ上でのオブジェクトの作成中に dbo として指定されます。

  • Oracle パブリケーションのアーティクルの場合は、既定では、所有者は dbo として指定されます。

  • 文字モード スナップショット (SQL Server 以外のサブスクライバおよび SQL Server Compact 3.5 SP1 サブスクライバで使用されます) を使用するパブリケーション内のアーティクルの場合。既定で、所有者名は空白のままになります。既定では、サブスクライバに接続したディストリビューション エージェントまたはマージ エージェントが使用するアカウントに関連付けられた所有者になります。

オブジェクトの所有者は、[アーティクルのプロパティ - <Article>] ダイアログ ボックスと、ストアド プロシージャ sp_addarticlesp_addmergearticlesp_changearticle、および sp_changemergearticle で変更できます。詳細については、「パブリケーションとアーティクルのプロパティを表示および変更する方法 (SQL Server Management Studio)」、「アーティクルを定義する方法 (レプリケーション Transact-SQL プログラミング)」および「アーティクルのプロパティを表示および変更する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。

以前のバージョンの SQL Server を実行するサブスクライバへのデータのパブリッシュ

  • 以前のバージョンの SQL Server を実行するサブスクライバにパブリッシュする場合、レプリケーション固有の機能および製品の全般的な機能は共に、該当するバージョンの機能に制限されます。たとえば、SQL Server 2000 を実行しているサブスクライバには、ユーザー定義データ型および CLR 関数をパブリッシュできません。

  • マージ パブリケーションでは互換性レベルが利用されます。この互換性レベルによってパブリケーションで使用する機能が決定され、また以前のバージョンの SQL Server を実行するサブスクライバをサポートできるようになります。

詳細については、「レプリケーション トポロジにおける複数バージョンの SQL Server の使用」を参照してください。

複数のパブリケーションでのテーブルのパブリッシュ

レプリケーションでは、以下に示す制限付きで、アーティクルを複数のパブリケーションでパブリッシュできます (データの再パブリッシュを含む)。

  • トランザクション パブリケーションおよびマージ パブリケーションでアーティクルをパブリッシュする場合は、マージ アーティクルの @published\_in\_tran\_pub プロパティを TRUE に設定します。プロパティの設定の詳細については、「パブリケーションとアーティクルのプロパティを表示および変更する方法 (SQL Server Management Studio)」および「アーティクルのプロパティを表示および変更する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。

    アーティクルがトランザクション サブスクリプションの一部であり、このアーティクルがマージ パブリケーションに含まれている場合は、@published_in_tran_pub プロパティも設定する必要があります。これに該当する場合、特に指定がなければ、トランザクション レプリケーションでは、サブスクライバ側のテーブルが読み取り専用として扱われるものと想定しているので、注意が必要です。マージ レプリケーションがトランザクション サブスクリプションに含まれるテーブルに対してデータ変更を行うと、データの非収束が発生する可能性があります。この可能性を回避するため、マージ パブリケーションではこのようなテーブルをダウンロードのみとして指定することをお勧めします。これにより、マージ サブスクライバによってデータ変更がテーブルにアップロードされる状況を防止できます。詳細については、「ダウンロード専用アーティクルを使用したマージ レプリケーションのパフォーマンス最適化」を参照してください。

  • マージ パブリケーションおよびキュー更新サブスクリプションを使用するトランザクション パブリケーションのどちらも、アーティクルをパブリッシュすることはできません。

  • 更新サブスクリプションをサポートするトランザクション パブリケーションのアーティクルを再パブリッシュすることはできません。

  • キュー更新サブスクリプションをサポートする複数のトランザクション パブリケーションでアーティクルをパブリッシュする場合には、すべてのパブリケーションで、次に示すプロパティの値を同一にする必要があります。

    プロパティ

    sp_addarticle のパラメータ

    ID 範囲の管理

    @auto_identity_range (非推奨) および @identityrangemangementoption

    パブリッシャの ID 範囲

    @pub_identity_range

    ID 範囲

    @identity_range

    ID 範囲のしきい値

    @threshold

    これらのパラメータの詳細については、「sp_addarticle (Transact-SQL)」を参照してください。

  • 複数のマージ パブリケーションでアーティクルをパブリッシュする場合には、すべてのパブリケーションにわたって、以下に示すプロパティの値を同一にする必要があります。

    プロパティ

    sp_addmergearticle のパラメータ

    列追跡

    @column_tracking

    スキーマ オプション

    @schema_option

    列フィルタ

    @vertical_partition

    サブスクライバのアップロード オプション

    @subscriber_upload_options

    条件付き削除の追跡

    @delete_tracking

    エラー補正

    @compensate_for_errors

    ID 範囲の管理

    @auto_identity_range (非推奨) および @identityrangemangementoption

    パブリッシャの ID 範囲

    @pub_identity_range

    ID 範囲

    @identity_range

    ID 範囲のしきい値

    @threshold

    パーティションのオプション

    @partition_options

    BLOB 列のストリーミング

    @stream_blob_columns

    フィルタの種類

    @filter_type(sp_addmergefilter のパラメータ)

    これらのパラメータの詳細については、「sp_addmergearticle (Transact-SQL)」および「sp_addmergefilter (Transact-SQL)」を参照してください。

  • トランザクション レプリケーションおよびフィルタ選択されていないマージ レプリケーションでは、複数のパブリケーションでのテーブルのパブリッシュを行ってから、サブスクリプション データベースの単一テーブル内でサブスクライブすることがサポートされています (一般にロール アップ シナリオと呼ばれています)。ロール アップは、複数の場所からのデータを中央のサブスクライバの単一テーブルに集計することを目的として使用されるのが一般的です。フィルタ選択されたマージ パブリケーションでは、中央のサブスクライバを使用するシナリオはサポートされません。マージ レプリケーションでは通常、パラメータ化された行フィルタを使用した単一のパブリケーションを介してロール アップが実装されます。詳細については、「パラメータ化された行フィルタ」を参照してください。