实验四:触发器实验
实验目的:
掌握数据库触发器的设计与使用方法
理解不同类型触发器的作用和执行原理
实验内容: 一、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.删除触发器
参考:
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;
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;
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;
select totalprice from orders where orderskey =1854;
update Lineitem set tax =tax+0.05where orderskey=1854 and linenumber=1;
select totalprice from orders where orderskey =1854;
2.before触发器
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;
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;
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;
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;
update Lineitem set quantity=quantity+5
where orderskey=1854 and linenumber=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;
select totalprice from orders where orderskey
insert into lineitem(partkey,suppkey,quantity) values(1,1,20);
select availqty from partsupp;
delete from lineitem where linenumber=1;
|