《西北工业大学数据库实验报告5.doc》由会员分享,可在线阅读,更多相关《西北工业大学数据库实验报告5.doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、. .?数据库原理?实验报告题目:实验一 数据库和表的创立与管理学号班级日期一. 实验内容、步骤以及结果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 procedure
2、 jsearch(search_jno nchar(20) )asbeginselect j.jname,s.sname,p.pnamefrom s,p,j,spjwherespj.jno=search_jno and spj.jno=j.jno and spj.sno=s.sno and spj.pno=p.pnoend执行:EXECjsearch search_jno=J1(2) 使用S表,为其创立一个加密的存储过程jmsearch。该存储过程的作用是:当执行该存储过程时,将返回供给商的所有信息。10分 创立:create procedure jmsearch with encryptio
3、nasbegin select * from S where city= end使用系统存储过程sp_helptext查看jsearch, jmsearch的文本信息。5分exec sp_helptext jsearchexec sp_helptext jmsearch(3) 执行jmsearch存储过程,查看供给商的情况。5分执行:exec jmsearch(4) 删除jmsearch存储过程。5分drop procedure jmsearch3. 针对Student数据库,创立和执行如下的触发器:共计40分(1) 删除SC表上的外键约束,针对SC表创立一个名为insert_s的INSERT
4、触发器。该触发器的功能:当用户向SC表中插入记录时,如果插入的o值不是C表中o的已有值,那么提示用户“不能插入记录这样的纪录,否那么提示“记录插入成功。触发器创立成功之后,向SC表插入记录,验证触发器是否正常工作。(5分)create trigger insert_son SCinstead of insertasif (exists(select *from inserted whereo not in (selecto from C)beginprint 不能插入这样的记录!rollback transactionendelseprint 记录插入成功!验证:insert into sc
5、values (95009,8,98) 更改数据:insert into sc values (95009,5,98)(2) 为S表创立一个名为dele_s1的DELETE触发器,该触发器的作用是制止删除S表中的记录。触发器创立成功之后,删除S表中的记录,验证触发器是否正常工作。(5分) 创立:create trigger dele_s1 on sinstead of delete as rollback transactionprint 制止删除验证:delete from s where sno=95001(3) 为S表创立一个名为dele_s2的DELETE触发器,该触发器的作用是删除S
6、表中的记录时删除SC表中该学生的选课纪录。触发器创立成功之后,删除S表中的记录删除S表中的记录,验证触发器是否正常工作(SC表中的数据被正常删除)。(5分)创立:create trigger dele_s2 on safter delete asdelete from scwhere sno in (select sno from deleted)验证:delete from s where sno=95001S表中:Sc表中:(4) 为S表创立一个名为update_s的UPDATE触发器,该触发器的作用是制止更新S表中“sdept字段的内容。触发器创立成功之后,更新S表中“sdept字段的内
7、容,验证触发器是否正常工作。(5分)创立:create trigger update_s on s instead of updateasif update(sdept)begin raiserror(sdept 不能被修改,10,1)end验证:(5) 禁用update_s触发器。禁用之后,更新S表中的“sdept字段的内容,验证触发器是否还继续正常工作。(5分)禁用触发器:disable trigger update_s on s验证:update s set sdept=CS1where sno =95002(6) 删除update_s触发器。(5分)drop trigger updat
8、e_s(7) 创立一个新的课程成绩统计表 CAvgGrade(o, Snum, examSNum, avgGrade),分别表示课号,选该课程的学生人数,参加考试人数,该门课程的平均成绩。利用触发器实现如下的功能:当SC表中有记录插入、删除或者某个人的成绩更新时,自动更新表CAvgGrade。注意SC表中的grade为NULL时说明该学生还未参加考试,计算平均成绩时不需要计算该成绩,但是grade为0即考试成绩为0时,需要计算该成绩。(10分)创立表:创立触发器:use studentgocreate trigger update_sc_cavggrade on scfor insert ,
9、delete , update as begin declare o char(10)declare ssum int declare examssum int declare avggrade intselect o from insertedselect o from deletedselect ssum =count(*) from sc where o=oselect examssum= count(*) from sc where o=o and cgrade=0select avggrade= AVG(cgrade) from sc where o=o and cgrade=0up
10、date CAvgGradeset Ssum=ssum,examSsum=examssum,avgGrade=avggradewhereo=oend验证触发器:初始的CAvgGrade表插入数据时:insert into sc values(95004,1,65)Sc表:CAvgGrade表:删除数据时:delete from sc where sno=95001sc表的变化:CAvgGrade表变化:更新数据时:update scset cgrade=99 where sno=95004SC表的变化:CAvgGrade表变化:4. 创立一个works数据库,其中包含员工表empoyee(eI
11、D, eName, salary),假设该表中有1000条员工数据,完成以下要求总计20分,每题10分。(1) 为了协助此题自动生成1000条员工数据,创立一个自动生成员工ID的用户自定义函数generateEID。其中员工ID要求是一个8位的数字,前四位表示插入员工数据的当前年份,后四位按照从0001到9999的顺序增长。例如2021 年插入的第一条数据是20050001,所有1000条员工ID分别是2021 00。调用该函数实现自动插入1000条数据。注意插入数据的时候员工XX可以为任意值,工资是2000-5000之间的数字创立了一个存储过程来完成:use workgocreate pro
12、cedure generateEIDasbegindeclare i int set i=0while (i1000)begin insert into dbo.employee values(20210001+i,name+CAST(i as nchar(20),2000+CAST(FLOOR(rand()*3001)as int)set i=i+1return endend(2) 该公司方案为员工按照一定的规那么涨工资,请使用游标创立一个存储过程,执行该存储过程完本钱次工资调整:工资增长规那么如下:l 工资在3000元以下,每月涨300元;l 工资在3000-4000元之间,每月涨200元
13、;l 工资大于或者等于4000元,每月涨50元;use workgodeclare mycursor CURSOR forselect salary from employeeopen mycursordeclare salary int fetch next from mycursor into salarywhile FETCH_STATUS=0begin if(salary3000) begin update employee set salary=salary+300 where current of mycursor end else if(salary4000) begin upd
14、ate employee set salary=salary+200 where current of mycursor end else begin update employee set salary=salary+50 where current of mycursor end fetch next from mycursor into salary end close mycursor deallocate mycursor未改变时:改变后:二. 实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)除了标题内容以外,该局部内容中还可以写对于实验的一些感受,建议,意见等。触发器是对表进展插入、更新、删除的时候会自动执行的特殊存储过程,本章学习的触发器类型是after触发器,即只有当执行update,delete,insert的时候这个触发器才会被使用到,触发器的使用为数据库操作真的提供了很多便利批阅者: 批阅日期:实验成绩: 批注:. .word.