数据库第五次实验报告
数据库第五次实验报告

南昌航空大学实验报告二0一年月日课程名称:数据库原理实验名称:数据库的并发控制与恢复备份班级:姓名:同组人:指导教师评定:签名:一、实验环境1、Windows2000或以上版本;2、SQLServer2000或2005。
二、实验目的1.掌握数据库并发控制与恢复备份基础知识;2.掌握创建、修改、使用、数据库并发控制与恢复的不同方法。
三、实验步骤及参考源代码实验一:数据库并发控制1、丢失数据create table sales(客户代号char(5)primary key,数量int null)insert into sales values('A0001',0)create procedure modi_a asdeclare @i intdeclare @s1 intset transaction isolation level read committed select @i=1while(@i<=2000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1+1 where客户代号='A0001'commit transelect @i=@i+1endcreate procedure modi_m asdeclare @i intdeclare @s1 intset transaction isolation level read committed select @i=1while(@i<=2000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1-1 where客户代号='A0001'commit transelect @i=@i+1end同时运行存储过程modi_a和modi_m可以看到如下结果:本应该数量一栏应该是0的,说明数据发生了丢失数据。
数据库原理与应用实验五报告

数据库系统概论实验报告(五)姓名:田垒班级学号: 2010080405226学院:信息学院专业:计算机科学与技术2010年12月12日实验五、用户自定义函数一、实验目的学习、掌握用户自定义函数的建立和使用二、实验平台操作系统:Windows 2000或者Windows XP。
数据库管理系统:Microsoft SQL Server 2000 或Microsoft SQL Server 2005。
三、实验内容1、创建自定义函数创建一个用户自定义函数,并测试、查看函数返回值。
USE NorthwindGOCREATE FUNCTION fn_TaxRate(@ProdID INT)RETURNS numeric(5,4)ASBEGINRETURN(SELECTCASE CategoryIDWHEN 1 THEN 1.10WHEN 2 THEN 1WHEN 3 THEN 1.10WHEN 4 THEN 1.05WHEN 5 THEN 1WHEN 6 THEN 1.05WHEN 7 THEN 1WHEN 8 THEN 1.05ENDFROM ProductsWHERE ProductID = @ProdID)ENDGOSELECT ProductName, UnitPrice,Northwind.dbo.fn_TaxRate(ProductID) AS TaxRate,UnitPrice * Northwind.dbo.fn_TaxRate(ProductID) AS PriceWithTax FROM Products结果:注意:函数可以在Select子句后面调用。
2、返回值为多值的自定义函数创建函数返回多列多值。
USE NorthwindGOCREATE FUNCTION fn_LargeFreight(@FreightAmt money)RETURNS TABLEASRETURN( SELECT S.ShipperID, panyName,O.OrderID, O.ShippedDate, O.FreightFROM Shippers AS S JOIN Orders AS OON S.ShipperID = O.ShipViaWHERE O.Freight > @FreightAmt)SELECT * FROM fn_LargeFreight(600)结果:3、返回值为多值的自定义函数本实验创建的函数也是返回多列多值,注意与上面实验的差别。
存储过程和触发器(数据库实验5)

数据库基础与实践实验报告实验五存储过程和触发器班级:惠普测试142学号:**********姓名:***日期:2016-11-141 实验目的:1)掌握SQL进行存储过程创建和调用的方法;2)掌握SQL进行触发器定义的方法,理解触发器的工作原理;3)掌握触发器禁用和重新启用的方法。
2 实验平台:操作系统:Windows xp。
实验环境:SQL Server 2000以上版本。
3 实验内容与步骤利用实验一创建的sch_id数据库完成下列实验内容。
1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。
存储过程定义代码:CREATE PROCEDURE JSXX_PROCASSELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND o=o存储过程执行语句与执行结果截图:EXECUTE JSXX_PROC2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。
存储过程定义代码:CREATE PROCEDURE XM_PROC @sname VARCHAR(100)ASBEGINIF EXISTS(SELECT NULL FROM S WHERE sn=@sname)SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE o=o AND SC.sno=S.sno ANDS.sn=@snameELSEPRINT'无该姓名的同学。
'END运行截图:3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业),统计并显示该专业各年龄段男、女生人数。
如果没有该专业,则显示“无此专业”。
存储过程定义代码:CREATE PROCEDURE XBNL_PROC@departName VARCHAR(30)='计算机',@begin INT,@end INTASDECLARE @numOfBoys INTDECLARE @numOfGirls INTDECLARE @d# VARCHAR(3)DECLARE @result VARCHAR(50)BEGINSELECT @d# = dno FROM D WHERE dn=@departNameIF @d# IS NOT NULLBEGINSELECT @numOfBoys =COUNT(sno)FROM S WHERE age BETWEEN @begin AND @end AND dno=@d# AND sex='男'SELECT@numOfGirls =COUNT(sno)FROM S WHERE age BETWEEN@begin AND@end AND dno=@d# AND sex='女'SET @result = @departName+'专业年龄在'+CAST(@begin AS VARCHAR(3))+'-'+CAST(@end AS VARCHAR(3))+'之间的男生有'+CAST(@numOfBoys AS VARCHAR(3))+'人,'+'女生有'+CAST(@numOfGirls AS VARCHAR(3))+'人'ENDELSESET @result='无此专业。
数据库实验五报告

