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