7

我有一個數據庫運行在Sql server 2005合併複製。我想將一些FK列更改爲'非空',因爲它們應該始終具有值。 SQL服務器將不會讓我做,雖然,這是它說:更改列約束空/非空= rowguid複製錯誤

  • 無法修改表。在 合併複製使用的rowguid列上放置默認約束 是無效的。在執行內部 複製過程期間,模式更改 失敗。要糾正 操作,請參閱伴隨此錯誤消息的其他錯誤消息 。交易在觸發器中結束。 批次已被中止。

我不試圖改變限制在ROWGUID列可言,僅在與充當FK另一列。我想設置的其他列不爲空,因爲如果沒有這些信息(即客戶名稱,客戶名稱),記錄就沒有任何意義。

問題: 有沒有一種方法來更新列是「NOT NULL」而不關閉複製,然後再次打開它? 這是甚至是做到這一點的最佳方式 - 我應該使用約束嗎?

回答

8

顯然,SSMS通過刪除它們並重新創建它們來更改表格。所以只需要使用T-SQL語句進行更改即可。

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn nvarchar(50) NOT NULL 
3

您需要在T-SQL語句中編寫腳本,因爲SQL Server Management Studio將刪除並重新創建表,而不是簡單地添加附加列。

您還需要將新列添加到您的出版物中。

請注意,以這種方式更改列可能會對複製的性能造成不利影響。取決於您正在改變的表的大小,可能導致大量數據被複制。考慮到儘管你的表修改可以在一個語句中執行,但如果有一百萬行受到影響,那麼將在訂閱服務器上生成100萬次更新,而不是像通常所想的那樣更新單個語句。

上,提高性能的做法手中.......

要執行這項工作,你需要:

  1. 通過腳本您的整個配置備份複製環境。
  2. 從複製中刪除表格 發佈者/訂閱者
  3. 在每個 發佈者/訂閱者處添加列。
  4. 在每個 Publisher/Subscriber上本地應用更新。
  5. 將表格添加到複製中。
  6. 驗證交易是否爲 已複製。
相關問題