sp_changearticle (Transact-SQL)

適用於:SQL ServerAzure SQL 受控執行個體

變更交易式或快照式發行集中發行項的屬性。 這個預存程式會在發行集資料庫的發行者端執行。

Transact-SQL 語法慣例

語法

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

引數

[ @publication = ] 'publication' 這是包含發行項的發行集名稱。 publicationsysname,預設值為 NULL。

[ @article = ] 'article' 這是要變更其屬性之發行項的名稱。 articlesysname,預設值為 NULL。

[ @property = ] 'property' 這是要變更的發行項屬性。 屬性nvarchar(100)

[ @value = ] 'value' 這是發行項屬性的新值。 valuenvarchar(255)

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

屬性 描述
creation_script 用來建立目標數據表之發行項架構腳本的路徑和名稱。 預設值是 NULL。
del_cmd 要執行的 DELETE 語句;否則,它會從記錄檔建構。
description 發行項的新描述性專案。
dest_object 提供這個項目的目的,是為了與舊版相容。 使用 dest_table
dest_table 新的目的地數據表。
destination_owner 目的地對象的擁有者名稱。
filter 要用來篩選數據表的新預存程式(水平篩選)。 預設值是 NULL。 無法在點對點復寫中變更發行集。
fire_triggers_on_snapshot true 套用初始快照集時,會執行復寫的使用者觸發程式。

注意:若要復寫觸發程式,schema_option位掩碼值必須包含值0x100
false 套用初始快照集時,不會執行復寫的使用者觸發程式。
identity_range 控制在訂閱者端指派的指派識別範圍大小。 不支援點對點複寫。
ins_cmd 要執行的 INSERT 語句;否則,它會從記錄檔建構。
pre_creation_cmd 預先建立命令,可在套用同步處理之前卸除、刪除或截斷目的地數據表。
none 不使用命令。
下降 卸除目的地數據表。
delete 刪除目的地數據表。
truncate 截斷目的地數據表。
pub_identity_range 控制在訂閱者端指派的指派識別範圍大小。 不支援點對點複寫。
schema_option 指定指定發行項之架構產生選項的點陣圖。 schema_option為 binary(8)。 如需詳細資訊,請參閱本主題稍後的一節。
0x00 停用 快照集代理程式 的腳本。
0x01 產生物件建立(CREATE TABLE、CREATE PROCEDURE 等等)。
0x02 如果已定義,產生傳播發行項變更的預存程式。
0x04 識別數據行是使用 IDENTITY 屬性編寫腳本。
0x08 復寫 時間戳數據 行。 如果未設定, 時間戳 數據行會復寫為 二進位檔。
0x10 產生對應的叢集索引。
0x20 將使用者定義資料類型 (UDT) 轉換為訂閱者端的基底數據類型。 如果 UDT 資料行是主鍵的一部分,或是計算數據行參考 UDT 資料行參考 UDT 資料行,則無法使用此選項。 Oracle 發行者不支援。
0x40 產生對應的非叢集索引。
0x80 在主鍵上包含宣告的引用完整性。
0x100 如果已定義,則復寫數據表發行項上的使用者觸發程式。
0x200 復寫 FOREIGN KEY 條件約束。 如果參考的數據表不是發行集的一部分,則不會復寫已發行數據表上的所有FOREIGN KEY條件約束。
0x400 復寫 CHECK 條件約束。
0x800 複寫預設值。
0x1000 復寫數據行層級定序。
0x2000 復寫與已發佈發行發行項來源對象相關聯的擴充屬性。
0x4000 如果在數據表發行項上定義,則復寫唯一索引鍵。
0x8000 使用 ALTER TABLE 語句,將數據表發行項上的主鍵和唯一索引鍵復寫為條件約束。

注意:這個選項已被取代。 請改用 0x800x4000
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 複寫數據和索引的壓縮選項。 如需詳細資訊,請參閱 Data Compression
0x800000000 將此選項設定為將 FILESTREAM 資料儲存在訂閱者端自己的檔案群組上。 如果未設定此選項,FILESTREAM 數據會儲存在預設檔案群組上。 複寫不會建立檔案群組;因此,如果您設定此選項,您必須先建立檔案群組,才能在訂閱者端套用快照集。 如需如何在套用快照集之前建立對象的詳細資訊,請參閱 套用快照集之前和之後執行腳本。

