问题标签 [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 回答
7580 浏览

postgresql - 如何在触发函数中使用变量设置?

我想在会话/事务中记录用户的 id,使用SET,所以我可以稍后在触发函数中访问它,使用current_setting。基本上,我正在尝试以前发布的一张非常相似的票中的选项 n2 ,不同之处在于我使用的是 PG 10.1 。

我一直在尝试 3 种方法来设置变量:

  • SET local myvars.user_id = 4,从而在事务中本地设置它;
  • SET myvars.user_id = 4,从而在会话中设置它;
  • SELECT set_config('myvars.user_id', '4', false),取决于最后一个参数,将是前两个选项的快捷方式。

它们都不能在触发器中使用,触发器NULL在通过 获取变量时接收current_setting。这是我设计的用于对其进行故障排除的脚本(可以很容易地与 postgres docker 映像一起使用):

我得出的结论是,该函数是在不同的事务和不同的(?)会话中触发的。这是一个可以配置的东西,以便所有事情都在同一个上下文中发生吗?

0 投票
0 回答
85 浏览

database - PostgreSQL:插入/更新所有关联行后执行触发器

我需要跟踪数据库中的数据更改并执行触发器。基本记录在不同的表中有一些关联的(多对一)记录。当任何记录(基本记录或关联记录)被更新/插入时,必须执行触发器以根据基本记录和所有关联记录数据执行一些操作。

当插入新的基本记录及其所有关联记录(创建新记录)时,是否有任何方法可以防止触发器在每次插入关联记录时执行?我的意思是,有没有办法等到所有相关数据都被存储然后运行触发器?

我不能保证所有插入都在一个事务中执行,也不能改变插入记录的方式。我所能做的就是向现有数据库添加触发器和函数。

我知道这个问题听起来很幼稚和愚蠢,但任何疯狂的想法都会受到赞赏。

0 投票
1 回答
26 浏览

postgresql - PostgresSQL:更新表B中的某些列后更新表B中的某些列

我在 Postgres 中有 2 个表,假设是一对多的Category关系Thread

Category

Thread

我想创建一个触发器:如果我执行软删除Categorydeleted_at从 null 更新到 now()),那么Thread. deleted_at也应该更新。

这是我的功能

这里是触发器

当我运行时update "category" set deleted_at = now() WHERE id = 1;,所有created_atthread都会更新。我的期望是只有category_id= 1 的行会更新。

请帮我

0 投票
2 回答
16 浏览

postgresql - 将表列保留在另一个表中列的最早相关值处

我有两个相关的表。让我们调用它们event_typesoccurrences使用以下列:

我想添加一个触发器来更新first_event以防万一新occurrencetimestamp.

用例:原因是我需要event_type经常使用条件查询此表first_event并按此字段对其进行排序以获取时间范围内的表。

我尝试过这样的事情:

由于 if 子句中的 select 语句存在语法错误,这已经失败。那么如何通过触发器实现这样的更新呢?

我正在使用 Postgres > 9.5 和 10。

进一步说明:此类事件更新不会经常出现。

0 投票
1 回答
328 浏览

postgresql - 使用 Pandas 导入 .csv to_sql 的 Python 脚本失败,除非我 DROP TRIGGER 用于更新物化视图

我有一个 Postgres 数据库,其中包含一个带有物化视图的表,每次通过以下用户定义的函数和触发器对表进行更改时都会自动更新:

我有一个 python 脚本,它使用 pandas 自动将 .csv 文件导入到这个表中,只有在我 DROP TRIGGER 用于在运行之前更新物化视图时才有效。

如果我尝试在不删除触发器的情况下运行脚本,则会收到以下错误:

