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,spjwhere 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 asselect * 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分)drop proc jmsearch;3.针对Student数据库,创建和执行如下的触发器:(共计40分)(1)删除SC表上的外键约束,针对SC表创建一个名为insert_s的INSERT触发器。
该触发器的功能:当用户向SC表中插入记录时,如果插入的cno值不是C表中Cno 的已有值,则提示用户“不能插入记录这样的纪录”,否则提示“记录插入成功”。
触发器创建成功之后,向SC表插入记录,验证触发器是否正常工作。
(5分)create trigger insert_son SCinstead of insertasdeclare @cno char(4)beginselect @cno = cno from insertedif @cno=any(select cno from C)beginselect '记录插入成功'insert into SCselect * from insertedendelseselect'不能插入记录这样的记录'endreturn验证:insert into SCvalues ('95007', '5', '99');(2)为S表创建一个名为dele_s1的DELETE触发器,该触发器的作用是禁止删除S表中的记录。
触发器创建成功之后,删除S表中的记录,验证触发器是否正常工作。
(5分)create trigger dele_s1on Sinstead of deleteasbeginrollbackprint '禁止删除S表中的记录'end验证:deletefrom 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)beginROLLBACKPRINT '禁止更新sdept字段'EndEND验证:update Sset sdept=’cf’where sno='95001'无法删除。
(5)禁用update_s触发器。
禁用之后,更新S表中的“sdept”字段的内容,验证触发器是否还继续正常工作。
(5分)disable trigger update_s on Sdisable trigger update_s on S验证:update Sset sdept='cf'where 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(@no<7)beginselect @snum= count(distinct sno)from SCwhere cno=@no;select @examsnum= count(distinct sno)from SCwhere cno=@no and grade is not null;select @avgGrade=AVG(grade)from SCwhere o=@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 mycursorfetch 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='95001'and 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 intasbegin declare @temp intselect @temp=count(eID)from empoyeewhere eid between year(GETDATE())*10000and year(GETDATE())*10000+9999;select@temp = year(GETDATE())*10000 + @temp + 1 return @temp enddeclare @i intset @i=0while @i<1000 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)该公司计划为员工按照一定的规则涨工资,请使用游标创建一个存储过程,执行该存储过程完成本次工资调整:工资增长规则如下:●工资在3000元以下,每月涨300元;●工资在3000-4000元之间,每月涨200元;●工资大于或者等于4000元,每月涨50元;create procedure change_salaryas begin declare @salary int;declare empoyee_cursor cursorfor select salary from empoyee;open empoyee_cursor fetch nextfrom empoyee_cursor into @salary;while(@@FETCH_STATUS=0)beginif (@salary<3000) set @salary=@salary+300else if(@salary>4000) set @salary=@salary+50else set @salary=@salary+200update empoyee set salary=@salarywhere current of empoyee_cursorfetch nextfromempoyee_cursor into @salary endcloseempoyee_cursordeallocate empoyee_cursor end二. 实验中出现的问题以及解决方案(对于未解决问题请将问题列出来)除了标题内容以外,该部分内容中还可以写对于实验的一些感受,建议,意见等。