SQL:查找用户登录时间

90 阅读1分钟

SQL Server:查找用户登录时间

在 SQL Server 中查找从不登录的用户并非易事。但是我们可以通过创建登录触发器来做到这一点。

要查找从未登录 SQL Server 的用户,我们需要:

  • 创建登录触发器(登录时执行的 SQL 代码);
  • 记录来自此触发器的访问。
  • 定期查询访问日志表。

访问表

创建登录访问表:

USE logs
GO
CREATE TABLE login_access (
    username SYSNAME,
    last_login DATETIME2 DEFAULT SYSUTCDATETIME(),
    PRIMARY KEY (username, last_login)
)
GO

添加行时,我们只能指定用户名。默认情况下,last_login将包含当前的 UTC 日期时间。

登录触发器

创建触发器:

CREATE TRIGGER trg_log_access
    ON ALL SERVER
    FOR LOGON
AS BEGIN
    INSERT INTO login_access (username) VALUES(SUSER_NAME());
END;

登录时,触发器记录登录。SUSER_NAME()返回登录标识名称。

信息查询

列出自触发器创建以来从未登录过的用户:

SELECT dp.name
    FROM sys.database_principals dp
    LEFT JOIN logs.login_access la
        ON dp.name = la.username
    WHERE la.username IS NULL
GO

列出上个月未登录的用户:

SELECT dp.name
    FROM sys.database_principals dp
    LEFT JOIN logs.login_access la
        ON dp.name = la.username
        AND la.last_login >= DATEADD(month, -1, SYSUTCDATETIME())
    WHERE la.username IS NULL
    FETCHS FIRST 1 ROW ONLY
GO

DATEADD(month, -1, SYSUTCDATETIME())返回当前 UTC 日期时间减去一个月,如DATETIME2.

获取用户上次登录时间:

SELECT MAX(last_login)
    FROM logs.login_access
    WHERE username = '...'
GO