检查约束,确保tableA列中的值小于tableB列中的值

时间:2014-01-17 22:42:49

标签: sql sql-server database triggers check-constraints

我正在创建一个数据库,我有表ProjectDetails.TimeCardExp和ProjectDetails.Project。 TimeCardExp表有一列ExpenseDate,在表Project中有EndDate列; (他们都接受日期时间数据类型)。我想要做的是在TimeCardExp表的ExpenseDate列上实现一个约束,该列确保在TimeCardExp表的ExpenseDate列中输入的值小于同一员工的Project表的EndDate列中的值。

TimeCardExp表* TimeCardID * EmployeeID * ProjectID * ExpenseDate

项目表* ProjectID * EmployeeID * EndDate

上面是两个表和一些列,我的任务是确保在TimeCard.ExpenseDate中输入的值始终小于同一员工的Project.EndDate值。谢谢

1 个答案:

答案 0 :(得分:3)

如果可以将您想要避免的条件表达为简单连接(这里似乎就是这种情况),那么只要您创建一个帮助器表,就可以使用索引视图以声明方式强制执行此操作。

CREATE TABLE dbo.TwoRows
  (
     X INT PRIMARY KEY
  );

INSERT INTO dbo.TwoRows
VALUES      (1), (2)

然后,您只需表达应该永远不会发生的条件,并将其交叉连接到帮助程序表。

CREATE VIEW TimeCardExpenseDateLessThanProjectEndDate
WITH SCHEMABINDING
AS
  SELECT P.ProjectID,
         P.EmployeeID,
         P.EndDate,
         TC.ExpenseDate
  FROM   ProjectDetails.Project AS P
         INNER JOIN ProjectDetails.TimeCardExp AS TC
           ON P.ProjectID = TC.ProjectID
              AND P.EmployeeID = TC.EmployeeID
              AND P.EndDate <= TC.ExpenseDate
         CROSS JOIN dbo.TwoRows

GO

CREATE UNIQUE CLUSTERED INDEX IX
  ON TimeCardExpenseDateLessThanProjectEndDate(ProjectID, 
                                               EmployeeID, 
                                               EndDate, 
                                               ExpenseDate)