文档详情

实验五触发器和存储过程.doc

发布:2017-02-03约2.89千字共8页下载文档
文本预览下载声明
实验五:触发器和存储过程 一.实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。 二.实验内容: 有一个小型的图书管理数据库,包含的表为: bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表 borrowcard(cardid,ownername);--借书证表 borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表 写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。 (2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。(3)要求用触发器实现表的完整性控制。 三、操作与运行 1.创建图书数据库: create table bookstore (bookid int not null primary key, bookname char(20), bookauthor char(20), purchasedate datetime, state char(4) ) create table borrowcard (cardid int not null primary key, ownername char(20) ) create table borrowlog (cardid int not null, bookid int not null, borrowdate datetime, returndate datetime, primary key(cardid,bookid), ---foreign key(cardid)references borrowcard(cardid), ---foreign key(bookid)references bookstore(bookid) ) 通过以上语句,可以看到数据库中的表建立成功。 2.创建存储过程: create proc book_borrow @mycardid_in int, @mybookid_in int, @str_out char(30) output as begin if not exists(select * from borrowcard where cardid=@mycardid_in) begin set @str_out=该读者不存在 return end if(select state from bookstore where bookid=@mybookid_in)=借出 begin set @str_out=该书以借出 end begin tran insert into borrowlog values(@mycardid_in,@mybookid_in,getdate(),null) if @@error0 begin rollback tran set @str_out=执行过程中遇到错误! return end update bookstore set state=借出 where bookid=@mybookid_in if @@error0 begin rollback tran set @str_out=执行过程中遇到错误! return end if @@error=0 begin commit tran set @str_out=借书成功! return 1 else begin rollback tran set @str_out=执行过程中遇到错误! return end End 查看执行结果: 执行存储过程: 当违反参照完整性时: declare @str_out char(30) exec book_borrow 1114060119,106,@str_out output print 执行情况 + @str_out 当图书已借出时执行结果会是: declare @str_out char(30) exec book_borrow 1114060114,102,@str_out output print 执行情况 + @str_out 当正常执行时(即不违反完整性时): 原先的借书记录有: 正常借书时: declare @str_out char(30) exec book_borrow 1114060116,105,@str_out output print 执行情况 + @str_out 查看借书记录: 查看图书在库状态: 由此可知借书成功。 3.
显示全部
相似文档