数据库完整性与安全性实验.docx

上传人:b****6 文档编号:9048413 上传时间:2023-02-02 格式:DOCX 页数:11 大小:212.36KB
下载 相关 举报
数据库完整性与安全性实验.docx_第1页
第1页 / 共11页
数据库完整性与安全性实验.docx_第2页
第2页 / 共11页
数据库完整性与安全性实验.docx_第3页
第3页 / 共11页
数据库完整性与安全性实验.docx_第4页
第4页 / 共11页
数据库完整性与安全性实验.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数据库完整性与安全性实验.docx

《数据库完整性与安全性实验.docx》由会员分享,可在线阅读,更多相关《数据库完整性与安全性实验.docx(11页珍藏版)》请在冰豆网上搜索。

数据库完整性与安全性实验.docx

数据库完整性与安全性实验

1.实验五数据库完整性与安全性实验

1.1实验目的

1.通过对完整性规则的定义实现,熟悉了解Mysql中完整性保证的规则和实现方法,加深对数据完整性的理解。

2.通过对安全性相关内容的定义,熟悉了解Mysql中安全性的内容和实现方法,加深对数据库安全性的理解

1.2实验内容

1.2.1完整性实验

(1)分别定义学生数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束;

(2)分别向学生表、课程表插入具有相同学号和相同课程编号的学生数据和课程数据,验证其实体完整性约束;

(3)向学生选课表中插入一条数据,课程编号是课程表中没有的,验证参照完整性约束;

(4)删除学生表中的所有数据,验证参照完整性约束;

(5)定义存储过程,完成查询某个学生的选课情况,并执行。

(6)定义触发器,当向学生表插入新的一条记录时,将所有学生出生日期加1;并对其进行测试。

(7)用sql完成以上操作。

1.2.2安全性实验

(1)定义一新的登陆帐号、数据库用户,并授予其访问学生数据库的读权限;

(2)分别用sa用户和新定义的用户访问学生数据库,并对其中的学生表数据进行修改;

(3)再次用此用户访问学生数据库,并对其中的学生表数据进行修改。

(4)用SQL语句分别完成以上内容。

1.3实验环境

Window8操作系统

Mysql版本数据库

Mysqlworkbench可视化工具

Mysql命令行编辑器

1.4实验步骤及结果分析

1.4.1完整性

1.4.1.1分别定义学生数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束

1.首先因为在之前创建表的时候定义了主键,因此,我们需要先将所有表的主键撤销掉,然后重新创建主键。

Mysql语句(删除主键):

altertablestudentdropprimarykey;

altertablecoursedropprimarykey;

altertablescdropprimarykey;

2.重新创建主键

Mysql语句(创建主键):

altertablestudentaddprimarykey(sno);

altertablecourseaddprimarykey(cno);

altertablescaddprimarykey(sno,cno);

3.到此,我们已经重新添加了各表的主键,接下来我们为SC表添加外键。

Mysql语句(创建外键):

altertablescaddconstraintforeignkey(sno)referencesstudent(sno);

altertablescaddconstraintforeignkey(cno)referencescourse(cno);

4.主键和外键都添加完毕,我们观察一下目前各表的结构。

Mysql语句(查看表定义):

showcreatetablestudent;

showcreatetablecourse;

showcreatetablesc;

由上面结果可知:

我们成功创建了各表的主键,并成功为SC表创建了sno,cno两个外键。

1.4.1.2分别向学生表、课程表插入具有相同学号和相同课程编号的学生数据和课程数据,验证其实体完整性约束

1.首先查找一下student表中的学生信息,以便下面添加重复学号的学生

Mysql语言:

select*fromstudent;

2.向student表中插入一个重复学号的学生,验证完整性约束。

我选择了*****学号,由上面的结果可知,该学号已经存在。

Mysql语句(添加一个新的学号为*****的学生):

insertintostudentvalue(‘30203’,’茹兴康’,’男’,’1997-07-0700:

00:

00’,’计算机’,’3174’);

上面结果显示:

添加失败,因为sno为student表的主键,不能重复,验证了其完整性约束。

3.同上,我们向course表中添加一个具有相同cno的课程。

Mysql语句:

select*fromcourse;

insertintocoursevalue(‘C01’,’数据库’,’50’,’1’,’春’);

上面结果显示:

成功验证了完成性约束。

1.4.1.3向学生选课表中插入一条数据,课程编号是课程表中没有的,验证参照完整性约束

向学生表中添加一条数据,其中课程编号在course中不存在,我选择了C06号。

Mysql语句(向学号为*****的学生选课中添加C06选课):

insertintoscvalues(‘30203’,’C06’,’100’);

由结果来看:

插入失败,因为course的cno是SC的外码,C06在course中不存在,由于参照完整性约束,所以添加失败,验证成功。

1.4.1.4删除学生表中的所有数据,验证参照完整性约束

删除学生表,验证参照完整性约束。

Mysql语句:

