PostgreSQL 16.0权限校验异常及跨集群权限查询问题
问题原因分析
1. \z命令查不到权限但information_schema.role_table_grants能查到
- \z命令的显示规则限制:PostgreSQL的
\z(或等效的\dp)元命令仅显示直接绑定到表对象的权限条目,且仅展示当前用户有权限查看的权限信息。比如你用dev1执行\z时,若不是超级用户、表所有者data_migration,也没有明确权限查看其他角色的权限,就看不到data_migration_ro的权限条目;而information_schema.role_table_grants会包含批量授予、角色继承的权限,因此能正常查询到。 - 未指定Schema前缀:如果执行
\z时仅输入my_table,未添加dm_backup.前缀,且当前搜索路径不包含dm_backup,PostgreSQL会找不到目标表,自然无权限结果返回。正确命令应为\z dm_backup.my_table。 - 权限被覆盖:若表所有者
data_migration在你授权后,手动修改过my_table的权限(比如撤销过相关权限),会覆盖之前通过GRANT SELECT ON ALL TABLES批量授予的权限,导致\z无法显示。
2. 非自建集群中postgres用户查询information_schema.role_table_grants失效
- 云厂商的权限裁剪:多数云托管PostgreSQL集群(如RDS类服务)会对默认
postgres用户做权限限制,不会赋予完整的超级用户权限,可能禁止其查看其他用户创建的Schema下的权限信息,导致查询返回空结果。 - Schema权限缺失:如果非自建集群里
postgres未被授予dm_backupSchema的USAGE权限,即使是管理员用户也无法查询该Schema下的表权限,需先执行GRANT USAGE ON SCHEMA dm_backup TO postgres;再尝试查询。 - 视图的过滤逻辑:
information_schema.role_table_grants本身会过滤掉当前用户无权访问的对象。若postgres在非自建集群中对dm_backup.my_table无任何访问权限,视图会直接返回空结果。
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

