【问题标题】:Make SQL Server use CHECK CONSTRAINT only on inserted or updated rows使 SQL Server 仅在插入或更新的行上使用 CHECK CONSTRAINT
【发布时间】:2012-02-02 17:01:34
【问题描述】:

我想将业务规则应用于表中的行(SQL Server 2008)。但是,表中存在历史数据不符合此规则,并且没有好的方法使其符合(没有合理默认值的未知值。)所以我希望 CHECK CONSTRAINT only em> 在新插入的行或更新行时检查。

我创建了这样一个约束,并设置了以下值:

  • 在创建或重新启用时检查现有数据:否
  • 强制插入和更新:是
  • 强制复制:是

当我插入一条新记录时,一切似乎都很好。但是,如果我更新一条记录,即使更新的记录符合 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

【问题讨论】:

  • 你正在做的事情应该如你所愿。它不应该检查未受影响行的约束。

标签: sql-server stored-procedures check-constraints


【解决方案1】:

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

,[PrimaryConsultantId] = PrimaryConsultantId

应该是

,[PrimaryConsultantId] = @PrimaryConsultantId

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

【讨论】:

  • 谢谢! 我知道一定是那样的愚蠢。我多次查看该过程,但忽略了缺少的“@”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2014-08-01
  • 2019-01-14
相关资源
最近更新 更多