Trigger引发:“错误:超出堆栈深度限制”

news/2024/7/9 19:52:42 标签: 数据库, java, sql, pgsql, postgresql, mysql

笔者一开始在pgsql创建触发器生成递增序列号一文中,当我尝试制作触发器函数时,我不断收到错误消息:无限执行了插入操作,导致栈溢出,抛出异常信息:error:SQL 错误 [54001]: ERROR: stack depth limit exceeded Hint: Increase the configuration parameter “max_stack_depth” (currently 4096kB), after ensuring the platform’s stack depth limit is adequate.

当时抛出异常时候创建的触发器函数如下:

sql">-- 创建触发器函数
CREATE OR REPLACE FUNCTION insert_increment_value_if_not_exists()
RETURNS TRIGGER AS $$
BEGIN
  -- 检查 user_sequences 表中是否存在对应的 user_name
  IF NOT EXISTS (
    SELECT 1 FROM user_sequences WHERE user_name = NEW.user_name
  ) THEN
    -- 在 user_sequences 表中插入新的记录
	INSERT INTO user_sequences (user_name, increment_value)
    VALUES (NEW.user_name, 1)
    RETURN NEW;
  else 	 
	UPDATE user_sequences
    SET increment_value = increment_value + 1
    WHERE user_name = NEW.user_name
	; 
  END IF;
  RETURN null;
END;
$$ LANGUAGE plpgsql;

-- 创建触发器
CREATE TRIGGER insert_increment_value_trigger
BEFORE INSERT ON user_sequences
FOR EACH ROW
EXECUTE FUNCTION insert_increment_value_if_not_exists();

我的触发条件就是在执行 insert 语句之前执行触发器里面的方法,初次调用的时候会进入第一个 sql 语句中,然后执行执行器里面的 insert 语句,然后又会触发触发器生成条件,在 BEFORE INSERT 触发器中再次 INSERT,导致对该第二个 INSERT 再次触发该触发器,再次触发 INSERT 并重新触发该触发器,依此类推。在初始化调用的时候,会一直触发,所有的函数调用都会耗尽堆栈。

解决办法:从触发功能中 BEGIN 删除 INSERT,返回 new 将使原始的 INSERT 触发语句完成。 BEFORE INSERT 触发器的触发功能中无需手动 INSERT。

修改后如下:

sql">-- 创建触发器函数
CREATE OR REPLACE FUNCTION insert_increment_value_if_not_exists()
RETURNS TRIGGER AS $$
BEGIN
  -- 检查 user_sequences 表中是否存在对应的 user_name
  IF NOT EXISTS (
    SELECT 1 FROM user_sequences WHERE user_name = NEW.user_name
  ) THEN
    -- 在 user_sequences 表中插入新的记录
    RETURN NEW;
  else 	 
	UPDATE user_sequences
    SET increment_value = increment_value + 1
    WHERE user_name = NEW.user_name
	; 
  END IF;
  RETURN null;
END;
$$ LANGUAGE plpgsql;

问题得以解决!


http://www.niftyadmin.cn/n/5145088.html

相关文章

Matlab2022b图文安装保姆级教程

注意:完成安装步骤1和步骤2之后,再去使用Matlab2022b 本次安装后的版本信息如下,64位软件,windows系统 Matlab2022a与2022b的比较 MATLAB主要用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险…

emq集群配置nginx做负载均衡

emq集群配置nginx做负载均衡 创建 EMQ X 节点集群 emqx 集群搭建 例如: 节点IP 地址emqx192.168.1.17192.168.1.17emqx192.168.1.18192.168.1.18emqx192.168.1.19192.168.1.19 配置 /etc/nginx/nginx.conf mqtt集群搭建并使用nginx做负载均衡_亲测得结论 示例: vim /et…

机器人仿真-gazebo学习笔记(3)URDF和机器人模型

1.URDF简介 URDF(统一机器人麦哦书格式)是ROS中的重要机器人模型描述格式,ROS提供了URDF文件的c解析器,可以解析URDF文件中使用XML格式的机器人模型。 urdf - ROS Wiki 自己查阅ros官方对URDF的介绍其实会强于大部分网上流传的文章。 1.URDF文件常用的…

【python海洋专题三十五】海图数据加密--二维插值

【python海洋专题三十五】海图数据加密–二维插值 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Python…

高等数学啃书汇总重难点(十二)无穷级数

同济高数的最后一张,重点是各种审敛法,至于后面的傅里叶级数和泰勒级数等,期末考试一般不会考(很多学校都不学),奈何数学一的考纲里面有,就捎带提一嘴。。。学会判别特定级数的敛散性是这一章的…

AM@变系数线性微分方程中的可常系数化类型@欧拉方程

文章目录 abstract变系数线性微分方程中的可常系数化类型Euler方程小结例 abstract 变系数微分方程特殊类型:欧拉方程的常系数化解法 变系数线性微分方程中的可常系数化类型 变系数的线性微分方程,一般来说不易求解但有些特殊的变系数线性微分方程,可以通过变量代换化为常系…

抛弃 scp 改用 rsync,让 Linux 下文件传输高效无比

我们都使用过 scp 来传输文件。当传输在中途或甚至在 99% 时被中断时,(每当我想起99%的中断传输时,我的心都很痛);让我们看看如何使用 rsync 来替代 scp,避免这样的不幸。 什么是rsync? Rsync…

Java 客户端、服务端NIO大文件传输

一、需求 公司电脑不让使用U盘,又不想通过公司聊天软件传输,怕被监控。但是通过QQ、微信传输文件对文件大小又有限制。基于种种原因,自己简单写了个服务端、客户端进行文件传输,大文件最好在局域网内进行数据传输。 二、pom依赖…