学生信息管理系统实验报告201026410130钟敏一.需求分析学生信息管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生信息管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对学生信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学生信息管理的效率.二.概念设计(关系图)(表设计)用visio绘制数据库模型关系图:三.规范化设计⑴student表结构字段数据类型长度是否允许空值备注学号st_idChar10否主键姓st_fnameChar10否名st_lnameChar10否性别st_sexChar5是男或女地址st_addrChar100是班级st_classChar30是专业st_spChar30是邮箱st_mailChar10是电话st_phoneChar15是备注st_descText是⑵course表结构字段数据类型长度是否允许空值备注课程号co_idChar10否主键课程名co_nameChar30否备注co_descText是教师te_idChar10是外键⑶score表结构字段数据类型长度是否允许空值备注学号st_idChar10否外键当主键课程号co_idChar10否外键当主键成绩sc_numTinyint是在1~100之间⑶teacher表结构字段数据类型长度是否允许空值备注工号te_idChar10否主键姓te_fnameChar10否名te_lnameChar10否电话te_phoneChar15是备注te_descText是四.存储过程设计1)首先建立名为zhongmin的数据库:2)定义zhongmin_student表:2)定义zhongmin_teacher表:3)定义zhongmin_course表:4)定义zhongmin_score表:5)查看MS企业管理器(多了四个表):6)为数据库各表建立索引(如果各表的数据海量,可以加快查询的速度):7)创建各表的存储过程:dropprocedurezhongmin_student_progocreateprocedurezhongmin_student_pro(@学号char(10),@姓char(10),@名char(10),@性别char(5)='男',@住址char(100),@班级char(30),@专业char(30),@邮箱char(30),@电话号码char(15),@备注text,)asinsertintozhongmin_studentvalues(@学号,@姓,@名,@性别,@住址,@班级,@专业,@邮箱,@电话号码,@备注)go五.触发器设计(1)插入触发器触发zhongmin_student表droptriggerzhongmin_student_insert_triggocreatetriggerzhongmin_student_insert_trigonzhongmin_studentforinsertasselect*fromzhongmin_studentgo当在zhongmin_student表中插入某一字段,将触发insert事件,在zhongmin_student表插入该学生所一个部分新记录,并将结果显示到查询分析器上。触发zhongmin_course表droptriggerzhongmin_course_insert_triggocreatetriggerzhongmin_course_insert_trigonzhongmin_courseforinsertasselect*fromzhongmin_coursego当在zhongmin_course表中插入某一字段,将触发insert事件,在zhongmin_course表插入该学生所一个部分新记录,并将结果显示到查询分析器上。触发zhongmin_teacher表droptriggerzhongmin_teacher_insert_triggocreatetriggerzhongmin_teacher_insert_trigonzhongmin_teacherforinsertasselect*fromzhongmin_teachergo当在zhongmin_teacher表中插入某一字段,将触发insert事件,在zhongmin_teacher表插入该学生所一个部分新记录,并将结果显示到查询分析器上。(2)更新触发器创建一个触发器,它实现当zhongmin_student表中st_id学号字段的更改,将同步实现zhongmin_score的学号的改变。droptriggerzhongmin_score_update_triggocreateTriggerzhongmin_score_update_trigonzhongmin_studentforupdateAsifupdate(st_id)beginupdatezhongmin_scoresetzhongmin_score.st_id=i.st_idfromzhongmin_scoreasbr,deletedasd,insertedasiWherebr.st_id=d.st_idendgo创建一个触发器,它实现当zhongmin_course表中co_id课程号字段的更改,将同步实现zhongmin_score的课程号的改变。droptriggerzhongmin_course_update_triggocreateTriggerzhongmin_course_update_trigonzhongmin_courseforupdateAsifupdate(co_id)beginupdatezhongmin_scoresetzhongmin_score.co_id=i.co_idfromzhongmin_scoreasbr,deletedasd,insertedasiWherebr.co_id=d.co_idendgo在zhongmin_score表创建限制学生课程成绩在0到100之间的触发器(假如之前并未创建0-100分限制约束)droptriggerzhongmin_score_check_sc_num_0to100_triggocreatetriggerzhongmin_score_check_sc_num_0to100_trigonzhongmin_scoreforupdate,insertasifexists(select*frominsertedwhere0orsc_num100)beginprint'请输入学生课程成绩在0到100分之间的数!'rollbacktransactionendgo之前我通过altertablezhongmin_scoredropconstraintcs3已经成功删除了原约束,现在插入一条成绩101的记录,触发器检测到马上发出警告:(3)删除触发器当删除zhongmin_student中st_id基本信息时,将同步实现zhongmin_score相应的记录整行的级联删除。droptriggerzhongmin_score_cascade_delete_triggocreatetriggerzhongmin_score_cascade_delete_trigonzhongmin_studentfordeleteasbegindeletezhongmin_scorefromdeletedasd1,zhongmin_scoreasbr1whered1.st_id=br1.st_idendgo当删除zhongmin_course中co_id基本信息时,将同步实现zhongmin_score相应的记录整行的级联删除。droptriggerzhongmin_score_cascade_delete_trig2gocreatetriggerzhongmin_score_cascade_delete_trig2onzhongmin_coursefordeleteasbegindeletezhongmin_scorefromdeletedasd1,zhongmin_scoreasbr1whered1.co_id=br1.co_idendgo当删除zhongmin_teacher中te_id基本信息时,将同步实现zhongmin_course相应的记录整行的级联删除。droptriggerzhongmin_course_cascade_delete_triggocreatetriggerzhongmin_course_cascade_delete_trigonzhongmin_teacherfordeleteasbegindeletezhongmin_coursefromdeletedasd1,zhongmin_courseasbr1whered1.te_id=br1.te_idendgo(4)已经定义的触发器全览:六.游标实现创建一个函数function_newavg1使用游标cursor_s返回zhongmin_score表中每个学生成绩sc_num的平均值:createfunctionfunction_newavg1(@st_idvarchar(10))returnsfloatasbegindeclare@co_idint,@sc_numint,@sc_avgfloat,@newavgfloatdeclarecursor_scursorfast_forwardforselectco_id,sc_numfromzhongmin_scorewherest_id=@st_idopencursor_sfetchnextfromcursor_sinto@co_id,@sc_numwhile(@@fetch_status=0)beginset@sc_avg=(selectavg(sc_num)fromzhongmin_scorewhereco_id=@co_id)fetchnextfromcursor_sinto@co_id,@sc_numendset@newavg=(selectavg(sc_num)fromzhongmin_scorewherest_id=@st_id)closecursor_sdeallocatecursor_sreturn@newavgendgo之后定义一个存储每个学生成绩sc_num的平均值的zhongmin_dual表接着定义zhongmin_dual表的插入触发器droptriggerzhongmin_dual_insert_triggocreatetriggerzhongmin_dual_insert_trigonzhongmin_dualforinsertasselect*fromzhongmin_dualgo然后向zhongmin_dual表插入学号为1的记录