问题标签 [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 投票
3 回答
117 浏览

sql - PostgreSQL copy to a new table with one extra column. How?

I am trying to make a forum database and in this database I have a trigger. After the Insert it should copy the values of the other table into the new one, but should also make a new column showing the actual registerdate of the user. Here is the trigger code:

When i try this, it tells me this:

ERROR Record "new" has no field "registerdate" CONTEXT: SQL statement "INSERT INTO public.freshlyinserted(user_id, username, bday, gender, uemail, pasword) VALUES (NEW.user_id, NEW.username, NEW.bday, NEW.gender, NEW.uemail, NEW.pasword, NEW.registerdate)". PL/pgSQL function insertuser() row 2 for SQL statement

The forumuser table doesn't have the "registerdate" column...but I really would like it for the new Table withe the actual date(i dont know how to do it tho). I would be happy, if I get help with this. I will post any more needed code! Btw. Without the registerdate, it works...but then the table would make no sense for me XD

Thanks! :)

0 投票
1 回答
173 浏览

postgresql - Postgres 函数触发序列依赖错误

我具有以下功能并通过序列设置触发:

我想创建一个函数并触发每当我向 STRATEGY_SITES 表添加新行时,“SITE_NUM”字段将具有来自 SITENUM_SEQ 的新序列号。模式名称是 gismgr。

我收到以下错误:基础 DBMS 错误 [错误:控制到达触发过程结束而没有返回上下文:PL/pgSQL 函数 process_sites_edit()(gismgr.strategy_sites)::SQLSTATE=2F005][gismgr.startegy_sites]

0 投票
0 回答
99 浏览

sql - 而不是插入触发器以防止我的数据库中出现重复记录

实际上我的问题是,我有一个 Azure 时间触发函数,它每天访问一个 API 并从该 API 获取数据并通过我的模型类映射该数据并将该数据插入我的应用程序数据库。所以数据库中有这么多重复记录,那么如何防止重复记录使用 INstead Of Insert 触发器输入到我的数据库中。据我所知,而不是插入触发器使用视图来工作。

0 投票
1 回答
855 浏览

sql - 获取 PostgreSQL 事件触发器的表名

我在 PostgreSQL 9.6 数据库中有多个表,我想在外部应用程序中监视和处理这些更改。

仅处理数据更改并不难,但现在我想监视要存储的数据库的结构更改。这就是我所拥有的:

EXECUTE PROCEDURE被调用时,我想解析已对其进行更改的表。PostgreSQL 官方文档并没有真正帮助我——我也可能没有完全理解某些部分。

那么我该如何解析那个被EVENT TRIGGER触发的表呢?它是否存储在变量中?

0 投票
1 回答
2585 浏览

python - 从 PostgreSQL 函数运行 Python 脚本

我面临一个关于每次执行 Python 脚本的“小”问题是对 PostgreSQL 表的更新或插入操作。

该脚本将提取并写入文件更新或插入的数据。

环境数据:Ubuntu 18.04(Bionic Beaver)、PostgreSQL 10、Python 3.6

并输出

姓名 默认版本 安装版本 评论
hstore_plpython2u 1.0 hstore 和 plpython2u 之间的转换
hstore_plpythonu 1.0 hstore 和 plpythonu 之间的转换
ltree_plpython2u 1.0 ltree 和 plpython2u 之间的转换
ltree_plpythonu 1.0 ltree 和 plpythonu 之间的转换
plpython2u 1.0 PL/Python2U 不受信任的过程语言
plpythonu 1.0 1.0 PL/PythonU 不受信任的过程语言

我创建了一个 PostgreSQL 函数(我希望在阅读完所有文档后它会没事)

在此之后,创建触发器

如果我进行任何插入或更新,什么都不会发生。

作为额外的预防措施,我做了以下测试

并得到这个输出:

我已经在全球范围内安装了 SQLAlchemy,现在我的脚本可以使用postgres用户按预期运行,但它不会触发。

0 投票
2 回答
259 浏览

sql - PostgreSQL创建触发器:插入操作的语法错误

我想在 PostgreSQL 中创建一个触发器。

我有一个产品表和一个类别表。如果一个新的元组被插入到 products 表中,其 category_id 尚不存在,我想用这个确切的 category_id 创建一个类别。我写了一些 SQL 代码,但在第 6 行的“INSERT”处出现语法错误。

