| 创建和使用触发器 / 使用触发操作 | |
在触发事件之前或之后发生的触发操作仅执行一次。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 语句。