postgresql 如何在启用RLS的情况下触发从父表向子表插入行?

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

在Supabase中,当我尝试将一行添加到父表时,我得到以下错误,这也应该触发在子表中添加相应的行:new row violates row-level security policy for table \"members\"
我有一个名为TEAM的父表和一个名为MEMBERS的子表。每个团队都是由一个所有者拥有的。每一位业主也是团队的一员。

TEAM
----
id (uuid)
owner (uuid) --> FK relationship with public.users.id

MEMBER
----
team_id (uuid) --> FK relationship with TEAM.id
member_id (uuid) --> FK relationship with public.users.id

为了实现这一点,我有一个触发器,它在TEAM表的每一行执行AFTER INSERT,并将team_id和所有者的user_id插入MEMBERS。
我有一个关于成员的RLS政策,它说只有所有者才能向团队添加成员。使用下面给出的SECURITY DEFINER SQL函数检查:
Name:is_team_owner(_team_id uuid)返回BOOL代码-

SELECT EXISTS (
  SELECT 1
  FROM members m, team t
  WHERE m.team_id = t.id
  AND t.owner_id = auth.uid()
  AND t.id = _team_id
)

我的INSERT的RLS策略是MEMBERS上的WITH CHECK(is_team_owner(_team_id))。
我的问题是,当我使用cURL创建一个新的团队时a)新的团队没有被添加到表b)我得到以下错误:new row violates row-level security policy for table \"members\"
我怀疑(a)是因为(b),这也是一个问题,因为我的触发器应该在INSERT之后运行,所以MEMBERS表中的策略违规不应该影响TEAM中的插入。
我认为(B)的发生是因为当触发插入MEMBERS时,插入TEAM还没有完成。
我该如何修正(B)?

tktrz96b

tktrz96b1#

我刚刚测试过它,如果我这样定义策略,它就能正常工作:

WITH CHECK (EXISTS
               (SELECT FROM team
                WHERE team.id = member.team_id
                  AND team.owner = auth.uid()
               )
           );

相关问题