我想创建一个依赖于同一表中其他记录的策略。例如,假设有以下联结表:
project_id | user_id
------------+----------
1 | 1
------------+----------
1 | 2
------------+----------
2 | 2
我想阻止用户选择与其不相关的项目相关的记录,并允许选择其余的。
就像是:
CREATE POLICY project_user_read ON project_user FOR SELECT
USING(
project_id IN(
SELECT project_id
FROM project_user
WHERE user_id = current_setting('app.current_user_id')::bigint ---> I use runtime variables
)
);
这将导致这种方式:
SET app.current_user_id = 1;
SELECT * FROM project_user;
-- project_id | user_id
-- ------------+----------
-- 1 | 1
-- ------------+----------
-- 1 | 2
这显然不起作用,因为它是一个循环条件。
有没有办法用 RLS 实现这样的逻辑?
您可以创建一个避免无限循环的函数:
然后像这样创建策略: