[GBase 8s 教程]GBase 8s 触发器

GBase 8s 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。

下面是关于 GBase 8s 触发器几个比较重要的点:

  • GBase 8s 触发器可以在下面三种触发动作:
    • 在执行操作之前BEFORE(在检查约束并尝试插入、更新、删除或查询之前)。
    • 在执行操作之后AFTER(在检查约束并插入、更新、删除或查询完成之后)。
    • 操作时FOR EACH ROW(当操作修改时每行调用一次)。
  • 触发器操作在引用 NEW.column-name 和 OLD.column-name 表单插入、删除或更新时可以访问每一行元素。其中 column-name 是与触发器关联的表中的列的名称。
  • BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
  • FOR EACH ROW 动作可能执行多次(按行), BEFORE 动作和AFTER 动作只能执行一次。
  • 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database:tablename。
  • 当创建约束触发器时会指定约束选项。这与常规触发器相同,只是可以使用这种约束来调整触发器触发的时间。当约束触发器实现的约束被违反时,它将抛出异常。

语法
创建触发器时的基础语法如下:

CREATE TRIGGER trigger_name event_name
ON table_name [REFERENCING [NEW AS new] [OLD AS old]]
[BEFORE(statement)]
[FOR EACH ROW [WHEN(condition)](statement)]
[AFTER(statement)]
;

在这里,event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE、UPDATE和SELECT 数据库操作。

以下是在 UPDATE 操作上在表的一个或多个指定列上创建触发器的语法:

CREATE TRIGGER trigger_name UPDATE OF column_name
ON table_name  [REFERENCING NEW AS new OLD AS old]
[BEFORE(statement)]
[FOR EACH ROW [WHEN(condition)](statement)]
[AFTER(statement)]
;

实例
让我们假设一个情况,我们要为被插入到新创建的 COMPANY 表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验:

DROP TABLE IF EXISTS COMPANY;
CREATE TABLE COMPANY(
  ID         SERIAL         PRIMARY KEY,
  NAME       VARCHAR(40)    NOT NULL,
  AGE        INT            NOT NULL,
  ADDRESS    CHAR(50),
  SALARY     DECIMAL(10,2),
  JOIN_DATE  DATE           DEFAULT TODAY
);

为了保持审计试验,我们将创建一个名为 AUDIT 的新表。每当 COMPANY 表中有一个新的记录项时,日志消息将被插入其中:

DROP TABLE IF EXISTS AUDIT;
CREATE TABLE AUDIT(
   EMP_ID      INT          NOT NULL,
   ENTRY_DATE  TIMESTAMP    NOT NULL DEFAULT CURRENT YEAR TO SECOND
);

在这里,ID 是 AUDIT 记录的 ID,EMP_ID 是来自 COMPANY 表的 ID,DATE 将保持 COMPANY 中记录被创建时的时间戳。所以,现在让我们在 COMPANY 表上创建一个触发器,如下所示:

CREATE TRIGGER tri_ins_company INSERT ON company REFERENCING NEW AS new 
FOR EACH ROW(insert into audit(emp_id) values(new.id));

现在,我们开始往 COMPANY 表中插入数据:

INSERT INTO COMPANY VALUES (0, '李雷', 37, '北京', 20000.00,'2005-05-13');

这时,COMPANY 表中插入了一条记录:

idnameageaddresssalaryjoin_date
1李雷37北京20000.002005-05-13

同时, AUDIT 表中也插入了一条记录,因为我们在插入 COMPANY 表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器:

emp_identry_date
12020-05-08 10:31:16.0

列出触发器

你可以把从 systriggers 表中把当前数据库所有触发器列举出来:

select * from systriggers;

如果,你想列举出特定表的触发器,语句如下:

select trigname
from systriggers tri, systables t
where tri.tabid = t.tabid
  and t.tabname = 'company';

得到结果如下:

trigname
tri_ins_company

删除触发器

删除触发器基础语法如下:

DROP TRIGGER trigger_name;

删除本文上表 company 上的触发器 example_trigger 的指令为:

drop trigger tri_ins_company;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值