SQL Server插入token后超时未使用自动删除数据行实现方案
SQL Server 到期自动删除未使用Token实现方案
首先明确两个核心结论:
- SQL Server 完全可以实现到期自动删除数据行的需求
- 单纯靠前端JS的
Date.now()方法无法实现可靠的自动过期删除,这个方法取的是用户本地浏览器时间,用户篡改本地系统时间就会导致判断失效,所有时间判断必须统一使用服务端(数据库/后端C#)的UTC时间。
第一步:调整account_token表结构
你现有的表只存储了email和token字段,缺少时间维度的判断依据,先执行以下SQL补充必要字段:
ALTER TABLE account_token ADD create_time DATETIME2 NOT NULL DEFAULT GETUTCDATE(), -- token创建时间 last_used_time DATETIME2 NOT NULL DEFAULT GETUTCDATE() -- token最后一次使用时间
字段加了默认值之后,你原有插入逻辑不修改也能正常运行,数据库会自动写入当前UTC时间。
第二步:调整后端写入、校验逻辑
插入逻辑优化(可选,更稳妥)
如果不想依赖数据库默认值,可以在C#代码里显式传入UTC时间,避免数据库时区配置问题,修改后的插入代码如下:
DateTime currentUtcTime = DateTime.UtcNow; string command1 = "insert into account_token(email, token, create_time, last_used_time) values (@email, @token, @createTime, @lastUsedTime)"; using(var cmd1 = new SqlCommand(command1, con)) { cmd1.Parameters.AddWithValue("@email", email); cmd1.Parameters.AddWithValue("@token", token); cmd1.Parameters.AddWithValue("@createTime", currentUtcTime); cmd1.Parameters.AddWithValue("@lastUsedTime", currentUtcTime); cmd1.CommandTimeout = 60; cmd1.ExecuteNonQuery(); con.Close(); }
Token校验逻辑必改
每次请求携带token做合法性校验时,必须同步更新last_used_time字段,否则无法判断token是否在有效期内被使用过,校验逻辑参考SQL如下:
-- @token 前端传入的待校验token,@expireMinutes 配置的token有效时长(比如30分钟) UPDATE account_token SET last_used_time = GETUTCDATE() WHERE token = @token AND DATEDIFF(MINUTE, last_used_time, GETUTCDATE()) < @expireMinutes -- 执行后判断影响行数,大于0说明token有效,否则为过期/伪造token
第三步:配置自动清理规则
SQL Server没有内置的“行到期自动触发删除”的事件机制,通过定时任务批量清理过期数据是生产环境最常用的稳定方案,两种实现方式二选一即可:
方案1:使用SQL Server代理作业(适合完整版SQL Server)
- 先创建清理过期数据的存储过程:
CREATE PROCEDURE sp_DeleteExpiredTokens @expireMinute INT = 30 -- 与你配置的token有效期保持一致 AS BEGIN SET NOCOUNT ON; DELETE FROM account_token WHERE DATEDIFF(MINUTE, last_used_time, GETUTCDATE()) >= @expireMinute END GO
- 开启SQL Server代理,新建定时作业,设置执行频率(建议每5-10分钟执行一次),作业步骤中执行语句
EXEC sp_DeleteExpiredTokens @expireMinute = 30即可,作业会自动按周期清理所有过期未使用的token。
方案2:ASP.NET 托管服务定时清理(适合SQL Server Express等无代理版本)
如果你用的是没有SQL Server代理的精简版数据库,直接在后端实现定时清理逻辑即可,在ASP.NET项目中添加IHostedService实现的后台任务,每隔固定时间执行一次上面的删除SQL,不需要依赖数据库侧能力,效果完全一致。
内容的提问来源于stack exchange,提问作者Syfy
相关产品推荐
相关产品推荐

