一、只允许指定IP访问数据库

创建测试账号

CREATE LOGIN testuser WITH PASSWORD = '123'

GO





CREATE TRIGGER [tr_connection_limit]

ON ALL SERVER WITH EXECUTE AS 'sa'

FOR LOGON

AS

BEGIN





--限制test这个帐号的连接

IF ORIGINAL_LOGIN()= 'test'

--允许test在本机和下面的IP登录

AND

(SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)'))

NOT IN('<local machine>','192.168.50.145','192.168.8.138')

     ROLLBACK;

END;





===========================================================================================





登录信息查询

SELECT 

a.[session_id],a.[login_time],a.[host_name],

a.[original_login_name],b.[client_net_address]

FROM MASTER.sys.dm_exec_sessions a 

INNER JOIN MASTER.sys.dm_exec_connections b 

ON a.session_id=b.session_id





===========================================================================================

二、限制角色只能运行指定IP访问

--创建测试数据库

USE MASTER

GO

CREATE DATABASE Logon_DB





--创建IP过滤表

USE Logon_DB

GO

CREATE TABLE dbo.ValidIP ( 

    IP NVARCHAR(15), 

    CONSTRAINT PK_ValidIP PRIMARY KEY CLUSTERED(IP) 

); 









--插入过滤IP

USE Logon_DB

GO

INSERT INTO dbo.ValidIP(IP) VALUES('<local machine>');

INSERT INTO dbo.ValidIP(IP) VALUES('192.168.8.138');

INSERT INTO dbo.ValidIP(IP) VALUES('192.168.8.16');





--创建登录触发器



CREATE TRIGGER [tr_logon_CheckIP] 

ON ALL SERVER 

FOR LOGON 

AS 

BEGIN 

    IF IS_SRVROLEMEMBER('sysadmin') = 1 

    BEGIN 

        DECLARE @IP NVARCHAR(15); 

        SET @IP = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)')); 

        IF NOT EXISTS(SELECT IP FROM [Logon_DB].[dbo].[ValidIP] WHERE IP = @IP) 

        ROLLBACK;

    END;

END;





这次我们在IP为:192.168.50.145的机器上进行测试,这个IP之前是允许使用rone4acc帐号登陆的(tr_connection_limit),这次使用sa这个帐号登陆,返回了Figure3的错误信息,这是因为它违反了登陆触发器tr_logon_CheckIP的规则。在192.168.8.16通过sa登录成功,说明限制生效了

三、登陆名与有效IP对应表

USE Logon_DB

GO

CREATE TABLE [dbo].[ValidLogOn](

    [Id] INT IDENTITY(1,1) NOT NULL,

    [LoginName] [sysname] NOT NULL,

    [ValidIP] [nvarchar](15) NOT NULL,

    CONSTRAINT [PK_ValidLogOn] PRIMARY KEY CLUSTERED ([Id])

 )

--创建唯一约束索引

CREATE UNIQUE NONCLUSTERED INDEX [IX_ValidLogOn_LV] ON [dbo].[ValidLogOn] 

(

    [LoginName] ASC,

    [ValidIP] ASC

)

 --插入测试数据

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'mssql2\administrator', N'<local machine>')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'<local machine>')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'127.0.0.1')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'localhost')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'192.168.50.145')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'rone4acc', N'<local machine>')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'rone4acc', N'192.168.8.16')





--创建登录触发器





CREATE TRIGGER [tr_logon_CheckLogOn]

ON ALL SERVER WITH EXECUTE AS 'sa'

FOR LOGON

AS

BEGIN

    DECLARE @LoginName sysname

    DECLARE @IP NVARCHAR(15)

    SET @LoginName = ORIGINAL_LOGIN();

    SET @IP = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)')); 

    --判断登录名和IP

    IF NOT EXISTS(SELECT [ValidIP] FROM [Logon_DB].[dbo].[ValidLogOn] WHERE [LoginName] = @LoginName AND [ValidIP] = @IP) 

        ROLLBACK;

END;





