图书管理系统触发器和存储过程.docx

上传人:b****6 文档编号:5063636 上传时间:2022-12-12 格式:DOCX 页数:15 大小:19.72KB
下载 相关 举报
图书管理系统触发器和存储过程.docx_第1页
第1页 / 共15页
图书管理系统触发器和存储过程.docx_第2页
第2页 / 共15页
图书管理系统触发器和存储过程.docx_第3页
第3页 / 共15页
图书管理系统触发器和存储过程.docx_第4页
第4页 / 共15页
图书管理系统触发器和存储过程.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

图书管理系统触发器和存储过程.docx

《图书管理系统触发器和存储过程.docx》由会员分享,可在线阅读,更多相关《图书管理系统触发器和存储过程.docx(15页珍藏版)》请在冰豆网上搜索。

图书管理系统触发器和存储过程.docx

图书管理系统触发器和存储过程

图书馆管理系统数据库---------------创建数据库和数据表

createdatabaseLibrarySystem

onprimary

name='LibrarySystem',

filename='f:

\LibrarySystem\LibrarySystem.mdf',

size=10240KB,

maxsize=unlimited,

filegrowth=1024KB

logon

name='LibrarySystem_log',

filename='f:

\LibrarySystem\LibrarySystem_log.ldf',

size=1024KB,

maxsize=unlimited,

filegrowth=1024KB

go

/*创建数据表:

图书信息表,读者信息表,用户表,读者借阅表,读者还书表等*/

useLibrarySystem

go

----------图书信息表

CREATETABLEBook

Bidnchar(30)NOTNULL,----分类号

Bnamevarchar(50)NOTNULL,----书名

Bwriternvarchar(20)NOTNULL,----作者

BpubAdrvarchar(30)NOTNULL,----出版社

BpubDatesmalldatetime,----出版日期

Btypevarchar(20),----类别

BtotalNumintNOTNULL,----总量

BborrowedNumintdefault0,----借出量默认值为零

constraintBook_PKprimarykey(Bid)----创建“分类号”为主键

go

useLibrarySystem

go

----------读者信息表

CREATETABLEReader

Rnonvarchar(10)NOTNULL,----读者编号

Rnamenvarchar(20)NOTNULL,----姓名

Rsexchar

(2)check(Rsexin('男','女')),----性别只能在“男”和“女”之间选择

Rageintnotnull,---读者年龄

Rphonenvarchar(15),----电话/手机

Readertypenvarchar(20)check(Readertypein('本科生','研究生','教师')),----读者类型只能在“本科生”,“研究生”,“教师”之间选择

constraintReader_PKprimarykey(Rno)----创建“读者编号”为主键

go

----------读者借阅信息表

createtableReaderBook

Rnonvarchar(10)NOTNULL,----读者编号

Bidnchar(30)NOTNULL,----分类号

RBorrowDatesmalldatetimeNOTNULL,----借阅日期

RBackDatesmalldatetimenotnull,----应还书日期

RReborrowTimestinyintdefault0,----续借次数默认为次

RoverdueDaysint,----图书超期天数

constraintReaderBook_PKprimarykey(Rno,Bid),----创建“读者编号,分类号”为主键

foreignkey(Rno)referencesReader(Rno),----创建“读者编号”为外部键

foreignkey(Bid)referencesBook(Bid)----创建“分类号”为外部键

go

------用户表

createtableAdmin

AdminIdvarchar(10)notnull,----用户ID

AdminPswvarchar(10)notnull,----用户密码

AdminNamevarchar(20)notnull,----用户名

constraintAdmin_PKprimarykey(AdminId)----创建用户ID为主键

CreatetableRReturnBook

Rnonvarchar(10)NOTNULL,

Rnamenvarchar(20)NOTNULL,----姓名

Rsexchar

(2)check(Rsexin('男','女')),----性别只能在“男”和“女”之间选择

Rageintnotnull,---读者年龄

Bidnchar(30)NOTNULL,----分类号

Bnamevarchar(50)NOTNULL,----书名

Bwriternvarchar(20),---作者

Btypevarchar(20),---图书类别

BpubAdrvarchar(30),---出版社

RborrowTimestinyintdefault1,---记录读者借借阅同一本书的次数

ReturnDatesmalldatetime,---还书时间

constraintRReturnBook_PKprimarykey(Rno,Bid,RborrowTimes),---创建主键

constraintRno_Fkforeignkey(Rno)referencesReader(Rno),

constraintRBid_FKforeignkey(Bid)referencesBook(Bid)---创建外码

Go

图书馆管理系统数据库--------------触发器的创建

useLibrarySystem

go

------------借书要求(书本没有库存,则无法进行借书操作)-----------

createtriggertri_Book

onBook

forupdate

as

declare@btotalint,@bborrowedint

select@btotal=BTotalNum,@bborrowed=BborrowedNumfrominserted

if(@btotal<@bborrowed)

begin

rollbacktransaction

print'借阅失败!

'

