SQL Server数据库安全性控制

本文详细介绍了在SQLServer2008中进行权限管理的过程,包括创建登录名、角色、数据库,以及对用户进行授权、收回权限等操作,通过具体案例展示了如何控制不同用户对数据库的访问级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建登录名并配置角色及用户

(1)使用sa登录SQLServer2008;

(2)创建数据库sa_test,其中创建数据表dbo.saTable;

CREATE DATABASE sa_test

USE sa_test

CREATE TABLE saTable

(

SNO INT PRIMARY KEY,

SNAME CHAR(10),

SSEX CHAR(4),

SAGE INT,

SDEPT CHAR(4));

INSERT INTO saTable VALUES('16121000','张虎','男','18','CS')

INSERT INTO saTable VALUES('16121002','李振','男','20','CS')

INSERT INTO saTable VALUES('16121004','黄飒','男','21','CS')

INSERT INTO saTable VALUES('16121006','曾强','男','19','IS')

INSERT INTO saTable VALUES('16121007','张翠','女','20','IS')

INSERT INTO saTable VALUES('16122005','赵坤','男','23','MA')

INSERT INTO saTable VALUES('15124001','李丽','女','22','IS')

INSERT INTO saTable VALUES('15124003','宋美丽','女','18','IS')

INSERT INTO saTable VALUES('15125006','李铭','男','21','MA')

INSERT INTO saTable VALUES('14253610','司马颖','女','22','MA')

(3)创建登录名L1,具有dbcreator权限,影射用户名U1,默认数据库sa_test,数据库角色为public;

(4)创建登录名L2,具有dbcreator权限,影射用户名U2,默认数据库sa_test,数据库角色为public。

2. 使用新登录名登录服务器并验证权限

(1)使用L1登录SQLServer2008,验证是否可以浏览表dbo.saTable;

不可以浏览表dbo.saTable。

(2)创建数据库L1_test,用户名默认为dbo,模式默认为dbo;

CREATE DATABASE L1_test

(3)在L1_test中创建数据表dbo.L1Table;

USE L1_test

CREATE TABLE L1Table

(SNAME CHAR(10),

ISBN CHAR(20) PRIMARY KEY,

PRICE FLOAT,

COUNT INT);

INSERT INTO L1Table VALUES('121564','三国演义','52.3','6');

INSERT INTO L1Table VALUES('441148','西游记','55.5','20');

INSERT INTO L1Table VALUES('414584','红楼梦','60','12');

INSERT INTO L1Table VALUES('824132','水浒传','48.5','12');

INSERT INTO L1Table VALUES('524631','西厢记','36.8','25');

INSERT INTO L1Table VALUES('142535','蛙','56.9','50');

INSERT INTO L1Table VALUES('755365','平凡的世界','45.5','16');

INSERT INTO L1Table VALUES('692354','隋唐英雄传','52.4','20');

INSERT INTO L1Table VALUES('796354','数据库系统概论','39.6','21');

INSERT INTO L1Table VALUES('452687','数据结构','40.3','18');

(4)使用L2登录SQLServer2008,验证是否可以浏览表dbo.saTable;

不可以浏览表dbo.saTable

(5)创建数据库L2_test,用户名默认为dbo,模式默认为dbo;

CREATE DATABASE L2_test

(6)在L2_test中创建数据表dbo.L2Table。

USE L2_test

CREATE TABLE L2Table

(SNAME CHAR(10),

ISBN CHAR(20) PRIMARY KEY,

PRICE FLOAT,

COUNT INT);

INSERT INTO L2Table VALUES('英语','4145154','20.5','5');

INSERT INTO L2Table VALUES('高数','7445155','23.5','6');

INSERT INTO L2Table VALUES('体育','8442241','32.5','12');

INSERT INTO L2Table VALUES('C#','7241584','56.6','21');

INSERT INTO L2Table VALUES('C++','9541233','58.3','32');

INSERT INTO L2Table VALUES('计算机导论','54142521','49.9','45');

INSERT INTO L2Table VALUES('近代史','41518546','32.2','20');

INSERT INTO L2Table VALUES('Java','45558888','45.6','35');

INSERT INTO L2Table VALUES('安卓开发','71621341','75.3','17');

INSERT INTO L2Table VALUES('PHP设计','44654521','48.7','29');

3. sa用户对新建用户授权

(1)使用sa登录SQLServer2008;

(2)设置U1用户在L2_test中具备public权限;

(3)设置U2用户在L1_test中具备public权限;

(4)授权U1在dbo.saTable上的select权限;

USE sa_test

GRANT SELECT

ON dbo.saTable

TO U1

WITH GRANT OPTION

