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 用户或组作为登录名?