1. PostgreSQL 的角色(Role)与用户(User)的差异,CREATE ROLE vs CREATE USER?
请解释 PostgreSQL 中角色(Role)与用户(User)的区别,以及 CREATE ROLE 与 CREATE USER 两个命令的差异?
- 角色与用户的统一模型
- CREATE ROLE 与 CREATE USER 的语法差异
- LOGIN 属性与角色管理
PostgreSQL 中角色(Role)与用户(User)本质上是同一个概念,二者都存储在 pg_roles 中。区别仅在于 CREATE USER 等价于 CREATE ROLE ... LOGIN,即创建用户时默认赋予 LOGIN 属性(允许登录),而 CREATE ROLE 默认不具备 LOGIN 属性。用户就是具有 LOGIN 属性的角色,角色可以包含其他角色(通过 GRANT 或 INHERIT 实现角色继承),现代 PostgreSQL 中"用户"和"角色"都是角色,只是按是否允许登录来区分。
这种统一模型简化了权限管理——可以把角色当作一组权限的集合,赋给具体用户,实现权限的集中管理。实际中创建只用于登录的账号用 CREATE USER,创建用于权限分组的账号用 CREATE ROLE。
CREATE ROLE app_role; -- 不可登录,仅作权限分组
CREATE USER app_user WITH PASSWORD 'x'; -- 等价于 CREATE ROLE ... LOGIN
GRANT app_role TO app_user; -- 用户继承角色权限