對發行集資料庫進行結構描述變更

更新: 2006 年 4 月 14 日

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

  • ALTER TABLE
  • ALTER VIEW
  • ALTER PROCEDURE
  • ALTER FUNCTION
  • ALTER TRIGGER (ALTER TRIGGER 僅可用於資料管理語言 [DML] 觸發器,因為無法複寫資料定義語言 [DDL] 觸發器。)
ms151870.note(zh-tw,SQL.90).gif重要事項:
必須使用 Transact-SQL 或 SQL Server Management Objects (SMO) 對資料表進行結構描述變更。在 SQL Server Management Studio 中進行結構描述變更時,Management Studio 會嘗試卸除並重新建立資料表。您無法卸除已發行的物件,因此結構描述變更會失敗。

對於交易式複寫與合併式複寫,結構描述變更會在「散發代理程式」或「合併代理程式」執行時進行累加傳播。對於快照式複寫,結構描述變更則在「訂閱者」套用新的快照集時進行傳播。在快照式複寫中,每次發生同步處理時,結構描述的新副本便會傳送至「訂閱者」。因此,對先前已發行物件進行的所有結構描述變更 (不僅僅是以上所列的變更) 會與每個同步處理一起自動傳播。

如需從發行集新增及移除發行項的詳細資訊,請參閱<在現有發行集中加入和卸除發行項>。

若要複寫結構描述變更

依預設,會複寫以上所列的結構描述變更。如需停用結構描述變更複寫的詳細資訊,請參閱下列主題:

結構描述變更之考量

複寫結構描述變更時,請記住下列考量。

一般考量

  • 結構描述變更必須遵從由 Transact-SQL 規定的任何條件約束。例如,ALTER TABLE 不允許對主索引鍵資料行執行 ALTER。
  • 如果發行集設定為允許傳播結構描述變更,則不論發行集中發行項的相關結構描述選項如何設定,結構描述都會傳播。例如,如果選取不對資料表發行項的外部索引鍵條件約束進行複寫,但是接著發出 ALTER TABLE 命令,將外部索引鍵新增至「發行者」端的資料表,則外部索引鍵會新增至「訂閱者」端的資料表。若要防止發生這種情況,則在發出 ALTER TABLE 命令前停用結構描述變更的傳播。
  • 僅應在「發行者」而不是「訂閱者」端 (包括重新發行「訂閱者」) 進行結構描述變更。合併式複寫防止在「訂閱者」端的結構描述變更。交易式複寫不會防止變更,但是變更會造成複寫失敗。
  • 依預設,傳播至重新發行訂閱者的變更會傳播至其訂閱者。
  • 如果結構描述變更參考了存在於「發行者」而不是「訂閱者」上的物件或條件約束,則結構描述變更會在「發行者」上成功,但會在「訂閱者」上失敗。
  • 新增外部索引鍵時所參考之「訂閱者」上所有物件的名稱和擁有者,必須與「發行者」上對應的物件相同。
  • 不支援明確地新增、卸除或改變索引。支援為條件約束 (例如主索引鍵條件約束) 隱含建立的索引。
  • 不支援改變或卸除由複寫管理的識別資料行。如需自動管理識別資料行的詳細資訊,請參閱<複寫識別資料行>。
  • 不支援包括非決定性函數的結構描述變更,因為該變更會導致「發行者」和「訂閱者」上的資料各不相同 (稱為非聚合)。例如,如果在「發行者」端發出下列命令:ALTER TABLE SalesOrderDetail ADD OrderDate DATETIME DEFAULT GETDATE(),則將命令複寫至「訂閱者」並執行此命令時,值會各不相同。如需有關不具決定性功能的資訊,請參閱<決定性與非決定性函數>。
  • 建議對條件約束進行明確命名。如果條件約束沒有明確命名,SQL Server 會產生條件約束的名稱,並且這些名稱在發行者及每個訂閱者會有所不同。在結構描述變更的複寫期間,這可能會造成問題。例如,如果您卸除發行者端的資料行,並且卸除相依性條件約束,複寫便會嘗試卸除訂閱者端的條件約束。因為條件約束名稱不同,所以訂閱者端的卸除動作會失敗。如果同步處理因條件約束名稱問題而失敗,請手動卸除訂閱者端的條件約束,然後重新執行合併代理程式。
  • 發行資料表來進行複寫時,如果已產生發行集快照集 (您可以先改變資料行,再產生快照集),則無法將該資料表中的資料行改為 XML 資料類型。若要改變資料行,您必須先移除複寫。如需詳細資訊,請參閱<移除複寫>。

新增資料行

  • 若要將新資料行新增至資料表,並將該資料行包含在現有發行集中,則執行 ALTER TABLE <Table> ADD <Column>。依預設,資料行然後便會寫至所有「訂閱者」。資料行必須允許 NULL 值或包含預設條件約束。
  • 若要將新資料行新增至資料表,並且在現有發行集中不包含該資料行,則停用結構描述變更的複寫,然後執行 ALTER TABLE <Table> ADD <Column>。
  • 若要在現有發行集中包含現有資料行,則使用 sp_articlecolumn (Transact-SQL)sp_mergearticlecolumn (Transact-SQL)[發行集屬性 - <Publication>] 對話方塊。
    如需詳細資訊,請參閱<How to: Define and Modify a Column Filter (Replication Transact-SQL Programming)>和<如何:定義和修改資料行篩選 (SQL Server Management Studio)>。這需要重新初始化訂閱。
  • 不支援在已發行的資料表上加入識別資料行,因為可能在資料行複寫至訂閱者時,導致無法聚合。發行者端識別資料行中的值,會隨著受影響的資料表之資料列的實際儲存順序而不同。資料列可能以不同方式儲存在訂閱者端;因此識別資料行的值可能與同資料列的不同。

