(欢迎提供更好或更具描述性标题的建议。)
我想知道在使用RLS(或任何其他机制)的PostgreSQL中是否可以使用以下内容。我希望用户能够更新表的某些行,如果其用户名与另一个表中的列匹配。在下面的示例中,我希望用户nene
能够更新列u
和t0
表格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)
答案 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))