数据库实验报告5.docx_第1页
数据库实验报告5.docx_第2页
数据库实验报告5.docx_第3页
数据库实验报告5.docx_第4页
数据库实验报告5.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库原理实验报告题目:实验五:触发器、存储过程和函数学号姓名班级日期xxxxxxxxxxxx2016.10.29一. 实验内容、步骤以及结果1. 使用系统存储过程(sp_rename)将视图“V_SPJ”更名为“V_SPJ_三建”。(5分) exec sp_rename v_spj, v_spj_三建;2. 针对SPJ数据库,创建并执行如下的存储过程:(共计35分)(1) 创建一个带参数的存储过程jsearch。该存储过程的作用是:当任意输入一个工程代号时,将返回供应该工程零件的供应商的名称(SNAME)和零件的名称(PNAME)以及工程的名称(JNAME)。执行jsearch存储过程,查询“J1”对应的信息。(10分)create proc jsearch jno char(2) as select sname, pname, jname from s,p,j,spj where s.sno=spj.sno and p.pno=spj.pno and j.jno=spj.jno and spj.jno=jno; 执行: exec jsearch J1(2) 使用S表,为其创建一个加密的存储过程jmsearch。该存储过程的作用是:当执行该存储过程时,将返回北京供应商的所有信息。(10分)创建加密存储过程:create proc jmsearch with encryption as select * from s where s.city=北京;sp_helptext jmsearch;(3) 使用系统存储过程sp_helptext查看jsearch, jmsearch的文本信息。(5分)用系统存储过程sp_helptext查看jsearch:exec sp_help jsearch; exec sp_helptext jsearch; 用系统存储过程sp_helptext查看jmsearch:exec sp_help jmsearch; exec sp_helptext jmsearch;(4) 执行jmsearch存储过程,查看北京供应商的情况。(5分)exec jmsearch;(5) 删除jmsearch存储过程。(5分)dropprocjmsearch;3. 针对Student数据库,创建和执行如下的触发器:(共计40分)(1) 删除SC表上的外键约束,针对SC表创建一个名为insert_s的INSERT触发器。该触发器的功能:当用户向SC表中插入记录时,如果插入的cno值不是C表中Cno的已有值,则提示用户“不能插入记录这样的纪录”,否则提示“记录插入成功”。触发器创建成功之后,向SC表插入记录,验证触发器是否正常工作。(5分)create trigger insert_son SCinstead of insert as declare cno char(4)beginselect cno = cno from insertedif cno=any(select cno from C)begin select 记录插入成功insert into SCselect * from insertedendelse select不能插入记录这样的记录endreturn 验证:insert into SCvalues (95007, 5, 99);(2) 为S表创建一个名为dele_s1的DELETE触发器,该触发器的作用是禁止删除S表中的记录。触发器创建成功之后,删除S表中的记录,验证触发器是否正常工作。(5分)create trigger dele_s1on Sinstead of delete as beginrollbackprint 禁止删除S表中的记录end验证:delete from Swhere sno = 95007(3) 为S表创建一个名为dele_s2的DELETE触发器,该触发器的作用是删除S表中的记录时删除SC表中该学生的选课纪录。触发器创建成功之后,删除S表中的记录删除S表中的记录,验证触发器是否正常工作(SC表中的数据被正常删除)。(5分)create trigger dele_s2 on Safter deleteasdeclare sno nchar(9)beginselect sno=sno from deleteddelete SCwhere sno=snoend删除验证:delete Swhere sno=95007(4) 为S表创建一个名为update_s的UPDATE触发器,该触发器的作用是禁止更新S表中“sdept”字段的内容。触发器创建成功之后,更新S表中“sdept”字段的内容,验证触发器是否正常工作。(5分)create trigger update_s on Safter updateasbeginif UPDATE(sdept)begin ROLLBACKPRINT 禁止更新sdept字段 EndEND验证:update Sset sdept=cfwhere sno=95001无法删除。(5) 禁用update_s触发器。禁用之后,更新S表中的“sdept”字段的内容,验证触发器是否还继续正常工作。(5分)disable trigger update_s on Sdisable trigger update_s on S验证:update Sset sdept=cfwhere sno=95001(6) 删除update_s触发器。(5分)drop trigger update_s(7) 创建一个新的课程成绩统计表 CAvgGrade(Cno, Snum, examSNum, avgGrade),分别表示课号,选该课程的学生人数,参加考试人数,该门课程的平均成绩。利用触发器实现如下的功能:当SC表中有记录插入、删除或者某个人的成绩更新时,自动更新表CAvgGrade。注意SC表中的grade为NULL时表明该学生还未参加考试,计算平均成绩时不需要计算该成绩,但是grade为0即考试成绩为0时,需要计算该成绩。(10分)create table CAvgGrade(Cno smallint, Snum smallint, examSNum smallint, avgGrade smallint );declare no smallintdeclare snum smallintdeclare examsnum smallintdeclare avggrade smallintset no=1;while(no7)beginselect snum= count(distinct sno)from SC where cno=no;select examsnum= count(distinct sno)from SCwhere cno=no and grade is not null;select avgGrade=AVG(grade)from SCwhere SC.cno=no and grade is not nullinsert CAvgGradevalues(no,snum,examsnum,avggrade)set no=no+1end创建触发器: create trigger tri_sc on SCafter delete,update,insertasdeclare grade smallintdeclare num smallintdeclare old_cno smallintdeclare examsnum smallintdelete CAvgGradeDECLARE mycursor CURSOR for select cno from C-游标是缓冲区!open mycursor fetch next from mycursor into old_cnowhile(fetch_status=0)beginselect grade=AVG(grade),num=COUNT(*) from SC where cno=old_cno group by cnoselect examsnum= count(distinct sno)from SCwhere cno=old_cno and grade is not null;insert into CAvgGradevalues(old_cno,num,num,grade)fetch next from mycursor into old_cnoset grade=nullset num=nullendclose mycursor验证:插入:insert into SCVALUES(95007,6,100);删除:delete SCWHERE sno=95007更新:UPDATE SCSET cno=4where sno=95001and cno=14. 创建一个works数据库,其中包含员工表empoyee(eID, eName, salary),假设该表中有1000条员工数据,完成下列要求(总计20分,每题10分)。(1) 为了协助本题自动生成1000条员工数据,创建一个自动生成员工ID的用户自定义函数generateEID。其中员工ID要求是一个8位的数字,前四位表示插入员工数据的当前年份,后四位按照从0001到9999的顺序增长。例如2015年插入的第一条数据是20050001,所有1000条员工ID分别是20150001-20151000。调用该函数实现自动插入1000条数据。(注意插入数据的时候员工姓名可以为任意值,工资是2000-5000之间的数字)自定义函数:create function generateEID()returns intas begin declare temp int select temp=count(eID) from empoyeewhere eid between year(GETDATE()*10000 and year(GETDATE()*10000+9999;select temp = year(GETDATE()*10000 + temp + 1 return temp enddeclare i int set i=0while i1000 begininsert into empoyeeselect dbo.generateEID(),char(65+floor(RAND()*26)+char(65+floor(RAND()*26)+char(65+floor(RAND()*26),2000+floor(RAND()*3000)select i=i+1 end(2) 该公司计划为员工按照一定的规则涨工资,请使用游标创建一个存储过程,执行该存储过程完成本次工资调整:工资增长规则如下:l 工资在3000元以下,每月涨300元;l 工资在3000-4000元之间,每月涨200元;l 工资大于或者等于4000元,每月涨50元;create procedure change_salaryas begin declare salary int;declare empoyee_cursor cursor for select salary from empoyee;open empoyee_cursor fetch next from empoyee_cursor into salary;while(FETCH_STATUS=0)beginif (salary4000) set salary=salary+50else set salary=salary+200update empoyee set salary=salary where current of empoyee_cursorfetch next from empoyee_cursor into salary endclose empoyee_cursordeallocate empoyee_cursor end二. 实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)除了标题内容以外,该部分内容中还可以写对于实验的一些感受,建议,意见等。这次实验时写触发器遇到了不小难度,验证触发器的时候也遇到了很多问题。在运行触发器时有时候发现触发器无效,后来发现是之前题的触发器对这道题的触发器带来了影响,需要关了之前的触发器再运行。批阅者: 批阅日期:实验成绩: 批注:5. 使用系统存储过程(sp_rename)将视图“V_SPJ”更名为“V_SPJ_三建”。(5分) 6. 针对SPJ数据库,创建并执行如下的存储过程:(共计35分)(6) 创建一个带参数的存储过程jsearch。该存储过程的作用是:当任意输入一个工程代号时,将返回供应该工程零件的供应商的名称(SNAME)和零件的名称(PNAME)以及工程的名称(JNAME)。执行jsearch存储过程,查询“J1”对应的信息。(10分)(7) 使用S表,为其创建一个加密的存储过程jmsearch。该存储过程的作用是:当执行该存储过程时,将返回北京供应商的所有信息。(10分)(8) 使用系统存储过程sp_helptext查看jsearch, jmsearch的文本信息。(5分)(9) 执行jmsearch存储过程,查看北京供应商的情况。(5分)(10) 删除jmsearch存储过程。(5分)7. 针对Student数据库,创建和执行如下的触发器:(共计40分)(8) 删除SC表上的外键约束,针对SC表创建一个名为insert_s的INSERT触发器。该触发器的功能:当用户向SC表中插入记录时,如果插入的cno值不是C表中Cno的已有值,则提示用户“不能插入记录这样的纪录”,否则提示“记录插入成功”。触发器创建成功之后,向SC表插入记录,验证触发器是否正常工作。(5分)(9) 为S表创建一个名为dele_s1的DELETE触发器,该触发器的作用是禁止删除S表中的记录。触发器创建成功之后,删除S表中的记录,验证触发器是否正常工作。(5分)(10) 为S表创建一个名为dele_s2的DELETE触发器,该触发器的作用是删除S表中的记录时删除SC表中该学生的选课纪录。触发器创建成功之后,删除S表中的记录删除S表中的记录,验证触发器是否正常工作(SC表中的数据被正常删除)。(5分)(11) 为S表创建一个名为update_s的UPDATE触发器,该触发器的作用是禁止更新S表中“sdept”字段的内容。触发器创建成功之后,更新S表中“sdept”字段的内容,验证触发器是否正常工作。(5分)(12) 禁用update_s触发器。禁用之后,更新S表中的“sdept”字段的内容,验证触发器是否还继续正常工作。(5分)(13) 删除u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论