gpt4 book ai didi

sql - 涉及外键与其他表的 PostgreSQL 行级安全性

转载 作者:行者123 更新时间:2023-12-05 03:37:14 25 4
gpt4 key购买 nike

我想知道在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com