我想将业务规则应用于表中的行(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