数据库技术实验六
《数据库技术实验六》由会员分享,可在线阅读,更多相关《数据库技术实验六(6页珍藏版)》请在装配图网上搜索。
1、 . 课程名称数据库技术实验成绩实验名称存储过程和触发器的使用学号班级日期14.11.25实验目的:1. 掌握存储过程的使用方法;2. 掌握触发器的实现方法;实验平台:利用RDBMS(SQL Server 2008)与其交互查询工具(查询分析器)来操作T-SQL语言;实验容:1. 存储过程(1) 创建存储过程,要求当一个员工的工作年份大于6年时将其转到经理办公室工作。alterprocedureyuangong_infolEmployeeIDchar(6),namenchar(20)asbegindeclareyearintsetyear=(selectWorkYearfromEmployee
2、swhereEmployeeID=EmployeeID)declareDepartmentIDchar(3)setDepartmentID=(selectDepartmentIDfromDepartmentswhereDepartmentName=name)if (year6)updateEmployeessetDepartmentID=DepartmentIDwhereEmployeeID=EmployeeIDEndexecdbo.yuangong_infol000000,经理办公室(2) 创建存储过程,根据每个员工的学历将收入提高500元。alterprocSA_INenuchar(6)a
3、sbeginupdateSalarysetInCome=InCome+500fromSalary,EmployeeswhereEmployees.EmployeeID=Salary.EmployeeIDandEducation=enuendselectInComefromSalary,EmployeeswhereSalary.EmployeeID=Employees.EmployeeIDandEducation=本科goexecdbo.sa_in本科goselectInComefromSalary,EmployeeswhereSalary.EmployeeID=Employees.Employ
4、eeIDandEducation=本科selectInComefromSalary,EmployeeswhereSalary.EmployeeID=Employees.EmployeeIDandEducation=本科(3) 创建存储过程,使用游标计算本科与以上学历的员工在总员工数中的比例。declareeduvarchar(10),part_countint,all_countint;declaremycursorcursorforselectdistincteducation,COUNT(education)over(partitionbyeducation)aspart_count,CO
5、UNT(education)over()asall_countfromEmployeesopenmycursorfetchnextfrommycursorintoedu,part_count,all_countwhileFETCH_STATUS=0beginprintedu+占总人数比例:+convert(varchar(100),convert(numeric(38,2),part_count/1.0/all_count*100)+%fetchnextfrommycursorintoedu,part_count,all_countendclosemycusordeallocatemycurs
6、or(4) 使用命令方式修改与删除一个存储过程。ifexists(selectworkyearfromEmployeeswhereworkyear=3)dropprocedureworkyear2. 触发器(1) 对于YGGL数据库,表Employees的Employeeid列与表Salary的Employeeid列应满足参照完整性规则,请用触发器实现两个表间的参照完整性。createtriggerSalaryins0onSalaryforinsert,updateasbeginif(selectemployeeidfrominserted)notin(selectEmployeeIDfrom
7、Employees)rollbackendcreatetriggerEmployeesupdate0ondbo.EmployeesforupdateasbeginupdateSalarysetemployeeid=(selectemployeeidfrominserted)whereemployeeid=(selectemployeeidfromdeleted)endcreatetriggerEmployeesdelete0onEmployeesfordeleteasbegindeletefromSalarywhereemployeeid=(selectemployeeidfromdelete
8、d)end(2)当修改表Employees时,若将Employees表中员工的工作时间增加1年,则将收入增加500,若增加2年则增加1000,依次增加。若工作时间减少则无变化。createtriggerem_workyearonEmployeesafterupdateasbegindeclareaint,bintseta=(selectworkyearfrominserted)setb=(selectworkyearfromdeleted)if(ab)updateSalarysetincome=income+(a-b)*500whereenployeeidin(selectEmployeesI
9、Dfrominserted)endupdateEmployeessetworkyear=12whereEmployeesID=000001(3)创建UPDATE触发器,当Salary表中InCome值增加500时,outCome值则增加50。createtriggersa_incomeonSalaryforupdateasbeginif(selectincomefrominserted)-(selectincomefromdeleted)=500)updateSalarysetoutcome=outcome+50whereenployeeid=(selectenployeeidfrominse
10、rted)endselectincome,outcomefromSalarywhereenployeeid=000001(5) 创建INSTEAD OF触发器,实现向不可更新视图插入数据。createviewa_viewasselectEmployees.EmployeesID,name,workyear,income,outcomefromEmployees,SalarywhereEmployees.EmployeesID=Salary.enployeeidgocreatetriggergxstona_viewinsteadofinsertasbegindeclareEichar(6),na
11、mechar(10),wytinyint,icfloat,ocfloatselectEi=EmployeesID,name=name,wy=workyear,ic=income,oc=outcomefrominsertedinsertintoEmployees(EmployeesID,name,workyear)values(Ei,name,wy)insertintoSalaryvalues(Ei,ic,oc)endinsertintoa_viewvalues(000011,小芳,3,2000,1500)select*froma_viewwhereEmployeesID=000011(5)创建DDL触发器,当删除数据库时,提示“无法删除”并回滚删除操作。createtriggertable_deleteondatabaseafterdrop_tableasprint不能删除表rollbacktransactiongodroptableYGGL实验总结(结论或问题分析): 在本次实验中,感觉很难,对触发器和存储过程不是很了解,最后老师讲了,自己通过讲的虽然说做出来了,但是还是有不明白的地方,需要自己在下面复习巩固。6 / 6
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。