我有具有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