print'对不起,此书已经没有库存,无法进行本次借书操作!

'

end

go

useLibrarySystem

go

------------借书要求(读者最多借阅量)-----------

----假定教师最多只能借十本,本科生最多只能借五本书,研究生最多可以借八本书----

createtriggertri_RBorrowNum

onReaderBook

forinsert

as

declare@nochar(10),@numint

--------获得教师编号

select@no=inserted.Rnofrominserted,ReaderwhereReader.Readertype='教师'

--------统计教师借书总量并做相应处理

begin

select@num=count(*)

fromReaderBook

whereRno=@no

if(@num>10)--------假定教师最多只能借十本书

begin

rollbacktransaction

print'借阅失败!

'

print'对不起,你的借阅总量已经达到本,无法进行本次借书操作!

请归还部分书籍后,再进行下次借书操作!

'

end

end

select@no=inserted.Rnofrominserted,ReaderwhereReader.Readertype='本科生'

begin

select@num=count(*)

fromReaderBook

whereRno=@no

if(@num>5)---------假定本科生最多只能借五本书

begin

rollbacktransaction

Print'借阅失败!

'

print'对不起,你的借阅总量已经达到本,无法进行本次借书操作!

请归还部分书籍后,再进行下次借书操作!

'

end

end

select@no=inserted.Rnofrominserted,ReaderwhereReader.Readertype='研究生'

begin

select@num=count(*)

fromReaderBook

whereRno=@no

if(@num>8)---------假定研究生最多只能借八本书

begin

rollbacktransaction

Print'借阅失败!

'

print'对不起,你的借阅总量已经达到本,无法进行本次借书操作!

请归还部分书籍后,再进行下次借书操作!

'

end

end

go

-------------续借次数要求---------

--------假定教师最多允许续借四次,本科生最多允许续借两次,研究生最多可以续借三次------------

useLibrarySystem

go

Createtriggertri_RRenewBook

onReaderBook

forupdate

as

declare@ttinyint

select@t=inserted.RReborrowTimesfrominserted,ReaderwhereReader.Readertype='教师'

begin

if(@t>4)--------教师最多允许续借四次

begin

rollbacktransaction

print'续借失败!

'

print'对不起,你的续借次数已经达到了四次,已经无法再续借!

'

end

end

select@t=inserted.RReborrowTimesfrominserted,ReaderwhereReader.Readertype='本科生'

begin

if(@t>2)--------本科生最多允许续借两次

begin

rollbacktransaction

print'续借失败!

'

print'对不起,你的续借次数已经达到了两次,已经无法再续借!

'

end

end

select@t=inserted.RReborrowTimesfrominserted,ReaderwhereReader.Readertype='研究生'

begin

if(@t>3)--------研究生最多允许续借三次

begin

rollbacktransaction

print'续借失败!

'

print'对不起,你的续借次数已经达到了三次,已经无法再续借!

'

end

end

go

useLibrarySystem

go

-----------读者还书信息入ReturnBook表-----------

Createtriggertri_RReturnBook

onReaderBook

fordelete

as

declare@tint,@tnovarchar(10),@Bidvarchar(30)

selecttop1@tno=Rnofromdeleted

selecttop1@Bid=Bidfromdeleted

-----------图书信息更改过程

updateBook

setBborrowedNum=BborrowedNum-1

whereBid=@Bid

--------判断RrturnBook表中该读者是否已借过同样一本书籍

select@t=RborrowTimesfromReturnBookwhereRno=@tnoandBid=@Bid

if(@t>0)----@t>0说明该读者过去借过同一本书

begin

set@t=@t+1

end

else

begin

set@t=1

end

---------向ReturnBook表中插入信息

-----第一部分(主码先入)

insert

intoReturnBook(Rno,Bid,RborrowTimes,ReturnDate)

values(@tno,@Bid,@t,getdate())

-----第二部分(读者、书本信息)

updateReturnBook

set

Rname=(selectRnamefromReaderwhereRno=@tno)

Rsex=(selectRsexfromReaderwhereRno=@tno)

Rage=(selectRagefromReaderwhereRno=@tno)

Bname=(selectBnamefromBookwhereBid=@Bid)

Bwriter=(selectBwriterfromBookwhereBid=@Bid)

Btype=(selectBtypefromBookwhereBid=@Bid)

BpubAdr=(selectBpubAdrfromBookwhereBid=@Bid)

whereRno=@tnoandBid=@Bid

Go

图书馆管理系统数据库-------------存储过程的创建

--------------------------------------读者借阅图书存储过程-------------------------------

useLibrarySystem

go

createprocedureRBorrowBook

@novarchar(10),@Bidvarchar(30)

as

declare@bnamevarchar(50)

-----------判断读者是否已经借阅同一本书,如果已有借阅记录,则不能进行借书操作

ifexists(select*fromReaderBookwhereRno=@noandBid=@Bid)

begin

print'对不起,你已经借阅了同一本图书,故而无法进行此次借书操作,请核实!

'

end

else

begin

