我有一個表,用作事件日誌並存儲用戶登錄狀態'In','Out'或'Rejected'(有時候我的用戶是'根據外部標準被拒絕)。SQL Server檢查Contraint並檢查登錄/註銷狀態
下面是一些示例數據,因此你可以得到的表是什麼樣子的想法:
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 [email protected]_ToUpdate)!='In' ORDER BY DateTime DESC)
)
THEN 'T'
WHEN (
[State] = 'Out' AND
(Select TOP 1 State FROM MyTable WHERE [email protected]_ToUpdate)!='Out' ORDER BY DateTime DESC)
)
THEN 'T'
WHEN (
[State] = 'Rejected' AND
(Select TOP 1 State FROM MyTable WHERE [email protected]_ToUpdate)!='In' ORDER BY DateTime DESC)
)
THEN 'T'
ELSE 'F'
END = 'T'
)
基本上是:
- 一個人可以,如果他們最後的狀態簽名IN在不「在」
- 一個人可以註冊OUT,如果他們最後的狀態是不「出」
- 一個人可以是拒絕的,如果他們最後的狀態是不「在」
我不知道檢查約束是否是最好的方法來做到這一點,或者如果我的數據庫設計將允許這個級別的約束;請讓我知道,如果我走了我的心(和好心建議用於存儲數據和/或確保數據的完整性更合適的方法)
注:我使用的是SQL-Server 2008的
+1,不要使用udf check約束! – 2010-02-22 18:24:42