在SQLSERVER中记录登录用户的登录时间,通常需要结合系统内置的视图或者自定义日志表来实现,不同的实现方式对应不同的使用场景,下面分别介绍具体的实现方法。

方案一:查询系统视图获取用户登录时间
SQLSERVER的系统视图sys.dm_exec_sessions中存储了当前所有连接到数据库实例的会话信息,其中包含登录用户、登录时间等字段,我们可以直接查询这个视图获取用户登录时间。
查询当前所有登录用户的登录时间
以下是查询当前所有登录用户登录时间的sql语句:
-- 查询当前所有登录用户的登录时间
SELECT
login_name AS 登录用户名,
login_time AS 登录时间,
host_name AS 登录主机名,
program_name AS 登录程序名
FROM sys.dm_exec_sessions
WHERE is_user_process = 1 -- 只查询用户进程,排除系统进程
ORDER BY login_time DESC;
查询指定用户的登录时间
如果需要查询特定用户的登录时间,可以添加WHERE条件过滤:
-- 查询指定用户test_user的登录时间
SELECT
login_name AS 登录用户名,
login_time AS 登录时间,
host_name AS 登录主机名
FROM sys.dm_exec_sessions
WHERE is_user_process = 1
AND login_name = 'test_user' -- 替换为目标用户名
ORDER BY login_time DESC;
需要注意的是,sys.dm_exec_sessions只存储当前活跃的会话信息,如果用户已经断开连接,对应的记录会被清除,无法查询到历史登录记录。
方案二:自定义表记录用户登录时间
如果需要长期保存用户的登录时间记录,方便后续做历史统计,我们可以创建自定义的登录日志表,在用户登录时主动插入记录。
创建登录日志表
首先创建存储登录记录的表,包含用户ID、用户名、登录时间、登录IP等常用字段:
-- 创建用户登录日志表
CREATE TABLE UserLoginLog (
LogId INT IDENTITY(1,1) PRIMARY KEY, -- 日志ID,自增
UserId INT NOT NULL, -- 用户ID,关联用户表
UserName NVARCHAR(50) NOT NULL, -- 登录用户名
LoginTime DATETIME DEFAULT GETDATE(), -- 登录时间,默认当前时间
LoginIp NVARCHAR(50), -- 登录IP地址
HostName NVARCHAR(100) -- 登录主机名
);
插入登录记录
在用户登录的业务逻辑中,执行插入语句记录登录信息,以下是示例sql:
-- 用户登录成功后插入登录记录,假设用户ID为1,用户名为test_user,登录IP为192.168.0.100 INSERT INTO UserLoginLog (UserId, UserName, LoginIp, HostName) VALUES (1, 'test_user', '192.168.0.100', 'DEVICE_001');
查询历史登录记录
自定义表创建后,可以随时查询任意时间段的用户登录记录:
-- 查询2024年1月1日之后的所有用户登录记录
SELECT
LogId AS 日志ID,
UserName AS 登录用户名,
LoginTime AS 登录时间,
LoginIp AS 登录IP,
HostName AS 登录主机名
FROM UserLoginLog
WHERE LoginTime >= '2024-01-01'
ORDER BY LoginTime DESC;
注意事项
- 使用系统视图查询时,需要有对应的系统视图查询权限,普通用户如果没有权限可以联系数据库管理员授权。
- 自定义登录日志表需要根据实际业务需求扩展字段,比如可以增加登录状态、退出时间等字段完善日志信息。
- 如果登录用户量较大,建议定期清理UserLoginLog表中的历史数据,避免表数据过大影响查询性能。