当前命令触发的操作已经修改了要更新的元组



我刚刚在数据库中添加了一个新的后触发器,我当前正在尝试使用一些计算的布尔来更新现有表的新列。

但是我遇到了这个错误:

错误:要更新的元组已经通过当前命令触发的操作进行了修改
提示:考虑使用后触发器而不是触发前触发以传播对其他行的更改。

我了解这与我添加的新触发器有关,但我谨慎 disable it,所以我不为什么会发生...帮助,我完全删除了触发器,但我仍然无法更新表:

CREATE TABLE public.extractions_2
(
    id bigint NOT NULL DEFAULT nextval('extractions_2_id_seq'::regclass),
    settling_bank text,
    created_at timestamp without time zone,
    is_prehedge boolean,
    --many more irrelevant columns...
    CONSTRAINT extractions_2_pkey PRIMARY KEY (id),
    CONSTRAINT extractions_2_filecode_created_at_key UNIQUE (filecode, created_at)
)
WITH (
  OIDS=FALSE
);
-- Trigger: set_is_prehedge on public.extractions_2
-- DROP TRIGGER set_is_prehedge ON public.extractions_2;
CREATE TRIGGER set_is_prehedge
  AFTER INSERT
  ON public.extractions_2
  FOR EACH ROW
  EXECUTE PROCEDURE public.set_is_prehedge();
ALTER TABLE public.extractions_2 DISABLE TRIGGER set_is_prehedge;
CREATE OR REPLACE FUNCTION public.set_is_prehedge()
  RETURNS trigger AS
$BODY$
begin
update NEW
set NEW.is_prehedge= case when(NEW.settling_bank LIKE '%PRE HEDGE%') THEN true ELSE false END;
return NEW;
end;

我试图简单地更新表:

update extractions_2 set 
is_prehedge = case when(settling_bank LIKE '%PRE HEDGE%') THEN true ELSE false END;

...怎么了?

答案:我需要触发前一个;此外,我在更新触发器之前有其他错误,这会阻止我更新字段,并且我在这里没有发布,因为我认为这是无关紧要的(这只是无关紧要的,因为我从未更新桌子,只插入了((

您想要一个 BEFORE INSERT触发。

而不是尝试使用UPDATE,您要做的就是将适当的值分配给NEW

CREATE OR REPLACE FUNCTION public.set_is_prehedge()
  RETURNS trigger LANGUAGE plpgsql AS
$$BEGIN
   NEW.is_prehedge := (NEW.settling_bank LIKE '%PRE HEDGE%');
   RETURN NEW;
END;$$;

最新更新