PostgreSQL 使用 角色 统一管理用户和组,角色可以拥有登录权限(即用户)或仅用于权限分组(即组)。
- LOGIN:允许角色登录数据库(即用户)。
- SUPERUSER:超级用户可绕过所有权限检查,创建 / 删除数据库、角色等。
- CREATEDB:允许创建数据库。
- CREATEROLE:允许创建和修改其他角色。
- INHERIT:默认继承父角色的权限(可显式关闭)。
- VALID UNTIL:角色有效期(如
VALID UNTIL '2024-12-31')。
PostgreSQL 的权限按对象类型划分,支持以下对象的权限管理:
- CONNECT:允许连接到数据库。
- CREATE:允许在数据库中创建模式(Schema)。
- TEMPORARY(简写 TEMP):允许创建临时表。
- OWNERSHIP:对象所有者权限(自动拥有所有权限)。
- USAGE:允许访问模式中的对象(如查询表),但不能创建新对象。
- CREATE:允许在模式中创建新对象(表、视图等)。
- SELECT:读取表数据。
- INSERT:插入新数据。
- UPDATE:更新数据(可指定列,如
UPDATE (col1, col2))。
- DELETE:删除数据。
- TRUNCATE:清空表数据(需谨慎,比 DELETE 更高效)。
- REFERENCES:允许在该表上创建外键约束(针对列)。
- TRIGGER:允许在表上创建触发器。
- EXECUTE:对函数表(物化视图)的执行权限。
- USAGE:允许使用序列的
NEXTVAL 和 CURRVAL 函数。
- CREATE:允许修改序列(如重置值)。
- SELECT:允许查询序列的当前值(
CURRVAL)。
GRANT USAGE, SELECT ON SEQUENCE user_id_seq TO app_user;
GRANT EXECUTE ON FUNCTION calculate_salary() TO app_user;
- 索引权限与表权限绑定,创建索引的用户自动拥有索引权限,且无法单独授予索引权限(通过表权限间接控制)。
- 与普通表类似,额外支持
TRUSTED 权限(允许外部数据包装器绕过验证)。
REVOKE {权限列表} ON {对象} FROM {角色 | PUBLIC};
- \z(psql 命令):查看表 / 视图权限。
psql -d mydb -c "\z employees"
- 系统视图:
- PUBLIC 代表所有角色,对 PUBLIC 授权等同于对所有用户授权。
- 对象创建者自动成为所有者,可通过
ALTER OWNER 更改:
ALTER TABLE employees OWNER TO group_developer;
- 设置新创建对象的默认权限(需在会话或数据库级别配置):
- 超级用户:绕过所有权限检查,可访问任何对象。
- 普通角色:
- 检查是否拥有对象的对应权限(如
SELECT)。
- 若角色通过继承(
GRANT role TO role)获得权限,需确保父角色拥有该权限。
- 外键约束检查:创建外键时,需拥有引用表的
REFERENCES 权限。
- 最小权限原则:仅授予角色必要的权限(如只读角色不授予
INSERT)。
- 使用角色组:通过创建组角色(如
dev_group、report_group)批量管理权限,避免重复授权。
- 分离开发与生产环境:生产环境禁用
CREATE、TRUNCATE 等高危权限。
- 定期审查权限:通过
\z 或系统视图检查异常权限配置。
- 避免 PUBLIC 权限:谨慎对 PUBLIC 授权,防止未授权访问。