sqlalchemy.exc.NotSupportedError: (psycopg2.NotSupportedError) "dohscrape" 不是物化视图 CONTEXT: SQL 语句 "refresh materialized view dohscrape" PL/pgSQL function refresh_matview_dohscrapemat() line 3 at SQL statement [SQL: 'INSERT INTO dohscrape (filename , content) VALUES (%(filename)s, %(content)s)'] [parameters: ({'filename':...(此错误的背景:http ://sqlalche.me/e/tw8g )

它说“dohscrape”不是物化视图,这是正确的,因为这是表的名称而不是物化视图。物化视图被命名为“dohscrapemat”。

错误消息中的链接指向以下信息:

NotSupportedError 如果使用了数据库不支持的方法或数据库 API,则会引发异常,例如在不支持事务或关闭事务的连接上请求 .rollback()。

此错误是 DBAPI 错误,源自数据库驱动程序 (DBAPI),而不是 SQLAlchemy 本身。

但我不明白这与更新物化视图的触发器引起/相关的错误有什么关系,我认为这是根本问题,因为删除它可以解决错误。

一旦我让脚本上传到表并重新创建触发器,一切正常,但我希望能够运行此脚本而不必删除并重新创建触发器。

为什么刷新物化视图的触发器会导致导入错误?为什么 pandas/sqlalchemy/psycopg2 会将我的表与其物化视图混淆?

上传到数据库的python脚本中的代码片段是:

我正在使用 Python 3.7 和 Postgres 11。

0 投票
1 回答
1390 浏览

sql - 修改 OLD 以在 postgresql 触发函数中由 DELETE 返回

我在 postgresql 中有一个触发器函数,它将在 INSERT、UPDATE 和 DELETE 操作的审计表中插入行。在我的表中,有一个名为audit_id的列,我需要在此字段中写入插入的审计行的 ID。这是我的功能

结果,当插入或更新我的表行时,我得到了相应操作的审计 ID,但是当我运行 DELETE 命令时,我得到了前一个操作的审计 ID,而不是 DELETE 本身的审计 ID。所以我想问题出在OLD.audit_id := audit_pk;

更具体地说,例如,我运行INSERT INTO table VALUES (this, that) RETURNING audit_id并返回 INSERT 操作的 audit_id。

之后,在运行时,DELETE FROM table WHERE id = sth RETURNING audit_id我得到了 INSERT 操作的 audit_id,而不是 DELETE。

任何帮助表示赞赏,谢谢。

PS这就是我创建触发器的方式

0 投票
2 回答
1759 浏览

sql - 通过触发器更新另一个表,其中新值是 SELECT 查询的结果

我有这些表:

  • 用户
  • 技能(名称- 字符串,计数- 整数)
  • Has_skills ( Skill_id - Skills.id, user_id users.id)

Has_skills 是前两个之间的多对多表,通过这些 FK:user_id (users.id) 和 Skill_id (skills.id)。

我想要做的是在将新行插入has_skills时更新技能内的计数列。我想通过表has_skills上的更新触发器来做到这一点。我将通过选择查询获得 count 的新值:

上面的 ID 是硬编码的 (1),但它可以工作。

我还单独测试了这段代码,它可以工作(虽然也是硬编码的):

好的,所以这可能是问题所在。下面是触发器函数以及触发器本身。

功能:

扳机:

我成功创建了函数和触发器,但是当我将新数据插入has_skills时,它不会更改Skills中的计数列。可能是什么问题呢?

0 投票
1 回答
112 浏览

sql - 如何在 PostgreSQL 中注册触发器?

我有触发器和程序。我想确保保存到数据库的字符串没有“-”字符。

执行后

我收到错误

varchar(10) 的值太长。

这表明在插入更新之前没有删除“-”字符。

为什么我的触发器没有被执行?

0 投票
1 回答
592 浏览

postgresql - Postgres - 将行移动到不同的表

使用 postgres 11 我想自动将行从一个表移动到另一个表。我已经设置了查询、触发函数和触发器,但是当启用触发器时,我的测试插入失败并显示“0 0”。

  • 要从中移动行的源表是“cmdb”
  • 要将行移动到的目标表是“cmdb_attic”
  • 条件是当列'mgmt_ip' = ''
  • 整行应该移动
  • 该表仅包含 3 列:'hostname'、'mgmt_ip'、'os_type'

我拥有的触发功能代码是:

我在“cmdb”表下定义了一个触发器,该触发器在插入事件之前触发。

当我对表'cmdb'进行测试插入时,我没有收到任何错误消息,并且没有任何内容被插入到任何一个表中。

解决方案

我从 pgAdmin 中删除了我的触发器函数和触发器,并将下面提供的 Bergi 代码运行到 pgsql 中,它可以工作。

编辑 1 - 来自 pgsql 的触发器详细信息

编辑 2 - 测试插入和选择

启用触发器后,以下是我得到的。如果我禁用触发器,我的插入工作,我可以在“cmdb”中找到该行。

编辑 3 - 用于在 pgAdmin4 中创建和应用触发器函数和触发器的步骤

未列出的设置/选项卡未调整

  1. 表 > 触发函数 > 创建 > 触发函数
  2. 类型名称“move_to_attic”
  3. 代码选项卡:插入代码(来自原始帖子)
  4. 未调整其他选项/设置
  5. 表 > cmdb > 触发器 > 创建 > 触发器
  6. 类型名称“move_to_attic”
  7. 定义选项卡:触发器已启用(是)、行触发器(是)、触发器函数 public.move_to_attic
  8. 事件选项卡:之前触发,事件插入
  9. 代码选项卡:我的触发函数代码已经存在
  10. SQL 选项卡:只显示“-- 无更新”。

编辑 4 - 触发器和触发器函数的 SQL 选项卡上的输出

触发功能(使用Bergi的答案)

触发器(适用于 cmdb)

0 投票
2 回答
35 浏览

sql - How will it be in PostgreSQL?

i have code for MySQL but i need to PostgreSQL. Can you help me convert from MySQL to PostgreSQL?