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 --指定的事件类型对指定的目标对象无效。