↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

第 22 章 数据库角色

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

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

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

22.1. 数据库角色 #

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

CREATE ROLE name;

name 遵循 SQL 标识符的规则:要么是不带特殊字符的普通标识符,要么用双引号括起。(在实际使用中,你通常会给该命令增加额外选项,例如 LOGIN。更多细节见后文。)要移除一个现有角色,可使用对应的 DROP ROLE 命令:

DROP ROLE name;

为了方便,提供了 createuser 和 dropuser 程序,作为这些 SQL 命令的包装器,可以从 shell 命令行调用:

createuser name
dropuser name

要确定现有角色的集合,请查看 pg_roles 系统目录,例如

SELECT rolname FROM pg_roles;

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

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

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

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

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.