北邮大三下第5次数据库实验报告--mysql.doc
CATHERINE2015/6/22实验五数据库完整性与安全性实验一、实验内容11完整性实验(1)分别定义学生数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束;(2)分别向学生表、课程表插入具有相同学号和相同课程编号的学生数据和课程数据,验证其实体完整性约束;(3)向学生选课表中插入一条数据,课程编号是课程表中没有的,验证参照完整性约束;(4)删除学生表中的所有数据,验证参照完整性约束;(5)定义存储过程,完成查询某个学生的选课情况,并执行。(6)定义触发器,当向学生表插入新的一条记录时,将所有学生出生日期加1;并对其进行测试。(7)用SQL完成以上操作。12安全性实验内容(1)定义一新的登陆帐号、数据库用户,并授予其访问学生数据库的读权限;(2)分别用SA用户和新定义的用户访问学生数据库,并对其中的学生表数据进行修改;(3)再次用此用户访问学生数据库,并对其中的学生表数据进行修改。(4)用SQL语句分别完成以上内容。二、实验要求1用SQL语句完成以上操作2要求学生独立完成以上内容。3实验完成后完成要求的实验报告内容。三、实验环境系统WINDOWS7软件MYSQL56四、实验步骤及结果分析41完整性实验CATHERINE2015/6/22111分别定义学生数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束;主键约束(建立表格时已经完成)实现实体完整性约束。CREATETABLECOURSECNOVARCHAR3NOTNULL,CNAMEVARCHAR12DEFAULTNULL,LHOURINTDEFAULTNULL,CREDITINTDEFAULTNULL,SEMESTERVARCHAR2DEFAULTNULL,PRIMARYKEYCNOCREATETABLESCSNOVARCHAR6NOTNULL,CNOVARCHAR3NOTNULL,GRADEINTDEFAULTNULL,PRIMARYKEYSNO,CNOCREATETABLESTUDENTSNOVARCHAR6NOTNULL,SNAMEVARCHAR6DEFAULTNULL,SEXVARCHAR2DEFAULTNULL,BDATEDATETIMEDEFAULTNULL,DEPTVARCHAR8DEFAULTNULL,CLASSNOVARCHAR4DEFAULTNULL,PRIMARYKEYSNO外键实现参照完整性约束;ALTERTABLESCADDCONSTRAINTSNOFOREIGNKEYSNOREFERENCESSTUDENTSNOALTERTABLESCADDCONSTRAINTCNOFOREIGNKEYCNOREFERENCESCOURSECNOCATHERINE2015/6/22查看插入结果112分别向学生表、课程表插入具有相同学号和相同课程编号的学生数据和课程数据,验证其实体完整性约束;由下图知,插入失败,失败原因【173625INSERTINTOSTUDENTVALUES 31401 , 郭子敬 , 男 , 1980120000 , 计算机 , 3146 ERRORCODE1062DUPLICATEENTRY 31401 FORKEY PRIMARY 0015SEC】,说明主键能够标识表中每条信息的唯一性,不可以重复。CATHERINE2015/6/22113向学生选课表中插入一条数据,课程编号是课程表中没有的,验证参照完整性约束;删除学生表中的所有数据,验证参照完整性约束;插入数据失败,失败原因【174304INSERTINTOSCVALUES 31401 , D03 ,NULLERRORCODE1452CANNOTADDORUPDATEACHILDROWAFOREIGNKEYCONSTRAINTFAILSSTUDENTSC,CONSTRAINTCNOFOREIGNKEYCNOREFERENCESCOURSECNO0109SEC】,因为课程号“D04”不存在于课程表中。CATHERINE2015/6/22114删除学生表中的所有数据删除失败,受参照完整性约束的影响,失败原因【174725DELETEFROMSTUDENTERRORCODE1175YOUAREUSINGSAFEUPDATEMODEANDYOUTRIEDTOUPDATEATABLEWITHOUTAWHERETHATUSESAKEYCOLUMNTOCATHERINE2015/6/22DISABLESAFEMODE,TOGGLETHEOPTIONINPREFERENCESSQLQUERIESANDRECONNECT0015SEC】115定义存储过程,完成查询某个学生的选课情况,并执行。这里需要注意的是DELIMITER和DELIMITER两句,DELIMITER是分割符的意思,因为MYSQL默认以““为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MYSQL才会将““当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。DELIMITERCREATEPROCEDURETESTBEGINSELECTSTUDENTSNO,STUDENTSNAME,SCCNOFROMSTUDENT,SCWHERESTUDENTSNOSCSNOANDSTUDENTSNO 31401 END建立存储过程运行存储过程CATHERINE2015/6/22查看存储过程116定义触发器,当向学生表插入新的一条记录时,将所有学生出生日期加1;并对其进行测试。需要建立一个新的TABLE,然后通过对旧TABLE的操作来触发对新TABLE的操作,而不能通过一个表的INSERT触发对同一个表的操作。创建触发器CREATETRIGGERAAFTERINSERTONSTUDENTFOREACHROWUPDATESTUSETBDATEDATE_ADDBDATE,INTERVAL1DAY注DATE_ADDDATE,INTERVALEXPRTYPE函数向日期添加指定的时间间隔。CATHERINE2015/6/22事件没有触发前表的状态CATHERINE2015/6/22测试INSERTINTOSTUDENTVALUES 31455 , 冯宇宁 , 男 , 1980120000 , 计算机 , 3146 42安全性实验内容1定义一新的登陆帐号、数据库用户“ZYR”,,并授予其访问学生数据库的读权限;CATHERINE2015/6/22授权用户ZYR访问学生数据库的读权利。查看2分别用超级用户和新定义的用户访问学生数据库,并对其中的学生表数据进行修改;ROOT用户访问STUDENT数据库ROOT用户修改登陆新建数据库CATHERINE2015/6/22新建用户ZYR访问数据库新建用户ZYR修改数据库因为用户‘ZYR’只有查询权限,没有修改权限,所以修改失败。五、实验总结(1)设置触发器后,测试时,插入失败,失败原因【101211INSERTINTOSTUDENTVALUES 31430 , 张明 , 女 , 1980120000 , 计算机 , 3146 E