我做的項目類似於百度知道,當然比百度知道要簡單許多。一個問題分享平台,使用者提出問題後若是在規定期限內不做任何處理(不採納正確答案,也不關閉問題或者乾脆就忘了這碼事兒),那麼到期的時候問題被視為到期問題,使用者也要得到扣分懲罰。由於每個問題的到期時間都不一樣,所以問題到期時扣分這項操作就不可能由人來手動即時完成。
一種方案就是使用者登陸之後,頁面page_load觸發查詢方法查詢目前使用者是否有到期問題,有的話就扣分。但是使用者如果不登陸,那麼就不會扣分,而實際上問題已經到期了,不太符合要求。那麼就只有每個使用者登陸的時候查詢所有問題是否到期。這樣的話如果網站流量過大,那麼效能將很難保證。
第二種方案。SQL Server2005有一項功能叫做SQL Server代理作業。其中一項功能是由使用者自己設定一個時間點來觸發某條SQL語句。這剛好符合我的要求。
首先右鍵點擊“SQL Server代理”,選擇“新增作業”。快顯視窗。左側“選擇頁”選項有六項設定。一般只要設定前三項就可以。“常規”裡設定一些簡單的名稱和說明,隨便填。確定。“步驟”裡可以添加執行步驟以及SQL語句。選擇好資料庫之後點擊確定。進入“計劃”設定--建立,這裡就可以設定你的作業執行的頻率以及執行的時間了。
貼上幾張圖,一看便知。
計劃:
貼上裡面SQL代碼:
Code
--更新問題表[work_status_id]欄位以及扣除到期問題不處理的使用者積分的事務
BEGIN TRANSACTION
DECLARE @errornum INT
--扣分
UPDATE [DBKnow].[dbo].[tbZDUser_base]
SET [useroffer] = [useroffer]-20
WHERE userid
in
(SELECT userid from [tbZDQuestion] where
DateDiff ("hour",[release_time],getdate())>336
AND work_status_id<5)
SET @errornum=@errornum+@@error
--更新[work_status_id]和[Operation_time]
UPDATE [DBKnow].[dbo].[tbZDQuestion]
SET [Operation_time] = getdate()
,[work_status_id]=5
WHERE
DateDiff ("hour",[release_time],getdate())>336
AND [work_status_id]<5
SET @errornum=@errornum+@@error
--判斷是否有錯誤
IF @errornum<>0
BEGIN
PRINT '有錯誤'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
PRINT '操作成功'
END
COMMIT TRANSACTION