数据库角色在概念和逻辑上与操作系统的系统用户是完全解耦独立的。在实践中为了管理方便,通常可以保持两者的名称对应,但这绝非硬性要求。数据库角色在整个数据库集群实例级别全局生效(而非限制在某个单独的数据库内)。使用 CREATE ROLE SQL 命令创建新角色:
CREATE ROLE name;
其中 name 遵循标准的 SQL 标识符命名规范:可以是普通标识符,也可以使用双引号包裹。要删除现有角色,使用配套的 DROP ROLE 命令:
DROP ROLE name;
为了便于在 Shell 脚本中自动化调度,系统提供了命令行包装工具 createuser 与 dropuser:
createusernamedropusername
要查看当前集群中已存在的所有角色,可直接查询系统目录视图 pg_roles:
SELECT rolname FROM pg_roles;
或者仅筛选具备登录权限的角色账户:
SELECT rolname FROM pg_roles WHERE rolcanlogin;
在交互式客户端 psql 中,也可以直接执行元命令 \du 列出全量角色及其特权属性。
一个新初始化的数据库集群总是包含一个预定义的初始登录角色。该角色固定拥有系统超级用户(SUPERUSER)特权,并且除非在执行 initdb 时显式指定,其角色名称默认与执行初始化的操作系统用户同名(通常为 postgres)。为了创建更多业务角色,你必须首先以该初始超级用户身份连接数据库。
每一次发往数据库服务器的连接请求,都必须明确声明一个具体的角色身份,该身份确立了本次会话执行所有命令的初始访问权限。客户端通过专有方式声明连接角色,例如命令行工具 psql 通过 -U 参数指定连接角色。许多应用在缺省情况下默认尝试使用当前的操作系统登录用户名作为数据库角色名。
特定客户端连接能够成功登录哪些数据库角色,由底层的客户端认证配置文件(pg_hba.conf)严格管控,详见 Chapter 20。