实验五:触发器和存储过程

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五:触发器和存储过程

一.实验目的:理解触发器和存储过程的含义,掌握用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,get date(),null)

if @@error>0

begin

rollback tran

set @str_out='执行过程中遇到错误!'

return

end

update bookstore set state='借出' where bookid=@mybookid_i n

if @@error>0

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.创建触发器:

create trigger delete_borrowlog

on bookstore

for delete

as begin

delete from borrowlog where bookid in(select bookid from d eleted)

End

执行:

delete

from bookstore

where bookid='102'

结果:

查看结束记录情况:

可知删除触发器创建成功。

create trigger update_borrowlog

on bookstore

for update

as begin

declare @old_bookid int,@new_bookid int

select @old_bookid=bookid from deleted

相关文档
最新文档