パブリッシュされたデータのフィルタ選択
テーブル アーティクルをフィルタ選択すると、パブリッシュされるデータのパーティションを作成できます。パブリッシュされたデータをフィルタ選択することによって、次のことができるようになります。
ネットワーク上で送信するデータ量を最小限に抑えられる。
サブスクライバの保存領域の必要量を節減できる。
各サブスクライバの要件に基づいてパブリケーションとアプリケーションをカスタマイズできる。
サブスクライバがデータを更新する場合は、各データ パーティションはそれぞれ別のサブスクライバに送信される (2 つのサブスクライバが同一のデータ値を更新することはない) ので、競合をなくす、または減らすことができる。
重要なデータの転送を回避できる。行フィルタおよび列フィルタを使用して、サブスクライバのデータへのアクセスを制限できます。マージ レプリケーションでは、HOST_NAME() を含むパラメータ化されたフィルタを使用する場合に考慮する必要があるセキュリティの問題があります。詳細については、「パラメータ化された行フィルタ」の「HOST_NAME() によるフィルタ選択」を参照してください。
レプリケーションでは、4 種類のフィルタが利用できます。
静的行フィルタ。すべての種類のレプリケーションで使用できます。
静的行フィルタを使用して、パブリッシュする行のサブセットを選択できます。フィルタ選択されたパブリケーションに対するすべてのサブスクライバは、フィルタ選択されたテーブルの同じ行のサブセットを受信します。詳細については、このトピックの「静的行フィルタ」を参照してください。
列フィルタ。すべての種類のレプリケーションで使用できます。
列フィルタを使用して、パブリッシュする列のサブセットを選択できます。詳細については、このトピックの「列フィルタ」を参照してください。
パラメータ化された行フィルタ。マージ レプリケーションでのみ使用できます。
パラメータ化された行フィルタを使用して、パブリッシュする行のサブセットを選択できます。すべてのサブスクライバに同じ行のサブセットを送信する静的フィルタと異なり、パラメータ化された行フィルタは、サブスクライバにより提供されたデータの値を使用し、サブスクライバにそれぞれ別の行のサブセットを送信します。詳細については、「パラメータ化された行フィルタ」を参照してください。
結合フィルタ。マージ レプリケーションでのみ使用できます。
結合フィルタを使用して、1 つのパブリッシュされたテーブルから別のパブリッシュされたテーブルに行フィルタを拡張できます。詳細については、「結合フィルタ」を参照してください。
静的行フィルタ
次の図は、行 2、3、および 6 のみがパブリケーションに含まれるようにフィルタ選択される、パブリッシュされたテーブルを示します。
静的行フィルタは、WHERE 句を使用してパブリッシュするのに適したデータを選択します。WHERE 句の最後の部分を指定してください。Adventure Works のサンプル データベースの Product テーブル (AdventureWorks) を考えます。ここには、列 ProductLine が含まれます。マウンテン バイクに関連した製品についてのデータがある行のみをパブリッシュするには、ProductLine = 'M' を指定します。
静的行フィルタにより、各パブリケーションに対するデータセットは 1 つのみとなります。前の例では、すべてのサブスクライバは、マウンテン バイクに関連する製品についてのデータがある行のみを受信します。別のサブスクライバがロード バイクに関連する製品についてのデータがある行のみを必要としている場合は、次のようになります。
スナップショット レプリケーションまたはトランザクション レプリケーションにより、別のパブリケーションを作成し、両方のパブリケーションにテーブルを含めることができます (そのパブリケーションのアーティクルに対するフィルタ句で、ProductLine = 'R') を指定します)。
注意 トランザクション パブリケーションの行フィルタは、オーバーヘッドを大幅に増やす原因となる場合があります。パブリッシュされたテーブルのログ行ごとにアーティクルのフィルタ句を評価して、ログ行をレプリケートする必要があるかどうかを判断するからです。各レプリケーション ノードが全データの読み込みをサポートできる場合、および、データセット全体がそれほど大きくない場合には、トランザクション パブリケーションの行フィルタは避けてください。
マージ レプリケーションでは、静的行フィルタで複数のパブリケーションを作成するのではなく、パラメータ化された行フィルタを使用します。詳細については、「パラメータ化された行フィルタ」を参照してください。
静的行フィルタを定義または変更するには
SQL Server Management Studio: 静的行フィルタを定義および変更する方法 (SQL Server Management Studio)
レプリケーション Transact-SQL プログラミング : 静的行フィルタを定義および変更する方法 (レプリケーション Transact-SQL プログラミング)
レプリケーション管理オブジェクト (RMO) プログラミング : アーティクルを定義する方法 (RMO プログラミング)
列フィルタ
次の図は、列 C をフィルタ選択により除外するパブリケーションを示します。
以下に示すように、行フィルタと列フィルタを組み合わせることも可能です。
パブリケーションが作成されたら、列のフィルタ選択を使用して、既存のパブリケーションからは列を削除してパブリッシャのテーブルの列を保持することもできますし、パブリケーションに既存の列を含めることもできます。新しい列をテーブルに追加し、それをパブリッシュされたアーティクルに追加するなど、その他の変更の場合は、スキーマ変更のレプリケーションを使用します。詳細については、「パブリケーション データベースでのスキーマの変更」の「列の追加」および「列の削除」を参照してください。
次の表に一覧表示した列の型は、特定の種類のパブリケーションからはフィルタ選択により除外することができません。
列の型 |
パブリケーションの種類とオプション |
---|---|
主キー列 |
主キー列は、トランザクション パブリケーションのすべてのテーブルで必要です。マージ パブリケーションのテーブルでは、主キーは必要ではありませんが、主キー列が存在する場合、これをフィルタ選択することはできません。 |
外部キー列 |
パブリケーションの新規作成ウィザードを使用して作成されたすべてのパブリケーション。外部キー列は、Transact-SQL ストアド プロシージャを使用して、フィルタ選択できます。詳細については、「列フィルタを定義および変更する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。 |
rowguid 列 |
マージ パブリケーション1 |
msrepl_tran_version 列 |
更新可能なサブスクリプションを有効にしたスナップショットまたはトランザクション パブリケーション |
NULL を許容せず、既定値または IDENTITY プロパティが設定されていない列 |
更新可能なサブスクリプションを有効にしたスナップショットまたはトランザクション パブリケーション |
一意の制約またはインデックスのある列 |
更新可能なサブスクリプションを有効にしたスナップショットまたはトランザクション パブリケーション |
SQL Server 7.0 マージ パブリケーションのすべての列 |
SQL Server 7.0 マージ パブリケーションでは、列はフィルタ選択できません。 |
Timestamp |
更新可能なサブスクリプションを許可する SQL Server 7.0 のスナップショットまたはトランザクション パブリケーション |
1 マージ パブリケーションのテーブルをパブリッシュし、そのテーブルには既に ROWGUIDCOL プロパティが設定されたデータ型 uniqueidentifier の列が含まれている場合、レプリケーションは、rowguid という列を追加作成するのではなく、この列を使用することができます。この場合、この既存の列をパブリッシュする必要があります。
列フィルタを定義または変更するには
SQL Server Management Studio: 列フィルタを定義および変更する方法 (SQL Server Management Studio)
レプリケーション Transact-SQL プログラミング : 列フィルタを定義および変更する方法 (レプリケーション Transact-SQL プログラミング)
レプリケーション管理オブジェクト (RMO) プログラミング : アーティクルを定義する方法 (RMO プログラミング)
フィルタ選択に関する注意点
データをフィルタ選択するときは、以下の点に注意してください。
行フィルタで参照されるすべての列は、パブリケーションに含まれている必要があります。つまり、行フィルタで使用される列を除外する列フィルタを使用することはできません。
サブスクリプションを初期化した後でフィルタを追加、または変更する場合は、サブスクリプションは再初期化する必要があります。
フィルタで使用される列に許容される最大バイト数は、マージ パブリケーションでは、アーティクルにつき 1,024 バイト、トランザクション パブリケーションでは、アーティクルにつき 8,000 バイトです。
次のデータ型を持つ列は、行フィルタまたは結合フィルタで参照できません。
varchar(max) and nvarchar(max)
varbinary(max)
text and ntext
image
XML
UDT
トランザクション レプリケーションでは、インデックス付きビューをビューまたはテーブルとしてレプリケートできます。このビューをテーブルとしてレプリケートする場合、テーブルから列をフィルタ選択することはできません。