2012-02-02 80 views
2

我想將業務規則應用於前進的表中的行(SQL Server 2008)。然而,在該錶的歷史數據,將不符合這個規則,並有以使其符合沒有什麼好辦法(沒有合理的默認值未知值)。所以我想CHECK約束來檢查上新插入的行或行更新時。使SQL Server僅在插入或更新的行上使用CHECK CONSTRAINT

我創造了這樣一個約束,並設置以下值:

  • 檢查現有的數據在創建或重新啓用:沒有
  • 強制插入和更新:是
  • 強制執行複製:是

的一切,當我插入一個新的記錄似乎罰款。但是,如果我更新記錄,即使更新後的記錄符合CHECK CONSTRAINT,CHECK CONSTRAINT也會失敗。就好像它試圖在更新單行時將約束應用於所有行。我怎樣才能防止這一點?

這裏是約束:

([DateGiven] IS NULL 
AND [PrimaryConsultantId] IS NULL 
AND [AdditionalConsultants] IS NULL 
AND [ResultingClaLevel] IS NULL) 
OR ([DateGiven] IS NOT NULL 
AND [PrimaryConsultantId] IS NOT NULL 
AND [AdditionalConsultants] IS NOT NULL 
AND [ResultingClaLevel] IS NOT NULL)) 

的更新正在通過一個存儲過程來完成:(ClaEvaluationId是主鍵)

CREATE PROCEDURE [dbo].[UpdateProc] (
    @ClaEvaluationId int, 
    @DateScheduled datetime, 
    @DateGiven datetime, 
    @PrimaryConsultantId int, 
    @AdditionalConsultants nvarchar(500), 
    @ResultingClaLevel decimal(2,1) 
) AS 

SET NOCOUNT ON 

UPDATE [dbo].[ClaEvaluation] 
SET 
    [DateScheduled] = @DateScheduled 
    ,[DateGiven] = @DateGiven 
    ,[PrimaryConsultantId] = PrimaryConsultantId 
    ,[AdditionalConsultants] = @AdditionalConsultants 
    ,[ResultingClaLevel] = @ResultingClaLevel 
WHERE [ClaEvaluationId] = @ClaEvaluationId 
+3

你在做什麼應該作爲你想要的。它不應該檢查未受影響的行上的約束。 – 2012-02-02 17:03:52

回答

5

在你的程序中下面一行是錯誤的:

,[PrimaryConsultantId] = PrimaryConsultantId 

應該是

,[PrimaryConsultantId] = @PrimaryConsultantId 

你的約束工作正常,並暴露出一個bug你。

+0

**謝謝!**我知道它必須是那樣的愚蠢。我多次查看過程,但忽略了缺少「@」的情況。 – 2012-02-02 18:09:53

相關問題