4.作业3——存储过程与触发器设计任务任务:1)为BookStore数据库增加一个用户oper1,允许oper1对图书表和借还表进行修改操作。useBookStoregoexecsp_addloginoperl,'(此处为密码)','BookStore'goexecsp_addrolemember'db_datareader','operl'grantupdateon图书表tooperlgrantupdateon借还表tooperl2)设计存储过程a)数据初始化过程sp_Init。包含的操作有:所有的用于测试图书信息、教师信息、历史记录清空,输入图书分类、输入管理员信息、输入借书规定。略,界面进行输入或者代码输入作业用数据b)某教师在某时间借了某本书,由某管理员办理。createprocedureproc_lendbook@aidchar(10),@atimedatetime,@ISBNchar(20),@anamenchar(4)asbeginupdate图书表set状态='借出'whereISBN=@ISBNinsertinto借还表(ISBN,教师工号,借办代理人,借出日期)values(@ISBN,@aid,@aname,@atime)endc)某教师在某时间还了某本书,由某管理员办理createprocedureproc_returnbook@bidchar(10),@btimedatetime,@ISBNchar(20),@bnamenchar(4)asbeginupdate图书表set状态='库存'whereISBN=@ISBNupdate借还表set还办代理人=@bname,归还日期=@btimewhere教师工号=@bidandISBN=@ISBNendd)查看某人的全部借还书记录createprocedureproc_getReaderlog@cnamenchar(4),@cidchar(10)asbeginselectb.姓名,c.书名,a.借出日期,归还日期from借还表ajoin教师表bona.教师工号=b.教师工号join图书表cona.ISBN=c.ISBNwhereb.姓名=@cnameorb.教师工号=@cidende)查看某本书的历史流转记录createprocedureproc_getBooklog@booknamenchar(10),@ISBNchar(20)asbeginselect教师表.姓名,图书表.书名,借还表.借出日期,归还日期from借还表ajoin教师表bona.教师工号=b.教师工号join图书表cona.ISBN=c.ISBNwherea.ISBN=@ISBNorc.书名=@booknameendf)某管理员在某时间给全部借阅过期者发催还邮件。部分有错误的需要将修改催还业务编号为自增长(identity(1,1)),还有整个表都要允许空值:例:altertable催还表altercolumn办代理人char(4)nullcreateprocedureproc_writeEmailLog@dnamechar(4),@dtimedatetimeasbegininsertinto催还表(教师工号)select教师工号from借还表ajoin图书表bona.ISBN=b.ISBNjoin类型表conb.类型名=c.类型名wheredatediff(day,a.借出日期,getdate())c.借阅期限anda.归还日期isnullupdate催还表set办代理人=@dname,催还日期=@dtimewhere催还日期isnullendg)对书名进行模糊搜索(搜索条件可以是多个模糊列值的组合,例如:搜索书名包含“网络”两个字,并且是近3年出版的图书)createprocedureproc_search@booknamenchar(10),@maxtinyintasbeginselect*from图书表wheredatediff(year,出版时间,getdate())@maxand书名like'%'+@bookname+'%'end3)设计触发器a)当oper1用户对图书状态进行修改时,自动在借还表追加相应的数据。createtriggertri_aon图书表afterupdateasdeclare@statuschar(4)declare@ISBNchar(20)select@status=状态frominsertedselect@ISBN=ISBNfrominsertedifuser_name()='operl'beginif@status='借出'insertinto借还表(ISBN,借办代理人,借出日期)values(@ISBN,user_name(),getdate())elseif@status='库存'update借还表set还办代理人=user_name(),归还日期=getdate()whereISBN=@ISBNendb)不允许oper1用户对催还表信息进行删除操作,如果删除进行回滚。createtriggertri_bon催还表afterdeleteasifuser_name()='operl'beginif(selectcount(*)fromdeleted)0rollbackend