如何根据同一表中没有任何主键列的同一表中的其他列更改更新列值



我有一个名为"custom_manual_edit"的表,其中包含"名称","生成器"和"标志"列,其中没有带主键的列。当用户更新构建器列中的任何更改时,我已经编写了一个触发器,并且该触发器将调用一个函数,该函数应将标志列值更新为 10 以记录更改构建器值 下面是我的触发器

CREATE TRIGGER builder_update_trigger_manual_custom_edits
AFTER UPDATE
ON edmonton.custom_manual_edit
FOR EACH ROW
WHEN (((old.builder)::text IS DISTINCT FROM (new.builder)::text))
EXECUTE PROCEDURE 
edmonton.automated_builder_update_trigger_manual_custom_edits();

和我的功能

CREATE OR REPLACE FUNCTION 
edmonton.automated_builder_update_trigger_manual_custom_edits()
RETURNS trigger AS
$BODY$
DECLARE
e record;
BEGIN
IF NEW.builder <> OLD.builder THEN
EXECUTE FORMAT('UPDATE edmonton.custom_manual_edit set builder_edit_flag = 10;
END IF;
RETURN NEW;
END 
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

我知道这会将整个表标志列更新为 10,但如何更新生成器值已更改的记录的标志值。

请查看文档:36.1。触发器行为概述

每语句触发器调用的触发器函数应始终 返回空值。每行触发器调用的触发器函数可以返回 表行(堆元组类型的值(到调用执行器,如果 他们选择。在操作具有 以下选择

  • 它可以返回 NULL 以跳过当前行的操作。这 指示执行程序不执行行级操作 调用触发器(插入、修改或删除 特定表行(。

  • 仅对于行级插入和更新触发器,返回的行 成为将要插入的行或将替换正在 更新。这允许触发器函数修改正在 插入或更新。

不打算导致以下任一情况的行级别 BEFORE 触发器 这些行为必须小心地返回同一行作为其结果 传入(即插入和更新的新行 触发器,删除触发器的旧行(。

根据上述规定,您必须:

  1. 将触发器声明为更新前,而不是更新
  2. 直接在 NEW 行中更改builder_edit_flag列值,而不是触发 UPDATE 语句

CREATE TRIGGER builder_update_trigger_manual_custom_edits
BEFORE UPDATE
ON edmonton.custom_manual_edit
FOR EACH ROW
.....
.....

CREATE OR REPLACE FUNCTION 
edmonton.automated_builder_update_trigger_manual_custom_edits()
.....
.....
BEGIN
IF NEW.builder <> OLD.builder THEN
NEW.builder_edit_flag = 10;
END IF;
RETURN NEW;
.....
.....

最新更新