7

(より良い、またはよりわかりやすいタイトルの提案を歓迎します)。

RLS(またはその他のメカニズム)を使用して、PostgreSQLで次のことが可能かどうか疑問に思います。ユーザー名が別のテーブルの列と一致する場合、ユーザーがテーブルの特定の行を更新できるようにします。次の例では、 tableのnenecolumn として表示されるuserが、 columnおよびtableを更新できるように します。私が表現したいのは、次の select ステートメントによって一致する t2 の行にポリシーを適用することです。 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 に余分な情報が追加され、強制するための追加の制約が必要になります。

これが私の 3 つのテーブルです (実際の状況では、さらに多くのフィールドがあり、テーブル t1 を問題から除外することはできません。2 つの結合が必要になるとソリューション スペースが変わる可能性があるため、この例では残しました)。

  • テーブル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)
    
  • テーブル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)
    
4

1 に答える 1

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))
于 2016-12-28T07:21:04.687 に答える