Bootstrap

【SQL实验】数据库安全

【代码是自己的解答,并非标准答案,也有可能写错,文中可能会有不准确或待完善之处,恳请各位读者不吝批评指正,共同促进学习交流

还原附件中的educ数据库和YGGL数据库文件,

本文因版本问题不能还原,导入相关的EXCEL文件

(导入操作在之前的文章中详细写过,这里就不再提了)

1、管理员身份登录,用菜单方式为自己新建一个登录账户(自己姓名命名,选用SQL SERVER身份验证),退出SSMS,用自己的登录名进入SSMS,观察能否打开educ数据库和YGGL数据库,为什么?用菜单方式新建一个登录名(同学姓名命名),是否成功?为什么?

首先以管理员的身份登陆(SSMS)进去。然后点击安全性下面有的登录名,建一个登录名

右键点击 “安全性” > “登录名”,选择 “新建登录名”。

退出 SSMS,用新创建的登录名登录,并检查能否访问 educ 数据库和 YGGL 数据库。

输入登录名(lq)并选择 SQL Server 身份验证【这里登录名可以按照自己的想法设置】

设置密码【我设的是123】

把这个√取消掉

点击 “确定” 完成创建

退出SSMS,用自己的登录名进入SSMS操作:

在这个连接的时候可能会有一个报错【忘记截图了,后面如果有机会的话再具体写一下】

需要改一下一些设置

改好设置后

重启再打开就可以正常连接了

连接后:

是否能够访问这两个数据库?

这个因为我已经有了一个educ库,所以改了一下名字


无法访问 educYGGL 数据库,原因是新创建的登录账户默认没有分配权限。

数据库能够看到名字,但是点不了,因为它没有这个查看的权限

lq这个登录名登录进来不能看到一些数据库

登录名是相当于是一第一层的最外一层的

相当于这栋楼的1楼的钥匙。如果想看到数据库的话每一层都要给他建一把钥匙

没有查看的权限怎么办呢?需要以管理员的身份登录进来,然后针对这个数据库在安要给他建用户

刚刚在建这个用户的时候,其实以什么操作都没有,比如说这里面的服务器角色,用户映射等都没有选,没有做任何的操作,直接建了一个登录名。

SQL Server 登录账户和数据库用户是不同的概念,登录账户只是验证身份,而数据库用户需要明确授权。

新建同学姓名登录名的操作是否成功?
不成功,当前账户权限不足,则无法创建新登录名。

2、用管理员身份登录,查看登录名;用菜单方式为educ数据库和YGGL数据库建立用户账户(自己姓名,登录名为自己姓名);查看educ数据库和YGGL数据库,能否看到信息?

使用管理员身份登录 SSMS。

右键点击 educ 数据库,选择 “安全性” > “用户”,点击 “新建用户”。

为该数据库创建用户账户(用户名为lq,登录名为lq)。

YGGL 数据库执行相同操作

管理员可以看到相关信息

3、退出系统,用自己姓名登录,查看educ数据库和YGGL数据库,能否看到信息,为什么?

 能否看到数据库信息?

已经为自己姓名的登录名创建了数据库用户并赋予了必要的权限,在访问 educYGGL 数据库时,可以看到相关的信息。

能点开。但是对表现在有没有查看的权限

查看的权限需要去赋予,grant语句去授予,或者rework语句。或者是通过菜单的形式,比如说在建这个用户的时候给这个用户权限呢

如果没有赋予足够的权限(如读取权限),则无法看到数据库中的内容。

4、从以上3个步骤中,你能得出什么结论?你有什么方法让自己姓名用户能访问这两个数据库?

结论:

  • 1.登录名与数据库用户是不同的概念

  • SQL Server 中,登录名(Login)用于连接到实例,而数据库用户(User)与特定数据库关联。即使登录名创建成功,若未在数据库中创建对应用户或授予权限,则无法访问数据库。

  • 2.授权必须明确且有针对性

    仅为数据库用户分配 db_datareader 或自定义读取权限,才能实现数据查询。

3.权限决定能否访问数据库内容

创建数据库用户后,若未赋予读取、写入等权限,用户仍无法查看或操作数据库内容。

方法:

确保登录名与数据库用户关联

为登录名(如自己姓名)创建与 educ 和 YGGL 数据库关联的用户账户。

授予适当权限

在创建数据库用户时,为其授予 db_datareader 固定数据库角色。