請參閱相關選項 0x100000000
0x1000000000 將大於 8000 位元組 的 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 (Transact-SQL)
0x4000000000 復寫數據表上任何篩選的索引。 如需已篩選索引的詳細資訊,請參閱 建立篩選的索引
0x8000000000 geographygeometry 數據類型轉換成 varbinary(max) ,以便將這些類型的數據行復寫至執行 SQL Server 2005 (9.x) 的訂閱者。
0x10000000000 復寫 geographygeometry 類型的數據行索引。
0x20000000000 復寫數據行的SPARSE屬性。 如需此屬性的詳細資訊,請參閱 使用疏鬆數據行
0x40000000000 啟用快照集代理程式的腳本,以在訂閱者上建立記憶體優化數據表。
0x80000000000 將叢集索引轉換為記憶體優化發行項的非叢集索引。
status 指定屬性的新狀態。
dts 水平分割區 僅供參考之用。 不支援。 我們無法保證未來的相容性。
包含資料行名稱 數據行名稱會包含在複寫的 INSERT 語句中。
沒有資料行名稱 數據行名稱不會包含在複寫的 INSERT 語句中。
沒有 dts 水平分割區 發行項的水準分割不是由可轉換的訂閱所定義。
none 清除 sysarticles 數據表中的所有狀態選項,並將發行項標示為非使用中。
parameters 變更會使用參數化命令傳播至訂閱者。 這是新發行項的預設設定。
字串 變更會使用字串常值傳播至訂閱者。
sync_object 用來產生同步處理輸出檔的數據表或檢視表名稱。 預設值是 NULL。 Oracle 發行者不支援。
tablespace 識別記錄數據表針對從 Oracle 資料庫發行之發行項所使用的數據表空間。 如需詳細資訊,請參閱管理 Oracle 資料表空間
閾 值 控制 散發代理程式 指派新識別範圍的百分比值。 不支援點對點複寫。
type Oracle 發行者不支援。
logbased 以記錄為基礎的發行項。
logbased manualboth 具有手動篩選和手動檢視的記錄型發行項。 此選項需要 同時設定sync_object篩選 屬性。 Oracle 發行者不支援。
logbased manualfilter 具有手動篩選的記錄式發行項。 此選項需要 同時設定sync_object篩選 屬性。 Oracle 發行者不支援。
logbased manualview 具有手動檢視的記錄型發行項。 此選項需要 同時設定sync_object 屬性。 Oracle 發行者不支援。
已編製索引的 viewlogbased 以記錄為基礎的索引檢視文章。 Oracle 發行者不支援。 針對這種類型的發行項,基表不需要個別發行。
indexed viewlogbased manualboth 具有手動篩選和手動檢視的記錄型索引檢視文章。 此選項需要 同時設定sync_object篩選 屬性。 針對這種類型的發行項,基表不需要個別發行。 Oracle 發行者不支援。
indexed viewlogbased manualfilter 具有手動篩選的記錄型索引檢視發行項。 此選項需要 同時設定sync_object篩選 屬性。 針對這種類型的發行項,基表不需要個別發行。 Oracle 發行者不支援。
索引檢視記錄基底手動檢視 具有手動檢視的記錄型索引檢視發行項。 此選項需要 同時設定sync_object 屬性。 針對這種類型的發行項,基表不需要個別發行。 Oracle 發行者不支援。
upd_cmd 要執行的 UPDATE 語句;否則,它會從記錄檔建構。
NULL NULL 傳回可以變更的發行項屬性清單。

[ @force_invalidate_snapshot = ] force_invalidate_snapshot 認可此預存程式所採取的動作可能會使現有的快照集失效。 force_invalidate_snapshot是位,預設值為0

0 指定發行項的變更不會造成快照集無效。 如果預存程式偵測到變更確實需要新的快照集,就會發生錯誤,而且不會進行任何變更。

1 指定發行項的變更可能會導致快照集無效,而且如果有現有的訂用帳戶需要新的快照集,則授與現有快照集被標示為過時和產生的新快照集的許可權。

如需變更時需要產生新快照集的屬性,請參閱一節。

[ @force_reinit_subscription = ]force_reinit_subscription_ 確認此預存程式所採取的動作可能需要重新初始化現有的訂用帳戶。 force_reinit_subscription是預設值為 0

0 指定發行項的變更不會使訂閱重新初始化。 如果預存程式偵測到變更需要重新初始化現有的訂用帳戶,就會發生錯誤,而且不會進行任何變更。

