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

Jay*_*Eye 6 database postgresql row-level-security relational-database

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

我想知道在 PostgreSQL 中是否可以使用 RLS(或任何其他机制)进行以下操作。如果用户名与另一个表中的列匹配,我希望用户能够更新表的某些行。在下面的示例中,我希望在 table 中nene显示为列的user能够更新列 和table 。我想表达的是将策略应用于 t2 中的行,该行将由以下 select 语句匹配: ut0apt2SELECT a, p FROM t2 INNER JOIN t1 ON (t2.t1id = t1.id) INNER JOIN t0 ON (t1.t0id = t0.id) WHERE t0.u = 'nene';

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

这是我的三个表(在实际情况中字段更多,表 t1 无法排除问题;我将其留在示例中,因为需要两个连接可能会改变解决方案空间)。

  • 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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 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)
    
    Run Code Online (Sandbox Code Playgroud)
  • t2是用创建的CREATE TABLE t2 (id TEXT, t1id TEXT REFERENCES t1(id), a INET, p INT);,现在包含

    => SELECT * FROM t2;
      id  | t1id |      a      |   p   
    ------+------+-------------+-------
     1264 | x99  |             |      
     1267 | zy49 |             |      
     1842 | l2l  | 192.0.200.3 | 31337
     1234 | x99  | 10.0.0.89   |    23
    (4 rows)
    
    Run Code Online (Sandbox Code Playgroud)

小智 6

尝试

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))
Run Code Online (Sandbox Code Playgroud)