PostgreSQL行级安全性涉及视图或带连接的选择

时间:2016-12-28 03:02:11

标签: database postgresql relational-database row-level-security

(欢迎提供更好或更具描述性标题的建议。)

我想知道在使用RLS(或任何其他机制)的PostgreSQL中是否可以使用以下内容。我希望用户能够更新表的某些行,如果其用户名与另一个表中的列匹配。在下面的示例中,我希望用户nene能够更新列ut0表格1}}。我要表达的是将策略应用于t2中与以下select语句匹配的行:a

这可能吗?有关如何进行的任何建议?一个明显的解决方法是复制表t2上的用户名,但这会在t2上添加无关的信息,并需要额外的约束来强制执行。

这是我的三个表(在实际情况中还有更多的字段,表t1不能从问题中分解出来;我在示例中留下了它,因为需要两个连接可能会改变解决方案空间。)

  • p是使用t2创建的,现在包含:

    SELECT a, p FROM t2 INNER JOIN t1 ON (t2.t1id = t1.id) INNER JOIN t0 ON (t1.t0id = t0.id) WHERE t0.u = 'nene';
  • t0是使用CREATE TABLE t0 (id TEXT PRIMARY KEY, u TEXT UNIQUE, pn TEXT);创建的,现在包含:

    => SELECT * FROM t0;
      id  |  u  |  pn  
    ------+------+------
     b321 | toto | fifi
     a421 | nene | xuxu
    (2 rows)
    
  • t1是使用CREATE TABLE t1 (id TEXT PRIMARY KEY, t0id TEXT REFERENCES t0(id), pn TEXT);创建的,现在包含

    => SELECT * FROM t1;
     id  | t0id |  pn  
    ------+------+------
    x99  | a421 | lala
    zy49 | a421 | popo
    l2l  | b321 | nipa
    (3 rows)
    

1 个答案:

答案 0 :(得分:2)

尝试

CREATE POLICY t2_policy_update ON t2 FOR UPDATE
    USING (EXISTS (SELECT * FROM t1 INNER JOIN t0 ON (t1.t0id = t0.id) WHERE t0.u = session_user AND t1id = t1.id))