图书管理系统触发器和存储过程.docx
- 文档编号:25739964
- 上传时间:2023-06-12
- 格式:DOCX
- 页数:19
- 大小:20.95KB
图书管理系统触发器和存储过程.docx
《图书管理系统触发器和存储过程.docx》由会员分享,可在线阅读,更多相关《图书管理系统触发器和存储过程.docx(19页珍藏版)》请在冰豆网上搜索。
图书管理系统触发器和存储过程
图书馆管理系统数据库-—-—-——-—-—-—-—创建数据库和数据表
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=书名
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 管理 系统 触发器 存储 过程