用户登陆名与IP对应关系表[ValidLogOn],有几点需要注意的,mssql2\administrator这个是Windows 身份验证中操作系统的帐号,你需要根据你的实际情况进行修改;IP当中你则需要注意<local machine>和127.0.0.1这些特殊的地址,我个人还是建议在这个表中加入这些信息的。

实用举例:





只允许指定IP访问

创建测试账号

CREATE LOGIN test WITH PASSWORD = '123'

GO





--创建测试数据库

USE MASTER

GO

CREATE DATABASE Logon_DB





USE Logon_DB

GO

CREATE TABLE [dbo].[ValidLogOn](

    [Id] INT IDENTITY(1,1) NOT NULL,

    [LoginName] [sysname] NOT NULL,

    [ValidIP] [nvarchar](15) NOT NULL,

    CONSTRAINT [PK_ValidLogOn] PRIMARY KEY CLUSTERED ([Id])

 )





--创建唯一约束索引

CREATE UNIQUE NONCLUSTERED INDEX [IX_ValidLogOn_LV] ON [dbo].[ValidLogOn] 

(

    [LoginName] ASC,

    [ValidIP] ASC

)

 --插入测试数据

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'mssql2\administrator', N'<local machine>')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'<local machine>')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'127.0.0.1')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'localhost')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'192.168.50.145')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'192.168.8.11')



INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'test', N'<local machine>')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'test', N'192.168.8.16')





--创建登录触发器



CREATE TRIGGER [tr_logon_CheckLogOn]

ON ALL SERVER WITH EXECUTE AS 'sa'

FOR LOGON

AS

BEGIN

    DECLARE @LoginName sysname

    DECLARE @IP NVARCHAR(15)

    SET @LoginName = ORIGINAL_LOGIN();

    SET @IP = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)')); 

    --判断登录名和IP

    IF NOT EXISTS(SELECT [ValidIP] FROM [Logon_DB].[dbo].[ValidLogOn] WHERE [LoginName] = @LoginName AND [ValidIP] = @IP) 

        ROLLBACK;

END;





远端云服务器的配置:



列出数据库孤立用户

exec  sp_change_users_login 'report'

将用户关联起来

exec sp_change_users_login 'UPDATE_ONE','read','read'





只允许指定IP访问





--创建测试数据库

USE MASTER

GO

CREATE DATABASE Logon_DB





USE Logon_DB

GO

CREATE TABLE [dbo].[ValidLogOn](

    [Id] INT IDENTITY(1,1) NOT NULL,

    [LoginName] [sysname] NOT NULL,

    [ValidIP] [nvarchar](15) NOT NULL,

    CONSTRAINT [PK_ValidLogOn] PRIMARY KEY CLUSTERED ([Id])

 )





--创建唯一约束索引

CREATE UNIQUE NONCLUSTERED INDEX [IX_ValidLogOn_LV] ON [dbo].[ValidLogOn] 

(

    [LoginName] ASC,

    [ValidIP] ASC

)

 --插入测试数据

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'mssql\administrator', N'<local machine>')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'<local machine>')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'127.0.0.1')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'localhost')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'sa', N'192.168.1.4')

INSERT [dbo].[ValidLogOn] ([LoginName], [ValidIP]) VALUES (N'read', N'2.2.2.2')





--创建登录触发器





CREATE TRIGGER [tr_logon_CheckLogOn]

ON ALL SERVER WITH EXECUTE AS 'sa'

FOR LOGON

AS

BEGIN

    DECLARE @LoginName sysname

    DECLARE @IP NVARCHAR(15)

    SET @LoginName = ORIGINAL_LOGIN();

    SET @IP = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(15)')); 

    --判断登录名和IP

    IF NOT EXISTS(SELECT [ValidIP] FROM [Logon_DB].[dbo].[ValidLogOn] WHERE [LoginName] = @LoginName AND [ValidIP] = @IP) 

        ROLLBACK;

END;

