sp_addmergefilter (Transact-SQL)
適用於:SQL Server Azure 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'
要加入合併篩選的發行集名稱。 @publication為 sysname,沒有預設值。
[ @article = ] N'article'
要加入合併篩選之發行項的名稱。 @article為 sysname,沒有預設值。
[ @filtername = ] N'filtername'
篩選的名稱。 @filtername是必要參數。 @filtername為 sysname,沒有預設值。
[ @join_articlename = ] N'join_articlename'
子發行項@article指定的父發行項必須使用@join_filterclause所指定的聯結子句來聯結,以判斷符合合併篩選條件篩選條件之子發行項中的數據列。 @join_articlename為 sysname,沒有預設值。 發行項必須位於@publication所指定的發行集中。
[ @join_filterclause = ] N'join_filterclause'
聯結子句,這個子句必須用來聯結@article指定的子發行項,以及@join_article所指定的父發行項,以判斷符合合併篩選條件的數據列。 @join_filterclause為 nvarchar(1000),沒有預設值。
[ @join_unique_key = ] join_unique_key
指定子發行項@article與父發行項之間的聯結@join_article是一對多、一對一、多對一或多對多。 @join_unique_key為 int,預設值為 0
。
0
表示多對一或多對多聯結。1
表示一對一或一對多聯結。
當1
聯結數據行在 @join_article中形成唯一索引鍵時,或者如果@join_filterclause是在 @article 中的外鍵與@join_article的主鍵之間。
警告
只有在父發行項的父發行項的聯結數據行上有一個條件約束,且保證唯一性時,才將此參數 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,而且可以是下列其中一個值。
值 | Description |
---|---|
1 |
僅聯結篩選條件。 支援 SQL Server Compact 訂閱者的必要專案。 |
2 |
僅限邏輯記錄關聯性。 |
3 |
聯結篩選和邏輯記錄關聯性。 |
如需詳細資訊,請參閱使用邏輯記錄分組相關資料列的變更。
傳回碼值
0
(成功) 或 1
(失敗)。
備註
sp_addmergefilter
用於合併式複寫。
sp_addmergefilter
只能與數據表發行項搭配使用。 不支持檢視和索引檢視發行項。
此程式也可以用來新增兩個發行項之間的邏輯關聯性,這些發行項之間可能或可能沒有聯結篩選條件。 @filter_type用來指定要加入的合併篩選是否為聯結篩選、邏輯關聯或兩者。
若要使用邏輯記錄,發行集和發行項必須符合數個需求。 如需詳細資訊,請參閱使用邏輯記錄分組相關資料列的變更。
一般而言,此選項會用於發行主鍵數據表的外鍵參考發行項,而主鍵數據表在其發行項中定義篩選條件。 主鍵數據列的子集可用來判斷複寫至訂閱者的外鍵數據列。
當兩個發行項的源數據表共用相同的數據表物件名稱時,您無法在兩個發行發行項之間加入聯結篩選。 在這種情況下,即使這兩個數據表都是由不同的架構所擁有,而且具有唯一的發行項名稱,聯結篩選的建立也會失敗。
當數據表發行項同時使用參數化數據列篩選和聯結篩選時,複寫會判斷數據列是否屬於訂閱者的分割區。 其方式是評估篩選函式或聯結篩選(使用 OR 運算符),而不是評估兩個條件的交集(使用 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.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
權限
只有系統管理員固定伺服器角色或db_owner固定資料庫角色的成員才能執行 sp_addmergefilter
。