(5)授权U2在dbo.saTable上的insert权限。

USE sa_test

GRANT INSERT 

ON saTable

TO U2

4. 新建用户之间授权

(1)使用L1登录SQLServer2008,验证是否可以浏览表dbo.saTable中的数据,是否可以插入数据;

USE sa_test

SELECT *

FROM saTable/*可以*/

INSERT INTO saTable VALUES('151250','李民','男','21','MA')/*不可以*/

(2)授权U2在dbo.L1Table上的select权限和insert权限;

GRANT SELECT,INSERT 

ON L1Table

TO U2

(3)授权U2在L1_test中创建表的权限;

GRANT CREATE TABLE 

TO U2

(4)授权U2在L1_test中创建模式的权限。

GRANT CREATE SCHEMA 

TO U2

 

5. 验证用户权限并对指定属性授权

(1)使用L2登录SQLServer2008,验证是否可以浏览表dbo.saTable中的数据,是否可以插入数据;

USE sa_test

SELECT *

FROM saTable/*不可以*/

INSERT INTO saTable VALUES('1512510','李三民','男','21','MA')/*可以*/

(2)验证是否可以浏览表dbo.L1Table中数据,是否可以插入数据;

USE L1_test

SELECT *

FROM L1Table/*可以*/

USE L1_test

INSERT INTO L1Table

VALUES('175236','三国群英传','55.3','6');/*可以*/

USE L1_TEST

UPDATE L1TABLE SET SNAME='414584';/*不可以*/

USE L1_TEST

DELETE FROM L1TABLE WHERE(SNAME='414584');/*不可以*/

(3)创建U2用户的数据库模式UU,验证是否成功;

CREATE SCHEMA "UU" AUTHORIZATION U2/*该模式存在登录名L1下的L1_test*/

(4)创建数据表UU.Test,验证是否成功(语句创建成功);

              CREATE TABLE UU.Test(COL1 INT PRIMARY KEY,

COL2 CHAR(10));/*存在于L2下的L1_test*/

(5)验证U2是否具备UU.Test的全部权限,如drop;

 USE L1_test

SELECT *

FROM UU.Test;

 USE L1_test

   DROP UU.Test;

 USE L1_test

INSERT INTO UU.Test VALUES('12','QQQQQ');/*全部都可以*/

(6)授权U1在dbo.L2Table上的select权限和修改指定列的权限。

USE L2_TEST

GRANT SELECT,UPDATE(PRICE)

ON L2Table

TO U1

 

6. 收回权限并验证

(1)使用L1登录SQLServer2008,验证是否可以浏览dbo.L2Table中数据,是否可以修改指定的列;

USE L2_test

SELECT *

FROM L2Table/*可以*/

USE L2_test

UPDATE L2Table SET PRICE='0'/*可以*/

(2)收回U2在dbo.L1Table上的insert权限;

USE L1_test

REVOKE INSERT

ON L1Table

FROM U2/*收回成功*/

(3)使用L2登录SQLServer2008,验证是否可以浏览表uu1.L1Table中数据,是否可以插入数据。

USE L2_test

SELECT *

FROM UU.L1Table

 USE L2_test

INSERT INTO L1Table VALUES('12564','三国','52.3','6');/*都不可以*/

7. 创建角色并授权

(1)使用L1登录SQLServer2008,在L1_test中创建数据表dbo.L1Table2;

USE L1_test

CREATE TABLE L1Table2

(SNAME CHAR(10),

ISBN CHAR(20) PRIMARY KEY);

INSERT INTO L1Table2 VALUES('英语','40145154');

INSERT INTO L1Table2 VALUES('高数','74045155');

INSERT INTO L1Table2 VALUES('体育','84402241');

INSERT INTO L1Table2 VALUES('C#','72415804');

INSERT INTO L1Table2 VALUES('C++','95412303');

INSERT INTO L1Table2 VALUES('计算机导论','054142521');

INSERT INTO L1Table2 VALUES('近代史','415180546');

INSERT INTO L1Table2 VALUES('Java','455588088');

INSERT INTO L1Table2 VALUES('安卓开发','716211341');

INSERT INTO L1Table2 VALUES('PHP设计','446054521');

(2)创建数据库角色R1;

CREATE ROLE R1/*在L1登录名下L1_test角色里*/

(3)将在dbo.L1Table表上的查询和插入权限授予角色R1,将dbo.L1Table2表上的查询权限和修改指定列权限授予角色R1;

GRANT SELECT,INSERT 

ON dbo.L1Table

TO R1

GRANT SELECT,UPDATE(SNAME)

ON dbo.L1Table2

TO R1

(4)将用户添加到角色R1中;

