北邮 大三下 数据库实验五 mysql版本.docx
《北邮 大三下 数据库实验五 mysql版本.docx》由会员分享,可在线阅读,更多相关《北邮 大三下 数据库实验五 mysql版本.docx(11页珍藏版)》请在冰豆网上搜索。
北邮大三下数据库实验五mysql版本
实验报告
学院:
计算机学院
课程名称:
数据库系统
实验名称:
实验五数据库完整性与安全性实验
班级:
2009211311
姓名:
schnee
学号:
实验五数据库完整性与安全性实验
1.实验目的
通过对完整性规则的定义实现,熟悉了解kingbase中完整性保证的规则和实现方法,加深对数据完整性的理解。
通过对安全性相关内容的定义,熟悉了解kingbase中安全性的内容和实现方法,加深对数据库安全性的理解。
2.实验环境
操作系统:
MicrosoftWindows7旗舰版(32位)。
硬件:
容量足以满足MySQL5.5安装及后续实验的使用。
软件:
数据库版本:
MySQL5.5
3.实验内容及过程
3.1.完整性实验
3.1.1.分别定义学生数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束;
其实在导入txt数据时,我已经定义了各个基表的主键。
CREATETABLEsc(
snovarchar(6)NOTNULL,
cnovarchar(3)NOTNULL,
gradeint(11)DEFAULTNULL,
PRIMARYKEY(sno,cno)
)DEFAULTCHARSET=gbk;
CreateTablestudent(
snovarchar(6)NOTNULL,
snamevarchar(6)DEFAULTNULL,
sexvarchar
(2)DEFAULTNULL,
bdatedatetimeDEFAULTNULL,
deptvarchar(8)DEFAULTNULL,
classnovarchar(3)DEFAULTNULL,
PRIMARYKEY(sno)
)DEFAULTCHARSET=gbk;
CreateTablecourse(
cnovarchar(3)NOTNULL,
cnamevarchar(12)DEFAULTNULL,
lhourint(11)DEFAULTNULL,
creditint(11)DEFAULTNULL,
semestervarchar
(2)DEFAULTNULL,
PRIMARYKEY(cno)
)DEFAULTCHARSET=gbk;
不过为了进一步熟悉主键的操作。
我对每个基表先删除主键,然后添加主键如下图,从而实现实体完整性约束:
接下来,我给sc表添加student和course的外键,实现参照完整性约束如下图:
添加完主键和外键后,我们用showcreatetable命令查看各基表信息,可得如下截图。
我们可以清楚地看到各个基表的主键和外键都成功添加了。
3.1.2.分别向学生表、课程表插入具有相同学号和相同课程编号的学生数据和课程数据,验证其实体完整性约束;
从截图可见,我们分别对student和course表格插入具有相同学号和相同课程编号的学生数据和课程数据,都失败了,出现error,即,验证了其实体完整性约束。
3.1.3.向学生选课表中插入一条数据,课程编号是课程表中没有的,验证参照完整性约束;
如图,course表格中没有C09,因此向sc表中添加此数据时,受参照完整性约束,而出现了错误,插入失败。
即验证了参照完整性约束。
3.1.4.删除学生表中的所有数据,验证参照完整性约束;
由截图可见,删除失败了,这是受参照完整性约束的影响。
3.1.5.定义存储过程,完成查询某个学生的选课情况,并执行;
由于存储过程中会用到结束符,所以我们先用delimiter修改结束符为//。
由下图,我们还可以看到现在数据库里没有任何存储过程。
接着,我们定义存储过程查询某个学生的选课情况。
并显示出现在的存储过程。
由图可见,创建成功。
在此存储过程中,我定义了一个读入的参数numt,用来存储我们要查询的学生学号。
最后,我们调用存储过程,查看运行结果。
证明调用成功。
3.1.6.定义触发器,当向学生表插入新的一条记录时,将所有学生出生日期加1;并对其进行测试;
由于Mysql和其他的软件不一样,所以几经纠结,最后才终于找到了正确的创建触发器的方法。
需要复制一个新的table,然后通过对旧table的操作来触发对新table的操作,而不能通过一个表的insert触发对同一个表的操作。
下图是正确的做法,错误的做法会在实验小结中遇到的问题里给出。
其中,我还用到了MySQL的时间处理函数date_add。
日期加1我的理解是加一天,而且借此学习了一下时间处理的相关函数,而不是直接bdate=bdate+1
向student里插入一条新纪录,触发触发器mytri的操作。
现在查看student和new_student的变化。
可见student已经插入成功,但数据都还是原数据,没有变化。
而new_student里的数据则出生日期加了一天。
1月2号都变为3号。
3.2.安全性实验内容
3.2.1.定义一新的登陆帐号、数据库用户,并授予其访问学生数据库的读权限;
定义一个新的登录帐号、数据库用户sy。
对sy授予访问student的读权限。
我们查看加入新用户后的用户表格:
3.2.2.分别用超级用户和新定义的用户访问学生数据库,并对其中的学生表数据进行修改;
登录测试:
用超级用户即root登录
用新用户sy登录。
可见两个用户都登录成功了。
访问student测试:
用root查看student
用sy查看student
由于sy也有查看student的权限,所以两个用户都查看成功。
插入student测试:
用root修改student:
用sy修改student:
可见,sy由于没有权限,所以修改失败了。
访问sc测试:
用root访问sc:
用sy访问sc:
同样,我们可以看到,由于sy只有查看student的权限,所以查看sc也失败了。
3.2.3.创建数据库角色,并授予访问学生数据库的读、写权限;
3.2.4.将角色赋予
(1)中定义的用户,建立用户和角色联系;
3.2.5.再次用此用户访问学生数据库,并对其中的学生表数据进行修改。
此上三部分实验由于MySQL不支持创建role,所以无法实验。
4.实验小结
实验中遇到的问题:
这次实验进行比较顺利,只是按照实验要求逐步编程实现即可。
实验中,但是由于MySQL本身的问题纠结了很久。
MySQL对触发器的支持还没有像SQLServer那么充分,需要创建新表来进行触发操作。
若是对旧表操作,则会出现死循环报错。
删除触发器的相关操作为:
此外,MySQL不支持创建role,所以导致部分实验内容无法完成。
实验心得:
通过这次实验,我在对完整性规则的定义实现中,熟悉了解MySQL中完整性保证的规则和实现方法,加深对数据完整性的理解。
并通过对安全性相关内容的定义,熟悉了MySQL中安全性的内容和实现方法,加深对数据库安全性的理解。
实验过程中虽然为触发器纠结了很久,但是总而言之,实验还是比较简单的,而且最重要的是在实践中巩固了我课堂所学的概念,真切体会到数据库完整性和安全性的概念,并实践了存储过程和触发器的知识。
实验不可小看,只有在实践中在自己的编程实现中,才能真正地较好掌握课堂所学的知识。
实践出真知就是这个道理。