【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;
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
opengauss支持存储过程的创建和使用。存储过程是一组SQL语句和逻辑控制的集合,可以在数据库中创建、删除和修改。存储过程可以接收参数,并且参数的类型需要保持一致才能正常执行。存储过程的参数有三种不同的输入/输出模式:IN、OUT、INOUT。IN参数是存储过程的输入参数,用于将外部的值传递给存储过程使用;OUT参数是存储过程的输出参数,在执行过程中将执行的中间结果赋值给OUT参数,供外部用户获取存储过程的执行结果;INOUT参数同时具有IN参数和OUT参数的性质,既是存储过程的输入参数,同时也会通过INOUT参数将中间结果输出给外部用户。通过存储过程的封装,应用程序只需要调用存储过程即可,提高了安全性和执行效率。存储过程的声明一般使用CREATE PROCEDURE语句来创建,可以在其中编写一组SQL语句和控制逻辑。 总结来说,opengauss支持存储过程的创建和使用,存储过程可以提供简单、安全和高性能的执行方式,并通过参数实现输入/输出的功能。通过声明存储过程,可以在其中编写业务逻辑和SQL语句,并将其封装在数据库系统中供应用程序调用。在opengauss中,对于修改存储过程,可以使用REPLACE关键字来指定使用当前的存储过程替代之前的同名存储过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【openGauss笔记】存储过程和函数](https://blog.csdn.net/weixin_43651049/article/details/127330529)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZhShy23

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

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

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

打赏作者

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

抵扣说明:

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

余额充值