我想知道在使用 RLS(或任何其他机制)的 PostgreSQL 中是否可以实现以下功能。如果表的 ID 与另一个表中的列匹配,我希望用户能够获取该表的某些行。
例如我们有下表:
“用户”表: 列:id,名称
| id | name |
| --- | --- |
| 1 | one |
| 2 | two |
| 3 | three|
| 4 | four |
“租户”表: 列:id,名称
| id | name |
| --- | --- |
| 1 | t1 |
| 2 | t2 |
“用户租户”表: 列:user_id, tenant_id
| user_id | tenant_id|
| --- | --- |
| 1 | t1 |
| 2 | t2 |
| 3 | t1 |
| 4 | t2 |
现在我只想要具有相同 tenant_id 的用户。
输出:
| id | name |
| --- | --- |
| 1 | one |
| 3 | three|
为此,我需要制定如下政策:
CREATE POLICY tenant_policy ON "user" USING (tenant_id = current_setting('my_user.current_tenant')::uuid);
但根据上述政策,它不起作用,因为我正在吸引所有用户。
注意:用户表和租户表是多对多关系。
P.S. 我知道我们可以通过加入或其他一些条件来做到这一点。但我想使用 RLS(行级安全性)使用 PostgreSQL 实现上述输出
提前致谢!
最佳答案
如果行级安全性不起作用,可能是因为以下情况之一:
您没有启用行级安全性:
ALTER TABLE "user" ENABLE ROW LEVEL SECURITY;
用户拥有该表
您可以为所有者启用行级安全性
ALTER TABLE "user" FORCE ROW LEVEL SECURITY;
您是 super 用户,始终不受 RLS 限制
您是使用
BYPASSRLS
定义的用户参数
row_security
设置为off
除此之外,您可能必须在您的政策中加入 user_tenant
:
CREATE POLICY tenant_policy ON "user"
USING (
EXISTS(SELECT 1 FROM user_tenant AS ut
WHERE ut.user_id = "user".id
AND ut.tenant_id = current_setting('my_user.current_tenant')::uuid
)
);
关于sql - 涉及外键与其他表的 PostgreSQL 行级安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69381358/