卸除資料行

  • 若要從現有發行集卸除資料行,並從「發行者」端的資料表卸除該資料行,則執行 ALTER TABLE <Table> DROP <Column>。依預設,資料行然後便會從所有「訂閱者」端的資料表中卸除。
  • 若要從現有發行集卸除資料行,但要將該資料行保留在「發行者」端的資料表中,則使用 sp_articlecolumn (Transact-SQL)sp_mergearticlecolumn (Transact-SQL)[發行集屬性 - <Publication>] 對話方塊。
    如需詳細資訊,請參閱<How to: Define and Modify a Column Filter (Replication Transact-SQL Programming)>和<如何:定義和修改資料行篩選 (SQL Server Management Studio)>。這需要產生新的快照集。
  • 要卸除的資料行不可以用於資料庫內任何發行集,任何發行項的篩選子句。
  • 卸除已發行之發行項的資料行時,請考慮會影響資料庫的任何條件約束、索引或資料行屬性。例如:
    • 無法從交易式發行集的發行項中卸除使用於主索引鍵的資料行,因為它們由複寫使用。
    • 無法從合併式發行集的發行項中卸除 rowguid 資料行,或從支援更新訂閱之交易式發行集的發行項中卸除 mstran_repl_version 資料行,因為它們由複寫使用。
    • 索引變更不會傳播至訂閱者:如果您卸除發行者端的資料行,並且卸除相依性條件約束,則不會複寫索引卸除。您必須先卸除訂閱者端的索引,然後卸除發行者端的資料行,如此一來,從發行者複寫至訂閱者時才會成功將資料行卸除。如果同步處理因訂閱者端的索引而失敗,請手動卸除索引,然後重新執行合併代理程式。
    • 條件約束應明確命名,才能允許卸除。如需詳細資訊,請參閱本主題中的「一般考量」一節。

交易式複寫

  • 結構描述變更傳播至執行舊版 SQL Server 的「訂閱者」,但是 DDL 陳述式應僅包含「訂閱者」端版本所支援的語法。
    如果「訂閱者」重新發行資料,則唯一受支援的結構描述變更會新增及卸除資料行。這些變更應使用 sp_repladdcolumn (Transact-SQL)sp_repldropcolumn (Transact-SQL),而不是 ALTER TABLE DDL 語法在「發行者」端進行變更。
  • 傳播至非「SQL Server 訂閱者」的結構描述變更會使「訂閱者」重新初始化。
  • 結構描述變更不會從非「SQL Server 發行者」傳播。
  • 您無法改變複寫為資料表的索引檢視。複寫為索引檢視的索引檢視可以改變,但是改變它們會使其變成一般的檢視而不是索引檢視。
  • 如果發行集支援立即更新或佇列更新訂閱,則在進行結構描述變更之前必須停止系統:已發行資料表上的所有活動必須在「發行者」或「訂閱者」端停止,且暫止資料變更必須傳播至所有節點。結構描述變更傳播至所有節點之後,可於已發行的資料表上繼續進行活動。
  • 如果發行集在點對點拓撲中,則進行結構描述變更前必須停止系統。如需詳細資訊,請參閱<How to: Quiesce a Replication Topology (Replication Transact-SQL Programming)>。
  • 將時間戳記資料行新增至資料表並將時間戳記對應至 binary(8),會造成所有作用中訂閱的發行項重新初始化。

合併式複寫

  • 若要複寫結構描述變更,則發行集的相容性層級必須至少為 90RTM。如需詳細資訊,請參閱<在複寫拓撲中使用多個 SQL Server 版本>主題的「合併式發行集的相容性層級」一節。如果「訂閱者」執行舊版 SQL Server 或相容性層級小於 90RTM,則仍可使用 sp_repladdcolumn (Transact-SQL)sp_repldropcolumn (Transact-SQL) 新增及卸除資料行。
  • 如果套用結構描述變更時發生錯誤 (例如,因為新增參考了「訂閱者」端上不可用之資料表的外部索引鍵而發生的錯誤),則同步處理會失敗且必須重新初始化訂閱)。
  • 如果在聯結篩選或參數化篩選涉及的資料行上進行結構描述變更,則必須重新初始化所有訂閱並重新產生快照集。
  • 合併式複寫會提供預存程序,以在疑難排解期間略過結構描述變更。如需詳細資訊,請參閱<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)

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 4 月 14 日

新增內容:
  • 新增有關變更複寫資料表以新增 XML 資料行的資訊。
  • 新增有關條件約束命名的資訊。
  • 新增有關卸除相依性索引的資訊。
變更的內容:
  • 移除有關合併式發行集資料庫中變更結構描述之前停止同步處理的記載需求。