前提
在文档中,行级安全性似乎很棒。根据我读过的内容,我现在可以停止创建这样的视图:
SELECT data.*
FROM data
JOIN user_data
ON data.id = user_data.data_id
AND user_data.role = CURRENT_ROLE
最重要的是,Postgres 对它进行了很好的分析,view
从索引扫描开始,然后对user_data
表进行哈希连接,这正是我们想要发生的,因为它非常快。将其与我的 RLS 实现进行比较:
CREATE POLICY data_owner
ON data
FOR ALL
TO user
USING (
(
SELECT TRUE AS BOOL FROM (
SELECT data_id FROM user_data WHERE user_role = CURRENT_USER
) AS user_data WHERE user_data.data_id = data.id
) = true
)
WITH CHECK (TRUE);
这种糟糕的策略会为表中的每一行执行条件data
,而不是像我们的视图那样通过将查询范围限定为我们CURRENT_USER
有权访问的行来进行优化。需要明确的是,这意味着select * from data
命中表中的每一行data
。
问题
我如何编写一个内部策略,该内部策略未在目标表中的每一行上select
测试。换一种说法:在对结果运行实际查询之前,如何让 RLS 在目标表上运行我的策略?select
ps 我已经把这个问题留给了一些人含糊不清,主要是因为sqlfiddle还没有达到 9.5。如果我需要添加更多颜色或一些要点来解决我的问题,请告诉我。