postgresql的权限管理体系基于角色和权限的绑定实现,所有权限的分配和回收都围绕角色展开,用户本质上也是一种可登录的角色,掌握赋权操作是数据库运维和开发的基础能力。
postgresql权限管理基础概念
postgresql中的角色可以分为普通角色和登录角色,登录角色拥有登录数据库的权限,普通角色一般用于权限分组。权限分为系统权限和对象权限,系统权限比如创建数据库、创建角色的权限,对象权限比如对表进行查询、插入、更新的权限。
常用的权限操作语句有两个,分别是GRANT用于分配权限,REVOKE用于回收权限。
使用GRANT语句赋权
给角色分配系统权限
系统权限的分配语法如下:
-- 给角色分配创建数据库的权限 GRANT CREATE DATABASE TO role_name; -- 给角色分配创建角色的权限 GRANT CREATE ROLE TO role_name; -- 给角色分配超级用户权限,只有超级用户才能执行该操作 GRANT SUPERUSER TO role_name;
给角色分配对象权限
对象权限的分配需要指定具体的数据库对象,比如表、视图、序列等,语法如下:
-- 给角色分配对指定表的所有权限 GRANT ALL PRIVILEGES ON TABLE table_name TO role_name; -- 给角色分配对指定表的查询和插入权限 GRANT SELECT, INSERT ON TABLE table_name TO role_name; -- 给角色分配对指定表所有字段的更新权限 GRANT UPDATE ON TABLE table_name TO role_name; -- 给角色分配对指定序列的使用权限 GRANT USAGE, SELECT ON SEQUENCE seq_name TO role_name;
如果要给所有角色分配权限,可以把角色名替换为PUBLIC:
-- 给所有角色分配对test表的查询权限 GRANT SELECT ON TABLE test TO PUBLIC;
给角色分配数据库层级权限
除了对象权限,还可以分配数据库层级的权限:
-- 给角色分配连接数据库的权限 GRANT CONNECT ON DATABASE db_name TO role_name; -- 给角色分配在数据库中创建schema的权限 GRANT CREATE ON DATABASE db_name TO role_name;
使用REVOKE语句回收权限
当不需要某个角色拥有特定权限时,可以使用REVOKE语句回收,语法和GRANT类似:
-- 回收角色对表的插入权限 REVOKE INSERT ON TABLE table_name FROM role_name; -- 回收角色创建数据库的权限 REVOKE CREATE DATABASE FROM role_name; -- 回收所有角色对表的查询权限 REVOKE SELECT ON TABLE test FROM PUBLIC;
赋权操作注意事项
- 执行赋权操作的用户本身需要拥有对应的权限,比如给别的角色分配表的查询权限,当前用户需要是该表的属主或者拥有该表的授权选项。
- 权限分配默认不会级联,比如给角色A分配了表的查询权限,角色A再把这个权限分配给角色B,需要角色A在获得权限时带有
WITH GRANT OPTION选项。 - 删除角色之前需要先回收该角色的所有权限,或者把该角色的权限转移给其他角色,避免权限残留。
- 可以通过
du命令查看角色列表,通过dp命令查看表的权限分配情况,方便排查权限问题。
常见赋权场景示例
假设现在有一个业务用户app_user,需要给它分配app_db数据库中user_info表的查询和插入权限,操作步骤如下:
-- 连接目标数据库 c app_db -- 给app_user分配user_info表的查询和插入权限 GRANT SELECT, INSERT ON TABLE user_info TO app_user; -- 验证权限分配结果 dp user_info
如果需要回收app_user的插入权限,执行以下语句即可:
REVOKE INSERT ON TABLE user_info FROM app_user;
postgresql数据库赋权grant语句角色权限revoke语句修改时间:2026-06-29 21:03:52