实验四:触发器实验

实验四:触发器实验


实验目的:
掌握数据库触发器的设计与使用方法
理解不同类型触发器的作用和执行原理

实验内容:
一、After触发器
二、Before触发器
三、删除触发器

实验过程与要求:
1.After触发器
(1)在LineItem上定义Update触发器,当修改订单明细(修改订单明细价格extendedPrice、折扣discount、税率tax)自动修改表Orders中的订单总金额TotalPrice,以保持数据一致性。
(2)在LineItem上定义触发器,删除一项订单明细时,自动修改表Orders中的订单总金额TotalPrice,以保持数据一致性。
(3)在LineItem上定义Delete触发器,当删除一项订单明细时,自动修改表Orders中的订单总金额TotalPrice,以保持数据一致性。
(4)验证触发器作用
2.Before触发器
(1)在LineItem表上定义一个Before Update触发器,当修改订单明细中的数量quantity时,先检查供应表PartSupp中的可用数量availqty是否足够
(2)在LineItem表上定义一个Before Insert触发器,当插入一条订单明细时,先检查供应表PartSupp中的可用数量availqty是否足够
(3)在LineItem表上定义一个Before Delete触发器,当删除一条订单明细时,该明细对应的零件数量应当归还相应的零件供应记录
(4)验证触发器作用

实验重点:触发器的定义、
实验难点:利用触发器实现较为复杂的用户自定义完整性

实验过程
1.After触发器
(1)定义Update 触发器
(2)定义Insert 触发器
(3)定义Delete 触发器
(4)验证触发器作用
2.Before触发器
(1)定义Before Update 触发器
(2)定义Before Insert触发器
(3)定义Before Delete触发器
(4)验证触发器作用
3.删除触发器

参考:

#1after触发器#
#(1)total price=totalprice+extendedprice*(1-discount)*(1+tax)#
------------
CREATE TRIGGER `TRI_Lineitem_Price_update` AFTER UPDATE ON `lineitem` FOR EACH ROW update orders 
begin
set  totalprice=totalprice+(new.extendedprice*(1-new.discount)*(1+new.tax)
-old.extendedprice*(1-old.discount)*(1+old.tax))
where orderkey=new.orderkey; 
end;
--------------
//(2)
 create trigger `TRI_Lineitem_Price_insert` after insert on `lineitem` for each row update orders 
begin
set totalprice=totalprice+NEW.extendedprice*(1-NEW.discount)*(1+NEW.tax)
where orderkey=new.orderkey;
end;
//(3)
create trigger `TRI_Lineitem_Price_delete`
after delete on `lineitem`
for each row
begin
update orders set totalprice
=totalprice-OLD.extendedprice*(1-OLD.discount)*(1+OLD.tax)
where orderskey=orderskey;
end;

#验证触发器TRI_Lineitem_Price_update#
#查看1854号订单的含税折扣总价totalprice#
select totalprice from orders where orderskey =1854;
#激活触发器,修改1854号订单第一个明细项的税率,该税率增加0.5%#
update Lineitem set tax =tax+0.05where orderskey=1854 and linenumber=1;
#再次查看2号订单的含税折扣总价totalprice是否有变化#
select totalprice from orders where orderskey =1854;
2.before触发器
//(1)
create trigger TRI_Lineitem_Quantity_update
before update on Lineitem
for each row
begin
select availqty into @L_availqty from partsupp
where partkey=new.partkey and suppkey=new.suppkey;
if(@L_availqty-(new.partkey-old.quantity)>=0) then
begin
update partsupp set availqty=availqty-(new.quantity)
where partkey=new.partkey and suppkey=new.suppkey ;
end;
end if;
end;
// (2)
create trigger TRI_Lineitem_Quantity_insert
before insert on Lineitem
for each rowbegin
select availqty into @L_availqty from partsupp
where partkey=new.partkey and suppkey=new.suppkey;
if(@L_availqty-(new.partkey)>=0) then
begin
update partsupp set availqty=availqty-(new.quantity)
where partkey=new.partkey and suppkey=new.suppkey ;
end;
end if;
end;
//(3)
create trigger TRI_Lineitem_Quantity_delete
before
delete on Lineitem
for each row
begin
update partsupp set availqty=availqty-(old.quantity)
where partkey=old.partkey and suppkey=old.suppkey;
end;


//验证触发器TRL-Lineitem_Quantity _update#
#查看1854号订单第1个明细项的零件和供应商编号,订购数量,可用数量#
select L.partkey,L.suppkey,L.quantity,PS.availqty
from Lineitem L,PartSupp PS
where L.partkey=PS.partkey 
and L.suppkey=PS.suppkeyand L.orderskey=1854 
and L.Linenumber=1;
#激活触发器:修改1854号订单第1个明细项的订购数量#
update Lineitem set quantity=quantity+5
where orderskey=1854 and linenumber=1;
#再次查看1854订单第1个明细项的相关信息,以验证触发器是否起作用#
select L.partkey,L.suppkey,L.quantity,PS.availqty
from Lineitem L,PartSupp PS
where L.partkey=PS.partkey 
and L.suppkey=PS.suppkeyand L.orderskey=1854 
and L.Linenumber=1;
#删除触发器#
drop trigger TRI_Lineitem_Price_update; 

//验证触发器TRI_Lineitem_Price_update:触发器起作用了
select totalprice from orders where orderskey
//验证触发器TRL_lineitem_quantity_update;触发器起作用了

 insert into lineitem(partkey,suppkey,quantity) values(1,1,20);

select availqty from partsupp;

 delete from lineitem where linenumber=1;






猜你喜欢

转载自blog.csdn.net/weixin_46220576/article/details/124323382