2012-02-02 78 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

相关问题