Postgresql 如何确定分层组织中的权限?
我正在尝试创建性能逻辑来确定分层组织中的权限 员工被分配到一个或多个单位。单元是分层的(理论上)无限深(实际上不超过6层) 例如,员工Postgresql 如何确定分层组织中的权限?,postgresql,permissions,hierarchy,Postgresql,Permissions,Hierarchy,我正在尝试创建性能逻辑来确定分层组织中的权限 员工被分配到一个或多个单位。单元是分层的(理论上)无限深(实际上不超过6层) 例如,员工简可能是应收账款单位的主管(会计单位的子公司),也可能是道德委员会的成员(委员会的子公司,本身就是首席执行官办公室的子公司) 作为应收账款的主管,Jane应该有权查看应收账款中其他人的人事档案,但不能查看道德委员会,因为她只是成员。类似地,应收账款部门的正式员工不应该能够查看彼此的个人资料,尽管他们都需要权限,比如查看公司的会计记录 我认为这方面的数据库体系结构如
简
可能是应收账款
单位的主管
(会计单位的子公司),也可能是道德委员会
的成员
(委员会的子公司,本身就是首席执行官办公室的子公司)
作为应收账款
的主管
,Jane
应该有权查看应收账款
中其他人的人事档案,但不能查看道德委员会
,因为她只是成员
。类似地,应收账款
部门的正式员工不应该能够查看彼此的个人资料,尽管他们都需要权限,比如查看公司的会计记录
我认为这方面的数据库体系结构如下所示:
| **employees** | **units** | **positions** | **assignments** | **permissions** |
| ------------- | ----------- | ------------- | --------------- | --------------- |
| id | id | id | employee_id | unit_id |
| name | name | title | unit_id | is_management |
| | parent_path | is_management | position_id | ability |
create function permissions(actor employees, subject employees) returns setof permissions as $$
begin
for unit_id in select unit_id from assignments where employee_id = subject.id loop
select permissions.name
from assignments
left join units on (unit.id = assignments.unit_id)
left join positions on (positions.id = assignments.position_id)
left join permissions on (
permissions.unit_id = units.id
and permissions.is_management = positions.is_management
)
where assignments.user_id = actor.id
and (units.parent_path = unit_id or units.parent_path @> unit_id)
end loop;
end;
$$ language plpgsql stable;
考虑到这一点,我如何编写性能查询,以确定Jane在应收账款中拥有的Sam
、会计、而在首席执行官办公室拥有的Bill
、接待员的权限
最接近我的是:
| **employees** | **units** | **positions** | **assignments** | **permissions** |
| ------------- | ----------- | ------------- | --------------- | --------------- |
| id | id | id | employee_id | unit_id |
| name | name | title | unit_id | is_management |
| | parent_path | is_management | position_id | ability |
create function permissions(actor employees, subject employees) returns setof permissions as $$
begin
for unit_id in select unit_id from assignments where employee_id = subject.id loop
select permissions.name
from assignments
left join units on (unit.id = assignments.unit_id)
left join positions on (positions.id = assignments.position_id)
left join permissions on (
permissions.unit_id = units.id
and permissions.is_management = positions.is_management
)
where assignments.user_id = actor.id
and (units.parent_path = unit_id or units.parent_path @> unit_id)
end loop;
end;
$$ language plpgsql stable;