实验 触发器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验8 触发器设计
一、实验目的:
通过本实验了解数据库触发器的概念,掌握触发器完整性设计方法。
二、实验原理
触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,由服务器自动激活可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。
创建触发器语法格式
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH ROW
[WHEN <触发条件>]
<触发动作体>
触发时间:Before, AFTER
触发事件:insert,update, delete
删除触发器:drop trigger <触发器名>
显示创建触发器脚本
>show create trigger <触发器名>
>show triggers;
三、实验内容及方法
实验平台操作系统:win7,数据库管理平台:mysql5.6或者mysql8,实验用数据库:老师提供的数据库脚本TradeDBSQL.txt
(一)触发器应用于数据库完整性设计
实体完整性-PK
参照完整性-FK
用户定义完整性
1.参照完整性级联约束
在订单表Orders(主表)与订单细节表OrderDetails(副表)中实现更新、删除级联是通过下列方式实现的
foreign key(OrderID) references Orders (OrderID)
on delete cascade on update cascade
用下面的更新、删除触发器实现上面的更新、删除级联
1)更新级联触发器orderd_upd
DELIMITER %% /* 用%% 代替; 作为命令结束符*/
Create trigger orderd_upd /* 创建触发器名为orderd_upd */
after update on Orders /* 在表orders 上建立更新后触发器*/
for each row /* 对于每一行*/
begin
/* 在表orders上更新后自动更新OrderDetails 表*/ update OrderDetails set OrderID = new.OrderID where OrderID=old.OrderID; end %%
特别要注意new,old 的区别
old 表示更新前的一行记录(for each row)
new 表示更新为新的数据的一行记录。
DELIMITER ; /* 恢复; 命令行结束符*/
设计测试用例,测试是否生效:
例如将orderid 从10400 改为14400
select * from orders where orderid=10400;
update orders set orderid=14400 where orderid=10400
select * from orders where orderid=14400;
select * from orderdetails where orderid=14400;
2)删除级联触发器orderd_del
DELIMITER %%
Create trigger delt1
after delete on Orders
for each row
begin
delete from OrderDetails where OrderID=old.OrderID; end %%
设计测试用例,测试是否生效。
2.用户定义完整性
Mysql 没有check 约束,只能通过触发器实现check 约束
例如产品表Products 中,规定单价UnitPrice的范围是大于0,小于100,设计触发器实现该约束
delimiter %%
create trigger prod_ins
before insert on Products
for each row
begin
if new.UnitPrice <=0 or new.UnitPrice>=100 then
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '不能插入数据,单价只能是大于0小于100';
end if;
end;
%%
测试是否生效:
单价超过100,及等于0
delimiter ;
insert into Products values (88,'梅州金柚',1,1,'每箱20个',110,39,0,10,TRUE);
insert into Products values (89,'梅州金柚2',1,1,'每箱20个',0,39,0,10,TRUE);
(二)触发器应用于业务逻辑
1.新增加订单
例如客户ID为ALFKI的客户下了一个订单,订单号为11088,订购了3种产品,具体数据如下:
产品ID,单价,数量,折扣
13,6,10,0.1
18, 62.5,15,0.13
27,43.5,5, 0
雇员ID为6 的雇员处理订单,订购日期:今天到货日期:5天后发货日期:2天后运货商:2,运货费:38,
业务逻辑
1)在订单orders中添加一条新纪录
2)在订单细节Orderdetails表中添加订购产品的相关记录
3)更新修改产品表中相关产品的库存量,减去订购的数量
在OrderDetails 表上设计一个插入触发器,自动实现3)的更新库存的操作。
DELIMITER %%
create trigger insertorder
before insert on OrderDetails
for each row
begin
update Products set UnitsInStock = UnitsInStock -new.Quantity where ProductID = new.ProductID;