今後、テーブルの行にビジネスルールを適用したいと思います(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