我的代码如下:

有人看到问题了吗?谢谢你的帮助!

0 投票
0 回答
91 浏览

sql - 自动将模式更改复制到 postgresql 中的另一个模式

我有一个设计不佳的数据库。为了设计一个新数据库,我想出了每个模式(A1、Backup_A1、History_A1、Test_A1)有 4 个副本的想法。因此,如果在 A1 中的任何表中添加/更新一行,则会在 Backup_A1 和 Test_A1 上复制相同的行,如图所示。虽然 History_A1 将在其中包含先前更新的行,其中 expired_column = True 和时间戳 _ts。这使得它在很多情况下变得更加混乱,因为在生产中,可以更改表以添加更多列,例如,如果在 A1 中添加新列,则更改应如何在其他三个模式表中复制。我不确定触发器如何在需要添加新行或更改表以添加新列时处理此类任务。

如果你能举例说明,那就太好了。

在此处输入图像描述

0 投票
1 回答
531 浏览

postgresql - 如何为插入/更新/删除触发器使用相同的触发器功能避免新旧对象的问题

我正在寻找一种优雅的解决方案来解决这种情况:

  • 我创建了一个触发器函数supply,每当在warehouse_supplies.
  • PostgreSQLinsert or update语法允许我sync_supply_stock()为插入和更新条件共享相同的函数。
  • 但是,当我尝试将after delete条件连接到函数时,它不能被重用(尽管它在逻辑上是有效的),因为返回的对象必须是old而不是new.

我是否遗漏了什么,或者是否有任何修复复制sync_supply_stock2()为的方法sync_supply_stock2()


编辑

为了未来读者的利益,遵循@bergi的回答和讨论,这是一个可能的分解解决方案

0 投票
1 回答
128 浏览

sql - 如何为没有已知列的 PostgreSQL 视图编写通用更新触发器?

我正在使用 PostgreSQL 视图来模拟一个遗留表,该表已被拆分为两个单独的表,因此我们可以保持与一系列服务的向后兼容性。目标本质上是让这个视图透明地运行,就好像它是拆分前的原始表一样。使用INSTEAD OF INSERT触发器,我已经能够很容易地处理插入两个表的操作。

但是我正在努力弄清楚如何编写INSTEAD OF UPDATE触发器,因为我不知道在任何一个请求中哪些列会被更改(我正在使用 sequelize 所以我真的没有任何方法来控制请求是什么将是,它可能是SET单个列,也可能是所有列)。我在网上找到的所有示例似乎都在更新已知字段(与查询相关的一些元列或知道更新的形状将是什么)。

几个例子:

想象:

  • legacy_table是视图的名称
  • table_a有以下列:id, name, description, type,shared_column
  • table_b有以下列:id, table_a_id(外键table_a), price, shared_column.

示例 A:

我希望触发器的行为类似于:

示例 B:它也可以只接收一张表的更新

所以我们希望触发器的行为类似于:

示例 C:一个请求中可能有很多列

所以触发器的行为应该像:

可能存在需要对两个表进行更新的情况,但我不相信在任何情况下原始列UPDATE的名称与新表中的列名称有任何不同。

INSTEAD OF UPDATE在我不明确知道 UPDATE 查询是什么的情况下,我将如何编写此触发器?

0 投票
0 回答
33 浏览

postgresql - PostgreSQL TRIGGER on WITH (UPDATE ..)UPDATE 在 2 个表上

我有一个这样的 SQL 查询:

我有这个触发器不允许我执行UPDATE上述操作:

注意比较部分应该没问题,因为 select 428872 = (0.00428872 * 100000000::BIGINT)::BIGINT返回true.

我想问题在于链式UPDATEs 没有同时更新两个表。BEFORE用帮助替换AFTER,但我不明白所有的含义......

我实际上阅读了CONSTRAINT TRIGGER, DEFERRABLE,INITIALLY DEFERRED并且REFERENCING我仍然一无所知,但是大多数(如果不是全部)都使用AFTERTRIGGER,而不是BEFORE,甚至很难测试所有可能的组合。

如何更新触发器以使最顶层的 SQL 查询通过?