You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

  1. 先创建清理过期数据的存储过程:
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
  1. 开启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:18:14