sp_changemergearticle (Transact-SQL)

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

主題連結圖示Transact-SQL 語法慣例

語法

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

引數

  • [ @publication=] 'publication'
    這是發行項所在發行集的名稱。publication 是 sysname,沒有預設值。

  • [ @article=] 'article'
    這是要變更的發行項名稱。article 是 sysname,沒有預設值。

  • [ @property=] 'property'
    這是給定發行項和發行集要變更的屬性。property 是 nvarchar(30),它可以是下表列出的值之一。

  • [ @value=] 'value'
    這是指定屬性的新值。value 是 nvarchar(1000),它可以是下表列出的值之一。

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

    屬性

    說明

    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_tracking 設為 false 會造成無法聚合,您必須手動移除刪除的資料列。

    description

     

    發行項的描述項目。

    destination_owner

     

    如果訂閱資料庫中之物件的擁有者不是 dbo 的話,這便是訂閱資料庫中之物件的擁有者名稱。

    identity_range

     

    這是一個 bigint,指定當發行項的 identityrangemanagementoption 設為 autoauto_identity_range 設為 true 時,在指派新識別值時所用的範圍大小。只適用於資料表發行項。如需詳細資訊,請參閱<複寫識別欄位>的<合併式複寫>一節。

    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,或者 auto_identity_range 設為 true 時,配置給具有主訂閱之訂閱者的範圍大小。這個識別範圍保留供重新發行訂閱者配置給自己的訂閱者。只適用於資料表發行項。如需詳細資訊,請參閱<複寫識別欄位>的<合併式複寫>一節。

    published_in_tran_pub

    true

    發行項也在交易式發行集中發行。

     

    false

    發行項也不在交易式發行集中發行。

    resolver_info

     

    這用來指定自訂解析程式所需要的其他資訊。部分 Microsoft 解析程式需要用來當做解析程式輸入的資料行。resolver_info 是 nvarchar(255),預設值是 NULL。如需詳細資訊,請參閱<以 COM 為基礎的 Microsoft 解析程式>。

    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 中所導入的大型物件資料類型 (nvarchar(max)、varchar(max) 和 varbinary(max)) 轉換成 SQL Server 2000 所支援的資料類型。如需有關這些類型對應方式的詳細資訊,請參閱<在複寫拓撲中使用多個 SQL Server 版本>中的「針對舊版本對應新資料類型」一節。

     

    0x40000000

    複寫權限。

     

    0x80000000

    嘗試卸除對於不在發行集中之任何物件的相依性。

    0x100000000

    使用這個選項即可複寫 FILESTREAM 屬性 (如果它指定於 varbinary(max) 資料行上的話)。如果您要將資料表複寫至 SQL Server 2005 訂閱者,請勿指定這個選項。目前不支援將含有 FILESTREAM 資料行的資料表複寫至 SQL Server 2000 訂閱者,不論這個結構描述選項的設定方式為何都一樣。請參閱相關的選項 0x800000000

    0x200000000

    將 SQL Server 2008 中所導入的日期和時間資料類型 (date、time、datetimeoffset 和 datetime2) 轉換成舊版 SQL Server 所支援的資料類型。如需有關這些類型對應方式的詳細資訊,請參閱<在複寫拓撲中使用多個 SQL Server 版本>中的「針對舊版本對應新資料類型」一節。

    0x400000000

    複寫資料與索引的壓縮選項。如需詳細資訊,請參閱<建立壓縮資料表及索引>。

    0x800000000

    設定這個選項即可將 FILESTREAM 資料儲存在訂閱者端的檔案群組中。如果沒有設定這個選項,FILESTREAM 資料就會儲存在預設檔案群組中。複寫不會建立檔案群組。因此,如果您設定這個選項,就必須先建立檔案群組,然後再於訂閱者端套用快照集。如需有關如何在套用快照集之前建立物件的詳細資訊,請參閱<在套用快照集的前後執行指令碼>。

    請參閱相關的選項 0x100000000

    0x1000000000

    將 Common Language Runtime (CLR) 使用者定義型別 (UDT) 轉換成 varbinary(max),如此 UDT 類型的資料行就可以複寫至正在執行 SQL Server 2005 的訂閱者。

    0x2000000000

    將 hierarchyid 資料類型轉換成 varbinary(max),如此 hierarchyid 類型的資料行就可以複寫至正在執行 SQL Server 2005 的訂閱者。如需有關如何在複寫資料表中使用 hierarchyid 資料行的詳細資訊,請參閱<hierarchyid (Transact-SQL)>。

    0x4000000000

    複寫資料表上任何已篩選的索引。如需有關已篩選之索引的詳細資訊,請參閱<篩選索引設計指導方針>。

     

    0x8000000000

    將 geography 和 geometry 資料類型轉換成 varbinary(max),如此這些類型的資料行就可以複寫至正在執行 SQL Server 2005 的訂閱者。

     

    0x10000000000

    複寫 geography 和 geometry 類型之資料行的索引。

     

    NULL

    系統會自動產生發行項的有效結構描述選項。

    status

    active

    發行資料表的初始處理指令碼在執行中。

     

    unsynced

    在下次執行快照集代理程式時,執行發行資料表的初始處理指令碼。

    stream_blob_columns

    true

    當複寫二進位大型物件資料行時,使用資料流最佳化。不過,某些合併式複寫功能,如邏輯記錄,仍能夠防止使用資料流最佳化。啟用 FILESTREAM 時,stream_blob_columns 設為 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 3.5 SP2 或舊版 SQL Server 的訂閱者所用的百分比值。threshold 用來控制合併代理程式指派新識別範圍的時機。當使用 threshold 指定的百分比值,合併代理程式會建立新的識別範圍。使用時機是 identityrangemanagementoption 設為 auto,或者 auto_identity_range 設為 true 之時。只適用於資料表發行項。如需詳細資訊,請參閱<複寫識別欄位>的<合併式複寫>一節。

    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>。

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

  • check_permissions

  • column_tracking

  • destination_owner

  • pre_creation_cmd

  • schema_options

  • subset_filterclause

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

  • check_permissions

  • column_tracking

  • destination_owner

  • subscriber_upload_options

  • subset_filterclause

