データとデータベースオブジェクトの公開

適用対象:SQL ServerAzure SQL Managed Instance

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

データベースオブジェクト スナップショット レプリケーションおよびトランザクション レプリケーション マージレプリケーション
テーブル 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

出版物の作成

出版物を作成するには、以下の情報を提供します。

  • ディストリビューター。
  • スナップショット ファイルの場所。
  • パブリケーション データベース。
  • 作成するパブリケーションの種類 (スナップショット、トランザクション、更新可能なサブスクリプションを含むトランザクション、またはマージ)。
  • パブリケーションに含めるデータとデータベース オブジェクト (アーティクル)。
  • すべての種類のパブリケーションの静的行フィルターと列フィルター、およびマージ パブリケーションのパラメーター化された行フィルターと結合フィルター。
  • スナップショット エージェントのスケジュール。
  • 以下のエージェントが動作するアカウント:すべての出版物に対するスナップショット エージェント、すべてのトランザクション出版物に対するLog Readerエージェント、サブスクリプションの更新を可能にするトランザクション出版物のためのQueue Readerエージェント。
  • パブリケーションの名前と説明。

出版物との連携方法については、以下の記事をご覧ください。

記事や出版物を削除しても、サブスクライバーからオブジェクトが消えるわけではありません。

テーブルの公開

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

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

スキーマ オプションを指定する場合は、「スキーマ オプションの指定」または「SchemaOption」を参照してください。

パーティション化されたテーブルとインデックス

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

ストアドプロシージャの公開

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

トランザクション レプリケーションでは、ストアド プロシージャの定義の他に、ストアド プロシージャの実行もレプリケートできます。 この機能は、大量のデータに影響を与える保守志向のストアドプロシージャの結果を再現するのに有用です。 詳細については、「トランザクション レプリケーションにおけるパブリッシング ストアド プロシージャの実行」をご覧ください。

ビューの公開

すべての種類のレプリケーションで、ビューをレプリケートできます。 ビューとそれに付随するインデックス(インデックスビューであれば)をサブスクライバーにコピーできますが、ベーステーブルも複製しなければなりません。

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

ユーザー定義関数の公開

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

ユーザー定義型および別名データ型の公開

レプリケーションは、ユーザー定義型やエイリアスデータ型を使用するカラムを他のカラムと同様に扱い、サブスクライバーに複製します。 プロセスはテーブルを作成する前に、サブスクライバーで各複製型の CREATE TYPE 文を実行します。 ユーザー定義型の場合、レプリケーションは関連するアセンブリも各サブスクライバーにコピーします。 レプリケーションはユーザー定義型の変更やエイリアスデータ型をサブスクライバーに複製しません。

データベースで型を定義しても、出版物を作成する際にどの列にも参照しなければ、レプリケーションはその型をSubscribersにコピーしません。 後でそのタイプのカラムを作成して複製したい場合は、まず各サブスクライバーにその型(およびユーザー定義型の対応するアセンブリ)を手動でコピーしなければなりません。

フルテキストインデックスの公開

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

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

レプリケーションは、パブリッシュされたオブジェクトに対するさまざまなスキーマ変更をサポートしています。 適切な公開SQL Server Publisherオブジェクトに対して以下のスキーマ変更を加えた場合、レプリケーションはデフォルトでその変更をすべてのSQL Serverサブスクライバーに伝えます。

  • ALTER TABLE

  • ALTER VIEW

  • ALTER PROCEDURE

  • ALTER FUNCTION

  • ALTER TRIGGER

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

出版に関する考慮事項

データベースオブジェクトを公開する際には、以下の点を念頭に置いてください:

  • ユーザーは出版物の作成および初期スナップショットの際にデータベースにアクセスできますが、Publisherの活動が少ない時期に出版物を作成するのが最善です。

  • データベース内で論文を作成した後は名前を変更することはできません。 データベースの名前を変更するには、まずレプリケーションをデータベースから削除する必要があります。

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

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

  • 出版物名には以下のキャラクターを含めることはできません:% * [ ] |: " ? \ / <>。

