列と、そのフラグがいつ設定されたかを追跡bit
する対応する列を持つテーブルがあります。datetime2
CREATE TABLE MyTable
(
Id int primary key identity,
Processed bit not null,
DateTimeProcessed datetime2
)
次のようにチェック制約を追加しました。
ALTER TABLE MyTable
ADD CHECK ((Processed = 0 AND DateTimeProcessed IS NULL)
OR (Processed = 1 AND DateTimeProcessed IS NOT NULL))
トリガーDateTimeProcessed
を使用して列の設定を制御しようとしました:AFTER UPDATE
CREATE TRIGGER tr_MyTable_AfterUpdate ON MyTable
AFTER UPDATE
AS
BEGIN
IF(UPDATE(Processed))
BEGIN
UPDATE MyTable
SET DateTimeProcessed = CASE
WHEN tab.Processed = 1 THEN GETDATE()
ELSE NULL
END
FROM MyTable tab
JOIN INSERTED ins
ON ins.Id = tab.Id
END
END
これに関する問題は、トリガーが実行される前にチェック制約が適用されるため、列が更新されるAFTER UPDATE
と制約に違反することです。Processed
私がここでやろうとしていることを達成するための最良の方法は何でしょうか?