受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

Chapter 21. 数据库角色

PostgreSQL使用角色这一概念来管理数据库访问权限。角色可以被看作数据库用户,也可以被看作一组数据库用户,这取决于该角色的设置方式。角色可以拥有数据库对象(例如表和函数),并且可以把这些对象上的权限赋予其他角色,以控制谁能访问哪些对象。此外,还可以把一个角色中的成员资格授予另一个角色,从而允许成员角色使用授予该角色的权限。

角色这一概念涵盖了用户这两个概念。在 PostgreSQL 8.1 之前的版本中,用户和组是两类不同的实体,但现在只有角色。任意角色都可以充当用户、组,或者同时充当两者。

本章描述如何创建和管理角色。有关角色权限对各种数据库对象影响的更多信息,见Section 5.8

21.1. 数据库角色 #

数据库角色在概念上与操作系统用户完全独立。实践中保持两者的对应关系可能比较方便,但这并非必需。数据库角色在整个数据库集簇安装范围内都是全局的(而不是每个单独数据库各自独立)。要创建一个角色,可使用CREATE ROLE SQL 命令:

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;

或者只看那些能够登录的角色:

SELECT rolname FROM pg_roles WHERE rolcanlogin;

psql程序的\du元命令也很适合列出现有角色。

为了完成数据库系统的初始引导,一个刚初始化的系统总会包含一个预定义的可登录角色。该角色总是一个超级用户,并且除非另行指定了不同名称,否则它的名称与用initdb初始化数据库集簇的操作系统用户相同。这个角色通常命名为postgres。要创建更多角色,必须先以这个初始角色建立连接。

每个到数据库服务器的连接都是以某个特定角色名建立的,而这个角色决定在该连接中发出命令时的初始访问权限。某个数据库连接要使用的角色名,由发起连接请求的客户端以应用特定的方式指明。例如,psql程序使用-U命令行选项来指明要以哪个角色连接。很多应用默认假定使用当前操作系统用户的名字(包括createuserpsql)。因此,在角色名和操作系统用户名之间维护对应关系通常很方便。

某个客户端连接能够以哪些数据库角色进行连接,由客户端认证设置决定,如Chapter 20中所述。(因此,客户端并不限于只能以与其操作系统用户匹配的角色连接,正如一个人的登录名不必与其真实姓名一致。)由于角色身份决定了已连接客户端可用的权限集合,所以在设置多用户环境时,仔细配置权限非常重要。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。