我需要创建一个登录触发器,以便能够捕获 Windows 和 SQL Server 身份验证帐户用户上次登录时间。我遇到的问题是,当我以仅具有公共服务器角色权限的 SQL Auth 用户身份登录时,我得到:
由于触发器执行,登录“xxx”登录失败。 将数据库上下文更改为“master”。 将语言设置更改为 us_english。 (微软 SQL Server,错误:17892)
我需要能够允许仅具有公共服务器角色的用户登录并跟踪他们的时间。我不能授予他们除公开之外的任何其他权限。 这是我当前的触发器:
CREATE TRIGGER LogonTimeStamp
ON ALL SERVER FOR LOGON
AS
BEGIN
DECLARE @time DATETIME
SET @time = (SELECT login_time FROM (SELECT login_name, login_time, RANK() OVER(PARTITION BY login_name ORDER BY login_time DESC) AS rnk
FROM sys.dm_exec_sessions) ds WHERE rnk = 1 AND login_name = SYSTEM_USER)
IF EXISTS (SELECT * FROM db_admin.dbo.tblUser WHERE name = SYSTEM_USER)
UPDATE db_admin.dbo.tblUser
SET lastLoginDate = @time
WHERE name = SYSTEM_USER
END;
您可以使用 SQL Server 日志事件来执行此操作。只需更改默认行为即可跟踪所有登录、失败和成功:
USE [master]
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'AuditLevel', REG_DWORD, 3
GO
使用特殊过程 xp_readerrorlog 按时间间隔以预定方式捕获这些事件:
EXEC xp_readerrorlog 0, 1, N'Login succeeded for user', N'Connection made using', '20240901 00:00:00', '20240901 23:59:59.997';
这将让您在 2024 年 9 月 1 日登录 1 小时...
当然你可以将这个结果存储在一个表中,解析消息的数据并找到最后的登录...登录名就在第一个引号和后面的引号后面