PostgreSQL权限机制解析:查询表所需权限是否正确?
PostgreSQL权限机制运作及查询表所需权限
一、PostgreSQL权限机制的运作逻辑
PostgreSQL的权限体系围绕**角色(Role)**展开,权限可直接授予单个角色,也能通过角色继承实现批量传递。权限管控分为多个层级,从高到低依次为:
- 数据库级:控制角色能否连接到目标数据库
- 模式级:控制角色能否访问模式下的各类对象
- 对象级:针对表、视图、函数等具体对象,控制角色的操作权限(如查询、修改、删除等)
所有对象的权限默认仅授予其创建者(所有者),其他角色需通过GRANT命令获得显式授权后,才能执行对应操作。
二、查询表所需权限的正确性验证
你列出的查询表所需权限完全正确,各权限的作用如下:
- 数据库的CONNECT权限:是连接到目标数据库的基础权限,没有该权限无法建立数据库连接,自然无法访问库内的表。默认情况下,
public角色会被授予所有数据库的CONNECT权限,普通用户通常会继承该权限。 - 模式的USAGE权限:要访问模式下的表,必须拥有该模式的USAGE权限,否则无法看到模式内的对象,执行查询时会提示“不存在该表”。默认仅模式所有者拥有该权限,其他角色需通过
GRANT USAGE ON SCHEMA 模式名 TO 角色名;授予。 - 表的SELECT权限:这是查询表数据的核心权限,默认仅表所有者拥有,需通过
GRANT SELECT ON TABLE 表名 TO 角色名;显式授予其他角色,使其能执行SELECT语句查询表数据。
权限验证小技巧
可以用以下命令快速验证权限:
- 查看表的权限:
\dp 表名(psql命令行工具) - 验证数据库CONNECT权限:
SELECT has_database_privilege('你的用户名', '目标数据库名', 'connect'); - 验证模式USAGE权限:
SELECT has_schema_privilege('你的用户名', '目标模式名', 'usage'); - 验证表SELECT权限:
SELECT has_table_privilege('你的用户名', '目标表名', 'select');
内容的提问来源于stack exchange,提问作者Paku
相关产品推荐
相关产品推荐

