我有以下表格:
CREATE TABLE public.permissions (
"user" varchar ,
"action" permissions_action_enum, -- 'read'/'write'
id ltree
);
CREATE TABLE public.items (
"path" ltree NULL,
id uuid NOT NULL,
);
我想返回用户有权查看的所有行,如果用户有权访问该项目或其祖先之一,则他有权访问该项目。例如:
public.permissions:
user |action|id |
-----------|------|---|
1 |read |a |
1 |read |d |
public.items:
path |id |
-----------|---|
a.b |b |
a.c |c |
e.d |d |
g.f |f |
根据以上数据,用户对项目(b、c、d)有权限。
我想创建一个连接上述表的查询并返回用户有权访问的所有项目,read
预期结果是:
path |id |
-----------|---|
a.b |b |
a.c |c |
e.d |d |
有一种有效的方法来搜索是否ltree
包含其他ltree
?或者如果ltree
是另一个条目的孩子?*.a.*
类似在lquery
列之间但在列之间的东西。
我尝试使用<@/@>
,但它们仅适用于检查根/项目:
select 'a.b'::ltree <@ 'b'::ltree -- false
select 'a.b'::ltree <@ 'a'::ltree -- true
select 'a.b'::ltree @> 'b'::ltree -- false
select 'a.b'::ltree @> 'a'::ltree -- false