PostgreSQL使用角色这一概念来管理数据库访问权限。角色可以被看作数据库用户,也可以被看作一组数据库用户,这取决于该角色的设置方式。角色可以拥有数据库对象(例如表和函数),并且可以把这些对象上的权限赋予其他角色,以控制谁能访问哪些对象。此外,还可以把一个角色中的成员资格授予另一个角色,从而允许成员角色使用授予该角色的权限。
角色这一概念涵盖了“用户”和“组”这两个概念。在 PostgreSQL 8.1 之前的版本中,用户和组是两类不同的实体,但现在只有角色。任意角色都可以充当用户、组,或者同时充当两者。
本章描述如何创建和管理角色。有关角色权限对各种数据库对象影响的更多信息,见Section 5.7。
数据库角色在概念上与操作系统用户完全分离。在实践中,维持两者之间的对应关系可能比较方便,但这并非必需。数据库角色在整个数据库集簇安装中是全局的(而非每个数据库各自独立)。要创建角色,请使用 CREATE ROLE SQL 命令:
CREATE ROLE name;
name 遵循 SQL 标识符规则:要么不加修饰且不含特殊字符,要么用双引号括起。(在实践中,通常还需要为该命令添加其他选项,例如 LOGIN。下文会给出更多细节。)要移除现有角色,请使用类似的 DROP ROLE 命令:
DROP ROLE name;
为了方便,提供了createuser和dropuser程序,作为这些 SQL 命令的包装器,可以从 shell 命令行调用:
createusernamedropusername
要确定现有角色的集合,请查看 pg_roles 系统目录,例如
SELECT rolname FROM pg_roles;
使用 psql 程序的 \du 元命令也可以列出现有角色。
为了完成数据库系统的初始引导,一个刚初始化的系统总会包含一个预定义的可登录角色。该角色总是一个“超级用户”,并且除非另行指定了不同名称,否则它的名称与用initdb初始化数据库集簇的操作系统用户相同。这个角色通常命名为postgres。要创建更多角色,必须先以这个初始角色建立连接。
每个到数据库服务器的连接都是以某个特定角色名建立的,而这个角色决定在该连接中发出命令时的初始访问权限。某个数据库连接要使用的角色名,由发起连接请求的客户端以应用特定的方式指明。例如,psql程序使用-U命令行选项来指明要以哪个角色连接。很多应用默认假定使用当前操作系统用户的名字(包括createuser和psql)。因此,在角色名和操作系统用户名之间维护对应关系通常很方便。
某个客户端连接能够以哪些数据库角色进行连接,由客户端认证设置决定,如Chapter 20中所述。(因此,客户端并不限于只能以与其操作系统用户匹配的角色连接,正如一个人的登录名不必与其真实姓名一致。)由于角色身份决定了已连接客户端可用的权限集合,所以在设置多用户环境时,仔细配置权限非常重要。