跟踪登录sql

跟踪登录sql,sql,sql-server,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表中,我从该表中

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

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

 INSERT INTO dbadb.dbo.TRACK_LOGIN (logontime, logon, loginname) EXEC XP_READERRORLOG 0, 1, [LOGIN SUCCEEDED FOR USER]
现在,该信息位于TRACK_LOGIN表中,我从该表中查询出不同的信息,并将其与此查询一起放入另一个表中:

 SELECT DISTINCT SUBSTRING(LOGINNAME,PATINDEX('%''%',LOGINNAME)+1,PATINDEX('%.%',LOGINNAME)-PATINDEX('%''%',LOGINNAME))FROM TRACK_LOGIN
我还想查询logontime列和distinct login,这样我就有了每天登录的用户和登录时间的列表

请帮助修改上面的select语句,以包括不同的登录及其最后一次登录时间


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

我知道您已经投入了一些真正的努力来实现这一点,但我仍然建议使用另一种方法,以产生更干净的结果:

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

这个例子展示了一个不同的用例,但我认为将它移植到您自己的问题上是没有问题的

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;
在所有服务器上创建用于登录的触发器MyLogonTrigger
作为
开始
如果SUSER_SNAME()“sa”
插入Test.dbo.LogonAudit(用户名、logonData、spid)
值(SUSER_SNAME(),GETDATE(),@@SPID);
结束;
去
在所有服务器上启用触发器MyLogonTrigger;

确定跟踪登录我这样做了,我丰富了第一种方法并实现了: 首先,我创建了一个名为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;
-----现在创建一个存储过程来执行此操作,它将查询AuditLoginErrors,并为您提供登录数据库的所有人的最后一次登录

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

谢谢,但这仍然留下了一个问题:如何在这个例子中使用最新的LogonDate来选择不同的用户名?答案似乎是通过登录从tracktable group中选择max(logintime)Test.dbo.LogonAudit的表,是吗?似乎您不知道当有人回答您的问题时您可以做什么:)您可以通过单击答案附近的复选标记来接受答案。另外,当你接受一个答案时,如果你也通过点击帖子附近的向上箭头来投票,那就太好了。这根本不是强制性的,但它是普通的、合理的和推荐的。有关接受答案如何工作的更多信息,请参见此。