我刚刚在数据库中添加了一个新的后触发器,我当前正在尝试使用一些计算的布尔来更新现有表的新列。
但是我遇到了这个错误:
错误:要更新的元组已经通过当前命令触发的操作进行了修改
提示:考虑使用后触发器而不是触发前触发以传播对其他行的更改。
我了解这与我添加的新触发器有关,但我谨慎 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;$$;