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 表中插入了一条记录:
id | name | age | address | salary | join_date |
---|---|---|---|---|---|
1 | 李雷 | 37 | 北京 | 20000.00 | 2005-05-13 |
同时, AUDIT 表中也插入了一条记录,因为我们在插入 COMPANY 表时创建了一个触发器。相似的,我们也可以根据需求在更新和删除时创建触发器:
emp_id | entry_date |
---|---|
1 | 2020-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;