创建和使用触发器 / 使用触发操作 |
在触发事件之前或之后发生的触发操作仅执行一次。BEFORE 触发操作在触发语句之前执行,即在触发器事件发生之前执行,AFTER 触发操作在触发语句操作完成之后执行。即使触发语句不处理任何行,BEFORE 和 AFTER 触发操作也会执行。
CREATE PROCEDURE upd_items_p1() DEFINE GLOBAL old_qty INT DEFAULT 0; LET old_qty = (SELECT SUM(quantity) FROM items); END PROCEDURE;
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;
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 语句。