我有一个用作事件日志的表,并存储用户登录状态、“进入”、“退出”或“拒绝”(有时用户可能会根据外部条件被“拒绝”)。
这是一些示例数据,因此您可以了解表格的外观:
Table MyTable
PersonID - State - DateTime
// data sample
156 - 'Out' - 02-14-2010 13:04:15
156 - 'In' - 02-21-2010 09:01:13
16 - 'In' - 02-21-2010 09:05:01
58 - 'Rejected' - 02-21-2010 11:04:58
156 - 'Out' - 02-21-2010 11:10:02
这是一些pseduo检查约束代码,概述了我想做的事情:
CHECK(
CASE
WHEN (
[State] = 'In' AND
(Select TOP 1 State FROM MyTable WHERE PersonID=@PersonID_ToUpdate)!='In' ORDER BY DateTime DESC)
)
THEN 'T'
WHEN (
[State] = 'Out' AND
(Select TOP 1 State FROM MyTable WHERE PersonID=@PersonID_ToUpdate)!='Out' ORDER BY DateTime DESC)
)
THEN 'T'
WHEN (
[State] = 'Rejected' AND
(Select TOP 1 State FROM MyTable WHERE PersonID=@PersonID_ToUpdate)!='In' ORDER BY DateTime DESC)
)
THEN 'T'
ELSE 'F'
END = 'T'
)
基本上:
- 如果一个人的最后一个状态不是“In” ,则可以登录
- 如果一个人的最后状态不是“退出” ,则他们可以退出
- 如果一个人的最后一个状态不是“在” ,则他们可能会被拒绝
我不知道检查约束是否是最好的方法,或者我的数据库设计是否允许这种级别的约束;如果我疯了,请告诉我(并建议一种更合适的方法来存储数据和/或确保数据完整性)
注意:我使用的是 SQL-Server 2008