我有一个函数:
begin
if pg_trigger_depth() <> 1 then
return new;
end if;
new.rating = ROUND((new.total_score / new.total_reviews), 1);
return new;
end;
这个函数必须在每次更新route
表时更新route
表中的rating
列。现在,如果触发,total_score
和total_reviews
的查询将得到更新,但列rating
保持不变。我的意思是,没有计算,它永远不会改变。不管我在需要的列中有什么值。
表route
定义:
create table
public.route (
id bigint generated by default as identity not null,
name text null,
country text null,
city text null,
description text null,
imageName text null,
created_at timestamp with time zone null default now(),
total_reviews numeric null,
total_score numeric null,
duration numeric not null default '30'::numeric,
rating double precision null,
isAdult boolean not null default false,
constraint route_pkey primary key (id)
) tablespace pg_default;
create trigger update_route_rating_trigger
after insert
or
update on route for each row
execute function update_route_rating ();
route
上的RLS策略:
策略名称:allow_update_on_route
目标角色:公众
使用表达式:真的
WITH CHECK表达式:真的
策略名称:授权用户可从路由表中选择
目标角色:公众
使用表达式:(auth.role()= 'authenticated'::text)
1条答案
按热度按时间e4yzc0pl1#
正如@Belayer所说,我的解决方案不起作用,因为它有
after row trigger
和***一个after触发器不能改变数据值***,所以这就是为什么在这个解决方案中,我应该使用before row trigger
。此外,最佳工作解决方案(IMHO)是
generated-columns
,正如@dshukertjr所说。以下是生成的列文档的链接,以获取帮助:postgresql.org/generated-columns