SQL Server 2016 - 如何获取用户的上次登录日期?

SQL Server 2016 - How to get last logged in date for user?

如何获取特定用户的最后登录日期。 我用谷歌搜索并偶然发现了这个查询

SELECT name, accdate FROM sys.syslogins

但是 accdate 列似乎已被弃用,并且不会更新。

我还有一条线索

SELECT login_name, max(login_time) as last_logged_in 
FROM sys.dm_exec_sessions GROUP BY login_name

但它只显示系统用户的结果,而不显示我使用此查询创建的结果

CREATE USER test1 FOR LOGIN test1 WITH DEFAULT_SCHEMA = 'test1'

问题是,如何让自定义创建的用户出现在 sys.dm_exec_sessions 中,或者该解决方案的替代方案是什么?

使用sys.dm_exec_sessions系统视图

shows information about all active user connections and internal tasks. This information includes client version, client program name, client login time, login user, current session setting, and more.

这里有一个小脚本希望能帮到你!

SELECT login_name [Login] , MAX(login_time) AS [Last Login Time]
FROM sys.dm_exec_sessions
GROUP BY login_name;

更新

关于新登录,您必须先登录他们才能在 sys.dm_exec_sessions

中获得记录

所以使用下一个代码创建登录:-

CREATE LOGIN NewAdminName WITH PASSWORD = 'ABCDa@12'
GO
CREATE USER [NewAdminName] FOR LOGIN [NewAdminName]
EXEC sp_addrolemember N'db_owner', N'NewAdminName'

现在登录:-

User Name = NewAdminName

Password: ABCDa@12

登录成功后,本次登录信息存入sys.dm_exec_sessions

select DISTINCT login_time, host_name, program_name, login_name from
(SELECT sys.dm_exec_sessions.*,
RANK() OVER(PARTITION BY login_name ORDER BY login_time DESC) as rnk
FROM sys.dm_exec_sessions) l
where l.rnk = 1
ORDER BY l.login_time DESC

默认情况下,SQL 服务器不记录上次登录日期:'(

您可以通过多种方式自行录制,例如

  • 扩展事件会话以记录登录(例如,参见 this article),然后您查询它以获得您想要的内容。有一个“连接跟踪”模板,可能会记录您需要的信息。
  • 触发器(呃,不推荐)
  • SQL Server Audit 功能(与 Extended Events 一样超级灵活,但当您只想要最后一次登录日期时很难理解)。
  • 一个 SQL 代理作业,它通过查询 sys.dm_exec_sessions 系统视图定期查看当前登录。我不推荐这样做,因为你很可能会错过一些登录,而且它比使用 SQL 提供的扩展事件基础设施带来更高的负载。