添加表级别约束,检查Sql Server 2005中的日期重叠

时间:2013-02-27 07:10:26

标签: sql-server-2005 check-constraints

我在Sql Server中有一个表,其中包含Columns:UserId,RoleId,FromDate和Todate。 我想写一个禁令,检查同一个RoleId和UserId在同一天不存在。

提前致谢....

1 个答案:

答案 0 :(得分:1)

如果您没有时间部分或所有记录中的时间部分相同,则可以使用UNIQUE约束:

ALTER TABLE yourSchema.yourTable 
ADD CONSTRAINT uniqueConstraint1 UNIQUE (RoleId, UserId, FromDate);

这样,date,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