sp_addmergefilter (Transact-SQL)

適用対象: SQL Server Azure SQL Managed Instance

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

Transact-SQL 構文表記規則

構文

sp_addmergefilter
    [ @publication = ] N'publication'
    , [ @article = ] N'article'
    , [ @filtername = ] N'filtername'
    , [ @join_articlename = ] N'join_articlename'
    , [ @join_filterclause = ] N'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 = ] N'publication'

マージ フィルターが追加されるパブリケーションの名前。 @publicationsysname で、既定値はありません。

[ @article = ] N'article'

マージ フィルターを追加するアーティクルの名前。 @articlesysname で、既定値はありません。

[ @filtername = ] N'filtername'

フィルターの名前。 @filtername は必須のパラメーターです。 @filternamesysname で、既定値はありません。

[ @join_articlename = ] N'join_articlename'

マージ フィルターのフィルター条件を満たす子アーティクルの行を決定するには、 @articleで指定された子アーティクルの親アーティクルを、 @join_filterclauseで指定された結合句を使用して結合する必要があります。 @join_articlenamesysname で、既定値はありません。 アーティクルは、 @publicationによって指定されたパブリケーションに含まれている必要があります。

[ @join_filterclause = ] N'join_filterclause'

マージ フィルターを修飾する行を決定するために、 @articleで指定された子アーティクルと、 @join_articleで指定された親アーティクルの結合に使用する必要がある join 句。 @join_filterclausenvarchar(1000)で、既定値はありません。

[ @join_unique_key = ] join_unique_key

子アーティクル @article と親アーティクル @join_article の間の結合が、一対多、一対一、多対一、または多対多であるかどうかを指定します。 @join_unique_keyint で、既定値は 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ビットで、既定値は 0 です。

  • 0 は、マージ アーティクルに対する変更によってスナップショットが無効になることがないように指定します。 ストアド プロシージャが変更に新しいスナップショットが必要であることを検出した場合、エラーが発生し、変更は行われません。

  • 1 は、マージ アーティクルに対する変更によってスナップショットが無効になる可能性があることを指定します。また、新しいスナップショットを必要とする既存のサブスクリプションがある場合は、既存のスナップショットを古いスナップショットとしてマークし、新しいスナップショットを生成するためのアクセス許可を付与します。

[ @force_reinit_subscription = ] force_reinit_subscription

このストアド プロシージャによって実行されるアクションで、既存のサブスクリプションの再初期化が必要になる可能性があることを確認します。 @force_reinit_subscriptionbit で、既定値は 0 です。

  • 0 は、マージ アーティクルに対する変更によってサブスクリプションが再初期化されないように指定します。 変更によってサブスクリプションの再初期化が必要であることがストアド プロシージャによって検出された場合、エラーが発生し、変更は行われません。

  • 1 は、マージ アーティクルに変更を加えて既存のサブスクリプションを再初期化し、サブスクリプションの再初期化を実行するためのアクセス許可を付与することを指定します。

[ @filter_type = ] filter_type

追加するフィルターの種類を指定します。 @filter_typetinyint で、次のいずれかの値を指定できます。

Value 説明
1 結合フィルターのみです。 SQL Server Compact サブスクライバーをサポートするために必要です。
2 論理レコードリレーションシップのみ。
3 結合フィルターと論理レコードリレーションシップの両方。

詳細については、「Group Changes to Related Rows with Logical Records」 (論理レコードによる関連行への変更のグループ化) を参照してください。

リターン コードの値

0 (成功) または 1 (失敗)。

解説

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

sp_addmergefilter は、テーブル アーティクルでのみ使用できます。 ビューとインデックス付きビューの記事はサポートされていません。

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

論理レコードを使用するには、パブリケーションとアーティクルが複数の要件を満たしている必要があります。 詳細については、「Group Changes to Related Rows with Logical Records」 (論理レコードによる関連行への変更のグループ化) を参照してください。

通常、このオプションは、公開された主キー テーブルへの外部キー参照であるアーティクルに使用され、主キー テーブルにはアーティクルで定義されたフィルターがあります。 主キー行のサブセットは、サブスクライバーにレプリケートされる外部キー行を決定するために使用されます。

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

テーブル アーティクルでパラメーター化された行フィルターと結合フィルターの両方を使用する場合、レプリケーションでは、行がサブスクライバーのパーティションに属しているかどうかを判断します。 これは、(AND 演算子を使用して) 2 つの条件の積集合を評価するのではなく、フィルター関数または結合フィルター (OR 演算子を使用して) を評価することによって行われます。

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.EmployeeID = 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

アクセス許可

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