请注意保持“命令行”连接状态,为后续查询保持数据库资源。
前面的任务中,我们已经完成了library数据库和表的创建。并且导入了数据。 在本实训中,在图书管理数据库中创建一系列 触发器,用以强化用户在借书、还书、预约图书等主要图书管理的业务处理规则,从而保证数据库的完整性。本任务中表结构如下:
任务描述
- 创建一个触发器tri_returnbook,当一本书被还回时,从LOAN表中删除相应的借阅记录,将该学生借阅这本书记录添加到LoadHist表中;并检查是否有用户在等待预约这本书:如有则将这本书的借阅状况修改为 已经预约,并按照预约的日期先后,将最先预约的预约状态改为T;如果没有人预约,则应该将此书的借阅状况修改为“可以借阅且尚未借出”(修改状态字段值)
/* 1. 创建一个触发器tri_returnbook,当一本书被还回时,从LOAN表中删除相应的借阅记录, 将该学生借阅这本书记录添加到LoadHist表中;并检查是否有用户在等待预约这本书: 如有则将这本书的借阅状况修改为 已经预约,并按照预约的日期先后,将最先预约的预约状态改为T; 如果没有人预约,则应该将此书的借阅状况修改为“可以借阅且尚未借出”(修改状态字段值)*/ use library; drop TRIGGER if EXISTS tri_returnbook; delimiter // ######### Begin ######### create trigger tri_returnbook after delete on Loan for each row Begin declare a int; declare b char(13); insert into LoanHist(loanNo,bookNo,borrowDate,returnDate) values (old.loanNo,old.bookNo,old.borrowDate,now()); select count(loanNo)into a from Books B join Reservation R on B.ISBN=R.ISBN WHERE old.bookNo=B.bookNo; if(a = 0) then update Books set bstatus = "0" where old.bookNo=Books.bookNo; end if; if(a!=0) then select ISBN into b from Books B where old.bookNo=B.bookNo; update Books set bstatus = "3" where old.bookNo=Books.bookNo; update Reservation set rstatus = "T" where ISBN=b; END if; END// ######## End ######### delimiter ; SELECT EVENT_MANIPULATION,EVENT_OBJECT_TABLE,ACTION_ORDER,ACTION_ORIENTATION,ACTION_TIMING from information_schema.TRIGGERS where TRIGGER_NAME='tri_returnbook';