《数据库原理与应用》实验报告实验名称:存储过程与触发器班级:学号:姓名:一、实验目的(1)掌握Oracle数据库编程语言PL/SQL的基础知识。
(2)掌握游标、存储过程和触发器的创建,使用方法。
(3)了解使用高级语言连接数据库的技术、基本方法,了解ODBC、ADO和JDBC 的技术。
二、实验过程在实验一、实验二创建的表中用PL/SQL语言完成以下内容:1.创建存储过程,根据调用时提供的学生姓名查询该学生所修课程的课程信息,在过程体中将课程号、课程名和成绩输出到输出窗口,在SQL窗口中给出过程调用语句块。
语句:create or replace procedure p1(v_sname in s.sname%type) isa o%type;b ame%type;cursor c1 isselect o,amefrom course,scwhere o=o and sno=(select snofrom studentwhere sname=v_sname);beginopen c1;loopfetch c1 into a,b;exit when c1%notfound;dbms_output.put_line(a||' '||b);end loop;close c1;end;beginp1('张北辰');end;执行结果:2.(1)删除SPJ关系中所有数据。
语句:delete from spj;执行结果:(2)在插入和修改SPJ表中QTY属性列的值时用触发器实现约束:如果是北京的供应商,供应任何零件的数量不能少于300,如果少于则自动改为300。
语句:create or replace trigger tr1before insert or update on spjfor each rowdeclarev_citys.city%type;beginselect cityinto v_cityfrom swhere sno=:new.sno;if(v_city='北京' and :new.qty<300)then :new.qty:=300;end if;end tr1;执行结果:(3)在SPJ表中录入值进行验证。
数据库实验报告五

数据库实验报告五一、实验目的本次数据库实验的目的在于深入了解和掌握数据库的相关操作和应用,通过实际操作提高对数据库原理的理解和运用能力,培养解决实际问题的思维和方法。
二、实验环境本次实验使用的数据库管理系统为_____,操作系统为_____,实验所使用的计算机配置为_____。
三、实验内容1、数据库的创建使用相应的命令和工具创建了一个名为_____的数据库,并设置了合适的字符集和校对规则,以满足数据存储和处理的需求。
2、表的设计与创建在创建的数据库中,设计并创建了多个表,包括_____表、_____表和_____表等。
在表的设计过程中,仔细考虑了字段的数据类型、长度、是否允许为空等属性,以确保数据的完整性和准确性。
例如,在_____表中,设置了_____字段为整数类型,用于存储_____信息;_____字段为字符串类型,长度为_____,用于存储_____信息。
同时,为了保证数据的一致性,设置了主键和外键约束。
3、数据的插入通过编写 SQL 语句,向创建的表中插入了大量的测试数据。
在数据插入过程中,注意了数据的合法性和有效性,避免了插入错误或不完整的数据。
4、数据的查询使用各种查询语句对插入的数据进行查询操作,包括简单查询、条件查询、连接查询、分组查询和排序查询等。
通过这些查询操作,熟练掌握了 SQL 语言中查询语句的语法和用法,能够根据不同的需求准确地获取所需的数据。
例如,使用简单查询语句获取了_____表中所有的记录;使用条件查询语句获取了满足特定条件(如_____)的记录;使用连接查询语句将多个表中的相关数据进行关联查询,获取了更全面的信息。
5、数据的更新与删除对表中的数据进行了更新和删除操作,以模拟实际应用中的数据修改和清理需求。
在更新和删除数据时,特别注意了操作的条件和范围,避免了误操作导致数据的丢失或错误。
四、实验中遇到的问题及解决方法1、数据类型不匹配问题在插入数据时,由于对某些字段的数据类型理解不准确,导致出现数据类型不匹配的错误。
数据库实验5答案