-----------图书信息更改

updateBook

setBborrowedNum=BborrowedNum+1

whereBid=@Bid

-----------读者借阅过程

insert

intoReaderBook(Rno,Bid,RBorrowDate)

values(@no,@Bid,getdate())

-----------输出借书成功信息

declare@rnamevarchar(8)

select@rname=RnamefromReaderwhereRno=@no

select@bname=BnamefromBookwhereBid=@Bid

select'编号为'+@no+',姓名为'+@rname+'的读者,于'+datename(year,GETDATE())+'年'+datename(month,GETDATE())+'月'+datename(day,GETDATE())+'日'+datename(hour,GETDATE())+'时'+datename(minute,GETDATE())+'分'+datename(second,GETDATE())+'秒,成功地从图书馆借出《'+@bname+'》一书!

'as读者借书成功信息

end

go

--------------------------------------读者还书存储过程-------------------------------

useLibrarySystem

go

createprocedureReturnBook

@novarchar(10),@Bidvarchar(30)

as

declare@bnamevarchar(50)

-----------判断读者是否借阅此书,如果没有借阅此书,则不能进行还书操作

ifnotexists(select*fromReaderBookwhereRno=@noandBid=@Bid)

begin

print'对不起,你没有借阅此书,故而无法进行此次还书操作,请核实!

'

end

else

begin

-----------读者还书过程

delete

fromReaderBook

whereRno=@noandBid=@Bid

--############"图书信息更改过程在触发器tri_RReturnBook中"###########

-----------输出还书成功信息

declare@rnamevarchar(8)

select@rname=RnamefromReaderwhereRno=@no

select@bname=BnamefromBookwhereBid=@Bid

select'编号为'+@no+',姓名为'+@rname+'的读者,于'+datename(year,GETDATE())+'年'+datename(month,GETDATE())+'月'+datename(day,GETDATE())+'日'+datename(hour,GETDATE())+'时'+datename(minute,GETDATE())+'分'+datename(second,GETDATE())+'秒,成功地向图书馆归还《'+@bname+'》一书!

'as读者还书成功信息

end

go

--------------------------------------读者续借图书存储过程-------------------------------

useLibrarySystem

go

createprocedureRRenewBook

@novarchar(10),@Bidvarchar(30)

as

declare@bnamevarchar(50),@renewNumchar

(1),@timesmalldatetime

-----------判断读者是否借阅此书,如果没有借阅此书,则不能进行续借操作

ifnotexists(select*fromReaderBookwhereRno=@noandBid=@Bid)

begin

print'对不起,你没有借阅此书,故而无法进行此次续借操作,请核实!

'

end

else

begin

-----------读者续借图书过程

updateReaderBook

setRReborrowTimes=RReborrowTimes+1,@renewNum=RReborrowTimes+1,@time=RBorrowDate=getdate()----续借一次后,重新计入时间

whereRno=@noandBid=@Bid

-----------输出续借成功信息

declare@rnamevarchar(8)

select@rname=RnamefromReaderwhereRno=@no

select@bname=BnamefromBookwhereBid=@Bid

select'编号为'+@no+',姓名为'+@rname+'的读者,于'+datename(year,@time)+'年'+datename(month,@time)+'月'+datename(day,@time)+'日'+datename(hour,@time)+'时'+datename(minute,@time)+'分'+datename(second,GETDATE())+'秒,成功地续借《'+@bname+'》一书,续借次数共为'+@renewNum+'次!

'as读者续借成功信息

end

go

--------------------------------------读者查询借阅图书情况存储过程-------------------------------

useLibrarySystem

go

createprocedureRQueryBook

@novarchar(10)

as

declare@bnamevarchar(50),@iint,@totalint,@timesmalldatetime,@dayint

---if(charindex('T',@no)>0)

---begin

-----------以读者编号为表名创建临时性数据表

declare@RtempTabletable

读者编号nvarchar(10),

姓名nvarchar(8),

书名varchar(50)primarykey,

图书类别Varchar(20),

借书日期smalldatetimenotnull,

---最后续借日期smalldatetimenotnull,

本次借阅还剩天数int,

续借次数tinyintnotnull,

是否超期nvarchar

(2)

-------------向临时表中插入数据

-------第一部分(插入子查询)

insert

into@RtempTable(书名,图书类别,借书日期,/*最后续借日期,*/续借次数)

selectBname,Btype,RBorrowDate/*,RRecentlyRenew*/,RReborrowTimes

fromBook,ReaderBook

whereReaderBook.Rno=@noandBook.Bid=ReaderBook.Bid

-------第二部分

declare@rnamechar(8)

select@rname=RnamefromReaderwhereRno=@no

update@RtempTableset读者编号=@no,姓名=@rname

-------第三部分(计算最后续借到超期还剩天数,并插入对应列)

select@total=count(*),@i=1from@RtempTable---获得@RtempTable表中的记录总数

while(@i<=@total)

begin

selecttop1@time=最后续借日期,@bname=书名

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1