我正在创建一个数据库,我有表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值。谢谢
答案 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)