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

时间:2018-03-30 13:30:44

标签: postgresql triggers

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

但是我收到了这个错误:

  

错误:要更新的元组已被当前命令
触发的操作修改   提示:考虑使用AFTER触发器而不是BEFORE触发器将更改传播到其他行。

我知道这与我添加的新AFTER触发器有某种关系,但我注意禁用它,所以我不知道为什么会发生这种情况......因为它没有& #39; t帮助,我完全删除了触发器,但我仍然无法更新表格:

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;

......出了什么问题?

ANSWER :我需要一个BEFORE触发器;此外,我有另一个错误的BEFORE ON UPDATE触发器,这会阻止我更新字段,而且我没有在这里发布,因为我认为这是无关紧要的(这只是无关紧要因为我以前从未更新过表,只是插入)

1 个答案:

答案 0 :(得分:1)

你需要一个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;$$;