オブジェクトの公開に関する制限

  • 掲載できる記事やコラムの最大数は、出版物の種類によって異なります。 詳細については、「SQL Server の最大容量仕様」の「レプリケーション オブジェクト」のセクションを参照してください。

  • 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 サブスクライバーで使用されます) を使用するパブリケーションのアーティクルの場合。既定では、所有者は空白のままになります。 既定の所有者は、サブスクライバーに接続しているディストリビューション エージェントまたはマージ エージェントで使用されるアカウントに関連付けられている所有者になります。

オブジェクト所有者は、 記事プロパティーズ - <Article> ダイアログボックスや、以下のストアドプロシージャ( sp_addarticlesp_addmergearticlesp_changearticlesp_changemergearticle)を通じて変更できます。 詳細については、「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更)、「Define an Article」 (アーティクルの定義)、および「View and Modify Article Properties」 (アーティクルのプロパティの表示および変更) を参照してください。

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

  • もしSQL Serverの旧バージョンを使っているサブスクライバーに公開する場合、そのバージョンの機能に制限されます。 この制限は、レプリケーション固有の機能だけでなく、製品全体の機能にも適用されます。

  • マージ出版物は互換性レベルを使用し、これにより出版物で使用できる機能を決定し、以前のSQL Serverを運用するサブスクライバーをサポートできます。

複数の出版物に表を掲載すること

レプリケーションは、複数の出版物での記事公開(データの再公開を含む)をサポートし、以下の制限があります。

  • もしトランザクション出版物とマージ出版物の両方に記事を掲載する場合は、マージ記事の @published_in_tran_pub プロパティをTRUEに設定してください。 プロパティの設定の詳細については、「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更)、「View and Modify Article Properties」 (アーティクルのプロパティの表示および変更) を参照してください。

    記事が取引的購読の一部であり、マージ出版物に含まれる場合は @published_in_tran_pub プロパティを設定してください。 デフォルトでは、トランザクションレプリケーションはサブスクライバーのテーブルが読み取り専用であることを前提としています。 マージレプリケーションがトランザクションサブスクリプション内のテーブルにデータ変更を加えると、データの収束が起こらないことがあります。 この問題を避けるために、マージ公開でダウンロード専用のテーブルを指定してください。 この設定により、マージ加入者がテーブルにデータ変更をアップロードするのを防ぎます。 詳細については、「ダウンロード専用アーティクルを使用したマージ レプリケーションのパフォーマンス最適化」を参照してください。

  • 更新サブスクリプションがキューに並んでいる状態で、マージ出版物とトランザクション出版物の両方で記事を公開することはできません。

  • 購読の更新をサポートするトランザクション出版物に含まれる記事の再掲載はできません。

  • 複数のトランザクション出版物で記事を公開し、その出版物はキュー更新サブスクリプションをサポートする場合、すべての出版物で以下のプロパティの価値が同じでなければなりません。

    プロパティ sp_addarticle のパラメーター
    ID 範囲の管理 @auto_identity_range (非推奨) および @identityrangemangementoption
    パブリッシャーの ID 範囲 @pub_identity_range
    識別子の範囲 @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
    識別子の範囲 @identity_range
    ID 範囲しきい値 @threshold
    パーティション オプション @partition_options
    BLOB 列のストリーミング @stream_blob_columns
    フィルターのタイプ @filter_type ( sp_addmergefilterのパラメーター)

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

  • トランザクションレプリケーションおよび非フィルタドマージレプリケーションは、複数のパブリケーションでテーブルを公開し、その後サブスクリプションデータベース内の単一のテーブル内で購読すること(一般にロールアップシナリオと呼ばれる)をサポートしています。 ロールアップは、複数の場所からのデータの一部を中央のサブスクライバーのテーブルに集約するためによく使われます。 フィルタリングされたマージ出版物は中央の購読者シナリオをサポートしていません。 マージレプリケーションの場合、ロールアップは通常、パラメータ化された行フィルターを備えた単一のパブリケーションを通じて実装されます。 詳しくは、「 Parameterized Row Filters」をご覧ください。