代码之家  ›  专栏  ›  技术社区  ›  Powercoder

PostgreSQL-在关系的策略中检测到无限递归

  •  3
  • Powercoder  · 技术社区  · 6 年前

    数据库中有3个表-部门、员工、帐户。一个部门有许多员工。员工包含列 department_id bigint 科目表包含列 login varchar , employee_id bigint 用于将Postgres用户(角色)绑定到Employee中的行。

    我的目标是让用户只查看和处理那些 department_id 与用户的相同。

    一定有这样的东西:

    CREATE POLICY locale_policy ON employee
    TO justuser, operator
    USING (department_id =
        (SELECT department_id FROM employee WHERE id =
            (SELECT employee_id FROM account WHERE login = CURRENT_USER)
        )
    )
    

    但由于员工的子查询,它正在引发 infinite recursion detected in policy for relation employee .

    编辑:关系由以下定义:

    create table department(
        id serial primary key);
    create table employee(
        id serial primary key,
        department_id int8 not null references department(id));
    create table account(
        id serial primary key,
        login varchar(100) not null unique,
        employee_id int8 not null unique references employee(id));
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Powercoder    6 年前

    我不知道这有多体面,但对我来说很管用。我在创建视图中找到了解决方案,其中是当前用户部门的id,然后检查它是否匹配:

    CREATE VIEW curr_department AS
        (SELECT department_id as id FROM employee WHERE id =
            (SELECT employee_id FROM account WHERE login = current_user)
        );
    
    CREATE POLICY locale_policy ON employee
        TO justuser, operator
        USING (department_id =
            (SELECT id FROM curr_department)
        );
    
        2
  •  0
  •   Vao Tsun    6 年前

    唉,rexter不允许创建角色。。 http://rextester.com/QDYC6798

    create table department(
        id serial primary key);
    create table employee(
        id serial primary key,
        department_id int8 not null references department(id));
    create table account(
        id serial primary key,
        login varchar(100) not null unique,
        employee_id int8 not null unique references employee(id));
    insert into department default values;
    insert into department default values;
    insert into employee (department_id ) select 1;
    insert into employee (department_id ) select 2;
    insert into account (login,employee_id) select 'justuser',1;
    insert into account (login,employee_id) select 'operator',2;
    create role justuser;
    create role operator;
    set role justuser;
    select * from employee;
    

    无法复制。这不是答案,只是一个格式化的脚本。解决后我会将其删除