無法在事務複製中複製架構更改
我已經在我的一個數據庫上實現了事務複製。
在 Microsoftsql 提供的文件(此處和此處)中,我應該能夠更改架構,並且這些更改也將復製到訂閱方。但是,我一直無法這樣做。
設置事務複製時我缺少什麼嗎?
我根據我的要求使用了以下自定義腳本,基本上複製了每一列和相關的所有內容(如完整的副本):
use [db_name] exec sp_changearticle @publication = N'db_PUB', @article = N'table_name', @property =schema_option, @value= '0x000003454DFD7FDF', @force_invalidate_snapshot =0, @force_reinit_subscription =1 GO
我在進行更改時遇到的錯誤是這樣的:
無法對錶執行操作,因為它是為複製而發布的。
我正在考慮一種解決此問題的方法,方法是從出版物中刪除文章,對其進行更改,然後將其重新添加到出版物中。
但是每次我這樣做時,我都必須生成一個新的快照並重新初始化訂閱,這似乎效率不高。
我可以做些什麼來解決這個問題?有什麼選擇嗎?
exec sp_dropsubscription @publication = 'tTestFNames' , @article = 'tEmployees' , @subscriber = 'RSCOMPUTER' , @destination_db = 'testrep' exec sp_droparticle @publication = 'tTestFNames' , @article = 'tEmployees' alter table tEmployees alter column Forename varchar(100) null exec sp_addarticle @publication = 'tTestFNames' , @article = 'tEmployees' , @source_table = 'tEmployees' exec sp_addsubscription @publication = 'tTestFNames' , @article = 'tEmployees' , @subscriber = 'RSCOMPUTER' , @destination_db = 'testrep' exec sp_startpublication_snapshot @publication = N'tTestFNames'; Go
您不能更改表名或更改複製中涉及的表的主鍵。
你可以在這裡看到腳本
如果您的出版物已打開,您可以複製架構更改
@replicate_ddl
。然而ALTER TABLE … DROP COLUMN 語句始終複製到其訂閱包含要刪除的列的所有訂閱伺服器,即使您禁用模式更改的複制也是如此。
您希望避免執行完整快照 - 您需要僅包含受影響對象的快照。
正如布蘭登威廉姆斯在評論中所說:首先,您檢查您的出版物
immediate_sync
並確保將allow_anonymous
其設置為 FALSE (0) 以避免創建完整快照,而不僅僅是更改文章的快照。SELECT immediate_sync, allow_anonymous FROM Your_Published_DBName.dbo.syspublications
然後,您可以按照此處所述更改這些屬性。
當我更改列名時,對訂閱者有什麼影響,我是否也必須在那裡更改名稱?在添加訂閱時,或者它是否也可以使用以前的名稱
您需要先從複製中刪除該表。然後進行更改 - 例如重命名列或更改主鍵。那麼您需要將表重新添加到發布中。生成新快照 - 將只有
new
表的版本。當您將此快照應用到訂閱者數據庫時 - 那裡的表將被覆蓋。您可以在訂閱伺服器上指定目標表。
因此,如果您需要對該表使用不同的權限、觸發器、索引、統計資訊或其他任何內容,您需要編寫所有這些腳本並在應用快照後將它們重新應用到訂閱上。
更改的表名稱如何工作,如果 tableA 被複製並且它駐留在訂閱者處,在我將名稱更改為發布者的 tableB 之後,更改將如何應用於它。我是否必須從訂閱者中刪除它 tableA 還是會被覆蓋?還是會在訂閱者處創建新的 tableB?
- 表 A 是出版物 1 的一部分
- 你從publication1中刪除tableA
- 您將 tableA 重命名為 tableB
- 您將 tableB 添加到 publication1
- 您生成了 publication1 的快照(希望其中只有 tableB)
- 您將subscriber1 添加到publication1
- 您在subscriber1 上應用publication1 快照
- tableB 在subscriber1 上創建