实验6.4 触发器
【实验目的】
①掌握使用图形界面工具创建触发器。
②掌握使用SQL创建触发器。
③掌握使用图形界面工具修改触发器。
④掌握使用SQL修改触发器。
⑤掌握使用图形界面工具删除触发器。
⑥掌握使用SQL删除触发器。
【实验内容】
①使用SQL语句复制表customers生成一个新表cuscopy,新表与老表结构相同,数据相同,然后使用图形界面工具建立触发器customers_AFTER_INSERT与customers_AFTER_UPDATE,当试图在customers表中插入或更改数据时,将执行触发器,实现cuscopy表和customers表数据的同步更新。
②建立一个触发器orders_AFTER_INSERT,当向orders表中插入一个新订单时被触发,自动更新products表的quantity列,即把在orders表中插入行时指定的qty值从products相应行的quantity中减去。
③使用图形界面工具修改触发器customers__AFTER_INSERT。
④使用图形界面工具删除触发器customers_AFTER_INSERT。
⑤使用SQL删除触发器orders_AFTER_INSERT。
【实验步骤】
(1)使用图形界面工具建立触发器
先使用SQL语句复制表customers生成一个新表cuscopy,新表与老表的结构相同,数据也相同,然后使用图形界面工具建立触发器customers_AFTER_INSERT与customers_AFTER_UPDATE,当试图在customers表中插入或更改数据时,将执行触发器,实现cuscopy表和customers表数据的同步更新。
①在图标菜单中单击第一个图标
,新建一个查询窗口。
②输入下面的SQL语句:
CREATE TABLE cuscopy LIKE customers;
INSERT INTO cuscopy SELECT * FROM customers;
③单击工具栏中的
图标或者按下快捷键“Ctrl+Shift+Enter”,执行上面的SQL语句。
④在“Navigator”导航栏的“Schemas”选项页中,依次展开节点“sales”→“Tables”,右击“customers”,在快捷菜单中选择“Alter Table...”选项,在查询窗口中显示表的结构。单击“Triggers”,进入创建触发器界面,如图6.18所示。
⑤分别单击左侧菜单的“AFTER INSERT”与“AFTER UPDATE”旁的加号,创建插入与更新操作的触发器“customers_AFTER_INSERT”与“customers_AFTER_UPDATE”,在右侧SQL模板的BEGIN与END之间添加触发器操作,使cuscopy的数据和customers的数据一致,如图6.19和图6.20所示。

图6.18 创建触发器界面

图6.19 “插入”操作的触发器

图6.20 “更新”操作的触发器
⑥单击“Apply”按钮,执行创建触发器操作,成功之后,可以在导航栏中先刷新后查看是否存在新建的触发器,如图6.21所示。

图6.21 创建的触发器
⑦验证触发器是否起作用。分别向customers表插入一行数据和更新数据,如图6.22所示。执行完成后,查询cuscopy表内容,如图6.23所示。cuscopy也增加了同样一行,并且进行了同样更新,说明这两个触发器已经成功触发。

图6.22 插入、更新数据验证触发器

图6.23 查看触发器执行结果
(2)使用SQL建立触发器
建立一个触发器orders_AFTER_INSERT,当向orders表中插入一个新订单时被触发,自动更新products表的quantity列,即把在orders表中插入行时指定的qty值从products相应行的quantity中减去。
①在图标菜单中单击第一个图标
,新建一个查询窗口。
②在查询窗口输入下面的SQL语句:
DROP TRIGGER IF EXISTS sales.orders_AFTER_INSERT;
DELIMITER $$
USE sales$$
CREATE DEFINER = CURRENT_USER TRIGGER sales.orders_AFTER_INSERT AFTER INSERT ON Orders FOR EACH ROW
BEGIN
UPDATE Products SET quantity=quantity-new.qty WHERE pid = new.pid;
END$$
DELIMITER ;
③单击工具栏中的
图标,执行上面的SQL语句,成功之后,可以在导航栏中先刷新后查看新建的触发器,如图6.24所示。

图6.24 导航栏中查看触发器
④验证触发器是否起作用。首先查询products表的内容,记下p01的quantity值,然后向orders表插入一行数据,SQL语句如下:
USE sales
INSERT orders (ordno,aid,cid,pid,qty)
values ('1100','a01','c001','p01',2000)
插入成功之后,再次查询products表的内容,比较两次查询结果中p01的quantity值。
(3)修改触发器
使用MySQL Workbench修改触发器cus_AFTER_INSERT。
①在“Navigator”导航栏的“Schemas”选项页中依次展开节点“sales”→“Tables”,右击“customers”,在快捷菜单中选择“Alter Table...”选项,进入“Triggers”界面,在查询窗口中显示触发器定义的SQL语句。
②对插入语句进行修改,实现对插入cuscopy表的元组的discnt值为插入customers表的discnt值的1.1倍,单击“Apply”按钮,执行窗口中的SQL语句。成功之后,customers_AFTER_INSERT触发器即完成修改,如图6.25所示。

图6.25 查询窗口中的修改触发器的SQL语句
③验证。向customers 表插入一行数据,如图6.26所示。然后查询cuscopy表的内容,如图6.27所示,可以看到新插入的这行discnt值为插入customer表的discnt值的1.1倍。

图6.26 向customers 表插入一行数据

图6.27 查询cuscopy表的内容
(4)使用图形界面工具删除触发器
删除触发器customers_AFTER_INSERT。
在“Navigator”导航栏的“Schemas”选项页中依次展开节点“sales”→“Tables”,右击“customers”,在快捷菜单中选择“Alter Table...”选项,进入“Triggers”界面,将光标移至左侧对应的触发器处,单击“-”按钮后再单击“Apply”按钮应用删除操作,如图6.28所示。可以在导航栏中查看customers_AFTER_INSERT是否存在,如图6.29所示。

图6.28 删除触发器

图6.29 触发器orders_AFTER_INSERT被删除
(5)使用SQL删除触发器
删除触发器orders_AFTER_INSERT。
①在图标菜单中单击第一个图标
,新建一个查询窗口。
②在查询窗口输入下面的SQL语句:
DROP TRIGGER orders_AFTER_INSERT
③单击工具栏中的
图标,执行上面的SQL语句,成功之后,可以在导航栏中先刷新后查看orders_AFTER_INSERT是否存在,如图6.30所示。

图6.30 触发器orders_AFTER_INSERT被删除