Share via


sp_changemergearticle (Transact-SQL)

適用於:SQL Server

變更合併發行項的屬性。 這個預存程式會在發行集資料庫的發行者端執行。

Transact-SQL 語法慣例

語法

sp_changemergearticle
    [ @publication = ] N'publication'
    , [ @article = ] N'article'
    [ , [ @property = ] N'property' ]
    [ , [ @value = ] N'value' ]
    [ , [ @force_invalidate_snapshot = ] force_invalidate_snapshot ]
    [ , [ @force_reinit_subscription = ] force_reinit_subscription ]
[ ; ]

引數

[ @publication = ] N'publication'

發行項所在的發行集名稱。 @publication為 sysname,沒有預設值。

[ @article = ] N'article'

要變更之發行項的名稱。 @article為 sysname,沒有預設值。

[ @property = ] N'property'

要變更指定發行項和發行集的屬性。 @property為 sysname,而且可以是下表所列的其中一個值。

[ @value = ] N'value'

指定之屬性的新值。 @value是 nvarchar(2000),而且可以是下表所列的其中一個值。

下表描述發行項的屬性和這些屬性的值。

屬性 描述
allow_interactive_resolver true 啟用發行項的互動式解析程式使用。
false 停用發行項的互動式解析程式使用。
article_resolver 發行項的自定義解析程式。 僅適用於數據表發行項。
check_permissions (點陣圖) 0x00 不會檢查數據表層級許可權。
0x10 在發行者端套用 INSERT 語句之前,會在發行者端檢查數據表層級的許可權。
0x20 在發行者端套用 UPDATE 語句之前,會在發行者端檢查數據表層級許可權。
0x40 在發行者端套用訂閱者的 DELETE 語句之前,會在發行者端檢查數據表層級許可權。
column_tracking true 開啟數據行層級追蹤。 僅適用於數據表發行項。

注意: 發行超過 246 個數據行的數據表時,無法使用數據行層級追蹤。
false 關閉數據行層級追蹤,並在數據列層級留下衝突偵測。 僅適用於數據表發行項。
compensate_for_errors true 同步處理期間發生錯誤時,會執行補償動作。 如需詳細資訊,請參閱 sp_addmergearticle
false 不會執行補償動作,這是預設行為。 如需詳細資訊,請參閱 sp_addmergearticle

重要事項: 雖然受影響數據列中的數據似乎無法聚合,但只要解決任何錯誤、可以套用變更,以及數據聚合。 如果發行項的源數據表已經發行在另一個發行集中,則 兩個發行項的值 compensate_for_errors 都必須相同。
creation_script 用來在訂用帳戶資料庫中建立發行項的選擇性發行項架構腳本的路徑和名稱。
delete_tracking true DELETE 語句會復寫,這是預設行為。
false 不會復寫 DELETE 語句。

重要事項: 將 設定 delete_trackingfalse 會導致非聚合,而且必須手動移除已刪除的數據列。
description 文章的描述性專案。
destination_owner 如果不是 dbo,則為訂用帳戶資料庫中對象的擁有者名稱。
identity_range bigint,指定當發行項設定identityrangemanagementoption為 或 auto_identity_range 設定trueauto 時,指派新識別值時要使用的範圍大小。 僅適用於數據表發行項。 如需詳細資訊,請參閱復寫識別數據行的一節。
identityrangemanagementoption manual 停用自動識別範圍管理。 使用 NOT FOR REPLICATION 標記識別數據行,以啟用手動識別範圍處理。 如需詳細資訊,請參閱複寫識別資料欄
none 停用所有身分識別範圍管理。
logical_record_level_conflict_detection true 如果在邏輯記錄中的任何位置進行變更,就會偵測到衝突。 需要將 logical_record_level_conflict_resolution 設定為 true
false 默認衝突偵測會如 所指定使用 column_tracking
logical_record_level_conflict_resolution true 整個獲勝的邏輯記錄會覆寫遺失的邏輯記錄。
false 獲勝的數據列不會受限於邏輯記錄。
partition_options 0 發行項的篩選是靜態的,或不會產生每個數據分割的唯一數據子集,也就是「重疊」的數據分割。
1 分割區重疊,而且訂閱者端進行的 DML 更新無法變更數據列所屬的數據分割。
2 發行項的篩選會產生非重疊的數據分割,但多個訂閱者可以接收相同的分割區。
3 發行項的篩選會產生每個訂用帳戶唯一的非重疊分割區。

