笔记168 实现白的有人登录过数据库或者改过密码都记录日志的需求 2013-2-6

笔记168 实现白的有人登录过数据库或者改过密码都记录日志的需求 2013-2-6

  1 --实现白的有人登录过数据库或者改过密码都记录日志的需求 2013-2-6
  2 
  3 --注意:如果你登录不了数据库,不管是sa还是其他登录用户
  4 --这时候要使用DAC连接进去数据库,不用重装
  5 --数据库,在SSMS左上角的新建查询那里连接数据库
  6 --因为DAC连接只能使用左上角的新建查询,然后删除触发器就可以了
  7 USE MASTER
  8 GO
  9 DROP TRIGGER trg_logon_attempttest ON ALL SERVER
 10 GO
 11 
 12 -----------------------------------------------------------------------------------------
 13 --创建一个登录触发器审核登录事件
 14 --------------------------------------------------------
 15 
 16 
 17 --------/***************
 18 --------演示数据库和审核表
 19 --------3w@live.cn
 20 --------*******************/
 21 
 22 CREATE DATABASE ExampleAuditDB
 23 GO
 24 USE ExampleAuditDB
 25 GO
 26 
 27 CREATE TABLE dbo.RestrictedLogonAttempt
 28 (LoginNM sysname NOT NULL,
 29 AttemptDT DATETIME NOT NULL)
 30 GO
 31 
 32 --------/***************
 33 --------创建登录触发器
 34 --------3w@live.cn
 35 --------*******************/
 36 
 37 CREATE TRIGGER trg_logon_attempttest
 38 ON ALL SERVER
 39 WITH EXECUTE AS'sa' 
 40 FOR LOGON,ALTER_LOGIN
 41 AS
 42 BEGIN
 43 --INSERT ExampleAuditDB.dbo.RestrictedLogonAttempt
 44 --(LoginNM, AttemptDT)
 45 --VALUES (ORIGINAL_LOGIN(), GETDATE())
 46 DECLARE
 47      @cmd nvarchar(4000)
 48 ;
 49 SELECT
 50      @cmd = 'ECHO '
 51           + ORIGINAL_LOGIN()+ CHAR(9) + CONVERT(varchar(100), GETDATE(), 121)
 52           + ' >> d:\Logondata.txt'
 53 ;
 54 DECLARE @tb_re TABLE(re varchar(4000));  --如果使用表的话,这里的表变量改为你的数据库里的表即可,这里使用增量记录日志文件就可以了
 55 INSERT @tb_re exec master.. xp_cmdshell @cmd
 56 END
 57 GO
 58 
 59 --------/***************
 60 --------查看审核记录
 61 --------3w@live.cn
 62 --------*******************/
 63 USE ExampleAuditDB
 64 GO
 65 SELECT * from dbo.RestrictedLogonAttempt
 66 go
 67 
 68 --------/***************
 69 --------删除演示数据库及演示触发器
 70 --------3w@live.cn
 71 --------*******************/
 72 USE [ExampleAuditDB]
 73 go
 74 
 75 USE MASTER
 76 GO
 77 DROP TRIGGER trg_logon_attempttest ON ALL SERVER
 78 GO
 79 
 80 DROP database ExampleAuditDB
 81 go
 82 
 83 ------------------------------下篇------------------------------------------------
 84 
 85 --http://msdn.microsoft.com/zh-cn/library/ms173781.aspx
 86 --http://msdn.microsoft.com/zh-cn/library/ms186456(v=SQL.90).aspx
 87 USE [pratice];
 88 GO
 89 CREATE TABLE ddl_log (PostTime datetime,DatabaseName NVARCHAR(100), DB_User nvarchar(100), Event nvarchar(100),LoginName NVARCHAR(100), TSQL nvarchar(2000));
 90 GO
 91 
 92 SELECT * FROM [dbo].[ddl_log]
 93 
 94 
 95 ALTER  TRIGGER tri_LogServerEvent
 96 ON DATABASE  --或者服务器级别 ALL SERVER
 97 FOR DDL_DATABASE_LEVEL_EVENTS  --或者服务器级别:DDL_SERVER_LEVEL_EVENTS
 98 AS
 99 DECLARE @data XML
100 SET @data = EVENTDATA()
101 INSERT ddl_log
102    (PostTime,DatabaseName, DB_User, Event, LoginName,TSQL)
103    VALUES
104    (GETDATE(),
105    @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'),
106    CONVERT(nvarchar(100), CURRENT_USER),
107    @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
108    @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),
109    @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
110 GO
111 --Test the trigger.
112 CREATE TABLE TestTable (a int);
113 DROP TABLE TestTable ;
114 GO
115 SELECT * FROM ddl_log ;
116 GO
117 --Drop the trigger.
118 DROP TRIGGER tri_LogServerEvent
119 ON DATABASE;
120 GO
121 --Drop table ddl_log.
122 DROP TABLE ddl_log;
123 GO
124 
125 --------------------------------------------------------------
126 CREATE TRIGGER tri_LogServerEvent
127 ON ALL SERVER  --服务器级别
128 FOR DDL_SERVER_LEVEL_EVENTS    --服务器级别
129 AS
130 DECLARE @data XML
131 SET @data = EVENTDATA()
132 INSERT ddl_log
133    (PostTime,DatabaseName, DB_User, Event, LoginName,TSQL)
134    VALUES
135    (GETDATE(),
136    @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'),
137    CONVERT(nvarchar(100), CURRENT_USER),
138    @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
139    @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),
140    @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
141 GO
142 
143 --这样写会报错
144 --消息 1082,级别 15,状态 1,过程 tri_LogServerEvent,第 15 行
145 --"DROP_SERVER_ROLE_MEMBER" 不支持同步触发器注册。
146 ----------------------------------------------------------------
147 CREATE TRIGGER tri_LogServerEvent
148 ON ALL SERVER    --服务器级别
149 FOR DDL_DATABASE_LEVEL_EVENTS  --数据库级别
150 AS
151 DECLARE @data XML
152 SET @data = EVENTDATA()
153 INSERT ddl_log
154    (PostTime,DatabaseName, DB_User, Event, LoginName,TSQL)
155    VALUES
156    (GETDATE(),
157    @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'),
158    CONVERT(nvarchar(100), CURRENT_USER),
159    @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
160    @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),
161    @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
162 GO
163 
164 --这样写会报错
165 --消息 1098,级别 15,状态 1,过程 tri_LogServerEvent,第 15 行
166 --指定的事件类型对指定的目标对象无效。
167 -------------------------------------------------------------------------
168 CREATE TRIGGER tri_LogServerEvent
169 ON DATABASE  --数据库级别
170 FOR DDL_SERVER_LEVEL_EVENTS   --服务器级别
171 AS
172 DECLARE @data XML
173 SET @data = EVENTDATA()
174 INSERT ddl_log
175    (PostTime,DatabaseName, DB_User, Event, LoginName,TSQL)
176    VALUES
177    (GETDATE(),
178    @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'),
179    CONVERT(nvarchar(100), CURRENT_USER),
180    @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
181    @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(100)'),
182    @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
183 GO
184 
185 --这样写会报错
186 --消息 1098,级别 15,状态 1,过程 tri_LogServerEvent,第 15 行
187 --指定的事件类型对指定的目标对象无效。

 

posted @ 2013-08-03 23:42  桦仔  阅读(348)  评论(0编辑  收藏  举报