SQL Server:查找用户登录时间
在 SQL Server 中查找从不登录的用户并非易事。但是我们可以通过创建登录触发器来做到这一点。
要查找从未登录 SQL Server 的用户,我们需要:
- 创建登录触发器(登录时执行的 SQL 代码);
- 记录来自此触发器的访问。
- 定期查询访问日志表。
访问表
创建登录访问表:
USE logs
GO
CREATE TABLE login_access (
username SYSNAME,
last_login DATETIME2 DEFAULT SYSUTCDATETIME(),
PRIMARY KEY (username, last_login)
)
GO
添加行时,我们只能指定用户名。默认情况下,last_login将包含当前的 UTC 日期时间。
登录触发器
创建触发器:
CREATE TRIGGER trg_log_access
ON ALL SERVER
FOR LOGON
AS BEGIN
INSERT INTO login_access (username) VALUES(SUSER_NAME());
END;
登录时,触发器记录登录。SUSER_NAME()返回登录标识名称。
信息查询
列出自触发器创建以来从未登录过的用户:
SELECT dp.name
FROM sys.database_principals dp
LEFT JOIN logs.login_access la
ON dp.name = la.username
WHERE la.username IS NULL
GO
列出上个月未登录的用户:
SELECT dp.name
FROM sys.database_principals dp
LEFT JOIN logs.login_access la
ON dp.name = la.username
AND la.last_login >= DATEADD(month, -1, SYSUTCDATETIME())
WHERE la.username IS NULL
FETCHS FIRST 1 ROW ONLY
GO
DATEADD(month, -1, SYSUTCDATETIME())返回当前 UTC 日期时间减去一个月,如DATETIME2.
获取用户上次登录时间:
SELECT MAX(last_login)
FROM logs.login_access
WHERE username = '...'
GO