注意:如果您針對 partition_options指定 的值3,該文章中每個數據分割只能有單一訂用帳戶。 如果建立第二個訂用帳戶,其中新訂用帳戶的篩選準則會解析為與現有訂用帳戶相同的分割區,則會卸除現有的訂用帳戶。
pre_creation_command none 如果數據表已存在於訂閱者端,則不會採取任何動作。
delete 根據子集篩選中的 WHERE 子句發出刪除。
drop 在重新建立數據表之前,請先卸除數據表。
truncate 截斷目的地數據表。
processing_order int ,表示合併式發行集中發行項的處理順序。
pub_identity_range bigint,如果發行項已identityrangemanagementoption設定為 或 auto_identity_range 設定trueauto ,則指定配置給具有伺服器訂閱之訂閱者的範圍大小。 此識別範圍會保留給重新發行的訂閱者,以配置給自己的訂閱者。 僅適用於數據表發行項。 如需詳細資訊,請參閱復寫識別數據行的一節。
published_in_tran_pub true 發行項也會發行在交易式發行集中。
false 發行項也不會在交易式發行集中發行。
resolver_info 用來指定自定義解析程式所需的其他資訊。 某些 Microsoft 解析程式需要提供數據行做為解析程式的輸入。 resolver_infonvarchar(255),預設值為 NULL。 如需詳細資訊,請參閱 進階合併式複寫衝突 - COM 型解析程式
schema_option (點陣圖) 如需詳細資訊,請參閱本文稍後的一節。
0x00 停用 快照集代理程式 的腳本,並使用 中creation_script提供的腳本。
0x01 產生物件建立腳本(CREATE TABLE、CREATE PROCEDURE 等等)。
0x10 產生對應的叢集索引。
0x20 將使用者定義的數據類型轉換成訂閱者端的基底數據類型。 如果 UDT 資料行是主鍵的一部分,或是計算數據行參考 UDT 資料行,則當使用者定義類型 (UDT) 資料行上有 CHECK 或 DEFAULT 條件約束時,就無法使用這個選項。
0x40 產生對應的非叢集索引。
0x80 在主鍵上包含宣告的引用完整性。
0x100 如果已定義,則復寫數據表發行項上的使用者觸發程式。
0x200 復寫 FOREIGN KEY 條件約束。 如果參考的數據表不是發行集的一部分,則不會復寫已發行數據表上的所有FOREIGN KEY條件約束。
0x400 復寫 CHECK 條件約束。
0x800 複寫預設值。
0x1000 復寫數據行層級定序。
0x2000 復寫與已發佈發行發行項來源對象相關聯的擴充屬性。
0x4000 如果在數據表發行項上定義,則復寫唯一索引鍵。
0x8000 在編寫條件約束腳本時產生 ALTER TABLE 語句。
0x10000 將 CHECK 條件約束複寫為 NOT FOR REPLICATION,以便在同步處理期間不會強制執行條件約束。
0x20000 將FOREIGN KEY條件約束複寫為NOT FOR REPLICATION,以便在同步處理期間不會強制執行條件約束。
0x40000 復寫與數據分割數據表或索引相關聯的檔案群組。
0x80000 復寫數據分割數據表的數據分割配置。
0x100000 復寫數據分割索引的數據分割配置。
0x200000 複寫數據表統計數據。
0x400000 復寫預設系結
0x800000 複寫規則系結
0x1000000 複寫全文檢索索引
0x2000000 系結至 xml 資料行的 XML 架構集合不會復寫。
0x4000000 複寫 xml 資料行上的索引。
0x8000000 建立訂閱者上尚未存在的任何架構。
0x10000000 xml 資料 行轉換成 訂閱者上的 ntext
0x20000000 將 SQL Server 2005 (9.x) 中引進的大型物件數據類型 (nvarchar(max)varchar(max)varbinary(max)轉換為 SQL Server 2000 (8.x) 所支援的數據類型。
0x40000000 複寫許可權。
0x80000000 嘗試卸除不屬於發行集之任何物件的相依性。
0x100000000 如果 varbinary(max) 資料行上指定了 FILESTREAM 屬性,請使用此選項來復寫 FILESTREAM 屬性。 如果您要將數據表復寫至 SQL Server 2005 (9.x) 訂閱者,請勿指定此選項。 不支援將 FILESTREAM 數據行復寫至 SQL Server 2000 (8.x) 訂閱者的數據表,不論此架構選項的設定方式為何。 請參閱相關選項 0x800000000
0x200000000 將 SQL Server 2008 (10.0.x) 中引進的日期和時間資料類型(date、time、datetimeoffset 和 datetime2)轉換為舊版 SQL Server 所支援的數據類型。
0x400000000 複寫數據和索引的壓縮選項。 如需詳細資訊,請參閱 數據壓縮
0x800000000 將此選項設定為將 FILESTREAM 資料儲存在訂閱者端自己的檔案群組上。 如果未設定此選項,FILESTREAM 數據會儲存在預設檔案群組上。 複寫不會建立檔案群組;因此,如果您設定此選項,您必須先建立檔案群組,才能在訂閱者端套用快照集。 如需如何在套用快照集之前建立對象的詳細資訊,請參閱 套用快照集之前和之後執行腳本。

請參閱相關選項 0x100000000
0x1000000000 將 Common Language Runtime (CLR) 使用者定義型別 (UDT) 轉換為 varbinary(max),讓 UDT 類型的數據行可以復寫至執行 SQL Server 2005 (9.x) 的訂閱者。
0x2000000000 hierarchyid資料類型轉換成 varbinary(max),以便將hierarchyid類型的數據行復寫至執行 SQL Server 2005 (9.x) 的訂閱者。 如需如何在復寫數據表中使用hierarchyid數據行的詳細資訊,請參閱hierarchyid資料類型方法參考
0x4000000000 復寫數據表上任何篩選的索引。 如需已篩選索引的詳細資訊,請參閱建立篩選的索引 (機器翻譯)
0x8000000000 geographygeometry 數據類型轉換成 varbinary(max) ,以便將這些類型的數據行復寫至執行 SQL Server 2005 (9.x) 的訂閱者。
0x10000000000 復寫 geographygeometry 類型的數據行索引。
NULL 系統會自動產生發行項的有效架構選項。
status active 執行發行數據表的初始處理腳本。
unsynced 下次執行 快照集代理程式 時,會執行發行數據表的初始處理腳本。
stream_blob_columns true 復寫二進位大型物件數據行時,會使用數據流優化。 不過,某些合併式複寫功能,例如邏輯記錄,仍然可以防止使用數據流優化。 stream_blob_columns 當啟用 FILESTREAM 時,會設定為 true。 這可讓 FILESTREAM 數據的複寫以最佳方式執行,並減少記憶體使用率。 若要強制 FILESTREAM 數據表發行項不使用 Blob 串流,請將 設定 stream_blob_columns 為 false。

重要事項:啟用此記憶體優化可能會損害同步處理期間 合併代理程式 的效能。 只有當復寫包含數 MB 資料的數據行時,才應該使用此選項。
false 在復寫二進位大型對象數據行時,不會使用優化。
subscriber_upload_options 0 對具有用戶端訂閱之訂閱者端的更新沒有任何限制;變更會上傳至發行者。 變更此屬性可能需要重新初始化現有的訂閱者。
1 用戶端訂閱的訂閱者允許變更,但不會上傳至發行者。
2 用戶端訂用帳戶的訂閱者上不允許變更。
subset_filterclause 指定水平篩選的 WHERE 子句。 僅適用於數據表發行項。

重要: 基於效能考慮,建議您不要將函式套用至參數化數據列篩選子句中的數據行名稱,例如 LEFT([MyColumn]) = SUSER_SNAME()。 如果您在篩選子句中使用HOST_NAME並覆寫HOST_NAME值,您可能必須使用 CONVERT 來轉換資料類型。 如需此案例最佳做法的詳細資訊,請參閱參數化篩選 - 參數化數據列篩選中的<覆寫HOST_NAME() 值>一節。
threshold 用於執行 SQL Server Compact 或舊版 SQL Server 之訂閱者的百分比值。 threshold會控制 合併代理程式 指派新的識別範圍。 使用閾值中指定的值百分比時,合併代理程式 會建立新的識別範圍。 當設定為 autoauto_identity_range 設定為 trueidentityrangemanagementoption使用。 僅適用於數據表發行項。 如需詳細資訊,請參閱復寫識別數據行的一節。
verify_resolver_signature 1 自定義解析程式上的數位簽名會經過驗證,以判斷其是否來自受信任的來源。
0 不會驗證自定義解析程式上的數位簽名,以判斷其是否來自信任的來源。
NULL (預設值) 傳回@property支援的值清單。

[ @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 表示合併發行項的變更會導致現有的訂閱重新初始化,並授與重新初始化訂閱的許可權。

如需變更時需要重新初始化所有現有訂閱的屬性,請參閱一節。

傳回碼值

0 (成功)或 1 (失敗)。

備註

sp_changemergearticle 用於合併式複寫。

因為 sp_changemergearticle 用來變更最初使用 sp_addmergearticle 所指定的發行項屬性,請參閱 sp_addmergearticle 以取得這些屬性的詳細資訊。

變更下列屬性需要產生新的快照集,而且您必須為 @force_invalidate_snapshot 參數指定 的值1

  • check_permissions
  • column_tracking
  • destination_owner
  • pre_creation_command
  • schema_options
  • subset_filterclause

變更下列屬性需要重新初始化現有的訂閱,而且您必須為 @force_reinit_subscription 參數指定 的值1

  • check_permissions
  • column_tracking
  • destination_owner
  • pre_creation_command
  • identityrangemanagementoption
  • subscriber_upload_options
  • subset_filterclause
  • creation_script
  • schema_option
  • logical_record_level_conflict_detection
  • logical_record_level_conflict_resolution

當您為 指定的值3partition_options時,每當執行 合併代理程式 且分割的快照集更快速地過期時,就會清除元數據。 使用此選項時,您應該考慮啟用訂閱者要求的分割快照集。 如需詳細資訊,請參閱 使用參數化篩選建立合併式發行集的快照集

設定 column_tracking 屬性時,如果數據表已在其他合併式發行集中發行,則數據行追蹤必須與根據此數據表的現有發行項所使用的值相同。 此參數僅適用於數據表發行項。

如果多個發行集根據相同的基礎表發行發行發行項,則變更 delete_tracking 一個發行項的 屬性或 compensate_for_errors 屬性會導致對以相同數據表為基礎的其他發行項進行相同的變更。

如果合併進程所使用的發行者登入/用戶帳戶沒有正確的數據表許可權,則會將無效的變更記錄為衝突。

當您變更的值 schema_option時,系統不會執行位更新。 這表示當您使用 sp_changemergearticle設定schema_option時,可能會關閉現有的位設定。 若要保留現有的設定,您應該在所設定的值與目前的 值之間執行 和 (Bitwise AND),其可藉由執行 sp_helpmergearticleschema_option決定。

警告

當您在出版物中執行許多 (也許數百個) 篇文章,且您 sp_changemergearticle 執行其中一篇文章時,可能需要很長的時間才能完成執行。

有效的架構選項數據表

下表說明允許 schema_option 的值,視發行項類型而定。

發行項類型 架構選項值
func schema only 0x010x2000
indexed view schema only 0x010x0400x0100、、 0x20000x400000x10000000x200000
proc schema only 0x010x2000
table 所有選項。
view schema only 0x010x0400x0100、、 0x20000x400000x10000000x200000

範例

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @article = N'SalesOrderHeader';

-- Enable column-level conflict tracking.
-- Changing this property requires that existing subscriptions
-- be reinitialized and that a new snapshot be generated.
USE [AdventureWorks2022]
EXEC sp_changemergearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'column_tracking', 
  @value = N'true',
  @force_invalidate_snapshot = 1,
  @force_reinit_subscription = 1;
GO

權限

只有系統管理員固定伺服器角色或db_owner固定資料庫角色的成員才能執行 sp_changemergearticle