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

Posted

技术标签:

【中文标题】SQL Server 2016 - 如何获取用户的最后登录日期?【英文标题】:SQL Server 2016 - How to get last logged in date for user? 【发布时间】:2018-06-02 23:26: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 中,或者该解决方案的替代方案是什么?

【问题讨论】:

不知道为什么,但accdate 实际上与createdate 相同。如果您查看 sys.syslogins 的 DDL,您会发现它们被定义为` createdate = p.create_date` 和 accdate = p.create_date。我不确定您是否可以从 SQL Server 获取登录日期。您可能需要设置某种扩展事件来存储此信息。我假设您也可以设置服务器级触发器,但只需确保您插入的表可供公众访问,并且没有用户拥有DENY(否则他们将无法登录)。我真的不推荐TRIGGER 您可能会对Stack DBA 上的这个问题感到高​​兴。正如@Larnu 所说,我不认为 SQL Server 开箱即用。调查extended events。 【参考方案1】:

使用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

【讨论】:

我已经这样做了。问题是没有我需要的用户。例如,我有用户test1,但该视图中没有该用户的数据。如果我能以某种方式将那个用户“推”到那里,并为那个用户打开日志记录,那就太好了 您必须首先使用您创建的用户名登录以获取sys.dm_exec_sessions 的记录 谢谢!恐怕我不能被其他用户登录 所以除非记录成功,否则不会插入记录! 我使用的是 SQL Server 2017。当我关闭桌面应用程序时,记录会立即消失,而当我关闭 SSMS 中的连接时,它会保留。唯一可以确定的是,我希望没有未显示在 sys.dm_exec_sessions 中的活动登录。对于尝试找出上次登录的时间没有用。【参考方案2】:
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 Server 2016 - 如何获取用户的最后登录日期?的主要内容,如果未能解决你的问题,请参考以下文章

始终加密 - SQL Server 2016 如何在加密列上使用用户案例语句

如何在 SQL Server 2016 中添加 Active Directory 用户或组作为登录名?

从 SQL Server 获取客户端操作系统用户名

从 SQL Server 2008 数据库获取上次登录时间

如何在 SQL Server 中获取用户定义的表值函数的结果形状? [复制]

如何获取 SQL Server 中的表结构?