or自定义授予查询权限,例如 GRANT SELECT ON [表名] TO [用户]。

5、退出系统,用管理员身份登录,删除第2步建立的两个用户

使用管理员身份登录。

在对象资源管理器中展开目标数据库。

点击 “安全性” > “用户”,找到自己命名的用户。

右键用户,选择 “删除”,确认后完成操作。

YGGL 数据库执行相同操作。

6、用菜单方法为EDUC数据库建立用户(自己姓名命名,登录名为自己姓名),建立用户时对用户授权,让该用户能查询数据库;

展开 educ 数据库,右键 “安全性” > “用户”,选择 “新建用户”。

填写以下信息:

用户名:lq

登录名:lq

授予查询权限

在用户页面中选择 “角色身份” 

勾选 db_datareader(授予读取权限),点击 “确定”。

测试用户权限

使用新用户登录 SSMS。

检查能否查看 educ 数据库,并验证

这个时候就能读了

7、用SQL语句为YGGL数据库建立用户(自己姓名命名,登录名为自己姓名),建立用户时不授权。

USE YGGL; 
GO

CREATE USER lq FOR LOGIN lq; -- 创建数据库用户并关联登录名
GO

注意这个细节

8、退出系统,用自己姓名登录,查看educ数据库和YGGL数据库,能否看到信息,执行几个数据库操作,查看该用户有哪些权限?

educ 数据库:已为 educ 数据库中的用户授权(查询权限),可以看到数据库中的内容。

YGGL 数据库:在第 7 步中未为用户授权,因此登录后无法查看任何表内容,权限不足会返回错误提示。

9、用SQL语句授予自己姓名用户在Salary表上的查询和修改权限,并允许将该权限授予其他用户;

USE YGGL; -- 切换到目标数据库
GO

GRANT SELECT, UPDATE ON Salary TO lq WITH GRANT OPTION; -- 授予查询和修改权限,并允许转授
GO

10、创建数据库用户u1(如不能直接创建,先建登录名u1),用SQL语句授予用户u1对YGGL数据库中Employees表的查询权限,以u1的用户身份登录服务器,验证该权限;

CREATE LOGIN u1 WITH PASSWORD = '123'; -- 创建登录名
GO
USE YGGL;
GO

CREATE USER u1 FOR LOGIN u1; -- 在数据库中创建用户
GO
GRANT SELECT ON Employees TO u1; -- 授予查询权限
GO
USE YGGL;
GO

SELECT * FROM Employees; -- 检查是否可以查询表内容
GO

11、以自己姓名用户身份登录服务器,并将自己拥有的所有权限授权给u1用户;

在第9题的基础上,只有这两个可以授权

USE YGGL;
GO

GRANT SELECT, UPDATE ON Salary TO u1 WITH GRANT OPTION; -- 将查询和修改权限授权给 u1
GO

all privileges是不对的 

12、以u1的用户身份登录服务器,验证其是否有对Salary表的查询和修改权限;

13、回收自己姓名用户在Salary表上的查询权限,以自己姓名用户身份登录服务器,验证该用户是否还可以对Salary表进行查询;

USE YGGL;
GO

REVOKE SELECT ON Salary FROM lq CASCADE;
GO

记录一下一个报错

REVOKE SELECT ON Salary FROM lq;

若要撤消或拒绝可授予的特权,请指定 CASCADE 选项。
因为这个权限给过了u1

CASCADE【表和模式】

因为SQLServer使用的是T-SQL,而该语句为标准SQL,SQL Server不支持在 DROP SCHEMA使用CASCADE

14、以u1的用户身份登录服务器,验证其是否还可以对Salary表进行查询。

可以

15、授予u1对Departments表中备注列的修改权限;

Note

GRANT UPDATE (Note) ON Departments TO u1; -- 授予 u1 修改指定列的权限

16、授予u1对YGGL数据库中所有表的查询权限,并以u1的用户身份登录服务器,验证该权限;

DATABASE::YGGL表示yggl是数据库的名字,on后一般跟表名

GRANT SELECT ON DATABASE::YGGL TO u1; -- 授予对所有表的查询权限

17、用SQL语句新建R1角色用户,并赋予它对YGGL数据库的全部操作权限。

USE YGGL;
GO

-- 创建角色 R1
CREATE ROLE R1;
GO

-- 赋予 R1 对数据库的全部权限
GRANT CONTROL ON DATABASE::YGGL TO R1;
GO
;