实验11 触发器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验11 触发器
一、学习要求
(1) 通过实践理解触发器的概念、作用、优点。
(2) 掌握利用界面方式创建、修改和删除不同类型的触发器。
(3) 掌握利用命令方式创建、修改和删除不同类型的触发器。
二、实验内容
在已建立的TSGL***数据库的基础上,按如下要求对数据库进行操作,保存操作代码和截图,命名要求同前。
1.创建一触发器,当向借阅表插入一条记录时,检查该记录的借书证号在读者表中是否存在,检查该记录图书的ISBN号在图书表中是否存在,以及图书的库存量是否大于0,若有一项为否,则不允许插入,并提示操作失败。
create trigger Lend_insert
on Lend
after insert
as
declare@借书证号char(12),@ISBN编号char(16)
select@借书证号=借书证号from inserted
select@isbn编号=(select@ISBN编号from reader,lend where@借书证号
=reader.借书证号and reader.借书证号=lend.借书证号)
if(@借书证号not in(select*from reader.借书证号)
or@isbn编号not in(select*from book.isbn编号)
or exists(select*from book where库存量<=0))
begin
print'不允许插入'
end
2.创建一触发器,当删除读者表一条记录时,检查该记录的借书证号在借阅表中是否存在,如果存在,则不允许删除,并提示先归还在借图书。
create trigger delete_reader
on reader
for delete
as
declare@借书证号char(12)
select@借书证号=借书证号from inserted
if(@借书证号not in(select*from lend.借书证号))
begin
print'不允许删除,请先归还图书'
end
else
begin
print('删除成功')
end
3.创建一触发器,当读者借一本书(即向借阅表中插入一条记录)时,在读者表中,该读者的借书量应增加1,而图书表中该图书的库存量应减1。
create trigger table_insert
on reader after insert
as
begin
declare@借书证号char(12)
select@借书证号=借书证号from inserted
update reader set借阅数量=借阅数量+1
update book set库存量=库存量-1
end
4.创建一触发器,当读者还一本书(即向借阅表删除一条记录)时,在读者表中,该读者的借书量应减1,而图书表中该图书的库存量应加1。
create trigger table_delete
on reader after insert
as
begin
declare@借书证号char(12)
select@借书证号=借书证号from inserted
update reader set借阅数量=借阅数量-1
update book set库存量=库存量+1
end
5.创建一数据库作用域的DDL触发器,当删除一个表时,提示禁止该操作,然后回滚删除表的操作。
create trigger safety_datebase
on database
after drop_table
as
print'不能删除该表'
rollback transaction
6.创建一服务器作用域的DDL触发器,当删除一个库时,提示禁止该操作,然后回滚删除表的操作。
create trigger safety_server
on all server
after drop_database
as
print'不能删除该数据库'
rollback transaction
7.删除第3题创建的触发器,然后修改第1题创建的触发器,实现当向借阅表插入一条记录时,检查该记录的借书证号在读者表中是否存在,检查图书的ISBN在BOOK表中是否存在,以及图书的库存量是否大于0,若有一项为否,则不允许插入,如果条件满足,则向借阅表中插入一条记录后,修改读者表中借书量增加1,图书表中该书的库存量减1。
drop trigger table_insert
alter trigger Lend_insert
on Lend
after insert
as
declare@借书证号char(12),@ISBN编号char(16)
select@借书证号=借书证号from inserted
select@isbn编号=(select@ISBN编号from reader,lend where@借书证号
if(@借书证号not in(select*from reader.借书证号)
or@isbn编号not in(select*from book.isbn编号)
or exists(select*from book where库存量<=0))
begin
print'不允许插入'
end
else
begin
update reader set借阅数量=借阅数量+1
where@借书证号in
(
select借书证号
from redaer
)
update book set库存量=库存量+1
where@isbn编号in
(select isbn编号from reader)
End
8.利用sp_helptext查看第2题创建的触发器,然后将其修改为加密存储过程(with encryption),再查看其存储过程的文本信息。
alter trigger delete_Reader
on Reader with encryption after delete
as
declare@借书证号char(12),@ISBN编号char(16)
select@借书证号=借书证号from inserted
select@isbn编号=(select@ISBN编号from reader,lend where@借书证号