在触发事件之前或之后发生的触发操作仅执行一次。BEFORE 触发操作在触发语句之前执
行,即在触发器事件发生之前执行,AFTER 触发操作在触发语句操作完成之后执行。即使
触发语句不处理任何行,BEFORE 和 AFTER 触发操作也会执行。
除其它用法外,
还可以使用 BEFORE 和 AFTER 触发操作来确定触发语句的效果。
例如,
在更新 items 表的 quantity 列之前,可以调用 SPL 例程upd_items_p1 来计算表中所有项的
订购总数,如下例所示,该过程将总数存储在名为 old_qty 的全局变量中。
CREATE PROCEDURE upd_items_p1()
DEFINE GLOBAL old_qty INT DEFAULT 0;
LET old_qty = (SELECT SUM(quantity) FROM items);
END PROCEDURE;
在完成触发更新之后,可以再次计算总数来看看更改了多少。下面的 SPL 例
程 upd_items_p2 再次计算了 quantity 的总数并将结果存储在局部变量 new_qty 中。然后,
它将 new_qty 与全局变量 old_qty 相比较,以查看所有订单的总量的增长是否超过 50%。
若是,该过程将使用 RAISE EXCEPTION 语句来模拟 SQL 错误。
CREATE PROCEDURE upd_items_p2()
DEFINE GLOBAL old_qty INT DEFAULT 0;
DEFINE new_qty INT;
LET new_qty = (SELECT SUM(quantity) FROM items);
IF new_qty > old_qty * 1.50 THEN
RAISE EXCEPTION -746, 0, 'Not allowed - rule violation';
END IF
END PROCEDURE;
下列触发器调用 upd_items_p1 和 upd_items_p2 以防止对 items 表的 quantity 列点进行异常
更新:
CREATE TRIGGER up_items
UPDATE OF quantity ON items
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 341 -
BEFORE(EXECUTE PROCEDURE upd_items_p1())
AFTER(EXECUTE PROCEDURE upd_items_p2());
如果更新使得对所有项的订购总量增长超过 50%,那么 upd_items_p2 中的 RAISE
EXCEPTION 语句终止该触发器,并显示错误。当进行事务记录的数据库服务器中的触发
器发生故障时,数据库服务器会回滚超过语句和触发操作进行的更改。有关触发器发生故
障时所发生的情况的更多信息,请参阅《GBase 8s SQL 指南:语法》中的 CREATE
TRIGGER 语句。