为什么在 PostgreSQL 中没有 SELECT 权限,UPDATE 权限不起作用?

Why UPDATE permission does not work without SELECT permission in PostgreSQL?

如果没有SELECT permission就不允许更新,UPDATE permission的目的是什么?

一般来说,我理解内部更新导致select找到目标行,但是这个“内部select”不会泄露给用户,所以不清楚是bug还是这有一个“更深层的含义”。

假设最初 my_usermy_schema 上只有 USAGE 而在 my_table

上没有授权

案例一:

GRANT UPDATE ON TABLE my_schema.my_table TO my_user;

UPDATE my_table
   SET my_col = 'X';

>> SQL Error [42501]: ERROR: permission denied for table my_table

案例二:

GRANT SELECT ON TABLE my_schema.my_table TO my_user;
GRANT UPDATE ON TABLE my_schema.my_table TO my_user;

UPDATE my_table
   SET my_col = 'X';

>> SUCCESS

您关于“内部select”不会泄露给用户的假设是错误的。

returning 关键字非常强大,可用于代理 select 语句:

UPDATE my_table
SET my_col = my_col
RETURNING *;

--> 将显示与 select * from my_table

相同的内容

但是,只需要 select 权限,因为读取 my_col 的值。如果您改用常量,它将仅使用 update 权限,并且不会让您 return 该行。

REVOKE select ON my_table FROM my_user;

update my_table set my_col =1;
UPDATE 7
update my_table set my_col =1 returning *;
ERROR:  permission denied for table test