我刚刚向数据库添加了一个新的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触发器,这会阻止我更新字段,而且我没有在这里发布,因为我认为这是无关紧要的(这只是无关紧要因为我以前从未更新过表,只是插入)
答案 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;$$;