基于DDL触发器的SQL SERVER登录IP限制

创建一个触发器,观测所能获取到的登录信息

use master
go
create trigger tr_LoginCheck
on all server
for LOGON
as 
declare @data xml,
              @EventType varchar(100),
              @EventTime datetime,
10                @ServerName varchar(100),
11                @ClientHost varchar(100),
12                @WhoDidIt varchar(100)
13  set @data=EVENTDATA()
14  set @EventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(100)')
15  set @EventTime = @data.value('(/EVENT_INSTANCE/PostTime)[1]','datetime')
16  set @ServerName = @data.value('(/EVENT_INSTANCE/ServerName)[1]','varchar(100)')
17  set @ClientHost = @data.value('(/EVENT_INSTANCE/ClientHost)[1]','varchar(100)')
18  set @WhoDidIt = @data.value('(/EVENT_INSTANCE/LoginName)[1]','varchar(100)')
19  insert into test..History values (@EventType,@EventTime,@ServerName,@ClientHost,@WhoDidIt)
20   
21  go
22   
23   

我们可以观测到所有登录当前数据库系统的用户信息

根据以上信息,我们可以根据用户信息来判断登录的合法性。比如,要限制仅仅某个IP能访问数据库系统,则可以这样判断:

 

if EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(15)') <> '192.168.1.22'
ROLLBACK TRAN
 
 

这样,除了192.168.1.22之外的IP均无法访问当前数据库
posted @ 2009-09-29 14:30  wangcong  阅读(453)  评论(2)    收藏  举报