如何解决在插入之前语句级触发器不起作用
以下我已执行的语句:
create table tab1(id int,name varchar(10),city varchar(10),latest bool default true);
CREATE OR REPLACE FUNCTION public.updateoldrow()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
begin
update tab1 set latest ='0' where name = new.name and city = new.city and latest = '1';
RETURN NEW;
END;
$function$
;
create trigger trig_updateoldrow before
insert
on
public.tab1 for each statement execute procedure updateoldrow();
insert into tab1 values(1,'Shiwangini','xyz','true');
insert into tab1 values(2,'true');
我创建了一个表+函数(用相同的匹配值条件将旧记录更新为'false')+然后创建了一个语句级触发器(在插入之前)->然后在其中插入了2条测试记录。 现在,当我运行“从tab1中选择*;”根据期望,id = 1的第一个值应设置为“ false”。但是,这没有发生。我还检查了插入语句的执行计划,因此它正在调用触发器:
explain (analyze true,verbose,costs,buffers)insert into tab1
values(2,'true');
Insert on public.tab1 (cost=0.00..0.01 rows=1 width=81) (actual time=0.113..0.113 rows=0
loops=1)
Buffers: shared read=1 dirtied=1
-> Result (cost=0.00..0.01 rows=1 width=81) (actual time=0.001..0.001 rows=1 loops=1)
Output: 2,'Shiwangini'::character varying(10),'xyz'::character varying(10),true
Planning Time: 0.020 ms
Trigger trig_updateoldrow: time=0.060 calls=1
Execution Time: 0.128 ms
但是,如果我要通过行级触发器来实现相同的目的,则可以正常工作并更新旧值。
在这里,我不明白为什么语句级触发器未按预期执行。任何原因都将不胜感激。
解决方法
doc说
新
数据类型为RECORD;在行级触发器中保存用于INSERT / UPDATE操作的新数据库行的变量。 此变量在语句级触发器和DELETE操作中为空。
由于NEW
为空,因此更新无法正常进行。您确实需要一个行级触发器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。