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

  • 1
  • 0
  • 约2.08千字
  • 约 3页
  • 2024-10-19 发布于江苏
  • 举报

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

一、实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。

二、预习要求:存储过程和触发器的相关概念,事务的相关概念,编写相应的SQL语句。

三、实验内容:

(一)为S表的删除操作定义一个触发器,在删除一个供应商记录时,将这个供应商的所有供应情况从spj表中删除。

(二)有一个小型的图书管理数据库,包含的表为:

bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表

borrowcard(cardid,ownername);--借书证表

borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表

写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。

(三)完成情况(附上设计的SQL语句)。建立数据库:

createdatabasebookstor

usebookstor

createtablebookstore

(

bookidint,

booknamechar(20),

bookauthorchar(20),

purchasedatechar(20),

statchar(6),

primarykey(bookid),

Check(statin(在库,不在库)),

);

createtableborrowcard

(cardidintprimarykey,

ownernamechar(20),);

createtableborrowlog

(cardidint,

bookidint,

borrowdatechar(20),

returndatechar(20),

primarykey(cardid,bookid),

foreignkey(cardid)referencesborrowcard(cardid),

foreignkey(bookid)referencesbookstore(bookid),);

存储过程:

createprocedure[dbo].[jieshu](@cardidint,@bookidint,@borrowdatechar(20),@returndatechar(20))

as

begintransaction

insert

intoborrowlog

values(@cardid,@bookid,@borrowdate,@returndate)

ifexists(select*frombookstore,borrowcardwherebookid=@bookidandstat=在库andcardid=@cardid)

begin

updatebookstore

setstat=不在库

wherebookid=@bookid

committransaction

end

else

begin

ifnotexists(select*frombookstorewherebookid=@bookid)

print不存在该书

ifnotexists(select*fromborrowcardwherecardid=@cardid)

print没有此用户

rollbacktransaction

End

查询语句:execjieshu1002062,12012124

结果:

触发器:

createtriggerstor

onborrowlog

afterinsert

as

if(new.borrowdatenew.returndate)

print失败,还书时间不应早于结束时间

begin

rollbacktransaction

end

四、实验方法和步骤:

(一)在查询分析器中编写实现上述功能的触发器,参考CreateTrigger语法。(二)参考CREATEPROCEDURE语句。在事务执行过程中引入错误触发事件,可以考虑在增加借书记录时违反实体完整性或参照完整性,以此体会事务的错误保护机制。

???五、思考题:

如何通过系统的设置实现类似的功能,而不需触发器?

答:建立数据库时定义完整性约束条件。

六、心得体会

本次试验理解了触发器和存储过程的含义,掌握用S

文档评论(0)

1亿VIP精品文档

相关文档