Share via


sp_addmergefilter (Transact-SQL)

別のテーブルとの結合に基づいてパーティションを作成するために、新しいマージ フィルタを追加します。このストアド プロシージャは、パブリッシャ側でパブリケーション データベースについて実行されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

sp_addmergefilter [ @publication = ] 'publication' 
        , [ @article = ] 'article' 
        , [ @filtername = ] 'filtername' 
        , [ @join_articlename = ] 'join_articlename' 
        , [ @join_filterclause = ] join_filterclause
    [ , [ @join_unique_key = ] join_unique_key ]
    [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
    [ , [ @force_reinit_subscription = ] force_reinit_subscription ]
    [ , [ @filter_type = ] filter_type ]

引数

  • [ @publication= ] 'publication'
    マージ フィルタを追加するパブリケーションの名前です。publication のデータ型は sysname で、既定値はありません。

  • [ @article= ] 'article'
    マージ フィルタを追加するアーティクルの名前です。article のデータ型は sysname で、既定値はありません。

  • [ @filtername= ] 'filtername'
    フィルタの名前です。filtername は必須パラメータです。filtername のデータ型は sysname で、既定値はありません。

  • [ @join_articlename= ] 'join_articlename'
    マージ フィルタのフィルタ条件に適合する子アーティクル内の行を判別するために、子アーティクル (article で指定) を join 句 (join_filterclause で指定) で結合する必要がある親アーティクルです。join_articlename のデータ型は sysname で、既定値はありません。アーティクルは publication で指定されたパブリケーション内に存在する必要があります。

  • [ @join_filterclause= ] join_filterclause
    マージ フィルタの条件を満たす行を判別するために、子アーティクル (article で指定) と親アーティクル (join_article で指定) の結合に使用する必要がある join 句です。join_filterclause のデータ型は nvarchar(1000) で、既定値はありません。

  • [ @join_unique_key= ] join_unique_key
    子アーティクル article と親アーティクル join_article の間の結合が一対多、一対一、多対一、多対多のいずれであるかを指定します。join_unique_key のデータ型は int で、既定値は 0 です。0 は多対一または多対多の結合を示します。1 は一対一または一対多の結合を示します。この値は、結合する列が join_article の一意キーを構成する場合、または join_filterclause が article の外部キーと join_article の主キーの間にある場合に 1 となります。

    注記注意

    一意性を保証する親アーティクルの元のテーブル内の結合する列に制約がある場合にのみ、このパラメータを 1 に設定します。join_unique_key を 1 に正しく設定しなかった場合は、データの非収束が発生する可能性があります。

  • [ @force_invalidate_snapshot= ] force_invalidate_snapshot
    このストアド プロシージャが実行する操作によって、既存のスナップショットが無効になることを許可します。force_invalidate_snapshot のデータ型は bit で、既定値は 0 です。

    0 に設定すると、マージ アーティクルへの変更によってスナップショットが無効になることはありません。変更に新しいスナップショットが必要であることをストアド プロシージャが検出すると、エラーが発生し、変更は加えられません。

    1 に設定すると、マージ アーティクルの変更によってスナップショットが無効になることがあります。また、新しいスナップショットを必要とする既存のサブスクリプションがある場合は、既存のスナップショットに古いスナップショットのマークを付けて、新しいスナップショットを生成することができます。

  • [ @force_reinit_subscription= ] force_reinit_subscription
    このストアド プロシージャが実行する操作によって、既存のサブスクリプションの再初期化が必要になることを許可します。force_reinit_subscription のデータ型は bit で、既定値は 0 です。

    0 に設定すると、マージ アーティクルへの変更によってサブスクリプションが再初期化されることはありません。変更にサブスクリプションの再初期化が必要であることをストアド プロシージャが検出すると、エラーが発生し、変更は加えられません。

    1 は、マージ アーティクルの変更によって既存のサブスクリプションが再初期化されることを示し、サブスクリプションの再初期化を許可します。

  • [ @filter_type= ] filter_type
    追加されるフィルタの型を指定します。filter_type のデータ型は tinyint で、次のいずれかの値を指定できます。

    説明

    1

    結合フィルタのみです。SQL Server Compact 3.5 SP2 のサブスクライバをサポートするために必要です。

    2

    論理レコード リレーションシップのみです。

    3

    結合フィルタおよび論理レコード リレーションシップの両方です。

    詳細については、「論理レコードによる関連行への変更のグループ化」を参照してください。

戻り値

成功した場合は 0 を、失敗した場合は 1 をそれぞれ返します。

説明

sp_addmergefilter はマージ レプリケーションで使用します。

sp_addmergefilter は、テーブル アーティクルに対してのみ使用できます。ビュー アーティクルおよびインデックス付きビュー アーティクルはサポートされません。

このプロシージャは、(結合フィルタを持つ場合でも持たない場合でも) 2 つのアーティクルの間に論理リレーションシップを追加するために使用できます。filter_type を使用して、追加されるマージ フィルタが結合フィルタ、論理リレーション、またはその両方であることを指定します。

論理レコードを使用するには、パブリケーションおよびアーティクルがいくつかの要件を満たしている必要があります。詳細については、「論理レコードによる関連行への変更のグループ化」を参照してください。

通常、パブリッシュされている主キー テーブルを参照する外部キーを持ち、その主キーがそのアーティクルで定義されたフィルタを持つようなアーティクルに対してこのオプションを使用します。主キー行のサブセットを使用して、サブスクライバにレプリケートする外部キー行を規定します。

2 つのパブリッシュされたアーティクルのコピー元のテーブルが同じテーブル オブジェクト名を共有している場合は、2 つのアーティクルの間に結合フィルタを追加することはできません。このような場合、それぞれのテーブルを所有するスキーマが異なっていて、それぞれが一意のアーティクル名を持っていても、結合フィルタの作成は失敗します。

パラメータ化された行フィルタと結合フィルタの両方がテーブル アーティクル上で使用される場合、レプリケーションでは、サブスクライバのパーティション内に行があるかどうかを判別します。この判別は、フィルタリング関数または結合フィルタのいずれかを評価 (OR 演算子を使用) して行います。2 つの条件の共通部分の評価 (AND 演算子を使用) では判別しません。

使用例

DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @table1 = N'Employee'; 
SET @table2 = N'SalesOrderHeader'; 
SET @table3 = N'SalesOrderDetail'; 
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';

-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table1, 
  @source_object = @table1, 
  @type = N'table', 
  @source_owner = @hrschema,
  @schema_option = 0x0004CF1,
  @description = N'article for the Employee table',
  @subset_filterclause = @filterclause;

-- Add an article for the SalesOrderHeader table that is filtered
-- based on Employee and horizontally filtered.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table2, 
  @source_object = @table2, 
  @type = N'table', 
  @source_owner = @salesschema, 
  @vertical_partition = N'true',
  @schema_option = 0x0034EF1,
  @description = N'article for the SalesOrderDetail table';

-- Add an article for the SalesOrderDetail table that is filtered
-- based on SaledOrderHeader.
EXEC sp_addmergearticle 
  @publication = @publication, 
  @article = @table3, 
  @source_object = @table3, 
  @source_owner = @salesschema,
  @description = 'article for the SalesOrderHeader table', 
  @identityrangemanagementoption = N'auto', 
  @pub_identity_range = 100000, 
  @identity_range = 100, 
  @threshold = 80,
  @schema_option = 0x0004EF1;

-- Add all columns to the SalesOrderHeader article.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Remove the credit card Approval Code column.
EXEC sp_mergearticlecolumn 
  @publication = @publication, 
  @article = @table2, 
  @column = N'CreditCardApprovalCode', 
  @operation = N'drop', 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table2, 
  @filtername = N'SalesOrderHeader_Employee', 
  @join_articlename = @table1, 
  @join_filterclause = N'Employee.BusinessEntityID = SalesOrderHeader.SalesPersonID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;

-- Add a merge join filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter 
  @publication = @publication, 
  @article = @table3, 
  @filtername = N'SalesOrderDetail_SalesOrderHeader', 
  @join_articlename = @table2, 
  @join_filterclause = N'SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID', 
  @join_unique_key = 1, 
  @filter_type = 1, 
  @force_invalidate_snapshot = 1, 
  @force_reinit_subscription = 1;
GO

権限

sp_addmergefilter を実行できるのは、固定サーバー ロール sysadmin または固定データベース ロール db_owner のメンバだけです。