Postgresql 如何确定分层组织中的权限?

Postgresql 如何确定分层组织中的权限?,postgresql,permissions,hierarchy,Postgresql,Permissions,Hierarchy,我正在尝试创建性能逻辑来确定分层组织中的权限 员工被分配到一个或多个单位。单元是分层的(理论上)无限深(实际上不超过6层) 例如,员工简可能是应收账款单位的主管(会计单位的子公司),也可能是道德委员会的成员(委员会的子公司,本身就是首席执行官办公室的子公司) 作为应收账款的主管,Jane应该有权查看应收账款中其他人的人事档案,但不能查看道德委员会,因为她只是成员。类似地,应收账款部门的正式员工不应该能够查看彼此的个人资料,尽管他们都需要权限,比如查看公司的会计记录 我认为这方面的数据库体系结构如

我正在尝试创建性能逻辑来确定分层组织中的权限

员工被分配到一个或多个单位。单元是分层的(理论上)无限深(实际上不超过6层)

例如,员工
可能是
应收账款
单位的
主管
(会计单位的子公司),也可能是
道德委员会
成员
(委员会的子公司,本身就是首席执行官办公室的子公司)

作为
应收账款
主管
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;