PostgreSQL涉及视图或加入选择的行级安全

问题描述:

(欢迎提供更好或更具描述性标题的建议)。PostgreSQL涉及视图或加入选择的行级安全

我不知道以下是否可能在PostgreSQL中使用RLS(或任何其他机制)。我希望用户能够更新表的某些行,如果其用户名与另一个表中的列匹配的话。在下面的示例中,我希望用户nene(在表t0中显示为列u)能够更新表t2中的列ap。我想要表达的是对t2中的行应用策略,并通过以下select语句匹配: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';

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

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

  • t0CREATE 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) 
    
  • t1CREATE 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) 
    
  • t2CREATE 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) 
    

尝试

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)) 
+0

感谢。它需要在t0和t1上添加相应的权限,但这正是我需要理解这种工作方式的线索。 – JayEye