3

我想将业务规则应用于表中的行(SQL Server 2008)。但是,表中存在不符合此规则的历史数据,并且没有好的方法使其符合(没有合理默认值的未知值。)所以我希望检查新插入的 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
4

1 回答 1

5

您的程序中的以下行是错误的:

,[PrimaryConsultantId] = PrimaryConsultantId

应该

,[PrimaryConsultantId] = @PrimaryConsultantId

您的约束按预期工作,并为您暴露了一个错误。

于 2012-02-02T17:06:42.927 回答