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