将用户 ID 插入另一个 table 的触发器和函数

Trigger and function to insert user id into another table

我正在使用 Prisma 作为我的架构,并使用 prisma migrate dev

将其迁移到 supabase

我的 table 个人资料之一,应该引用 supabase 中的 auth.users table,在 sql 中是这样的 id uuid references auth.users not null,

既然 table 是在 supabase 中自动创建的,我还要将它添加到我的 prisma 模式中吗?它不在 public 中,也不在 auth.

model Profiles {
  id               String   @id @db.Uuid
  role             String
  subId            String
  stripeCustomerId String
  refundId         String[]
  createdAt        DateTime @default(now())
  updatedAt        DateTime @updatedAt
}

我想要这种关系的原因是因为我想要一个触发器自动 运行 一个在邀请新用户时将 id 和角色插入配置文件 table 的函数。

这是触发器和函数

-- inserts a row into public.profiles
create function public.handle_new_user() 
returns trigger 
language plpgsql 
security definer 
as $$
begin
  insert into public.Profiles (id, role)
  values (new.id, 'BASE_USER');
  return new;
end;
$$;

-- trigger the function every time a user is created
create trigger on_auth_user_created
  after insert on auth.users
  for each row execute procedure public.handle_new_user();

当我在 supabase 中手动创建配置文件 table 时,我有这个工作我包括了对 auth.users 的引用,这是我能想到为什么用户 ID 和角色不会的唯一原因'当我邀请用户时插入配置文件数据库,触发器和函数失败

create table public.Profiles (
  id uuid references auth.users not null,
  role text,

  primary key (id)
);

评论更新:
我发现的一个错误是

relation "public.profiles" does not exist

我改成了"public.Profiles",supabase里有一个大写,但是函数好像还在找小写

您显示的内容应该有效:

db<>fiddle here

看起来你用 Postgres 标识符弄乱了大写。

如果您(或您的 ORM)将 table 创建为 "Profiles"(带双引号),将保留非标准大写字母,您需要将其余名称用双引号引起来它的生命。

所以触发器函数体必须是:

...
insert into public."Profiles" (id, role)  -- with double-quotes
...

请注意,架构和 table(和列)必须 单独引用

参见:

  • Are PostgreSQL column names case-sensitive?