20.1. 数据库角色

数据库角色从概念上与操作系统用户是完全无关的。在实际使用中把它们对应起来可能比较方便, 但这不是必须的。数据库角色在整个数据库集群中是全局的(而不是每个库不同)。 要创建一个角色,使用 SQL 命令CREATE ROLE执行:

CREATE ROLE name;

name遵循 SQL 标识的规则:要么完全没有特殊字符, 要么用双引号包围(实际上你通常会给命令增加额外的选项,比如LOGIN。 下面显示更多细节)。要删除一个现有角色,使用类似的DROP ROLE命令:

DROP ROLE name;

为了方便,程序createuserdropuser 提供了对了这些 SQL 命令的封装。我们可以在 shell 命令上直接调用它们:

createuser name
dropuser name

要检查现有角色的集合,可以检查pg_roles系统表,比如:

SELECT rolname FROM pg_roles;

psql的元命令\du也可以用于列出现有角色。

为了能创建初始数据库系统,新建立的数据库总是包含一个预定义的"超级用户"角色, 并且缺省时(除非在运行initdb时更改过) 他将和初始化该数据库集群的用户有相同的名称。通常,这个角色名叫postgres。 为了创建更多角色,你必须首先以这个初始用户角色连接。

每一个和数据库的连接都必须用一个角色身份进行,这个角色决定在该连接上的初始权限。 特定数据库连接的角色名是在初始化连接请求的时候声明的。比如,psql 程序使用-U命令行选项声明它代表的角色。 许多应用以当前操作系统的用户名为缺省角色名(这样的应用包括createuserpsql)。 所以,在系统用户和数据库角色之间有某种命名关系会让我们工作方便很多。

一个客户端连接可以使用的角色集合是由客户认证设置决定的, 在第 19 章里面有解释。因此, 一个客户端并不局限于以它的操作系统用户匹配的角色进行连接, 就像你登录系统的名称不一定要是你的真实姓名一样。因为角色的身份决定了一个连接的权限, 所以在多用户环境里仔细配置这些内容是非常重要的。