我想知道在PostgreSQL中是否可以使用RLS(或任何其他机制)实现以下功能。如果用户的ID与另一个表中的某个列匹配,我希望用户能够获取表的某些行。
例如,我们有以下表:
"user"表: 列:id、姓名
为了实现这个目标,我需要创建类似以下的策略:
例如,我们有以下表:
"user"表: 列:id、姓名
| id | name |
| --- | --- |
| 1 | one |
| 2 | two |
| 3 | three|
| 4 | four |
"租户"表: 列:id、名称
| id | name |
| --- | --- |
| 1 | t1 |
| 2 | t2 |
"user_tenant"表: 列:用户ID,租户ID
| user_id | tenant_id|
| --- | --- |
| 1 | t1 |
| 2 | t2 |
| 3 | t1 |
| 4 | t2 |
我只想要与当前用户相同租户ID的用户。
| id | name |
| --- | --- |
| 1 | one |
| 3 | three|
为了实现这个目标,我需要创建类似以下的策略:
CREATE POLICY tenant_policy ON "user" USING (tenant_id = current_setting('my_user.current_tenant')::uuid);
使用上述策略后,它并没有按预期工作,因为我得到了所有用户。
注意: 用户和租户表之间有多对多关系。
附言: 我知道我们可以通过连接或其他条件来实现这一点。但我想使用PostgreSQL和RLS(行级安全)实现上述输出。
提前感谢!!
CREATE POLICY tenant_policy ON "user" USING ( EXISTS(SELECT 1 FROM user_tenant AS ut WHERE ut.user_id = id AND ut.tenant_id = current_setting('my_user.current_tenant')::uuid ) );
当我运行该策略时,在数据库中它显示为:(EXISTS ( SELECT 1 FROM user_tenant ut WHERE ((ut.user_id = ut.id) AND (ut.tenant_id = (current_setting('app_user.current_tenant'::text))::uuid))))
- piyushid
。 - Laurenz Albe