Sql-Server

無法在事務複製中複製架構更改

  • June 3, 2020

我已經在我的一個數據庫上實現了事務複製。

在 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?

  1. 表 A 是出版物 1 的一部分
  2. 你從publication1中刪除tableA
  3. 您將 tableA 重命名為 tableB
  4. 您將 tableB 添加到 publication1
  5. 您生成了 publication1 的快照(希望其中只有 tableB)
  6. 您將subscriber1 添加到publication1
  7. 您在subscriber1 上應用publication1 快照
  8. tableB 在subscriber1 上創建

引用自:https://dba.stackexchange.com/questions/268353