droptablestudent;

由结果来看:

由于student中的sno是sc的一个外码,所以不能删除student,成功验证了参照完整性约束。

1.4.1.5定义存储过程,完成查询某个学生的选课情况,并执行

1.首先定义一个根据学生学号搜索的存储过程。

但是由于‘;’是一个结束标志,因此存储过程定义失败,因为第一个遇到语句的‘;’时候,该语句还没结束导致‘;’后面的语句没有加工

2.解决上面问题,将结束符号更换为其他字符,我替换为了#,使用delimiter语句

Mysql语句:

delimiter#

createproceduresearch_sc_sno(idchar(6))

beginselectsno,cnofromscwheresno=id;

end#

存储过程定义成功。

3.使用存储过程查看学生选课情况。

Mysql语句(查询学号为*****的学生选课情况):

callsearch_sc_sno(‘30203’)#

1.4.1.6定义触发器,当向学生表插入新的一条记录时,将所有学生出生日期加1;并对其进行测试

1.定义触发器,当向学生表插入新记录时,将所有学生出生日期+1;

Mysql语句:

createtriggeradd1_bdatebeforeinsertonstudentforeachrow

beginupdatestudentsetbdate=date_add(bdate,interval1day);end#

2.向学生表中插入新纪录,注意:

必须插入sno无重复的新纪录

Mysql语句:

insertintostudentvalue(‘12345’,’茹兴康’,’男’,’1997-07-0700:

00:

00’,’计算机’,’3174’);

但是结果显示:

在触发器中不能更新student表的内容。

后来我在网上查找了一些资料:

即当对该表进行插入操作时,由于触发器要将每一行进行修改,那么刚开始插入的新纪录可能会导致无限制的递归。

因此,需要复制一个新的student表,由一个表的插入引起另一个表的触发。

 

3.创建一个student复制表

Mysql语句:

createtablestudent1select*fromstudent;

 

4.重新创建触发器,让student1的插入引起student的触发(注意,在创建前把之前的删除掉)

Mysql语句:

createtriggeradd1_bdatebeforeinsertonstudent1foreachrow

beginupdatestudentsetbdate=date_add(bdate,interval1day);end#

之后向student1中插入新纪录,发现插入成功。

 

5.搜索student和student1表的记录,观察变化

从上两个表的结果来看,我们成功引起了触发,student的bdate都增多了一天。

1.4.2安全性

1.4.2.1定义一新的登陆帐号、数据库用户,并授予其访问学生数据库的读权限

1.在root用户下定义一个新的用户auser

Mysql语句:

createuser‘auser’@’localhost’identifiedby‘072312’;

2.赋予新用户auser对student表的select和update权限

Mysql语句:

grantselect,updateonto‘auser’@’localhost’;

上图显示:

新用户创建成功;

权限赋予成功。

1.4.2.2分别用root用户和新定义的用户访问学生数据库,并对其中的学生表数据进行修改

1.登录root用户,进行student表的查询操作,此处我查询了*****学号的学生信息

Mysql语句:

Select*fromstudentwheresno=30203;

使用root用户查询成功。

2.用root用户修改student表的信息,此处我更改了30203学生的班级为3000;

Mysql语句:

Updatestudentsetclassno=’3000’;

使用root用户修改成功。

 

3.登录新创建的auser用户,进行与root用户相同的操作。

Mysql语句:

Select*fromstudentwheresno=30203;

Updatestudentsetclassno=’3022’;

使用auser新用户查询student成功;

使用auser新用户修改student成功。

1.5实验总结

1.5.1实验遇到的问题

1.问题:

在添加外键的时候发生错误:

不能添加外键

解决:

a.student的主键sno定义要和sc的外键sno定义需要完全一样,长度也要一样

b.两个数据表定义时的内码也要一样,之前因为student表的采用的是utf-8码,而sc表采用的是latin码,产生错误,在workbench中将sc码改变为utf-8,解决了问题。

2.问题:

在定义存储过程中,遇到第一个‘;’便结束了语句,但实际上语句还没有结束。

解决:

使用delimiter语句,将结束符号改为其他符号,比如#,这样就解决了判定问题。

3.问题:

定义触发器遇到问题,在student中定义触发器,但是不能再student中进行触发操作

解决:

创建一个student的复制表,在新表中定义触发操作,触发改变另一个表的值。

4.问题:

在创建新的用户,为其赋予权限过程中遇到问题。

遇到赋予权限失败。

解决:

语句使用错误,在赋予权限时必须制定host是什么,要写明‘user’@‘host’;

1.5.2收获

经过本次实验,首先让我对完整性约束有了更深的了解。

同时,也对定义数据库表的内码进行了了解,使用不同的码表可能会导致很多错误,例如utf-8和latin的之间无法识别。

让我印象最深刻的是,有关于数据表的了解,在实验过程中,我先后查阅了表内容,更改权限等操作,让我对mysql的user有了更深一步的了解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1