【发布时间】:2015-01-02 00:52:11
【问题描述】:
我有一个表,其中有一个 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 列时违反了约束。
实现我在这里尝试做的最好方法是什么?
【问题讨论】:
标签: sql-server sql-server-2008 tsql check-constraints database-trigger