我有一张名为' custom_manual_edit'使用列' name',' builder'并且'标记'其中没有带主键的列。当用户更新构建器列中的任何更改时,我已写入触发器,并且该触发器将调用一个函数,该函数应将标志列值更新为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但是如何更新生成器值更改的记录的标志值。
答案 0 :(得分:0)
请查看文档:{{3}}
每个语句触发器调用的触发器函数应始终使用 返回NULL。每行触发器调用的触发器函数可以返回 调用执行程序的表行(类型为HeapTuple的值)if 他们选择。 在操作具有之前触发的行级触发器 以下选择:
它可以返回NULL以跳过当前行的操作。这个 指示执行程序不执行该行级操作 调用触发器(插入,修改或删除) 特别的表格行。)
仅对于行级INSERT和UPDATE触发器,返回的行 成为将要插入的行或将替换正在行的行 更新。这允许触发器功能修改行 插入或更新。
不打算导致其中任何一个的行级BEFORE触发器 这些行为必须小心返回,因为它的结果是同一行 传入的(即INSERT和UPDATE的NEW行) 触发器,DELETE触发器的OLD行)。
根据以上所述,您必须:
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;
.....
.....