partition_options 指定的值是 3 時,每當合併代理程式執行時,都會清除中繼資料,資料分割快照集也會到期得更快。當使用這個選項時,您應該考慮啟用訂閱者要求的資料分割快照集。如需詳細資訊,請參閱<含參數化篩選之合併式發行集的快照集>。

當設定 column_tracking 屬性時,如果資料表已發行在其他合併式發行集中,資料行追蹤就必須與依據這份資料表的現有發行項所用的值相同。這個參數只適用於資料表發行項。

如果多個發行集根據相同的基礎資料表來發行發行項,變更 delete_tracking 屬性或發行項的 compensate_for_errors 屬性,會使基於相同資料表的其他發行項也進行相同的變更。

如果合併處理序所使用的發行者登入/使用者帳戶並沒有正確的資料表權限,就會將無效的變更記錄為衝突。

當變更 schema_option 的值時,系統不會執行位元更新。這表示當您利用 sp_changemergearticle 來設定 schema_option 時,可能會關閉現有的位元設定。若要保留現有的設定,應該在您設定的值和 schema_option 目前的值 (可以執行 sp_helpmergearticle 來判斷它的值) 之間執行 & (位元 AND)

有效的結構描述選項表

下表描述允許的 schema_option 值,這會隨著發行項類型而不同。

發行項類型

結構描述選項值

func schema only

0x010x2000

indexed view schema only

0x010x0400x01000x20000x400000x10000000x200000

proc schema only

0x010x2000

table

所有選項。

view schema only

0x010x0400x01000x20000x400000x10000000x200000

範例

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 [AdventureWorks2008R2]
EXEC sp_changemergearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'column_tracking', 
  @value = N'true',
  @force_invalidate_snapshot = 1,
  @force_reinit_subscription = 1;
GO

權限

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