У меня есть таблица, которая работает как журнал событий и хранит пользователей, подписанных в состоянии «В», «Вне» или «Отклонено» (иногда пользователи могут быть «Отклонены» на основании внешних критериев).
Вот несколько примеров данных, чтобы вы могли понять, как выглядит таблица:
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
Вот некоторый код ограничения проверки псевдо-проверки, описывающий то, что я хотел бы сделать:
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 , если его последнее состояние было , а не 'In'
- Человек может подписать OUT , если его последнее состояние было , а не 'Out'
- Человек может быть ОТКАЗАН , если его последнее состояние было , а не 'В'
Я не знаю, является ли Проверка Ограничения лучшим способом сделать это, или моя структура базы данных учитывает этот уровень ограничения; пожалуйста, дайте мне знать, если я не в своем уме (и, пожалуйста, предложите более подходящий метод для хранения данных и / или обеспечения целостности данных)
примечание: я использую SQL-Server 2008