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

18

我该如何获取某个用户的最后登录日期?我在谷歌上搜索并发现了这个查询

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 中,或者有没有替代解决方案?


1
不确定为什么,但是accdate实际上与createdate相同。如果您查看sys.syslogins的DDL,您会发现它们被定义为createdate = p.create_dateaccdate = p.create_date。我不确定您是否可以从SQL Server中获取登录日期。您可能需要设置某种扩展事件来存储此信息。我假设您也可以设置服务器级触发器,但请确保您插入的表可由公共访问,并且没有用户具有DENY(否则他们将无法登录)。我不太推荐使用TRIGGER - Thom A
1
你可能会在Stack DBA上得到更多的帮助。正如@Larnu所说,我认为SQL Server默认情况下不支持此功能。请尝试使用扩展事件进行调查。 - David Rushton
请翻译以下关于编程的内容,从英语到中文。只返回翻译后的文本:查找用户最后一次连接时间的SQL Server近似副本 - Jon Schneider
3个回答

15

使用 sys.dm_exec_sessions 系统视图,可以查看有关所有活动用户连接和内部任务的信息。 该信息包括客户端版本、客户端程序名称、客户端登录时间、登录用户、当前会话设置等。

以下是一个小脚本,希望能对您有所帮助!

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中。


您必须首先使用您创建的用户名登录,以便将记录插入到 sys.dm_exec_sessions 中。 - ahmed abdelqader
1
只有在日志记录成功的情况下才会插入记录! - ahmed abdelqader
3
我正在使用SQL Server 2017。当我关闭我的桌面应用程序时,记录会立即消失,但是当我在SSMS中关闭连接时,记录会保留。唯一的问题是,在sys.dm_exec_sessions中没有显示任何活动登录,希望如此。这对于尝试查找上次登录时间不是很有用。 - Hrvoje Batrnek
2
是的,sys.dm_exec_sessions文档中写道:“返回SQL Server上每个经过身份验证的会话一行” - 因此,这个答案并不告诉您那些不再是活动会话一部分的系统登录上次登录的时间。 - youcantryreachingme
因为这并不是问题所要求的,所以被踩了。 “活跃用户连接”与“每个服务器登录/主体的上次登录日期”根本不是同一回事。 - Stuart J Cuthbertson
显示剩余3条评论

4
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

2

默认情况下,SQL Server不记录最后登录日期 :'(

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

  • 使用扩展事件会话记录登录信息(例如,请参见此文章),然后查询以获取所需信息。可能有一个“连接跟踪”模板记录了您需要的信息。
  • 触发器(呃,不推荐)
  • SQL Server Audit 功能(与扩展事件一样灵活,但当您只需要最后登录日期时很难理解)。
  • 定期查看当前登录信息的 SQL 代理作业,通过查询 sys.dm_exec_sessions 系统视图。我不建议这样做,因为您可能会错过某些登录信息,并且它比使用 SQL 提供的扩展事件基础架构会增加更高的负载。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接