共用方式為


對發布資料庫進行架構變更

複寫支援對已發行物件進行大範圍的結構描述變更。 當您對 Microsoft SQL Server 發行者端適當的已發行物件進行下列任何結構描述變更時,依預設,該變更會傳播給所有的 SQL Server 訂閱者:

  • ALTER TABLE(修改資料表)

  • ALTER TABLE SET LOCK ESCALATION 就不應該使用,如果啟用架構變更複寫,且拓撲包含 SQL Server 2005 或 SQL Server Compact 3.5 訂閱者。ALTER VIEW

  • ALTER PROCEDURE

  • 改變函數

  • 無改進必要,可以考慮保持原樣。

    ALTER TRIGGER 僅能用於資料操作語言 [DML] 觸發器,因為資料定義語言 [DDL] 觸發器無法被複製。

這很重要

必須使用 Transact-SQL 或 SQL Server 管理物件 (SMO) 進行資料表的架構變更。 當 SQL Server Management Studio 中的架構變更時,Management Studio 會嘗試卸除並重新建立數據表。 您無法卸除已發佈的物件,因此架構變更會失敗。

針對事務複製和合併複製,當散發代理程式或合併代理程序執行時,架構變更會以累進方式傳播。 針對快照複寫,當訂閱者端套用新的快照時,會傳播結構變更。 在快照式複寫中,每次同步處理發生時,架構的新複本都會傳送至訂閱者。 因此,所有已發佈物件的架構變更(不僅限於以上所列的變更)都會在每次同步時自動傳播。

如需從發行集新增和移除發行項的詳細資訊,請參閱 將發行項新增至現有發行集和卸除發行項

若要複製架構變更

上述模式變更預設會被複製。 如需停用架構變更的複製的相關資訊,請參閱 複寫架構變更

架構變更的考慮

復寫架構變更時,請記住下列考慮。

一般考慮

  • 架構變更受限於 Transact-SQL 所施加的任何限制。 例如,ALTER TABLE 不允許您修改主鍵欄。

  • 數據類型映射只會針對初始快照執行。 結構定義變更不會映射到先前版本的數據類型。 例如,如果語句 ALTER TABLE ADD datetime2 column 用於 SQL Server 2012,則 SQL Server 2005 訂閱者不會將數據類型轉譯為 nvarchar 。 在某些情況下,發行者上會封鎖架構變更。

  • 如果發行集設定為允許傳播架構變更,則不論發行集中發行項的相關架構選項如何設定,架構變更都會傳播。 例如,如果您選擇不覆寫表 "article" 的外鍵約束條件,但接著發出 ALTER TABLE 命令,將外鍵新增至發行者的數據表,則外鍵會新增至訂閱者的數據表。 若要避免這種情況,請在發出 ALTER TABLE 命令之前停用架構變更的傳播。

  • 架構變更應該只在發行者端進行,而不是在訂閱者端進行(包括重新發行訂閱者)。 合併式複寫可防止訂閱者端的架構變更。 事務複製不會防止變更,但變更可能會導致復寫失敗。

  • 傳播至重新發佈訂閱者的變更預設會傳播至其訂閱者。

  • 如果架構變更參考發行者上現有的物件或條件約束,但不參考訂閱者上的對象或條件約束,則發行者上的架構變更將會成功,但在訂閱者上將會失敗。

  • 加入外鍵時所參考之訂閱者上的所有物件,都必須擁有與發行者上對應物件相同的名稱和擁有者。

  • 不支持明確新增、卸除或改變索引。 支持為條件約束隱含建立的索引(例如主鍵條件約束)。

  • 不支援變更或刪除由複寫所管理的識別欄位。 如需識別數據行自動管理的詳細資訊,請參閱 複寫識別數據行

  • 不支援包含非決定性函式的架構變更,因為它們可能會導致發行者和訂閱者的數據不同(稱為非聚合)。 例如,如果您在發行者端發出下列命令: ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(),當命令複寫至訂閱者並執行時,這些值會有所不同。 如需非決定性函式的詳細資訊,請參閱 確定性和非決定性函數

  • 建議明確命名限制。 如果未明確命名條件約束,SQL Server 會產生條件約束的名稱,而且這些名稱在發行者和每個訂閱者上會有所不同。 這可能會在架構變更的復寫期間造成問題。 例如,如果您在發行者端卸除欄位,並且卸除相依的約束條件,複寫功能會嘗試在訂閱者端卸除該約束條件。 訂閱者端的卸除將會失敗,因為條件約束的名稱不同。 如果同步處理因為條件約束命名問題而失敗,請手動卸除訂閱者端的條件約束,然後重新執行合併代理程式。

  • 如果數據表已被發佈進行複寫,且已生成發行快照,就無法將該數據表中的數據列變更為 XML 的數據類型。要變更該列,您必須先移除複寫。

  • 在已發佈的數據表上執行 DDL 時,未提交的讀取不是支援的隔離等級。

  • SET CONTEXT_INFO 不應該用來修改針對已發行物件執行架構變更的交易內容。

增加列

  • 若要將新的欄加入資料表,並在現有的出版物中包含該欄,請執行 ALTER TABLE <Table> ADD <Column>。 預設情況下,該欄會複製到所有訂閱者。 數據行必須允許 NULL 值,或包含預設條件約束。 如需有關新增欄位的更多資訊,請參閱本主題中的「Merge Replication」一節。

  • 為了將新的欄位新增至資料表並且不將該欄位包含在現有的發行集中,請停用架構變更的複製功能,然後執行 ALTER TABLE <Table> ADD <Column>。

  • 若要在現有發行集中包含現有的欄,請使用sp_articlecolumn (Transact-SQL)sp_mergearticlecolumn (Transact-SQL)發行集屬性 - <發行集>對話框。

    如需詳細資訊,請參閱 定義和修改數據行篩選。 這需要重新初始化訂用帳戶。

  • 不支援將識別數據行加入已發行數據表,因為當數據行復寫至訂閱者時,可能會導致非聚合。 發行者端識別數據行中的值取決於受影響數據表的數據列實際儲存順序。 數據列可能會以不同的方式儲存在訂閱者端;因此,相同數據列的識別數據行值可能會不同。