实验五:数据库综合查询一、实验目的1.掌握SELECT语句的基本语法和查询条件表示方法;2.掌握查询条件种类和表示方法;3.掌握连接查询的表示及使用;4.掌握嵌套查询的表示及使用;5.了解集合查询的表示及使用。
二、实验环境已安装SQL Server企业版的计算机(120台);具有局域网环境,有固定IP;三、实验学时2学时四、实验要求1.了解SELECT语句的基本语法格式和执行方法;2.了解连接查询的表示及使用;3.了解嵌套查询的表示及使用;4.了解集合查询的表示及使用;5.完成实验报告;五、实验内容及步骤1.利用Transact-SQL嵌套语句实现下列数据查询操作。
1) 查询选修了计算机体系结构的学生的基本信息。
select*from studentwhere Sno in(select Sno from coursewhere Cno in(select Cno from sc where Cname='计算机体系结构'))2) 查询年龄比李勇小的学生的学号和成绩。
select a.sno,grade from student a,coursewhere a.sno=course.sno and sage<(select sage from student where sname='李勇')3) 查询其他系中比系编号为‘D1’的学生中年龄最小者要大的学生的信息。
select*from student where dnum<>'D1'AND SAGE>(select min(sage)from student where dnum='D1')4) 查询其他系中比系编号为‘D3’的学生年龄都大的学生的姓名。
select*from student where dnum<>'D3'AND SAGE>all(selectsage from student where dnum='D3')5) 查询‘C1’课程的成绩高于70的学生姓名。
数据库实验报告五

select @stuavg //看结果
(3)在pubs数据库中建立一个存储过程,用于检索数据库中某一价位的图书信息。参数有两个,用于指定图书价格的上下限。如果找到满足条件的图书,则返回0,否则返回1。执行结果如图五所示:
实验地点:软件实验室一时间:2015年12月10日
1、实验目的:
掌握用户存储过程的创建,了解一些常用的系统存储过程,以及调用和删除过程,并熟悉使用存储过程来进行数据库应用程序的设计。
二、实验内容:
(1)基于学生—课程数据库创建一存储过程,用于检索数据库中某个专业学生的人数,带有一个输入参数,用于指定专业。执行结果如图二所示:
as select @stu_avg = avg(grade) //将平均值给了变量
from student,sc where student. sno = sc. sno andstudent.sno=@stu_sno
1.存储过程的执行
declare @stuavg float //用于存放输出变量内容的
(2)基于学生-课程数据库创建一存储过程,该过程带有一个输入参数,一个输出参数。其中输入参数用于指定学生的学号,输出参数用于返回学生的平均成绩。执行结果如图四所示:
create procedure pro_stu @stu_sno char(6),@stu_avg float output //这个带output的是输出参数
return 0
else
return 1
(4)存储过程的执行
(5)存储过程的删除。执行结果如图七所示:
3、实验数据(或者实验结果):
数据库实验报告:实验五

