Chapter 18. 数据库角色和权限

Table of Contents
18.1. 数据库角色
18.2. 角色属性
18.3. 权限
18.4. 角色成员
18.5. 函数和触发器

PostgreSQL 使用角色的概念管理数据库访问权限。 根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组数据库用户。 角色可以拥有数据库对象(比如,表)以及可以把这些对象上的权限赋予其它角色, 以控制谁拥有访问哪些对象的权限。另外,我们也可以把一个角色的成员 (membership)权限赋予其它角色,这样就允许成员角色使用它被赋予成员权限的角色之权限。

角色的概念替换了"用户""组"。 在 PostgreSQL 版本 8.1 之前,用户和组是独立类型的记录, 但现在它们只是角色。任何角色都可以是一个用户,一个组,或者两者皆可。

本章描述如何创建和管理角色,以及介绍权限系统。 更多各种各样数据库对象和其权限效果的信息可以在 Chapter 5 找到。

18.1. 数据库角色

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

CREATE ROLE name;

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

DROP ROLE name;

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

createuser name
dropuser name

要判断一套现有用户,检查 pg_role 系统表,比如

SELECT usename FROM pg_role;

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

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

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

一个客户端联接可以用来联接的数据库角色集合是由客户认证设置决定的, 在 Chapter 20 里面有解释。 (因此,一个客户端并不局限于以它的操作系统用户同名的角色进行联接, 就象你登录系统的名称不一定要是你的真实姓名一样。) 因为角色的身份决定了一个已连接地客户端可用的权限, 所以在多用户环境里仔细配置这些内容是非常重要的。