实验 触发器设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档