postgresql Supabase函数不执行任何计算

lg40wkob  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

我有一个函数:

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_scoretotal_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)

e4yzc0pl

e4yzc0pl1#

正如@Belayer所说,我的解决方案不起作用,因为它有after row trigger和***一个after触发器不能改变数据值***,所以这就是为什么在这个解决方案中,我应该使用before row trigger
此外,最佳工作解决方案(IMHO)是generated-columns,正如@dshukertjr所说。
以下是生成的列文档的链接,以获取帮助:postgresql.org/generated-columns

相关问题