SQLSERVER記錄登錄用戶的登錄時間


SQLSERVER記錄登錄用戶的登錄時間

前一陣子經理問我能不能把用戶最后一次登錄我們的業務數據庫的時間記錄下來,因為之前有人修改過數據庫sa用戶

的登錄密碼,所以我們要記錄一下。

我查了一下資料,好像不能記錄誰登錄過業務庫,只能記錄誰登錄過SQLSERVER

數據庫版本是SQL2005  ,操作系統:Windows7

下面是本人寫的一個腳本,我的實現原理是使用觸發器,觸發器是登錄觸發器,范圍是整個服務器范圍,如果有人登錄過,就使用

bcp命令把登錄信息記錄日志文件

1、如果原來數據庫已經存在觸發器把他刪掉

1 USE MASTER
2 GO
3 DROP TRIGGER trg_logon_attempttest ON ALL SERVER
4 GO

2、在D盤新建一個文本文件 d:\Logondata.txt  這個文本文件用來記錄登錄信息

3、創建一個登錄觸發器審核登錄事件

 1 CREATE TRIGGER trg_logon_attempttest
 2 ON ALL SERVER
 3 WITH EXECUTE AS'sa'  
 4 FOR LOGON,ALTER_LOGIN
 5 AS
 6 BEGIN
 7 DECLARE
 8     @cmd nvarchar(4000)
 9 ;
10 SELECT
11     @cmd = 'ECHO '
12         + ORIGINAL_LOGIN()+ CHAR(9) + CONVERT(varchar(100), GETDATE(), 121)
13         + ' >> d:\Logondata.txt'
14 ;
15 DECLARE @tb_re TABLE(re varchar(4000));  
16 INSERT @tb_re exec master.. xp_cmdshell @cmd
17 END
18 GO

這樣當每次登錄SQLSERVER的時候就會記錄登錄時間和登錄用戶名

在創建觸發器前,需要開啟xp_cmdshell擴展存儲過程,並且不要禁用sa用戶

不然會遇到下面這種情況,登錄不了服務器,我的計算機名是joe

 

如果遇到這種情況可以使用SQLSERVER的專用管理員連接(DAC)連接進服務器,並把觸發器先刪除掉

 

日志的樣式是這樣的:

 1 NT AUTHORITY\SYSTEM    2013-02-08 16:49:04.140 
 2 NT AUTHORITY\SYSTEM    2013-02-08 16:49:14.210 
 3 NT AUTHORITY\SYSTEM    2013-02-08 16:49:24.277 
 4 JOE\Administrator    2013-02-08 16:49:31.753 
 5 JOE\Administrator    2013-02-08 16:49:31.963 
 6 NT AUTHORITY\SYSTEM    2013-02-08 16:49:34.327 
 7 JOE\Administrator    2013-02-08 16:49:35.777 
 8 sa    2013-02-08 16:51:39.930 
 9 NT AUTHORITY\SYSTEM    2013-02-08 16:52:03.147 
10 NT AUTHORITY\SYSTEM    2013-02-08 16:52:13.337 
11 NT AUTHORITY\SYSTEM    2013-02-08 16:52:23.410 
12 NT AUTHORITY\SYSTEM    2013-02-08 16:52:33.830 
13 NT AUTHORITY\SYSTEM    2013-02-08 16:52:44.703 
14 NT AUTHORITY\SYSTEM    2013-02-08 16:52:54.407 
15 NT AUTHORITY\SYSTEM    2013-02-08 16:52:54.623 
16 NT AUTHORITY\SYSTEM    2013-02-08 16:52:54.797 
17 NT AUTHORITY\SYSTEM    2013-02-08 16:52:54.823 
18 NT AUTHORITY\SYSTEM    2013-02-08 16:52:54.893 
19 NT AUTHORITY\SYSTEM    2013-02-08 16:52:55.147 
20 NT AUTHORITY\SYSTEM    2013-02-08 16:52:55.277 

 


現在還有兩個問題沒有解決:

(1)我只想記錄非Windows驗證方式的用戶登錄,不想記錄Windows驗證方式的 ,現在還沒有找到方法

(2)修改登錄用戶密碼的動作要記錄,但是找了很久也沒有找到使用什么函數

 

可能這篇文章還有錯誤,歡迎大家拍磚o(∩_∩)o !!

昨天看了一下AdventureWorks數據庫,原來他里面有一個表“dbo.DatabaseLog

記錄了人們對AdventureWorks數據庫所做的操作,非常詳細,可惜由於他使用服務器范圍的觸發器

來記錄操作信息,而且這個觸發器不是 “隨庫附送”,不然我也可以參考他的觸發器代碼自己做一個

他記錄的內容真的非常詳細

查了MSDN也找不到這個觸發器,希望見過這個觸發器或者知道這個觸發器告知我一聲,謝謝大家了 o(∩_∩)o 

 今晚在MSDN上找到監控代碼,但是依然不能監控密碼更改,還有觸發器是數據庫級別的,不能建立在服務器級別

 1 USE [pratice];
 2 GO
 3 CREATE TABLE ddl_log (PostTime datetime,DatabaseName NVARCHAR(100), DB_User nvarchar(100), Event nvarchar(100),LoginName NVARCHAR(100), TSQL nvarchar(2000));
 4 GO
 5 
 6 SELECT * FROM [dbo].[ddl_log]
 7 
 8 
 9 CREATE  TRIGGER tri_LogServerEvent 
10 ON DATABASE  --或者服務器級別 ALL SERVER 
11 FOR DDL_DATABASE_LEVEL_EVENTS  --或者服務器級別:DDL_SERVER_LEVEL_EVENTS
12 AS
13 DECLARE @data XML
14 SET @data = EVENTDATA()
15 INSERT ddl_log 
16    (PostTime,DatabaseName, DB_User, Event, LoginName,TSQL) 
17    VALUES 
18    (GETDATE(), 
19    @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'),
20    CONVERT(nvarchar(100), CURRENT_USER), 
21    @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
22    @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'), 
23    @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
24 GO
25 --Test the trigger.
26 CREATE TABLE TestTable (a int);
27 DROP TABLE TestTable ;
28 GO
29 SELECT * FROM ddl_log ;
30 GO
31 --Drop the trigger.
32 DROP TRIGGER tri_LogServerEvent
33 ON DATABASE;
34 GO
35 --Drop table ddl_log.
36 DROP TABLE ddl_log;
37 GO

文章出處:

http://msdn.microsoft.com/zh-cn/library/ms173781.aspx

http://msdn.microsoft.com/zh-cn/library/ms186456(v=SQL.90).aspx

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM