图书管理系统触发器和存储过程教学文案.docx
- 文档编号:26508335
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:18
- 大小:19.69KB
图书管理系统触发器和存储过程教学文案.docx
《图书管理系统触发器和存储过程教学文案.docx》由会员分享,可在线阅读,更多相关《图书管理系统触发器和存储过程教学文案.docx(18页珍藏版)》请在冰豆网上搜索。
图书管理系统触发器和存储过程教学文案
图书馆管理系统数据库---------------创建数据库和数据表
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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 管理 系统 触发器 存储 过程 教学 文案