GBase 8s SQL 指南:教程———13 创建和使用触发器

本章描述CREATE TRIGGER语句的每个组成部分的用途,说明触发器的一些用法,并描 述将SPL例程用作触发器的优点。

此外,本章还描述可在视图上定义的INSTEAD OF触发器。

SQL触发器是驻留在数据库中的一种机制。具有使用许可权的任何用户都可以使用它。SQL 触发器指定当数据操纵语言DML)操作INSERTSELECTDELETEUPDATE语 句)时,数据库服务器应自动执行一个或多个附加操作。对于在视图上定义的触发器,视 图基本表上的触发操替换触发事件。对于表或视图上的触发器,触发操作可以是INSERTDELETEUPDATEEXECUTE PROCEDURE EXECUTE FUNCTION 语句。

GBase 8s还支持用CJava编写的用户定义的例程作为触发操作。

有关如何撰写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语句。对于表,触发器事件可以是INSERTSELECTDELETEUPDATE语句。对于UPDATESELECT触发事件,可以指定表中一列 或多列可以激活触发器。可以在同一表上定义多个INSERTSELECTDELETEUPDATE触发器,也可以在同一视图上定义多个INSERTDELETEUPDATE触发 器。

在当前数据库中的一个表或一个视图上,只能创建一个触发器。触发器不能引用远程表或 视图。

在以下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语句。触发操作可以由INSERTDELETEUPDATEEXECUTE FUNCTION EXECUTE PROCEDURE 语句组成。但是,除了指 定要执行什么操作外,还必须就触发语句何时执行这些操作。您有以下选择:

在触发语句执行之前

在触发语句执行之后

针对触发语句作用的每一行

表上的单个触发器可以为上述每一时间定义操作。

要定义触发操作,指定该操作何时发生,然后提供要执行的SQL语句,可使用关键字 BEFOREAFTERFOR 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值