EXEC SP_ADDROLEMEMBER R1,U2

(5)使用L2登录SQLServer2008,验证对L1_test中数据表的操作权限。

USE L1_test

SELECT *

FROM L1Table/*可以*/

USE L1_test

INSERT INTO L1Table

VALUES('1752306','三国群雄传','55.3','6');/*可以*/

USE L1_TEST

UPDATE L1TABLE SET SNAME='1752306';/*不可以*/

USE L1_TEST

DELETE FROM L1TABLE WHERE(SNAME='1752306');/*不可以*/

8. 收回角色的权限

(1)使用L1登录SQLServer2008,收回角色R1在dbo.L1Table表上的插入权限;

REVOKE INSERT

ON L1Table FROM R1

(2)1使用L2登录SQLServer2008,验证对L1_test中数据表的操作权限。

USE L1_test

SELECT *

FROM L1Table/*可以*/

USE L1_test

INSERT INTO L1Table

VALUES('1752306','三国群雄传','55.3','6');/*不可以*/

USE L1_TEST

UPDATE L1TABLE SET SNAME='1752306';/*不可以*/

USE L1_TEST

DELETE FROM L1TABLE WHERE(SNAME='1752306');/*不可以*/

 

SQLServer安全及性能优化 修补漏洞 安装程序补丁修补漏洞 随时关注微软官方网站补丁升级 关闭不必要的端口 关闭联必要的服务 数据库引擎 SQL Server Analysis Services SQL Server Reporting Services SQL Server Integration Services SQL Server 代理 SQL Full-text Filter Daemon launcher SQL Server Browser 同时开启所有服务系统性能会变得很差,根据需要手动启动或者禁用某个服务 DTC: Distributed Transaction Coordinator(分布式事务处理协调器),用于协调多个数据库、消息队列、文件系统等等资源管理器的事务,由于内部开发中并不使用这个功能,远程数据库服务器上也并不经常使用,因此建议关闭这个服务 禁用不使用的协议 Shared Memory 默认为已启用状态,这个协议只能用于本地连接,不能用于远程连接,一般用于其它协议出问题的时候管理作诊断使用 TCP/IP 禁用不需要使用的协议,减少网络攻击对象 减少监听的网卡和IP地址 改变监听端口号 安全地设置账户 Windows身份验证[微软推荐的方式] 优势: 1.访问SqlServer时速度更快,不用输入用户名和密码 2.可以利用Windows系统的自身工具和安全策略管理账户 3.安全确认和口令加密、审核、口令失效、最小口令长度和账号锁定 SqlServer身份验证 1.将sa账户名更改为其它账户名比如nocial,防止黑客利用sa进行攻击 2.删除不使用的账户 3.对已有账户设置安全密码[强制密码规则] 4.限制登录->远程登录、匿名登录 5.限制用户角色和权限,一般将权限设置到最低。设置角色的时候不要为public角色授予任何权限,并且从sysadmin这个角色中删除windows的administrators组,提高系统安全性。 删除不必要的数据库对象 删除危险的存储过程 xp_cmdshell:执行操作系统命令,这是一个系统后门[可以移动文件位置、创建用户、提升用户权限],建议不需要则删除掉。 ole自动化存储过程 任务管理存储过程 强化文件和目录安全 数据库最终以文件的形式存储在文件系统中 使用NTFS设置权限 限制共享【不能设置为完全控制】 及时审核日志 sqlserver的审核机制可以帮助跟踪并且阻止系统中没有授权的用户他的行为。比如没有授权的用户登录系统会阻止这次登录,并且把这次操作给记录下来。审核机制既能跟踪失败记录也能跟踪成功记录。所有的数据库平台均在不同程度上提供了审查功能。 跟踪用户行为 保护数据库 数据库性能优化 数据库的性能优化主要有两个方面:减少查询比较次数、减少资源的征用。 使用工具Sql Server Profiler优化数据库的性能,减少资源的征用 SqlServer Profiler的功能 Sql Server Profiler的用法  定义跟踪  登录连接、失败和断开  Select、Insert、Update和Delete语句  SQL批处理的开始或结束  写入到Sql server错误日志的错误  安全权限检查  Profiler执行的事件 让Profiler监视我们感兴趣的事件,可以监视的事件太多,监视太多会大大降低性能和增大表数据,只监视与数据库的性能密切相关的哪些事件。常见的感兴趣的事件:  执行查询的性能  单个用户或应用程序的活动  逻辑磁盘的读写  语句级别上的CPU占用  Standart模板的事件类 优化数据库性能可以从五个层次来进行:  优先级一:减少数据的访问【减少磁盘访问】  优先级二:返回更少数据【减少网络传输或磁盘访问】  优先级三:减少交互次数【减少网络传输或磁盘访问】  优先级四:减少开销【减少CPU及内存开销】  优先级五:利用更多资源【增加资源】 技术上从四个方面来解决性能优化问题 1、调整数据库结构设计 2、调整应用程序结构设计 3、调整数据库SQL语句 4、调整服务器内存分配 如果不熟悉sqlserver可以使用数据库引擎优化顾问来对数据库提出优化建议,然后通过系统管理的修改达到目的。 数据库引擎优化顾问  数据库引擎优化顾问介绍  分析一个或多个数据库的工作负荷和物理实现,工作负荷可以是优化的sql语句或者sqlserver profiler的跟踪文件和数据表。我们可以在运行引擎优化顾问前运用sqlserver profiler记录一些事件,然后将跟踪结果存储为文件或者数据表,然后把这些提供给数据库引擎优化顾问,让它去分析。  提出合理的物理设计结构,物理设计结构包括数据库中的索引、索引视图、非聚集索引、聚集索引视图等等。对工作负荷进行分析后,数据库优化顾问会建议添加删除修改数据库的物理设计结构。推荐一组合理的物理结构以降低工作负荷的开销。从而提高数据库的性能 数据库性能优化的常见问题 如何发现问题,如何分析导致性能降低的原因仍然是数据库管理员要掌握的知识。 事务占用资源的时间过长,造成阻塞 许多用户同时访问数据库的时候会产生大量事务,许多用户同时竞争一个资源导致占用资源的时间过长,造成阻塞。从而降低了数据库执行效率。产生这样的现象的原因如下: 1、多表连接查询,查询期间占用多个表 2、事务需要占用太多资源,容易出现多个事务占用对方资源的状况。从而导致死锁 解决之道: 1、避免多表连接查询,联合过多的表会在查询中占用过多的资源。很容易因为别的事务占用资源而相互等待。 2、使用统一的SQL语句规范,特别是访问表的顺序要保持一致,这样可以避免互相占用资源而导致的死锁。 不合理的数据文件设置,影响事务处理的性能 当事务处理产生大量数据的时候,数据文件的大小如果设置不合理将导致数据文件的不断扩展,这也会影响到事务处理的性能,进而影响到整个数据库的性能。 1、频繁操作数据库,导致日志文件增长的过快,因为日志文件记录数据库的原始操作。所以它的增长速度比数据文件要快得多。当日志文件的增长大小设置不合理的时候会导致频繁地扩展文件。从而影响性能 2、查询操作比较频繁,系统数据Tempdb的大小设置不合理。 查询操作比较频繁的时候系统数据Tempdb增长得会比较快,因为查询所产生的临时数据都存放在这个数据库上。如果Tempdb过小当查询数据量较大的时候Tempdb会自动扩展,如果遇到频繁的查询会导致Tempdb不断扩展,从而影响系统性能。这种情况我尽可能地使查询的返回结果比较小 3、大量插入数据,导致数据文件增长过快。不要设置数据文件的自动收缩,它会在忙碌的系统上导致不必要的性能开销。所以如果没有特别需要不要设置数据库的自动收缩。最好采用手动收缩。 磁盘数据组织不合理,导致磁盘的访问次数过多 数据库的磁盘访问都是按照页来访问数据的,无论访问的数据再少都是以页为单位读取,1页为8K。所以如果将经常访问的数据放在一起,数据库读取尽量少的页面就能够完成读取操作。这样效率自然就提高了。也减少了磁盘头的来回移动。否则会多次读取硬盘页面导致访问的效率降低。 对于表A和表B、表C、表D,如果经常查询表A和表B中的数据,那么可以将他们放在同一个文件组M中;如果经常访问表C和表D中的数据可以将他们放在同一个文件组N中。这样读取效率就比较高,因为一次读取就可能包含了两个表中的数据,因此提高了查询效率。要解决“磁盘数据组织不合理,导致磁盘的访问次数过多”这个问题,我们可以将经常读写的数据放置在不同的磁盘上,也就是将经常在一起被多表连接查询的表放在同一个文件组上。这里强调:这里反复提到的“不同的磁盘”指的的是不同的磁盘,而不是同一个硬盘的不同分区。 批量导入数据的时候,要进行特殊设置 当用户需要大批量导入数据的时候会突然增加很多日志记录,并且如果数据表上有索引,数据表每增加一条记录就会在索引上增加一条数据从而降低插入的性能。解决方案: 1、大批量导入数据的时候设置数据库的恢复模式为“大容量日志恢复模式” 2、导入前禁用索引,导入完毕后重建索引。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值