(より良い、またはよりわかりやすいタイトルの提案を歓迎します)。
RLS(またはその他のメカニズム)を使用して、PostgreSQLで次のことが可能かどうか疑問に思います。ユーザー名が別のテーブルの列と一致する場合、ユーザーがテーブルの特定の行を更新できるようにします。次の例では、 tableのnene
column として表示されるuserが、 columnおよびtableを更新できるように します。私が表現したいのは、次の select ステートメントによって一致する t2 の行にポリシーを適用することです。 u
t0
a
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';
これは可能ですか?続行する方法について何か提案はありますか? 明らかな回避策は、テーブル 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)