データとデータベース オブジェクトのパブリッシュ
パブリケーションの作成時には、パブリッシュするテーブルやその他のデータベース オブジェクトを選択します。 レプリケーションを使用すると、以下のデータベース オブジェクトをパブリッシュできます。
データベース オブジェクト |
スナップショット レプリケーションおよびトランザクション レプリケーション |
マージ レプリケーション |
---|---|---|
テーブル |
× |
× |
パーティション テーブル |
× |
× |
ストアド プロシージャ - 定義 (Transact-SQL および CLR) |
× |
× |
ストアド プロシージャ - 実行 (Transact-SQL および CLR) |
× |
不可 |
ビュー |
× |
× |
インデックス付きビュー |
× |
× |
テーブルとしてのインデックス付きビュー |
× |
不可 |
ユーザー定義型 (CLR) |
× |
× |
ユーザー定義関数 (Transact-SQL および CLR) |
× |
× |
別名データ型 |
× |
× |
フルテキスト インデックス |
× |
× |
スキーマ オブジェクト (制約、インデックス、ユーザー DML トリガー、拡張プロパティ、および照合順序) |
× |
× |
パブリケーションの作成
パブリケーションを作成するには、次の情報を指定します。
ディストリビューター。
スナップショット ファイルの場所。
パブリケーション データベース。
作成するパブリケーションの種類 (スナップショット、トランザクション、更新可能なサブスクリプションを含むトランザクション、またはマージ)。
パブリケーションに含めるデータとデータベース オブジェクト (アーティクル)。
すべての種類のパブリケーションの静的行フィルターと列フィルター、およびマージ パブリケーションのパラメーター化された行フィルターと結合フィルター。
スナップショット エージェントのスケジュール。
次の各エージェントを実行するアカウント。すべてのパブリケーションのスナップショット エージェント、すべてのトランザクション パブリケーションのログ リーダー エージェント、サブスクリプションを更新できるトランザクション パブリケーションのキュー リーダー エージェント。
パブリケーションの名前と説明。
パブリケーションの操作方法の詳細については、次のトピックを参照してください。
注 |
---|
アーティクルまたはパブリケーションを削除しても、オブジェクトはサブスクライバーから削除されません。 |
テーブルのパブリッシュ
パブリッシュされるオブジェクトで最も一般的なのはテーブルです。 以下のリンクは、テーブルのパブリッシュに関連する分野についての情報を提供します。
レプリケーションでテーブルをパブリッシュする場合、宣言された参照整合性 (主キー制約、参照に関する制約、一意制約)、インデックス、ユーザー DML トリガー (DDL トリガーはレプリケートできません)、拡張プロパティ、照合順序などの、サブスクライバーにコピーするスキーマ オブジェクトを指定できます。 拡張プロパティのレプリケートは、パブリッシャーとサブスクライバーの間での初期同期中にのみ行われます。 初期同期の完了後に拡張プロパティを追加または変更した場合、その変更はレプリケートされません。
スキーマ オプションを指定するには、「スキーマ オプションの指定」または「SchemaOption」を参照してください。
パーティション テーブルとパーティション インデックス
レプリケーションでは、パーティション テーブルとパーティション インデックスのパブリッシュがサポートされます。 サポート レベルは、使用するレプリケーションの種類、パブリケーションに指定するオプション、およびパーティション テーブルに関連付けられたアーティクルによって異なります。 詳細については、「パーティション テーブルとパーティション インデックスのレプリケート」を参照してください。
ストアド プロシージャのパブリッシュ
すべての種類のレプリケーションでは、ストアド プロシージャの定義をレプリケートすることができます。CREATE PROCEDURE が、各サブスクライバーにコピーされます。 共通言語ランタイム (CLR) ストアド プロシージャの場合は、関連するアセンブリもコピーされます。 プロシージャの変更はサブスクライバーにレプリケートされますが、関連するアセンブリの変更はレプリケートされません。
トランザクション レプリケーションでは、ストアド プロシージャの定義の他に、ストアド プロシージャの実行もレプリケートできます。 これは、大量のデータに影響を与えるメンテナンス用ストアド プロシージャの結果をレプリケートする場合に便利です。 詳細については、「トランザクション レプリケーションにおけるパブリッシング ストアド プロシージャの実行」を参照してください。
ビューのパブリッシュ
すべての種類のレプリケーションで、ビューをレプリケートできます。 ビュー (インデックス付きビューの場合は付属するインデックスも含む) はサブスクライバーにコピーできますが、ベース テーブルもレプリケートする必要があります。
トランザクション レプリケーションでは、インデックス付きビューをビューではなくテーブルとしてレプリケートできます。この場合、ベース テーブルをレプリケートする必要はありません。 インデックス付きビューをテーブルとしてレプリケートするには、「sp_addarticle (Transact-SQL)」の @type パラメーターに "indexed view logbased" のいずれかのオプションを指定します。 sp_addarticle の使用方法の詳細については、「アーティクルの定義」を参照してください。
ユーザー定義関数のパブリッシュ
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 オプションで作成された既定値を使用してください)。
ディストリビューション エージェントが配信を行う順序が原因で、インデックス付きビューに NOEXPAND ヒントを含む関数を、参照テーブルやインデックス付きビューと同じパブリケーション内でパブリッシュすることはできません。 この問題を回避するために、最初のパブリケーション内にテーブルとインデックス付きビューを配置し、インデックス付きビューに NOEXPAND ヒントを含む関数を、最初のパブリケーションが完了した後にパブリッシュする 2 番目のパブリケーションに追加します。 または、それらの関数に対応するスクリプトを作成し、sp_addpublication の @post\_snapshot\_script パラメーターを使用してそれらのスクリプトを配信します。
スキーマおよびオブジェクトの所有権
既定では、パブリケーションの新規作成ウィザードは、スキーマとオブジェクトの所有権に関して、以下のように動作します。
互換性レベルが 90 以上のマージ パブリケーション、スナップショット パブリケーション、およびトランザクション パブリケーションのアーティクルの場合、既定では、サブスクライバー側でのオブジェクトの所有者は、パブリッシャー側での対応するオブジェクトの所有者と同じです。 オブジェクトを所有するスキーマがサブスクライバーに存在しない場合は、スキーマが自動的に作成されます。
互換性レベルが 90 未満のマージ パブリケーションのアーティクルの場合、既定では、所有者は空白のままとなり、サブスクライバー上にオブジェクトが作成される時に dbo として指定されます。
Oracle パブリケーションのアーティクルの場合、既定では、所有者は dbo として指定されます。
文字モードのスナップショットを使用するパブリケーションのアーティクル (SQL Server 以外のサブスクライバーと、SQL Server Compact サブスクライバーのために使用される) の場合、既定では、所有者は空白のままです。 既定の所有者は、サブスクライバーに接続しているディストリビューション エージェントまたはマージ エージェントで使用されるアカウントに関連付けられている所有者になります。
オブジェクトの所有者は、[アーティクルのプロパティ - <アーティクル>] ダイアログ ボックスや、次のストアド プロシージャを使用して変更できます。sp_addarticle、sp_addmergearticle、sp_changearticle、および sp_changemergearticle。 詳細については、「パブリケーション プロパティの表示および変更」、「アーティクルの定義」および「アーティクルのプロパティの表示および変更」を参照してください。
以前のバージョンの SQL Server を実行するサブスクライバーへのデータのパブリッシュ
以前のバージョンの SQL Server を実行するサブスクライバーにパブリッシュする場合、レプリケーション固有の機能および製品の全般的な機能は共に、該当するバージョンの機能に制限されます。
マージ パブリケーションでは互換性レベルが利用されます。この互換性レベルによってパブリケーションで使用する機能が決定され、また以前のバージョンの SQL Server を実行するサブスクライバーをサポートできるようになります。
複数のパブリケーションでのテーブルのパブリッシュ
レプリケーションでは、以下に示す制限付きで、アーティクルを複数のパブリケーションでパブリッシュできます (データの再パブリッシュを含む)。
トランザクション パブリケーションおよびマージ パブリケーションでアーティクルをパブリッシュする場合は、マージ アーティクルの @published\_in\_tran\_pub プロパティを TRUE に設定します。 プロパティの設定の詳細については、「パブリケーション プロパティの表示および変更」および「アーティクルのプロパティの表示および変更」を参照してください。
アーティクルがトランザクション サブスクリプションの一部であり、このアーティクルがマージ パブリケーションに含まれている場合は、@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)」を参照してください。
トランザクション レプリケーションおよびフィルター選択されていないマージ レプリケーションでは、複数のパブリケーションでのテーブルのパブリッシュを行ってから、サブスクリプション データベースの単一テーブル内でサブスクライブすることがサポートされています (一般にロール アップ シナリオと呼ばれています)。 ロール アップは、複数の場所からのデータを中央のサブスクライバーの単一テーブルに集計することを目的として使用されるのが一般的です。 フィルター選択されたマージ パブリケーションでは、中央のサブスクライバーを使用するシナリオはサポートされません。 マージ レプリケーションでは通常、パラメーター化された行フィルターを使用した単一のパブリケーションを介してロール アップが実装されます。 詳細については、「パラメーター化された行フィルター」を参照してください。