2012-09-18 49 views
0

我有一個與sql server中的數據相關的問題。在我的數據庫中,一些約束沒有被啓用,即他們沒有被檢查,經過一段時間的處理後,我們發現這個問題,父行可以刪除而不刪除子,這是一個問題。我使用的查詢如何驗證sql server中的數據?

ALTER TABLE tbl_name CHECK CONSTRAINT ALL 

以上查詢是沒有任何錯誤,在該數據庫中所有表執行啓用所有的約束在數據庫中。但是我的擔心是它是否會起作用,如果它能夠處理現有的數據,那麼父表數據已被刪除的數據會發生什麼情況。

我想知道有沒有什麼方法可以驗證其父記錄不存在於整個數據庫中的此類數據數據。大約有270 constraint包含FOREIGN KEY AND UNIQUE KEY。我不想去手動選項。

請幫我一把。

回答

1
ALTER TABLE tbl_name CHECK CONSTRAINT ALL 

只重新啓用約束。重要的是,的約束不是針對數據庫中的現有數據進行檢查(它們也不受優化程序信任)。如果你想要的發生,你需要指定WITH CHECK還有:

ALTER TABLE tbl_name WITH CHECK CHECK CONSTRAINT ALL 

(是的,這個詞CHECK出現兩次)

如果執行此,有被孤立子行(或其他無效的限制),那麼ALTER TABLE將失敗並顯示錯誤消息。沒有什麼SQL Server可以解決這個問題 - 這是由您決定是否要a)刪除孤行,或者b)以某種方式爲它們重新創建合適的父行。

+0

Damien_The_Unbeliever嗨,你能告訴我兩個ALTER TABLE tbl_name檢查約束WITH CHECK CHECK約束中的所有 和ALTER TABLE tbl_name ALL –

+0

正如我在第二句說的區別 - 不同的是,第一個將*不*驗證表中的任何現有數據。 –

+0

謝謝這是一個很好的幫助.. –

0

您還可以將'ON DELETE CASCADE'代碼添加到外鍵的末尾,以防止孤兒子行持續存在。

這比解決方案更像是「更好的做法」,但我相信Damien_The_Unbeliever已經回答了您的主要問題。

+0

沒關係,但現有的數據如何...您的建議將工作的進一步或新的數據。 –

+0

對於現有的數據,我會與Damien_The_Unbeliever的建議一起去 – Ranger4290