问题标签 [postgresql-triggers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
40 浏览

postgresql - PostgreSQL Trigger on last deleted line

I created a trigger that updates the number of species counted from the "effectif" table to the "citation" table. It works well except when I delete the last row, the calculation does not perform and remains at the last state. For example, if I delete the last row on the "effectif" table that represents 6 species, I would still have 6 on my "citation" table where I'm suppose to find 0 or null. Here is my trigger :

0 投票
1 回答
51 浏览

postgresql - PostgreSQL 触发函数来捕获更新的字段

我正在从服务器查询数据以更新本地数据库中的字段。

但是,我有 100 多列,因此我只想知道哪一列具有新值(与以前不同),以便我只能使用这些字段来准备/​​制作/构建本地数据库的更新命令。

示例:我的数据库中已有 100 列。服务器中的同一行已更新。现在我已经从服务器获取了所有这 100 列。(存储在列表对象中以在 Java 中制作准备语句)。100 列中只有 10 列已更新。我想更新哪 10 列。

如何用触发器做到这一点?

或者除了触发器之外还有其他方法,例如在 Cassandra 中,使用相同的 PK插入将作为一行的更新

0 投票
1 回答
289 浏览

postgresql - 如何在 Postgres 容器中插入存储的函数和触发器

我有一个容器化的 Postgres 数据库,我正在尝试创建一个函数和一个触发器:一个关于新行插入的简单通知。

这可能看起来很愚蠢,但我无法找到如何编写代码,我应该将它推送到 Postgres 容器的哪里,以及如何以编程方式将代码插入容器中。

我可以看到以下文件结构

在使用/docker-entrypoint-initdb.d/文件夹(Dockerfile 中的副本)时,我只(模糊地)找到了一种复制代码的方法。

此注入仅在创建数据库时有效 - 根据 Docker/Postgres 文档。这意味着我必须删除并重新创建数据库。这是错误的,因为我无法对生产数据库进行任何更改。

此外,当我将其他 SQL 命令连接到.sql文件中的 CREATE TABLE 命令时,这些命令的执行顺序会导致错误(未知表...)。

init.sql以编程方式复制到/docker-entrypoint-initdb.d/文件夹中的文件是:

我还尝试了一个“sh”版本(dixit PG docs)但没有成功:它在“$$”周围抛出一个错误。

0 投票
1 回答
75 浏览

sql - 使用 PGAdmin4 v5 中的触发器来获取 QGIS 中生成的线条的几何图形

所以我有一个在 qgis 中可视化编码的管道数据库。我的目标是向 PGAdmin4 v5 添加一个触发器,该触发器使用 ST_StartPoint() 和 ST_EndPoint() 来获取正在输入的折线(管道)的端点。然后,我将使用这个几何来获取最近的结构(一个点)并使用相应的数据自动完成两列。我有工作代码可以获取现有管道的端点并找到最近的结构,但我想使用新创建的线(管道)在将表单输入数据库时​​自动完成表单。

工作代码:

我需要弄清楚如何从更新中获取数据(向 qgis 添加条目)并使用它的几何而不是现有管道的几何。

0 投票
1 回答
54 浏览

postgresql - 混合 SRID 触发阻止 qgis 提交更改

我有一个触发器,它需要一条线,抓取它的 ST_StartPoint 和 ST_EndPoint,然后抓取离这些端点最近的点,并将 node_id 分配给一列。这个 Fiddle显示了触发器以及一些示例数据。运行此触发器时,我在 QGIS 上收到错误消息,说明如下:

我试图通过编辑触发器来解决这个问题,但这并没有解决问题。任何想法将不胜感激。

0 投票
2 回答
95 浏览

postgresql - 使用 ST_DWithin 获取区域内最近对象的 id

我在 pgAdmin4 中有一个触发函数,它可以在 QGIS 中抓取最接近线的起点和终点的对象。但是,我不仅要获取最近对象的 id,而且仅在对象在 20' 半径内且对象的 id 不为 null 时才获取该 id。

这个小提琴有我的工作触发器(触发器的副本也可以在下面找到)以及一些示例数据。我知道我需要将 ST_DWithin 添加到函数中,但我不确定如何去做。

下面是触发代码:

0 投票
1 回答
38 浏览

sql - 触发在 qgis 中放置一个点以通过在 Postgresql 中添加下一个字母数字序列来自动完成一列

在 QGIS 中,我有一个点表和一个区域表。当我在一个区域中放置一个点时,我需要发生以下事情。获取要放置新点的区域(称为 plat_page)的 ID。然后我想根据该区域中已经存在的点将序列中的下一个值插入到名为“node_id”的列中的新条目中。我的问题是序列是字母数字,其中前 4 个字符是 plat_page,后三个字符是序列。同样,我不确定如何辨别我放置新点的区域。“node_id”看起来像这样:

510C101510Cplat_page在哪里,101是我需要排序的数字。

这是一个示例,我在 plat_page 的区域中放置了一个点610C。我想获取 plat_page,然后检查现有序列中的最大值是什么,比如说100。然后我想生成序列中的下一个值610C101并将其插入名为“node_id”的列中。

到目前为止,我有一种方法可以获取给定 plat_page 序列中的最高数字,但我想通过让插入点决定该 plat 页面是什么来自动化这个过程。同样,我不确定如何对最后一个数字进行排序,然后将其附加到 plat_page 值以生成“node_id”。下面是我所拥有的代码。

我还附上了这个小提琴样本数据以帮助理解。

0 投票
1 回答
24 浏览

postgresql - 如何实现“状态”字段更新时填充的“被盗”字段?TRIGGER 函数和 GENERATED ALWAYS AS 尝试附加

如何更新,以便在从to更新stolen_at时填充当前时间戳?statusINSTOCKSTOLEN

我尝试了一个基于触发器的方法,但它包含一个错误:

触发方法:

探索的另一种方法是接收idandnew_item_status并填充该item_status字段的函数。我无法让它工作:

这两种方法中的哪一种是首选(例如资源密集度较低),实现它们的正确方法是什么?

0 投票
1 回答
28 浏览

sql - 在“更新前”触发器中设置 NEW.column 设置来自先前触发器调用的值

我正在尝试为before update表创建触发器。基本上,在每次更新行时,我都需要在同一张表的同一行上设置额外的列。

但是,由于某种原因,每个触发器调用都会导致从前一个触发器调用中设置值。

这是我的触发器的代码:

在函数外部运行时,函数内部的select语句test_trigger_func可以正常工作。但是当从函数内部调用时,这些raise notice语句显示不正确的(以前的)值。selecttest_trigger_func

salesprofile.solutionscreteria #>> '{departments, 0}'语句包含表id中的行department。我正在尝试从每行更新(通过修改)设置表格行department上的列。salesprofile"department".namesalesprofileNEW.department = ...


我得到的行为:

  • select语句非常好并且按预期工作(按原样调用时,在函数之外)。

  • 当我对salesprofile行进行第一次更新时,触发器将department列设置为NULL(该列根本没有更新);

  • 当我对salesprofile行进行第二次更新时,触发器将department列设置为我在第一次更新时尝试设置的值;

  • 当我对行进行第三次更新时salesprofile,触发器将department列设置为我在第二次更新时尝试设置的值;

  • 等等...

  • 如果我将不正确的值放入salesprofile.solutionscreteria #>> '{departments, 0}'值中,第一次触发更新不会导致任何错误。

  • 然后如果我在此之后设置正确的值,触发器将触发错误(由上一个触发器调用的值不正确引起)。


我不明白这是如何以及为什么会发生的,我希望我能以一种可以理解的方式解释这种行为。

这是 potgresql 触发器的预期行为吗?如果没有,那么您能否解释发生了什么以及如何使其正常工作?

0 投票
2 回答
194 浏览

sql - 如何使用触发器函数连接两个字符串以更新 postgres 表中的列

我有用户表和配置文件表。当在 user 表中创建记录时,它会自动在 profile 表中使用返回的 id 创建一条记录。配置文件表如下:

当用户更新配置文件表并为 和 输入值时first_namelast_name我想要一个触发器函数来连接两列并使用结果进行更新display_name

目前我将触发功能定义为

我也有触发器