イベント ログとして機能し、ユーザーのサインイン状態、「イン」、「アウト」、または「拒否」を格納するテーブルがあります (ユーザーは、外部基準に基づいて「拒否」される場合があります)。
テーブルがどのように見えるかを理解できるように、いくつかのサンプル データを次に示します。
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」でない場合、ユーザーはサインインできます
- 最後の状態が「アウト」でない場合、人はサインアウトできます
- 最後の状態が「イン」でない場合、その人は拒否される可能性があります
チェック制約がこれを行うための最良の方法なのか、データベースの設計でこのレベルの制約が許容されるのかはわかりません。私の頭がおかしい場合はお知らせください(データを保存したり、データの完全性を確保したりするためのより適切な方法を親切に提案してください)
注: SQL Server 2008 を使用しています