无需向对象的所有者(通常是创建该对象的用户)授予权限,因为所有者默认拥有所有权限。(但是,为了安全起见,所有者可以选择撤销自己的一些特权。)
现在我有一个带有所有者用户的数据库表,但ERROR: permission denied for table alert
每当我尝试从此表中进行选择时,我都会收到:
database=# SET ROLE user;
SET
database=> select * from pg_tables where tablename = 'alert';
schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
------------+-----------+--------------------+------------+------------+----------+-------------+-------------
public | alert | user | | t | f | f | f
(1 строка)
database=> select * from alert limit 1;
ERROR: permission denied for table alert
为什么是这样?
没有额外的表权限:
database=> \z Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------------------------------------+----------+-------------------+-------------------+----------
public | alert | table | | |
此外,架构和数据库所有者已更改为用户。
为了解决这个问题,我必须这样做GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user;
,然后一切正常。
因此,重申一个问题:所有者怎么可能无法从表中进行选择?是的,我确实运行了REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM user;
,但我希望这会将权限重置为默认值,并且我的假设可能是错误的。但是,我怎样才能知道我的权限不再是默认的呢?如果我查看\z
输出,一切看起来都像之前的GRANT
/一样REVOKE
。另外,看看其他数据库,我的 select 没有问题,我没有看到\z
. 经过大量谷歌搜索后,我发现\l
输出(我想\z
)没有显示默认值。但是我怎样才能找到这个默认值呢?\ddp
输出为空,我在这里迷路了:(
预先感谢您的任何帮助。
您的期望是错误的:如果您撤销表所有者对表的所有权限,则表所有者对表没有任何权限,并且无法从中进行选择。
通过向表所有者授予所有权限,您将恢复默认值。
令人困惑的部分是
\z
或\dp
在两种情况下都显示空权限:初始状态(默认权限)和根本没有权限(您无意中创建的)。PostgreSQL v17 通过显示(none)
后一种情况来解决这个问题。