为什么在 PostgreSQL 中没有 SELECT 权限,UPDATE 权限不起作用?
Why UPDATE permission does not work without SELECT permission in PostgreSQL?
如果没有SELECT permission
就不允许更新,UPDATE permission
的目的是什么?
一般来说,我理解内部更新导致select找到目标行,但是这个“内部select”不会泄露给用户,所以不清楚是bug还是这有一个“更深层的含义”。
假设最初 my_user
在 my_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
如果没有SELECT permission
就不允许更新,UPDATE permission
的目的是什么?
一般来说,我理解内部更新导致select找到目标行,但是这个“内部select”不会泄露给用户,所以不清楚是bug还是这有一个“更深层的含义”。
假设最初 my_user
在 my_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