我有一个包含 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,但我无法正确编写代码来工作。我是个初学者,所以请大家放轻松。哈哈
如果您插入到其他表中的只是新 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 ...
相关: