2009-08-16 128 views
1

我正在處理一個預先存在的MS SQL Server數據庫,這個數據庫設計得不是很好。大多數情況下索引和主鍵都不存在。沒有外鍵約束。SQL Server架構同步

我做了一個DB的本地副本(以免在實時版本上工作),並修復了大部分問題。我現在想syncronize我的變化到生產服務器,

但是......

,因爲沒有以前的外鍵約束有表中的關鍵不匹配,幾千條。我嘗試了一些同步工具,但它們都不允許忽略或解決FK不匹配問題。 (在SQL Server Management Studio中稱爲「在創建或重新啓用時檢查現有數據:否」)

有沒有辦法自動解決舊數據庫的差異?

回答

0

你所說的 「自動解析」 是什麼意思? 現有數據是「不好的」 - 也就是說,您試圖強加的約束被違反。如果不修改數據,則無法使數據「良好」。而且顯然沒有辦法自動決定如何修復數據。

因此,您可以做的最好的事情是分析數據,找出如何糾正,手動糾正,然後添加約束條件。 你也可以刪除所有不一致的行(如果你需要這些數據可能是一個壞主意),或者迫使服務器忽略現有數據的限制(絕對是一個壞主意)。

如果你只是要刪除的數據不一致,我建議你寫(或生成,如果有很多賣foreing鍵)SQL腳本是這樣的:

DELETE a FROM a LEFT JOIN b ON a.b_id = b.id WHERE b.id IS NULL 

ALTER TABLE a ADD CONSTRAINT FK_a_b_id FOREIGN KEY (b_id) REFERENCES b (id) 
+0

假設我已經創建比我的FK約束不應該不可能自動丟棄不一致的數據。 – 2009-08-16 13:00:39

+0

SQL Server無法爲您做到這一點。可能有些第三方工具可以,但我懷疑是否有人照顧實施這一點。就我個人而言,我認爲這是相當罕見的用例,並且使用普通SQL很容易實現。 請參閱編輯我的答案代碼示例。 – VladV 2009-08-16 13:42:45