我有一个在我的服务器上运行的作业,用于跟踪我在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语句,以包含不同的登录以及上次登录时间。
这是为了让我回顾我的用户上次登录,并删除服务器上未使用的用户。
答案 0 :(得分:2)
我知道你已经付出了一些努力来完成这项工作,但我仍然建议采用不同的方法来产生更清晰的结果:
这将允许您将正确类型的数据插入表中,并且不会强制您解析日志条目。
此示例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