我做的项目类似于百度知道,当然比百度知道要简单许多。一个问题分享平台,用户提出问题后若是在规定期限内不做任何处理(不采纳正确答案,也不关闭问题或者干脆就忘了这码事儿),那么到期的时候问题被视为过期问题,用户也要得到扣分惩罚。由于每个问题的到期时间都不一样,所以问题到期时扣分这项操作就不可能由人来手动实时完成。
一种方案就是用户登陆之后,页面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