跟踪登录sql
我有一个在我的服务器上运行的作业,用于跟踪我的sql server上的最后一次登录,以便审计非活动用户。 首先,我在服务器上启用了跟踪成功登录 我创建了一个名为TRACK_LOGIN的表,并每天运行该表:跟踪登录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表中,我从该表中
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)但是我想你有一个更复杂的问题。您能编辑您的问题以显示一些示例数据和预期的输出吗?当我创建上面提供的触发器时,可以:在所有服务器上创建触发器MyLogonTrigger,以便作为BEGIN登录,如果SUSER_SNAME()'sa'插入Test.dbo.LogonAudit(UserName,LogonDate,spid)值(SUSER_SNAME(),GETDATE(),@@spid); 结束;在所有服务器上启用触发器MyLogonTrigger;它会阻止所有用户,除了说您实际上没有一个名为
Test.dbo.LogonAudit
的表,是吗?似乎您不知道当有人回答您的问题时您可以做什么:)您可以通过单击答案附近的复选标记来接受答案。另外,当你接受一个答案时,如果你也通过点击帖子附近的向上箭头来投票,那就太好了。这根本不是强制性的,但它是普通的、合理的和推荐的。有关接受答案如何工作的更多信息,请参见此。