実験4:トリガー実験

実験4:トリガー実験


実験の目的:
データベーストリガーの設計と使用を習得し、さまざまなタイプのトリガーの機能と実行原理を
理解 する

実験内容:
1。トリガー後
2.トリガー前
3.トリガーの削除

実験プロセスと要件:
1。トリガー後
(1)LineItemで更新トリガーを定義し、注文の詳細を変更する場合(注文の詳細の価格を変更する場合、価格、割引、税率)は、テーブルOrdersTotalPriceの合計注文額を自動的に変更します。 、データの一貫性を維持します。
(2)LineItemにトリガーを定義します。注文の詳細が削除されると、データの一貫性を維持するために、Ordersテーブルの合計注文金額TotalPriceが自動的に変更されます。
(3)LineItemにDeleteトリガーを定義します。注文の詳細が削除されると、データの一貫性を維持するために、Ordersテーブルの合計注文金額TotalPriceが自動的に変更されます。
(4)トリガー機能を確認します
。2。トリガー前
(1)LineItemテーブルで更新前トリガーを定義します。注文詳細で数量数量を変更する場合は、最初に供給テーブルPartSuppで利用可能な数量が十分かどうかを確認します
(2 )LineItemテーブルでBefore Insertトリガーを定義し、注文詳細を挿入するときは、最初に供給テーブルPartSuppで使用可能な数量が十分かどうかを確認します。
(3)Order Detailを削除するとき、LineItemテーブルでBeforeDeleteトリガーを定義します。詳細に対応する部品数を対応する部品供給記録に戻す必要があります
(4)トリガー機能を確認します

実験の焦点:トリガーの定義、
実験の難しさ:トリガーを使用してより複雑なユーザー定義の整合性を実現する

実験プロセス
1.トリガー後
(1)更新トリガーを
定義(2)挿入トリガーを
定義(3)削除トリガーを定義
(4)トリガー機能を確認
2.トリガー
前(1)更新前トリガーを定義
(2))挿入前トリガーの
定義(3)削除前トリガーの定義
(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