1、学 号: 实验五 数据库完整性与安全性实验1. 实验目的通过对完整性规则的定义实现,熟悉了解kingbase中完整性保证的规则和实现方法,加深对数据完整性的理解。通过对安全性相关内容的定义,熟悉了解kingbase中安全性的内容和实现方法,加深对数据库安全性的理解。2. 实验环境操作系统:Microsoft Windows 7旗舰版 (32位)。硬件:容量足以满足MySQL 5.5安装及后续实验的使用。软件:数据库版本:MySQL 5.5 3. 实验内容及过程3.1. 完整性实验3.1.1. 分别定义学生数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束;其实在导入txt数据时,我
2、已经定义了各个基表的主键。CREATE TABLE sc ( sno varchar(6) NOT NULL, cno varchar(3) NOT NULL, grade int(11) DEFAULT NULL, PRIMARY KEY (sno,cno) DEFAULT CHARSET=gbk;Create Table student ( sname varchar(6) DEFAULT NULL, sex varchar(2) DEFAULT NULL, bdate datetime DEFAULT NULL, dept varchar(8) DEFAULT NULL, classno
3、 varchar(3) DEFAULT NULL, PRIMARY KEY (sno)Create Table course ( cname varchar(12) DEFAULT NULL, lhour int(11) DEFAULT NULL, credit int(11) DEFAULT NULL, semester varchar(2) DEFAULT NULL, PRIMARY KEY (cno)不过为了进一步熟悉主键的操作。我对每个基表先删除主键,然后添加主键如下图,从而实现实体完整性约束:接下来,我给sc表添加student和course的外键,实现参照完整性约束如下图: 添加完
4、主键和外键后,我们用show create table命令查看各基表信息,可得如下截图。我们可以清楚地看到各个基表的主键和外键都成功添加了。3.1.2. 分别向学生表、课程表插入具有相同学号和相同课程编号的学生数据和课程数据,验证其实体完整性约束; 从截图可见,我们分别对student和course表格插入具有相同学号和相同课程编号的学生数据和课程数据,都失败了,出现error,即,验证了其实体完整性约束。3.1.3. 向学生选课表中插入一条数据,课程编号是课程表中没有的,验证参照完整性约束; 如图,course表格中没有C09,因此向sc表中添加此数据时,受参照完整性约束,而出现了错误,插入
5、失败。 即验证了参照完整性约束。3.1.4. 删除学生表中的所有数据,验证参照完整性约束; 由截图可见,删除失败了,这是受参照完整性约束的影响。3.1.5. 定义存储过程,完成查询某个学生的选课情况,并执行;由于存储过程中会用到结束符,所以我们先用delimiter修改结束符为/。由下图,我们还可以看到现在数据库里没有任何存储过程。 接着,我们定义存储过程查询某个学生的选课情况。并显示出现在的存储过程。由图可见,创建成功。 在此存储过程中,我定义了一个读入的参数numt,用来存储我们要查询的学生学号。 最后,我们调用存储过程,查看运行结果。证明调用成功。3.1.6. 定义触发器,当向学生表插入
6、新的一条记录时,将所有学生出生日期加1;并对其进行测试;由于Mysql和其他的软件不一样,所以几经纠结,最后才终于找到了正确的创建触发器的方法。需要复制一个新的table,然后通过对旧table的操作来触发对新table的操作,而不能通过一个表的insert触发对同一个表的操作。下图是正确的做法,错误的做法会在实验小结中遇到的问题里给出。 其中,我还用到了MySQL的时间处理函数date_add。日期加1我的理解是加一天,而且借此学习了一下时间处理的相关函数,而不是直接bdate=bdate+1 向student里插入一条新纪录,触发触发器mytri的操作。 现在查看student和new_s
7、tudent的变化。 可见student已经插入成功,但数据都还是原数据,没有变化。 而new_student里的数据则出生日期加了一天。1月2号都变为3号。3.2. 安全性实验内容3.2.1. 定义一新的登陆帐号、数据库用户,并授予其访问学生数据库的读权限;定义一个新的登录帐号、数据库用户sy。 对sy授予访问student的读权限。 我们查看加入新用户后的用户表格:3.2.2. 分别用超级用户和新定义的用户访问学生数据库,并对其中的学生表数据进行修改;登录测试:用超级用户即root登录用新用户sy登录。可见两个用户都登录成功了。访问student测试:用root查看student 用sy查
8、看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,所以无法实
9、验。4. 实验小结实验中遇到的问题:这次实验进行比较顺利,只是按照实验要求逐步编程实现即可。实验中,但是由于MySQL本身的问题纠结了很久。MySQL对触发器的支持还没有像SQL Server那么充分,需要创建新表来进行触发操作。 若是对旧表操作,则会出现死循环报错。 删除触发器的相关操作为: 此外,MySQL不支持创建role,所以导致部分实验内容无法完成。实验心得:通过这次实验,我在对完整性规则的定义实现中,熟悉了解MySQL中完整性保证的规则和实现方法,加深对数据完整性的理解。并通过对安全性相关内容的定义,熟悉了MySQL中安全性的内容和实现方法,加深对数据库安全性的理解。实验过程中虽然为触发器纠结了很久,但是总而言之,实验还是比较简单的,而且最重要的是在实践中巩固了我课堂所学的概念,真切体会到数据库完整性和安全性的概念,并实践了存储过程和触发器的知识。实验不可小看,只有在实践中在自己的编程实现中,才能真正地较好掌握课堂所学的知识。实践出真知就是这个道理。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1