本章描述CREATE TRIGGER语句的每个组成部分的用途,说明触发器的一些用法,并描 述将SPL例程用作触发器的优点。
此外,本章还描述可在视图上定义的INSTEAD OF触发器。
SQL触发器是驻留在数据库中的一种机制。具有使用许可权的任何用户都可以使用它。SQL 触发器指定当数据操纵语言(DML)操作(INSERT、SELECT、DELETE或UPDATE语 句)时,数据库服务器应自动执行一个或多个附加操作。对于在视图上定义的触发器,视 图基本表上的触发操替换触发事件。对于表或视图上的触发器,触发操作可以是INSERT、 DELETE、UPDATE、EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句。
GBase 8s还支持用C或Java™编写的用户定义的例程作为触发操作。
有关如何撰写C UDR以获取有关触发器事件的元数据信息,请参阅《GBase 8s DataBlade API程序员指南》。
13.1何时使用触发器
因为触发器驻留在数据库中,且具有必需特权的任何用户都可以使用它,所以触发器允许 您编写可供多个应用程序使用的一组SQL语句。它可在多个程序需要执行同一数据库操 作时避免冗余码。
可使用触发器执行下列操作以及在此列表中找不到的其它操作:
•在数据库中创建活动的审计跟踪。例如:可通过更新审计表的确认信息来跟踪对订 单的更新。
•实现业务规则。例如:可以确定何时订单超出客户的信用卡限制并对此情况显示一 条消息。
•派生表内或数据内未提供的其它数据。例如:当对items表的quantity列进行更新 时,可以计算对total_price列的相应调整。
•强制执行引用完整性。例如:在删除客户时,可以使用触发器来删除orders表中具 有相同客户号的相应行。
13.2如何创建触发器
使用CREATE TRIGGER语句定义新触发器。CREATE TRIGGER语句是数据定义语句, 它将称为触发操作的SQL语句与表上的诱发事件相关联。当发生诱发操作时,它触发存 储在数据库中的关联SQL语句。
在本示例中,触发事件是引用items表中的quantity列的UPDATE语句。下图说明激活触 发器的DML操作(称为触发器事件)与触发操作之间的关系。
图:触发事件和触发操作
UPDATE ▼ |
||
rtem nom quantily |
totaLprice |
|
2 3 |
15.00 |
EXECUTE PROCEDURE |
3 1 |
236.00 |
upd_items |
A 4 |
100.00 280.00 |
|
trigger event |
CREATE TRIGGER语句由执行下列操作的子句组成:
• 声明触发器名称。
•指定在指定表或试图上作为触发事件的DML操作。
•定义该事件触发器的SQL操作。
FOR EACH ROW 触发操作中讨论了称为REFERENCING子句的可选子句。
要创建触发器,使用DB-Access或某个SQL API。本节描述当您在DB-Access中使用交互 查询语言选项输入CREATE TRIGGER语句时的用法。在SQL API中,您在语句前加上 将该语句标识为嵌入式语句的符号或关键字。
13. 2. 1声明触发器名称
触发器名称标识触发器,且该名称在数据库的触发器名称中必须唯一。在语句中,触发名 称跟在CREATE TRIGGER后面。与任何SQL标识一样,该名称最长为128个字节, 以字母开始并由字母、数字和下划线(_)组成。在以下示例中,所示的CREATE TRIGGER 语句部分声明了触发器的名称upqty:
CREATE TRIGGER upqty -- declare trigger name
13. 2. 2指定触发器事件
触发器事件是一种激活触发器的DML语句。当对表执行此类型的语句时,数据库服务器 执行组成触发操作的SQL语句。对于表,触发器事件可以是INSERT、SELECT、 DELETE或UPDATE语句。对于UPDATE或SELECT触发事件,可以指定表中一列 或多列可以激活触发器。可以在同一表上定义多个INSERT、SELECT、DELETE和 UPDATE触发器,也可以在同一视图上定义多个INSERT、DELETE和UPDATE触发 器。
在当前数据库中的一个表或一个视图上,只能创建一个触发器。触发器不能引用远程表或 视图。
在以下CREATE TRIGGER语句片段中,触发事件定义为更新items表中quantity列:
CREATE TRIGGER upqty
UPDATE OF quantity ON items -- an UPDATE trigger event
语句的这一部分标识在其上定义触发器的表。如果触发器事件为插入或删除操作,那么仅 需要语句的类型和表名,如以下示例所示:
CREATE TRIGGER ins_qty
NSERT ON items -- an INSERT trigger event
13. 2. 3定义触发操作
触发操作是当触发事件发生时执行的SQL语句。触发操作可以由INSERT、DELETE、 UPDATE、EXECUTE FUNCTION 和 EXECUTE PROCEDURE 语句组成。但是,除了指 定要执行什么操作外,还必须就触发语句何时执行这些操作。您有以下选择:
•在触发语句执行之前
•在触发语句执行之后
•针对触发语句作用的每一行
表上的单个触发器可以为上述每一时间定义操作。
要定义触发操作,指定该操作何时发生,然后提供要执行的SQL语句,可使用关键字 BEFORE、AFTER或FOR EACH ROW指定该操作何时发生。然后是括在圆括号中的触 发操作。下面的触发操作定义指定在触发语句之前执行SPL例程upd_items_pl :
BEFORE(EXECUTE PROCEDURE upd_items_p1) -- a BEFORE action
13. 2.4 完整的 CREATE TRIGGER 语句
要定义完整的CREATE TRIGGER语句,将触发器名称子句、触发事件子句和触发操作子 句组合起来。下面的CREATE TRIGGER语句是将前例中的语句的各个组成部分组合在一 起的结果。每次更新items表的quantity列时,此触发器将执行SPL例程upd_items_p1 o
CREATE TRIGGER upqty
UPDATE OF quantity ON items