Chapter 17. 数据库用户和权限

Table of Contents
17.1. 数据库用户
17.2. 用户属性
17.3.
17.4. 权限
17.5. 函数和触发器

每个数据库集群都包含一个数据库用户的集合。 这些用户是和那些在同一个服务器上运行的操作系统的用户相独立的。 用户拥有数据库对象(比如说,表)以及可以把这些对象的权限赋予其它用户,这样就能控制谁可以访问哪些对象。

本章描述如何创建和管理用户,以及介绍权限系统。 有关各种类型的数据库对象和权限的效果可以在 Chapter 5 中找到。

17.1. 数据库用户

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

CREATE USER name;

name 遵循 SQL 标识的规则: 要么完全没有特殊字符,要么用双引号引起。 要删除一个现有用户,使用类似的命令 DROP USER

DROP USER name;

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

createuser name
dropuser name

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

SELECT usename FROM pg_user;

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

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

一个和数据库的活跃连接只能有一个用户身份进行。 和特定数据库联接的用户名是由初始化联接请求的应用以应用相关的方式声明的, 比如,psql 程序使用-U命令行选项声明它代表的进行联接的用户。 许多应用以当前操作系统的用户名为缺省(这样的应用包括 createuserpsql)。 这样我们就可以很方便地维护这两个用户集合之间地映射关系。

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