我有具有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))
我試圖使用AFTER UPDATE
觸發信號以控制DateTimeProcessed
柱的設置:
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
列時違反了約束條件。
什麼會達到什麼樣的,我想在這裏做的最好方法是什麼?現在
「的評論說,建議」 BEFORE 「觸發器可能由於SQL Server沒有」BEFORE「觸發器而被刪除」......是的,這可能是原因,不是嗎:) – grin0048 2014-11-05 20:34:08
感謝您的答案。如果直接更新'DateTimeProcessed'則拋出一個錯誤,就像在這裏添加的最後一部分。 – grin0048 2014-11-05 20:44:47
@ grin0048:是的,我曾建議在這種情況下拋出一個錯誤,那是你指的還是你沒有看到我的更新?無論如何,我再次更新以重新排列項目符號的順序並添加了一些細節,例如處理錯誤和取消的代碼以及不涉及代碼的新(不太知名)選項。 – 2014-11-05 22:02:00