1 指定發行項的變更會導致現有的訂閱重新初始化,並授與重新初始化訂閱的許可權。

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

[ @publisher = ] 'publisher' 指定非 SQL Server 發行者。 publishersysname,預設值為 NULL。

注意

變更 SQL Server 發行者上的發行項屬性時,不應該使用 publisher

傳回碼值

0 (成功) 或 1 (失敗)

備註

sp_changearticle用於快照式複寫和事務複製。

當發行項屬於支援點對點事務複製的發行集時,您只能變更 描述ins_cmdupd_cmddel_cmd 屬性。

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

  • del_cmd

  • dest_table

  • destination_owner

  • ins_cmd

  • pre_creation_cmd

  • schema_options

  • upd_cmd

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

  • del_cmd

  • dest_table

  • destination_owner

  • filter

  • ins_cmd

  • status

  • upd_cmd

在現有的發行集中,您可以使用 sp_changearticle 來變更發行項,而不需要卸除並重新建立整個發行集。

注意

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

有效的架構選項

下表描述根據複寫類型(顯示在頂端)和發行項類型(顯示第一個數據行)的可允許值 schema_option

發行項類型 復寫類型 - 交易式 復寫類型 - 快照集
logbased 所有選項 所有選項,但 0x02
logbased manualfilter 所有選項 所有選項,但 0x02
logbased manualview 所有選項 所有選項,但 0x02
索引檢視記錄基底 所有選項 所有選項,但 0x02
索引檢視記錄式手動篩選 所有選項 所有選項,但 0x02
索引檢視記錄式手動檢視 所有選項 所有選項,但 0x02
索引檢視記錄基底手動索引 所有選項 所有選項,但 0x02
proc exec 0x01、0x200x20000x4000000x8000000x2000000、0x8000000、0x10000000、0x200000000x40000000和0x80000000 0x01、0x200x20000x4000000x8000000x2000000、0x8000000、0x10000000、0x200000000x40000000和0x80000000
serializable proc exec 0x01、0x200x20000x4000000x8000000x2000000、0x8000000、0x10000000、0x200000000x40000000和0x80000000 0x01、0x200x20000x4000000x8000000x2000000、0x8000000、0x10000000、0x200000000x40000000和0x80000000
僅限 proc 架構 0x01、0x200x20000x4000000x8000000x2000000、0x8000000、0x10000000、0x200000000x40000000和0x80000000 0x01、0x200x20000x4000000x8000000x2000000、0x8000000、0x10000000、0x200000000x40000000和0x80000000
僅限檢視架構 0x01、0x0100x020、0x040、0x01000x2000、0x40000、0x100000、0x200000、0x400000、0x800000、0x2000000、0x8000000、0x40000000和0x80000000 0x01、0x0100x020、0x040、0x01000x2000、0x40000、0x100000、0x200000、0x400000、0x800000、0x2000000、0x8000000、0x40000000和0x80000000
僅限 func 架構 0x01、0x200x20000x4000000x8000000x2000000、0x8000000、0x10000000、0x200000000x40000000和0x80000000 0x01、0x200x20000x4000000x8000000x2000000、0x8000000、0x10000000、0x200000000x40000000和0x80000000
僅限索引檢視架構 0x01、0x0100x020、0x040、0x01000x2000、0x40000、0x100000、0x200000、0x400000、0x800000、0x2000000、0x8000000、0x40000000和0x80000000 0x01、0x0100x020、0x040、0x01000x2000、0x40000、0x100000、0x200000、0x400000、0x800000、0x2000000、0x8000000、0x40000000和0x80000000

注意

針對已排入佇列的更新發行集,必須啟用0x80的schema_option。 非 SQL Server 發行集支援的schema_option值為:0x01、0x02、0x10、0x40、0x800x10000x4000。

範例

DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @option AS int;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product';
SET @option = (SELECT CAST(0x0000000002030073 AS int));

-- Change the schema options to replicate schema with XML.
USE [AdventureWorks2022]
EXEC sp_changearticle 
  @publication = @publication,
  @article = @article, 
  @property = N'schema_option', 
  @value = @option,
  @force_invalidate_snapshot = 1;
GO

權限

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

另請參閱

檢視和修改發行項屬性
變更發行集與發行項屬性
sp_addarticle (Transact-SQL)
sp_articlecolumn (Transact-SQL)
sp_droparticle (Transact-SQL)
sp_helparticle (Transact-SQL)
sp_helparticlecolumns (Transact-SQL)