一.视图设计与操作

请针对你在作业#2中所设计的用户界面的数据需求

1)至少设计并创建行列子集视图、带表达式的视图和分组视图各一个,并将代码加入自己的建库脚本中。

答:从单个基本叫中导出的,保留主码的视图为行列子集视图。创建行列子集视图的代码如下:
在这里插入图片描述

带虚拟列的视图称为带表达式的视图,创建带表达式的视图的代码如下:
在这里插入图片描述

用聚集函数和group by子句的查询定义的视图称为分组视图,创建分组视图的代码如下:
在这里插入图片描述

2)编写测试代码,通过视图实现数据查询操作

在这里插入图片描述

这里对上一个生成的用户回答的分组视图进行了查询,寻找数据库中所有的回答的总的赞同数大于5的用户ID

3)对不同类别视图尝试进行数据修改和删除操作,看能否实现,分析其原因

在行列子集视图中进行数据的修改和删除操作,可以实现。
在这里插入图片描述在这里插入图片描述

在代表达式的视图中进行数据的修改操作不可以实现:
在这里插入图片描述
在这里插入图片描述

在带表达式的视图中进行删除操作,可以实现:
在这里插入图片描述
在这里插入图片描述

对分组视图进行修改操作,不可实现:
在这里插入图片描述
在这里插入图片描述

对分组视图进行删除操作同样不可实现:
在这里插入图片描述
在这里插入图片描述

总结:由于视图是不实际存储数据的虚表,因此对视图的更新最终要转化为基本表的更新。但是在关系数据库中,不是所有的视图都可以更新,这是因为有些视图的更新不能唯一的有意义的转换成对应基本表的更新。例如,在对分组视图进行修改操作的时候,我们对一个用户的回答的赞同数的和进行修改,但是这不能对应和修改之前每一个回答的赞同数的值从而实现要求,所以不可更新,系统报错。

4)在实验室报告中总结视图的主要作用。

答:合理使用视图能够带来许多的便利和好处。
1.视图能简化用户的操作
2.视同是用户能以多种角度看待同一数据
3.视图对重构数据库提供了一定程度的逻辑独立性
4.视图能够对机密数据提供安全保护
5.适当利用视图可以更清晰的表达查询

二、 用户口令管理设计题

用户注册与认证管理是数据库系统的基本功能,请为你在作业#2中选择的具体案例设计一个用户注册与认证中的口令管理解决方案,要求如下

1) 用户口令采用密文存储,采用不可逆加密算法加密,查资料了解现有的不可逆算法。

答:目前常用的不可逆加密算法为MD5算法,这是一种不可逆的加密算法,即加密后的结果无法逆向解密,只有再次输入明文,加密结果判断一致才能完成确认。

2) 设计用户修改密码流程,用VISO画出流程图

答:
在这里插入图片描述

3) 设计用户密码重置业务流程(可以包含线下流程),用VISO画出业务流程图

在这里插入图片描述

三、 用户授权操作题

为你在作业#2中选择的具体案例增加若干个数据库用户,并对各个用户进行相应的授权操作,至少应完成如下操作:

1) 创建用户

创建用户从localhost主机访问本数据库。
在这里插入图片描述

2) 为不同的用户授予和收回表级SELECT, INSERT, UPDATE, DELETE, ALL PRIVILEGES权限

对于两个用户分别授予了表级SELECT, INSERT, UPDATE, DELETE权限和ALL PRIVILEGES权限:
在这里插入图片描述
可以看到输出的结果中创建的两个用户已经有了我们授予的权限:

在这里插入图片描述 在这里插入图片描述
接下来对给予的权限进行收回: 在这里插入图片描述

这里虽然workbench提示错误,但是可以正常运行,并且在输出当前用户的权限的时候也可以看到ALL PRIVILEGES权限已经被收回。
在这里插入图片描述
在这里插入图片描述
收回另一个用户的权限:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接下来,使用这两个用户登录数据库:

使用u1登录成功,因为u1有answer表的所有权限,所以可以进行各种操作,但是如果对其他表进行操作,就会报错。
在这里插入图片描述
在这里插入图片描述

3) 为不同的用户授予和收回属性列级的SELECT, INSERT, UPDATE的权限

对不同的用户授予属性列级的SELECT, INSERT, UPDATE的权限:
在这里插入图片描述输出用户权限如下:
在这里插入图片描述
在这里插入图片描述

收回之前授予的权限:
在这里插入图片描述
收回之后的用户权限输出如下:
在这里插入图片描述
在这里插入图片描述

通过命令行指令,使用定义的用户进入数据库进行操作,下图为使用u2进入数据库之后对回答ID为2的回答的文本进行修改,因为没有select权限所以无法输出:
在这里插入图片描述

4) 创建角色,并把角色授予用户或收回用户的某个角色

之前使用的MySQL版本是5.7,但是角色功能是MySQL8.0+版本的特色。因此重新下载了MYSQL8.0进行使用。下图为角色的创建和授予:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对于角色的收回:
在这里插入图片描述

将以上语句写成单独的SQL脚本,上机实验调试通过,编写测试代码,测试权限设置或取消是否成功,并将调试结果截屏写入实验报告。

四、 数据库完整性实验题

完善作业#3中你的数据模型完整性设计,模型中至少应体现如下完整性要求:

1) 实体完整性

答:在数据库中实体完整性的主要表现方式为主码。

2) 参照完整性

答:参照完整性在数据库中以外码的形式表现。

3) 用户定义的完整性

答:用户定义的完整性在数据库中主要表现形式为:列值非空,列值唯一,用check语句检查列值是否满足一个条件表达式。
因为以上三个部分在使用MYSQL建表的时候就已经完成,所以这里一起进行说明,数据库建表语句如下:
在这里插入图片描述

其中,实体完整性的语句用红框标出,参照完整性相关语句用黄框标出,绿框和蓝框则是用户定义的完整性。

4) 对部分完整性约束进行命名

答:完整性约束命名子句用于对完整性约束条件命名,从而灵活地增删一个完整性约束条件。如下图中对电子书列表的价格进行约束,命名为yueshu:
在这里插入图片描述

在输入了不满足约束的条件之后(价格<=0),运行程序报错:
在这里插入图片描述
在这里插入图片描述

但是这里的实验过程中,我发现check语句在5.7的版本里同样可以运行,但是不被解析,也就是说check语句合法,但是没有实际的作用,在使用8.0.16之后的版本的MYSQL之后check语句才被编译。

5) 创建域以实现某些属性内容完整性

答:设置一组具有相同设置类型的值的集合,通过域来定义属性,在修改完整性约束的时候只要修改域的定义即可。
因为MYSQL中没有domain关键字,所以使用SQL语句进行类似域功能的模拟。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将以上实现代码加入到作业#3 的脚本中并调试通过,用违犯相应约束的语句尝试,以验证完整性约束实施效果。注意观察不同的RDBMS平台对完整性的支持程度。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