BEFORE 和 AFTER 触发操作

在触发事件之前或之后发生的触发操作仅执行一次。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_p1upd_items_p2 以防止对 items 表的 quantity 列点进行异常更新:
CREATE TRIGGER up_items
          UPDATE OF quantity ON items
          BEFORE(EXECUTE PROCEDURE upd_items_p1())
          AFTER(EXECUTE PROCEDURE upd_items_p2());

如果更新使得对所有项的订购总量增长超过 50%,那么 upd_items_p2 中的 RAISE EXCEPTION 语句终止该触发器,并显示错误。当进行事务记录的数据库服务器中的触发器发生故障时,数据库服务器会回滚超过语句和触发操作进行的更改。有关触发器发生故障时所发生的情况的更多信息,请参阅 GBase 8s SQL 指南:语法中的 CREATE TRIGGER 语句。