数据库实验报告:实验五一、实验目的本次数据库实验五的主要目的是深入了解和掌握数据库的高级操作,包括存储过程的创建与使用、视图的定义和应用、以及事务处理的原理和实践。
通过这些实验内容,提高我们对数据库系统的综合运用能力,为解决实际的数据库管理问题打下坚实的基础。
二、实验环境本次实验使用的数据库管理系统是 MySQL 80,开发工具为 Navicat Premium 12。
操作系统为 Windows 10 专业版。
三、实验内容及步骤(一)存储过程的创建与使用1、创建一个名为`get_student_info` 的存储过程,用于根据学生学号查询学生的基本信息(包括学号、姓名、年龄、性别和专业)。
```sqlDELIMITER //CREATE PROCEDURE get_student_info(IN student_id INT)BEGINSELECT FROM students WHERE student_id = student_id;END //DELIMITER ;```2、调用上述存储过程,查询学号为 1001 的学生信息。
```sqlCALL get_student_info(1001);```(二)视图的定义和应用1、创建一个名为`student_grade_view` 的视图,用于显示学生的学号、姓名和平均成绩。
```sqlCREATE VIEW student_grade_view ASSELECT sstudent_id, sname, AVG(ggrade) AS average_gradeFROM students sJOIN grades g ON sstudent_id = gstudent_idGROUP BY sstudent_id, sname;```2、查询上述视图,获取所有学生的平均成绩信息。
```sqlSELECT FROM student_grade_view;```(三)事务处理1、开启一个事务,向学生表中插入一条新的学生记录(学号:1005,姓名:_____,年龄:20,性别:男,专业:计算机科学)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌航空大学实验报告二0一年月日课程名称:数据库原理实验名称:数据库的并发控制与恢复备份班级:姓名:同组人:指导教师评定:签名:1、实验环境1、 Windows2000或以上版本;2、SQLServer2000或2005。
二、实验目的1.掌握数据库并发控制与恢复备份基础知识;2.掌握创建、修改、使用、数据库并发控制与恢复的不同方法。
三、实验步骤及参考源代码实验一:数据库并发控制1、丢失数据create table sales(客户代号char(5)primary key,数量int null)insert into sales values('A0001',0)create procedure modi_a asdeclare @i intdeclare @s1 intset transaction isolation level read committed select @i=1while(@i<=2000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1+1 where客户代号='A0001'commit transelect @i=@i+1endcreate procedure modi_m asdeclare @i intdeclare @s1 intset transaction isolation level read committed select @i=1while(@i<=2000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1-1 where客户代号='A0001'commit transelect @i=@i+1end同时运行存储过程modi_a和modi_m可以看到如下结果:本应该数量一栏应该是0的,说明数据发生了丢失数据。
将两个存储过程中事务中select语句改为:select @s1=数量 from sales with(tablockx) where 客户代号=’A0001’然后再次同时运行两个存储过程,结果如下:可以看到如果在存储过程中对数据加上独立锁后数量结果始终为0。
2、脏读数据create procedure dirt_wroll asdeclare @i intdeclare @s1 intset transaction isolation level read uncommitted select @i=1while(@i<=16000)beginselect @i=@i+1begin transelect @s1=数量from sales where客户代号='A0001'update sales set数量=@s1+1 where客户代号='A0001'rollback tranwaitfor delay '00:00:00.000'endcreate procedure dirt_r asdeclare @i intdeclare @s1 intset transaction isolation level read uncommitted select @i=1while(@i<=60000)beginselect @i=@i+1begin transelect @s1=数量from sales where客户代号='A0001'if(@s1<>1000)raiserror('发生了脏读!',16,1)commit tranend并行运行上面两个存储过程dirt_wroll和dirt_r看到如下结果:可知如果是这样的话,就会发生脏读的现象。
如果把上述的存储过程中的设置隔离级别的语句“set transaction isolation level read uncommitted”改为:“set transaction isolation level read committed”则就可以把问题解决了。
3、不可重复读create procedure rep_r asdeclare @i intdeclare @s1 intdeclare @s2 intset transaction isolation level read committed select @i=1while(@i<=3000)beginselect @i=@i+1begin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.001'select @s2=数量from sales where客户代号='A0001'if(@s1<>@s2)raiserror('发生不可重复读!',16,1)commit tranendcreate procedure rep_w asdeclare @i intdeclare @s1 intdeclare @s2 intset transaction isolation level read committed select @i=1while(@i<=1000)beginbegin transelect @s1=数量from sales where客户代号='A0001'waitfor delay '00:00:00.002'update sales set数量=@s1+1 where客户代号='A0001'commit transelect @i=@i+1end以上两个存储过程同时运行的时候,会出现不可重复的现象,结果如下:预防这种结果的方法就是制定更高的事务隔离级别,如:repeatable read、snapshot、serializable.4、幻影问题create procedure huany_I asdeclare @i intset transaction isolation level repeatable read delete from sales where(客户代号='A1111')select @i=1while(@i<=1000)beginbegin traninsert into sales(客户代号,数量)values('A1111',1000)commit tranwaitfor delay '00:00:00.001'select @i=@i+1endcreate procedure huany_u asdeclare @i intdeclare @j intset transaction isolation level repeatable read select @i=1while(@i<=300)beginbegin tranupdate sales set数量=数量+3 where客户代号='A1111'select @j=0select @j=count(*)from sales where客户代号='A1111'and数量=1000if(@j>0)raiserror('发生了幻影现象!',16,1)commit tranwaitfor delay '00:00:00.001'select @i=@i+1end同时运行上面两个存储过程huany_I和huany_u会出现幻影现象,结果如下图:解决的方法为:指定事务级别为serializable。
5、抢答问题create procedure qiangxian1 asdeclare @i intset transaction isolation level read committedselect @i=1while(@i<=5000)beginbegin tranupdate sale set数量=数量+10000 where客户代号=@iif(@@error<>0)rollback tranelse commit tran select @i=@i+1end当同时执行像上面多个存储过程的时候就会出现抢答现象,记录的修改只能由先加锁的进程完成。
6、编号产生问题create procedure bhsc asdeclare @i intdeclare @s1 intset transaction isolation level read committedselect @i=1while(@i<=1500)beginbegin transelect @s1=max(客户代号)+1 from saleinsert into sale(客户代号,数量)values(@s1,@i)commit transelect @i=@i+1end多个以上的存储过程并行运行会出现编号重复现象,而且发现重复程度与并发程度成正比。
解决的办法法有:(1)设计编号产生事务一开始就加独立锁;(2)设计编号产生事务,其中采用插入后即查询重复编号情况,若发现重复,能进行反复尝试再插入;(3)利用一般数据库具有的identity字段来保障编号的唯一性。
下面的存储过程体现了前两种方法,当多个此存储过程同时运行时不会在发生编号重复现象。
create procedure bhsc2 asdeclare @i intdeclare @s1 intdeclare @kk intselect transaction level read committedwhile(@i<=1500)beginbegin transelect @s1=max(客户代号)+1 from sale with(tablock) insert into sale(客户代号,数量)values(@s1,@i)select @kk=count(*)from sale where客户代号=@1if @kk>=2 begin rollback tran continue endelse commit transelect @i=@i+1end7、手工加锁下并发事务读写冲突create procedure pmin asset transaction isolation level read committedselect @i=1while(@i<=500)beginbegin transelect @s1=数量from sales with(updlock)where客户代号='A0001'waitfor delay '00:00:00.003'update sales set数量=@s1-1 where客户代号='A0001'if(@@error<>0)rollback tranelse commit transelect @i=@i+1;endcreate procedure padd asset transaction isolation level read committedselect @i=1while(@i<=500)beginbegin transelect @s1=数量from sales with(updlock)where客户代号='A0001'waitfor delay '00:00:00.003'update sales set数量=@s1+1 where客户代号='A0001'if(@@error<>0)rollback tranelse commit transelect @i=@i+1;end实验二:数据库备份与恢复(1)备份数据库创建用于存放jxgl数据库完整备份的逻辑备份设备,然后备份整个jxgl 数据库use masterexec sp_addumpdevice'disk','jxgl_1','C:\Program Files\Microsoft SQLServer\MSSQL.1\MSSQL\Backup\jxgl_1.dat'backup database JXGL to jxgl_1创建一个数据库和日志的完整备份。