3

今後、テーブルの行にビジネスルールを適用したいと思います(SQL Server2008)。ただし、このルールに準拠しない履歴データがテーブルにあり、準拠させるための適切な方法がありません(妥当なデフォルトのない不明な値)。したがって、CHECK CONSTRAINTは、新しく挿入された場合にのみチェックされるようにします。行、または行が更新されたとき。

このような制約を作成し、次の値を設定しました。

  • 作成または再有効化時に既存のデータを確認する:いいえ
  • 挿入と更新の実施:はい
  • レプリケーションの実施:はい

新しいレコードを挿入すると、すべてが正常に見えます。ただし、レコードを更新すると、更新されたレコードがCHECK CONSTRAINTに準拠していても、CHECKCONSTRAINTが失敗します。これは、1つの行が更新されているときに、すべての行に制約を適用しようとしているかのようです。どうすればこれを防ぐことができますか?

制約は次のとおりです。

([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

The following line in your procedure is wrong:

,[PrimaryConsultantId] = PrimaryConsultantId

should be

,[PrimaryConsultantId] = @PrimaryConsultantId

Your constraint is working as expected, and exposing a bug for you.

于 2012-02-02T17:06:42.927 に答える