我在Sql Server中有一个表,其中有列:UserId,RoleId,FromDate和Todate。 我想写一个检查相同的RoleId和UserId在同一日期不存在的约束。在Sql Server 2005中添加表级检查日期重叠的Contraint
在此先感谢....
我在Sql Server中有一个表,其中有列:UserId,RoleId,FromDate和Todate。 我想写一个检查相同的RoleId和UserId在同一日期不存在的约束。在Sql Server 2005中添加表级检查日期重叠的Contraint
在此先感谢....
如果你没有时间或部分时间部分是在所有的记录同样可以使用UNIQUE
约束:中
ALTER TABLE yourSchema.yourTable
ADD CONSTRAINT uniqueConstraint1 UNIQUE (RoleId, UserId, FromDate);
这样组合日期,RoleId和UserId只能在表中出现一次,其他尝试插入相同的组合将失败。
请注意,如果您的日期字段的每个记录中的时间部分值相同(例如0)或该字段的数据类型为DATE
(消除了时间部分),则这将起作用。
如果你的日期字段有记录各不相同时间部分,试试这个方法:
A)加入定义
ALTER TABLE yourSchema.yourTable
ADD constraintCheckDate AS CAST(FromDate AS DATE)
的计算列,并添加定义
的UNIQUE
约束
ALTER TABLE yourSchema.yourTable
ADD CONSTRAINT uniqueConstraint1 UNIQUE (RoleId, UserId, constraintCheckDate)
B)使用触发器在插入数据之前验证数据,数据只有在它不存在:
CREATE TRIGGER trig1 ON yourSchema.yourTable
INSTEAD OF INSERT
AS
BEGIN
IF NOT EXISTS
(
SELECT *
FROM yourSchema.yourTable t
JOIN inserted i ON
CAST(t.FromDate AS DATE) = CAST(i.FromDate AS DATE)
AND t.RoleId = i.RoleId
AND t.UserId = i.UserId
)
INSERT yourTable(RoleId, UserId, FromDate, ToDate)
SELECT RoleId, UserId, FromDate, ToDate
FROM inserted
ELSE
RAISERROR('Error', 16, 0)
END
GO
非常感谢.... – 2013-02-28 11:00:37
不客气,我很高兴我的帮助。 – 2013-02-28 11:03:01
该触发器正常工作..因为相同的数据没有插入表中。但它不会返回警告消息...我怎么能这样做... – 2013-02-28 12:21:17
我认为你应该改变你的表格结构。你没有每天在你的表格中放置一个索引。 – 2013-02-27 07:21:51
“FromDate”是否仅限于包含* date *(时间部分始终设置为午夜)或者是任何常规日期时间值,但每天只需要一个条目? – 2013-02-27 07:37:11