[SQL Server 2005/2008]限制(及监控)建立连接的客户端ip及db用户

SQL Server 2005开始,引入了新的触发器类型。 详细帮助文档"create trigger"。

本文描述通过触发器,限制某个数据库用户(比如 sa这种高级别的用户),只能从指定的IP登陆,这可以做为防止非法连接数据库的最后防线。

 

只有在 连接数据库的最后一步(账号密码验证成功后), 才会激活这个触发器。

 

createtriggertr_logincheckon all server forlogon

as

 if eventdata().value('(/EVENT_INSTANCE/LoginName)[1]','sysname')= 'sa'

 andeventdata().value('(/EVENT_INSTANCE/ClientHost)[1]','varchar(15)')<> '192.168.0.23'

rollbacktran

go

 

 

-- 记录登陆数据库情况

CREATE TABLE [t_log_loginlog](
	[loginame] [varchar](30) NULL,
	[ipaddress] [varchar](40) NULL,
	[spid] [int] NULL,
	[hostname] [varchar](30) NULL,
	[logtime] [datetime] NULL
);
GO

CREATE trigger [tr_log_login] on all server WITH EXECUTE AS 'sa'
for logon 
as
 declare @loginame  varchar(30),
         @ipaddress varchar(30),
         @spid      int,
         @hostname  varchar(30);
 select @loginame = eventdata().value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),
        @ipaddress = eventdata().value('(/EVENT_INSTANCE/ClientHost)[1]', 'sysname'),
        @spid = eventdata().value('(/EVENT_INSTANCE/SPID)[1]', 'int');
 if  @ipaddress not in ('127.0.0.1', '<local machine>') --@loginame = 'sa' or @loginame = 'jav'
 begin
   select @hostname = [host_name] from sys.dm_exec_sessions where session_id = @spid;
   insert into DBperf.dbo.t_log_loginlog(loginame,ipaddress,spid,hostname, logtime)
   values( @loginame,@ipaddress,@spid,@hostname, getdate() );
 end
GO

ENABLE TRIGGER [tr_log_login] ON ALL SERVER
GO


 

你可能感兴趣的:(sql,数据库,server,server,null,insert,login)