跟踪登录sql

时间:2016-01-06 18:30:23

标签: sql sql-server

我有一个在我的服务器上运行的作业,用于跟踪我在sql server上的最后一次登录,因此我可以审核非活动用户。 首先,我启用了在服务器上跟踪成功登录

我创建了一个名为TRACK_LOGIN的表,并每天运行:

 INSERT INTO dbadb.dbo.TRACK_LOGIN (logontime, logon, loginname) EXEC XP_READERRORLOG 0, 1, [LOGIN SUCCEEDED FOR USER]

现在该信息在TRACK_LOGIN表中,我从该表中查询DISTINCT并将其放入另一个包含此查询的表中:

 SELECT DISTINCT SUBSTRING(LOGINNAME,PATINDEX('%''%',LOGINNAME)+1,PATINDEX('%.%',LOGINNAME)-PATINDEX('%''%',LOGINNAME))FROM TRACK_LOGIN

我还想查询列登录时间以及不同的登录信息,这样我每天都会列出谁登录以及登录的时间?

请帮助修改上面的select语句,以包含不同的登录以及上次登录时间。

这是为了让我回顾我的用户上次登录,并删除服务器上未使用的用户。

2 个答案:

答案 0 :(得分:2)

我知道你已经付出了一些努力来完成这项工作,但我仍然建议采用不同的方法来产生更清晰的结果:

Logon triggers

这将允许您将正确类型的数据插入表中,并且不会强制您解析日志条目。

此示例here显示了不同的用例,但我认为将其移植到您自己的问题中没有任何问题。

CREATE TRIGGER MyLogonTrigger ON ALL SERVER FOR LOGON
AS 
BEGIN
    IF SUSER_SNAME() <> 'sa'
    INSERT INTO Test.dbo.LogonAudit (UserName, LogonDate, spid) 
            VALUES (SUSER_SNAME(), GETDATE(), @@SPID);
END;
GO
ENABLE TRIGGER MyLogonTrigger ON ALL SERVER;

答案 1 :(得分:0)

好的跟踪登录我做了这个,我丰富了第一个方法并实现了这个: 首先,我创建了一个名为logonaudit的表:

 CREATE TABLE LogonAudit
(
    AuditID INT NOT NULL CONSTRAINT PK_LogonAudit_AuditID 
                PRIMARY KEY CLUSTERED IDENTITY(1,1)
    , UserName NVARCHAR(255)
    , LogonDate DATETIME
    , spid INT NOT NULL
);

然后我必须在该表上授予插入:

GRANT INSERT ON dbadb.dbo.LogonAudit TO public;

我创建了另一个名为auditloginresults的表:

create table auditLoginResults
(
AuditID INT,
Username NVARCHAR(255),
LogonDate DATETIME,
SPID INT 
);

然后我创建了一个触发器,将所有登录和时间记录到第一个表LogonAudit。我必须创建一个名为login_audit的登录,并允许它插入到我的表中。然后我不得不使用origional_login()来记录用户登录,如果你不这样做,它将阻止所有不是sa的登录

CREATE TRIGGER MyLogonTrigger 
ON ALL SERVER WITH EXECUTE AS 'login_audit'
FOR LOGON
AS 
BEGIN
INSERT INTO DBADb.dbo.LogonAudit (UserName, LogonDate, spid) 
        VALUES (ORIGINAL_LOGIN(), GETDATE(), @@SPID);

END;

现在我创建了一个作业(您需要创建一个作业,以便在特定时间使用此代码运行,这不是作业的代码,只是您在作业中运行的代码)来查询第一个表LogonAudit并将结果放入auditloginResults表中,在该步骤之后,我通过运行另一步删除第一个表中的数据来清除第一个表LogonAudit。我不打算发布工作以保持威胁清洁,但这是在工作中运行的

创建工作步骤1 ------------------------------------------ --------------

INSERT INTO DBADb.dbo.auditLoginResults
SELECT I.* 
FROM DBADb.[dbo].[LogonAudit]  AS I
INNER JOIN 
       (SELECT UserName, MAX([logondate]) AS MaxDate
        FROM DBADb.[dbo].[LogonAudit] 
        GROUP BY UserName
       ) AS M ON I.logondate = M.MaxDate 
             AND I.UserName = M.UserName

` -----现在创建作业以清除logonaudit表第2步

DELETE FROM dbadb.dbo.auditLoginResults;

-----现在创建一个存储过程来执行此操作将查询auditloginreaults并为您提供登录数据库的每个人的最后一次登录

SELECT I.* 
FROM DBADb.[dbo].[auditLoginResults]  AS I
INNER JOIN 
           (SELECT UserName, MAX([logondate]) AS MaxDate
            FROM DBADb.[dbo].[ auditLoginResults] 
            GROUP BY UserName
           ) AS M ON I.logondate = M.MaxDate 
                 AND I.UserName = M.UserName