我是靠谱客的博主 风趣洋葱,这篇文章主要介绍【openGauss笔记】触发器,现在分享给大家,希望可以做个参考。

文章目录

触发器是对应用动作的响应机制,当应用对一个对象发起DML操作时,就会产生一个触发事件(Event)。如果该对象上拥有该事件对应的触发器,那么就会检查触发器的触发条件(Condition)是否满足,如果满足触发条件,那么就会执行触发动作(Action)

在这里插入图片描述通过CREATE TRIGGER命令可以创建一个触发器,在CREATE TRIGGER命令中可以指定触发器的事件、条件和动作。

例2-58:创建触发器。

复制代码
1
2
3
4
5
6
CREATE TRIGGER <trigger name> # 触发器名称 <trigger action time><trigger event> # 触发器事件 ON <table name> # 触发器对象 [REFERENCING <old or new values alias list>] # 触发器条件 <triggered action> # 触发器动作

当满足触发事件时,还需要考虑触发器的执行时机,触发器语法提供了两个触发时机:

  1. BEFORE:在触发器事件执行之前检查触发条件以及执行触发动作;
  2. AFTER:触发事件之后检查触发条件以及执行触发动作。

例2-59:在UPDATE事件发生之前执行触发器。具体语句如下:

复制代码
1
2
3
4
CREATE TRIGGER before_update BEFORE UPDATE ON ......

例2-60:在INSERT事件发生之后执行触发器。具体语句如下:

复制代码
1
2
3
4
CREATE TRIGGER after_insert AFTER INSERT ON ......

触发器可以对应到元组(一个SQL语句可以更新多个元组),也可以对应到SQL语句级,默认是SQL语句级。

例2-61:针对SQL语句级的触发器。具体语句如下:

复制代码
1
2
3
4
5
6
CREATE TRIGGER after_insert AFTER INSERT ON warehouse FOR EACH STATEMENT ......

例2-62:针对元组级的触发器。具体语句如下:

复制代码
1
2
3
4
5
6
CREATE TRIGGER after_insert AFTER INSERT ON warehouse FOR EACH ROW ......

针对触发对象的触发事件一旦发生,就会激活触发器。触发器首先检查触发条件,满足条件的情况下被执行。
元组触发器可以将更新前后的值嵌入到触发器的触发条件里。

在这里插入图片描述
例2-63:触发条件中包含NEW元组对应的列值。具体语句如下:

复制代码
1
2
3
4
5
6
7
CREATE TRIGGER after_insert AFTER INSERT ON warehouse FOR EACH ROW WHEN (NEW.w_id > 10) ......

触发器的动作主要是执行一个函数。
在创建触发器之前,需要创建一个函数,如果返回值是Trigger,那么该函数就是触发器函数,否则是普通函数。
同一个触发器可以指定多个触发事件,每个事件发生时都能激活触发器来执行触发器的动作。

例2-64:在warehouse表上创建一个完整的触发器,触发器的工作是在wh_log表中记录DELETE/UPDATE/INSERT操作的具体信息。实现的语句如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
CREATE TABLE wh_log ( event VARCHAR(10), time_stamp TIMESTAMP, w_id SMALLINT, w_name VARCHAR(10) ); CREATE FUNCTION record_warehouse_log() RETURN TRIGGER AS $warehouse_log$ BEGIN IF (TG_OP = 'DELETE') THEN INSERT INTO wh_log SELECT 'D', now(), OLD.w_id, OLD.w_name; RETURN OLD; ELSEIF (TG_OP = 'UPDATE') THEN INSERT INTO wh_log SELECT 'U', now(), OLD.w_id, OLD.w_name; RETURN NEW; ELSEIF (TG_OP = 'INSERT') THEN INSERT INTO wh_log SELECT 'I', now(), OLD.w_id, OLD.w_name; RETURN NEW; END IF; RETURN NULL; END; $warehouse_log$ LANGUAGE plpgsql; CREATE TRIGGER warehouse_log AFTER INSERT OR UPDATE OR DELETE ON warehouse FOR EACH ROW EXECUTE PROCEDURE record_warehouse_log();

如果需要删除触发器,可以使用SQL中的DROP TIGGER命令。

例2-65:删除触发器。具体语句如下:

复制代码
1
2
DROP TRIGGER warehouse_log;

最后

以上就是风趣洋葱最近收集整理的关于【openGauss笔记】触发器的全部内容,更多相关【openGauss笔记】触发器内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(91)

评论列表共有 0 条评论

立即
投稿
返回
顶部