【openGauss笔记】触发器

文章目录

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

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

例2-58:创建触发器。

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事件发生之前执行触发器。具体语句如下:

CREATE TRIGGER before_update 
	BEFORE UPDATE
ON ......

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

CREATE TRIGGER after_insert
 	AFTER INSERT 
 ON ......

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

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

CREATE TRIGGER after_insert 
	AFTER INSERT
ON warehouse
FOR EACH STATEMENT
......

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

CREATE TRIGGER after_insert 
	AFTER INSERT
ON warehouse
FOR EACH ROW
......

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

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

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操作的具体信息。实现的语句如下:

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:删除触发器。具体语句如下:

DROP TRIGGER warehouse_log;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhShy23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值