2011-05-25 25 views
0

我正在建立一個數據庫,並且有幾個表需要在創建/更新行之前檢查許多行間依賴關係。有許多來源的max/min/avg/stdev字段。在SQL Server中尋找用戶友好的CheckConstraint錯誤消息的策略

我想我會創建一些約束條件,確保max> = min,avg> = min,對所有關係都使用avg < = max,stdev> = 0。這樣我在數據庫中進行設置,任何觸摸數據的東西都會引發錯誤。這種機制很好地工作......除了從用戶的角度來看錯誤消息是可怕的這一事實之外,基本上說約束失敗並將其留給用戶以確定20個約束條件中的哪一個是壞的。

我可以在客戶端代碼中通過查看約束異常,然後運行數據來查找問題來解決此問題。該解決方案有驗證發生在兩個地方...

我不能有我希望分配一個錯誤消息給每個約束(在數據庫中),並通過異常機制將該消息過濾到UI。是否有一些機制讓用戶友好的消息滲透到UI而不復制業務邏輯中的數據驗證?更重要的是,這類問題的基本策略是什麼?

回答

2

從您控制的服務器返回的唯一東西是約束名稱 - 因此請儘可能確保它們儘可能描述,或者將約束名稱映射到異常處理程序中用戶友好的錯誤消息。

在這種情況下,嘗試使每個約束儘可能細化,因此每種類型的故障都是不同約束的故障。當然,你也有這樣的問題:SQL Server只會報告第一個失敗的約束 - 你的數據實際上可能會失敗多個約束。

在提交數據之前,除了重複應用程序中的檢查之外,我無法想象您可以做的任何事情。我傾向於將這種重複看作類似於網頁上的客戶端/服務器驗證 - 您在客戶端上運行驗證,以改善用戶體驗,並避免不必要的往返服務器。但是,如果客戶端驗證因任何原因失敗,服務器必須保護自己。

+0

同意:業務和驗證邏輯應該意味着數據庫永遠不會拋出錯誤。但是RDBMS負責數據完整性。 – gbn 2011-05-25 08:10:54

+0

因此,通常客戶端不應該依賴於數據驗證的檢查約束?對於這個例子來說,風險很低,因爲沒有幻數,(max> =最小的東西)。 – Hucker 2011-05-25 08:52:10

相關問題