sqlserver2008r2数据库使用触发器对sa及其他数据库账号访问进行IP限制的更多相关文章

  1. 详解MariaDB数据库的触发器

    1.什么是触发器 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行 它比数据库本身标准的功能有更精细和更复杂的数据控制能力 2.触发器的作用: 2.1 安全性 可以基于数据库的 ...

  2. Sql Server数据库之触发器

    阅读目录 一:触发器的优点 二:触发器的作用 三:触发器的分类 四:触发器的工作原理 五:创建触发器 六:管理触发器 概念:   触发器(trigger)是SQL server 提供给程序员和数据分析 ...

  3. MySQL数据库之触发器

    1 引言 本文是对MySQL中触发器的总结,从触发器概念出发,结合实例对创建触发器.使用触发器.删除触发器进行介绍. 2 触发器简介 MySQL触发器和存储过程一样,都是嵌入到MySQL的一段程序.触 ...

  4. 数据库-mysql触发器

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 一:创建触发器 在MySQL中,创建触发器语法 ...

  5. 第二百八十四节,MySQL数据库-MySQL触发器

    MySQL数据库-MySQL触发器 对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行[增/删/改]前后的行为. 1.创建触发器基本语法 ...

  6. Mysql数据库的触发器、存储引擎和存储过程

    数据库的触发器 1.触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句): DELETE,INSERT,UPDATE 我们可以监视某表 ...

  7. MySQL/MariaDB数据库的触发器

    MySQL/MariaDB数据库的触发器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.触发器概述 1>.什么是触发器 触发器的执行不是由程序调用,也不是由手工启动,而是 ...

  8. Oracle数据库之触发器(一)

    触发器trigger是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发.比如当对一个表进行操作(in ...

  9. plsql 数据库事件触发器

    --4.数据库事件触发器 需要超管的权限 /* 数据库事件触发器有数据库级和模式级两种. 前者定义在整个数据库上,触发事件是数据库事件,如数据库的启动.关闭,对数据库的登录或退出. 后者定义在模式上, ...

随机推荐

  1. Django model中的 class Meta 详解

    通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model): bar = models.CharFi ...

  2. Solr各个版本重大变化之安装方式【请别违背规律】

    这里主要讲安装方式的变化 4.x~5.x的变化 这是4.x的安装方式,大家都熟知,在我看来未免繁琐了一点. 或许官方也感觉繁琐了,于是5.x有个最大的改变.↓ 现在Solr是一个独立的服务器 什么叫S ...

  3. 使用博客系统发生_STORAGE_WRITE_ERROR_错误

    因为本人有自己的vps正好又最近学习了网络的搭建,但是呢不是一番风顺的在假设好PHP.http和MySQL后吧一个博客系统放进去后出现了以下问题 好吧== 出来了这个问题到是让我看了半天,然后查了查说 ...

  4. 四个修改Docker默认存储位置的方法

    方法一.软链接 默认情况下Docker的存放位置为:/var/lib/docker 可以通过下面命令查看具体位置: sudo docker info | grep "Docker Root ...

  5. Shell脚本编写及常见面试题

      注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 4)默认变量是全局的, ...

  6. 利用bootstrap-datetimepicker实日历插件

    由于项目中需要获取一个时间值,手动输入的话比较Low,这里引用了bootstrap-datetimepicker模块来实现. 1.首先,下载该模块并引用.(官网:http://www.bootcss. ...

  7. Java基础-Eclipse第三方安装包管理工具之Maven

    Java基础-Eclipse第三方安装包管理工具之Maven 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 玩过Linux的小伙伴应该都知道yum吧,我们只要把搭建好的yum仓库配 ...

  8. Scala进阶之路-Scala中的枚举用法案例展示

    Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...

  9. java实现word转pdf在线预览(前端使用PDF.js;后端使用openoffice、aspose)

    背景 之前一直是用户点击下载word文件到本地,然后使用office或者wps打开.需求优化,要实现可以直接在线预览,无需下载到本地然后再打开. 随后开始上网找资料,网上资料一大堆,方案也各有不同,大 ...

  10. Bandicam录制视频

    我已经录制了一个视频,关于怎么录制视频的,原画画质的嘻嘻.视频地址  http://www.tudou.com/programs/view/T7xzG1CgsD4 ------------------ ...