2011-08-23 86 views
6

我喜歡外鍵,但我遇到了一個問題。我有一個轉換程序,我禁用外鍵到表。我這樣做的原因是,我可以重新轉換主表中的所有記錄,但保留其他表不依賴於那個表,而不必每次重新轉換它們,因爲它們很大。使用外鍵檢查現有數據

我使用這些命令禁用和重新啓用外鍵:

ALTER TABLE MyTable的NOCHECK約束MyConstraint

ALTER TABLE MyTable的CHECK約束MyConstraint

不過,我以後重新啓用約束「檢查現有數據創建或重新啓用」仍然設置爲否。我知道它被設置爲否,因爲我禁用了約束,但通過這樣做它改變了我的數據庫架構,我不喜歡。我認爲這將被視爲重新啓用約束並檢查現有數據,但顯然不是。

有沒有辦法改變這與ALTER TABLE命令?我知道我可以,如果我放棄約束並重新創建它,但我不會編寫腳本來重新創建我擁有的每個外鍵,並保持這一點。

我正在使用SQL Server 2008 R2。

回答

9

要重新啓用約束:

-- Enable the constraint 
ALTER TABLE MyTable 
WITH CHECK CHECK CONSTRAINT MyConstraint 
GO 

注意:你必須指定CHECK兩次強行檢查,所有外鍵瓦萊斯是有效的。

外鍵,並檢查將被禁用標記 is_not_trusted.These處於sys.check_constraints和 sys.foreign_keys目錄視圖可見約束。這意味着對於表的所有行,約束不再由系統驗證更長的 。即使在 重新啓用約束時,除非您指定 ALTER TABLE的WITH CHECK選項,否則它將不會重新驗證現有的 行。指定WITH CHECK將該限制再次標記爲可信 。

參考:Guidelines for Disabling Indexes and Constraints

正如註釋(搜索引擎)所指出的,這對應於

sys.foreign_keys.is_not_trusted

在目錄視圖

+0

謝謝,你是一個救生員。 –

+1

爲了記錄,因爲我有一段時間在其他地方找到它:「sys.foreign_keys.is_not_trusted」對應於SQL Server Management Studio「外鍵關係」對話框中的「在創建或重新啓用時檢查現有數據」。 – leqid