Plpgsql,如何在多个表中插入新行?

问题描述 投票:0回答:1

我有一个包含 10 个表的 supabase plpgsql 数据库。我也有 auth.users。我正在尝试编写一个函数,当新用户注册时,它将在 10 个 public.tables 中的每一个中插入一个新行。我已经使用了安全定义器并且有一个可以正常工作的函数,但它只允许我插入 public.table1 ,如果我尝试向该函数添加其他公共表,那么它会失败。

我将所有 RLS 设置为允许所有,我还尝试了 2 个单独的函数,其中两个函数都使用 auth.user 表中的触发器,其中一个函数写入 public.table1 ,而另一个触发器和函数写入 public.table2 ,但是什么都没有似乎有效。我对 plpgsql 不太熟悉,所以如果有人可以向我展示编写代码的正确方法,我将不胜感激。我现在所拥有的有效,但仅适用于一个公共表插入,如下

    Begin
      Insert into    public.tableone(id)
Values (new.id);
Returns new;

我确信还有另一种方法可以做到这一点,例如 CTE,但我无法正确编写代码来工作。我是个初学者,所以请大家放轻松。哈哈

postgresql plpgsql multiple-tables supabase-database
1个回答
0
投票

如果您插入到其他表中的只是新 ID,则不需要 CTE。

-- trigger function
CREATE OR REPLACE FUNCTION public.trg_users_insert_after()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   INSERT INTO public.tableone(id) VALUES (NEW.id);
   INSERT INTO public.tabletwo(id) VALUES (NEW.id);
-- more?   

   RETURN NULL;  -- note correct syntax!
END
$func$;

-- trigger
CREATE TRIGGER my_trigger
AFTER INSERT ON public.users
FOR EACH ROW EXECUTE FUNCTION public.trg_users_insert_after();

在 Postgres 11 之前的旧版本中,使用旧的(误导性的)语法:

...
FOR EACH ROW EXECUTE PROCEDURE ...

相关:

© www.soinside.com 2019 - 2024. All rights reserved.