卸除數據行

  • 若要從現有的發佈移除欄,並從發行者端的資料表移除欄,請執行 ALTER TABLE <Table> DROP <Column>。 預設情況下,欄位會從所有訂閱者的資料表中移除。

  • 若要從現有的出版物卸除數據行,但保留發行者數據表中的數據行,請使用 sp_articlecolumn(Transact-SQL)sp_mergearticlecolumn(Transact-SQL)或 [ 發行集屬性 - <發行集> ] 對話框。

    如需詳細資訊,請參閱 定義和修改數據行篩選。 這將需要生成一個新的快照。

  • 要刪除的數據行不能用於資料庫中任何發行集的任何篩選子句。

  • 從已發佈的文章中刪除數據列時,請考慮該數據列的任何可能影響資料庫的約束條件、索引或屬性。 例如:

    • 您無法從交易式發行中的資料表移除主鍵用到的欄位,因為複寫會使用這些欄位。

    • 您無法從合併式發行中的文章中移除 rowguid 欄,也無法從支援更新訂閱的交易式發行中的文章中移除 mstran_repl_version 欄,因為它們被用於資料複寫。

    • 索引變更不會傳遞至訂閱者:如果您在發行者端刪除欄位,且相依索引被刪除,則該索引的刪除不會被復寫至訂閱者。 在刪除發行者端的資料行之前,您應該先刪除訂閱者端的索引,以確保當資料行從發行者複寫到訂閱者時,資料行的刪除會成功。 如果同步處理因為訂閱者端的索引而失敗,請手動卸除索引,然後重新執行合併代理程式。

    • 約束條件應該明確地命名,以便刪除。 如需詳細資訊,請參閱本主題稍早的一節。

交易複製

  • 架構變更會傳播至執行舊版 SQL Server 的訂閱者,但 DDL 語句應該只包含訂閱者端版本所支援的語法。

    如果訂閱者重新發佈數據,唯一支援的架構變更就是新增和卸除數據行。 這些變更應在發行者上使用sp_repladdcolumn(Transact-SQL)sp_repldropcolumn(Transact-SQL),而不是使用ALTER TABLE DDL語法。

  • 架構變更不會復寫到非 SQL Server 訂閱者。

  • 架構變更不會從非 SQL Server 發行者傳播。

  • 您無法變更複寫為資料表的索引檢視表。 可以變更復寫為索引檢視表的索引檢視表,但改變它們會導致它們變成一般檢視,而不是索引檢視表。

  • 如果出版物支援立即更新或排隊更新的訂閱,則系統必須在進行架構變更之前進入靜止狀態:所有在出版者及訂閱者上的發行表活動都必須停止,同時,待處理的數據變更必須傳播至所有節點。 在架構變更傳播到所有節點之後,活動可以在已發佈的數據表上繼續。

  • 如果出版物位於點對點拓撲中,則必須先使系統進入靜默狀態,才能進行架構變更。 如需詳細資訊,請參閱停止複寫拓撲 (複寫 Transact-SQL 程式設計)

  • 將時間戳數據行新增至數據表,並將時間戳對應至 binary(8) 會導致所有使用中訂閱重新初始化發行項。

合併複製

  • 合併式復寫處理架構變更的方式取決於發行集相容性層級,以及快照集是否設定為原生模式(預設)或字元模式:

    • 若要復寫架構變更,發行集的相容性層級必須至少為90RTM。 如果訂閱者執行舊版 SQL Server 或相容性層級小於 90RTM,您可以使用 sp_repladdcolumn (Transact-SQL)sp_repldropcolumn (Transact-SQL) 來新增和卸除數據行。 不過,這些程式已被取代。

    • 如果您嘗試將具有 SQL Server 2008 中導入之數據類型的數據行新增至現有的發行項,SQL Server 的行為如下:

      100RTM,原生快照 100RTM,字元快照 所有其他相容性層級
      hierarchyid 允許變更 區塊變更 區塊更換
      geographygeometry 允許變更 允許變更1 區塊變更
      filestream 允許變更 區塊更改 封鎖變更
      datetimedatetime2datetimeoffset 允許變更 允許變更1 區塊變更

      1 SQL Server Compact 訂閱者會在訂閱者端轉換這些數據類型。

  • 如果套用架構變更時發生錯誤(例如新增參考訂閱者端無法使用之數據表的外鍵所產生的錯誤),同步處理會失敗,而且訂閱必須重新初始化。

  • 如果在聯結篩選或參數化篩選中涉及的數據行上進行架構變更,您必須重新初始化所有訂用帳戶並重新產生快照集。

  • 合併式複寫提供儲存程序,以便在疑難排解時略過架構變更。 如需詳細資訊,請參閱sp_markpendingschemachange(Transact-SQL)sp_enumeratependingschemachanges(Transact-SQL)。

另請參閱

ALTER TABLE (Transact-SQL)
ALTER VIEW (Transact-SQL)
ALTER PROCEDURE (Transact-SQL)
ALTER FUNCTION (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
發行資料和資料庫物件
重新產生自定義交易程式以反映架構變更