L_aavailqty INSERT; BEGIN
L_valuediff=NEW.quantity;/*获得插入订单明细项的订购数量*/ /*查询当前订单明细项对应零件供应记录中的可用数量*/ SELECT availqty INTO L_availqty FROM PartSupp
WHERE partkey=NEW.partkey AND suppkey=NEW.suppkey;
IF (L_availqty-L_valuediff >=0) THEN BEGIN
/*如果可用数量可以满足订单订购数量,则提示ENOUGH*/ RAISE NOTICE’Availqty quantity is ENOUGH’;
/*修改当前订单明细项对应零件供应记录中的可用数量*/ UPDATE PartSupp
SET availqty=availqty-L_valuediff
WHERE partkey=NEW.part AND suppkey=NEW.suppkey; END; ELSE
/*如果可用数量不能满足订单订购数量,则插入过程异常中断*/ RAISE EXCEPTION ‘Available quantity is NOT ENOUGH’; END IF; END;
(3)在Lineitem表上定义一个BEFORE DELETE触发器,当删除订单明细时,该订单明细项订购的数量要归还对应的零件供应记录。
CREATE OR REPLACE TRIGGER TRI_Lineitem_Quantity_UPDATE BEFORE DELETE ON Lineitem FOR EACH ROW AS
DECLARE
L_valuediff INSERT; L_availqty INSERT; BEGIN
/*获得删除订单明细项的订购数量*/ L_valuediff=-OLD.quantity;
/*修改当前订单明细项对应零件供应记录中的可用数量*/ UPDATE PartSupp
SET availqty=availqty-L_valuediff
WHERE partkey=NEW.partkey AND suppkey=NEW.suppkey; END;
(4)验证触发器TRI_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.suppkey AND L.orderkey=1854 AND L.linenumber=1;
/*激活触发器,修改1854号订单第1个明细项的订购数量*/ UPDATE Lineitem SET quantity=quantity+5; WHERE orderkey=1854 AND lineitem=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.suppkey AND L.orderkey=1854 AND L.Linenumber=1;
3. 删除触发器
删除触发器TRI_Lineitem_Price_UPDATE。
DROP TRIGGER TRI_Lineitem_Price_UPDATE ON Lineitem;
四、实验心得
通过本次实验,进一步了解了触发器的定义,初步掌握了数据库触发器的设计和使用方法,成功动手设置了BEFORE触发器和AFTER触发器。实验过程中,由于基础知识薄弱与实践经验匮乏,遇到了不少难题,好在有老师和同学的帮助克服了困难。经过实践,更激励了我们继续努力学习,打好基础。
实验项目名称:数据库设计实验 实验学时: 4 同组学生姓名: 孟陈、陈晓雪、季佰军 实验地点: 1318 实验日期: 6.16 实验成绩: 批改教师: 批改时间:
一、实验目的和要求
掌握数据库设计基本方法及数据库设计工具。
二、实验内容及过程
掌握数据库设计基本步骤,包括数据库概念结构设计、逻辑结构设计,物理结构设计,
数据库魔石SQL语句生成。能够使用数据库设计工具进行数据库设计。
三、实验结果与分析
设计一个采购、销售和客户管理应用数据库。其中,一个供应商可以供应多种零件,一种零件也可以有多个供应商。一个客户订单可以订购多种供应商供应的零件。客户和供应商都分属不同的国家,而国家按世界五大洲八大洋划分地区。请利用PowerDesigner或者ERwin等数据库设计工具设计该数据库。
(1)数据库概念结构设计
① 零件Part:零件编号partkey、零件名称name、零件制造商mfgr、品牌brand、类型type、大小Size、零售价格retailprice、包装container、备注comment。主码:零件编号partkey。 create table part (
partkey int primary key, name char(20), mfgr char(100), brand char(20), type char(10), Sizee int, retailprice int,
comment varchar(150), container char(20)); ② 供应商Supplier:供应商编号suppkey、客户名称name、地址address、国籍nation、电话phone、备注comment等。主码:供应商编号suppkey。 create table supplier (
suppkey int primary key, name char(20), address varchar(50), nationkey int,
foreign key(nationkey) references nation(nationkey), phone char(20), comment varchar(200) );
③ 客户Customer:客户编号custkey、客户名称name、地址address、电话phone、国籍nation、备注comment。主码:客户编号custkey。
create table customer ( orderkey int primary key,
status char(20) check ( status in ( \ totalprice int, orderdate DATE, comment varchar(200), orderpriority int check ( orderpriority> 0 and orderpriority <3 ), shippriority int check ( shippriority> 0 and shippriority <3 ), clerk int );
④ 订单Order:订单编号orderkey、订单状态status、订单总价totalprice、订单日期order-date、订单优先级orderpriority、记账员clerk、运送优先级视频priority、备注comment。主码:订单编号orderkey。
⑤ 订单项Lineitem:订单项编号linenumber、所订零件号partkey、所订零件供应商号suppkey、零件数量quantity、零件总价extendedprice、折扣discount、税率tax、退货标记returnflag等。主码:订单项编号linenumber。
create table lineitem( linenumber int primary key, partkey int, foreign key(partkey) references part(partkey), suppkey int, foreign key(suppkey) references supplier(suppkey), quantity int, extendedprice long, discount long, tax float, returnflag char(1) check ( returnflag in ('N' or 'Y')) );
⑥ 国家Nation:国家编号nationkey、国家名称name、所属地区region、备注comment。主码:国家编号nationkey。
create table nation( nationkey int primary key, name char(15), regionkey int, foreign key(regionkey) references region(regionkey), comments varchar(200) );
⑦ 地区Region:地区编号regionkey、地区名称name、备注comment。主码:地区编号regionkey。
create table region ( regionkey int primary key, name char(20), comments varchar(200) );