第 17 章 数据库用户和权限
每个数据库集簇都包含一组数据库用户。这些用户与运行服务器的操作系统所管理的用户是相互独立的。用户拥有数据库对象(例如表),并且可以把这些对象上的权限赋予其他用户,以控制谁能访问哪些对象。
本章描述如何创建和管理用户,并介绍权限系统。关于各种数据库对象类型和权限效果的更多信息,见第 5 章。
17.1. 数据库用户 #
数据库用户在概念上与操作系统用户完全分离。实践中维持对应关系可能方便,但这不是必需的。数据库用户名在整个数据库集簇安装中是全局的(而不是每个数据库单独的)。要创建用户,使用 CREATE
USER SQL 命令:
CREATE USER name;
name 遵循 SQL 标识符的规则:要么是不带特殊字符的普通形式,要么用双引号括起。要移除现有的用户,使用类似的
DROP USER 命令:
DROP USER name;
为方便起见,提供了 createuser
和 dropuser 程序作为这些 SQL 命令的包装,可以从 shell 命令行调用:
createusernamedropusername
为了完成数据库系统的初始引导,一个刚初始化的系统总会包含一个预定义用户。该用户将拥有固定的 ID 1,并且默认情况下(除非在运行initdb时另行指定)它与初始化数据库集簇的操作系统用户同名。这个用户通常命名为postgres。要创建更多用户,必须先以这个初始用户建立连接。
每个到数据库服务器的连接中恰好只有一个用户身份处于活动状态。某个数据库连接要使用的用户名,由发起连接请求的客户端以应用特定的方式指明。例如,psql程序使用-U命令行选项来指明要以哪个用户连接。很多应用默认假定使用当前操作系统用户的名字(包括createuser和psql)。因此,在这两组用户之间维护命名对应关系通常比较方便。
给定的客户端连接可以以哪些数据库用户身份连接,由客户端认证设置决定,如第 19 章所述。(因此,客户端不一定只能以与其操作系统用户同名的用户连接,就像一个人的登录名不受其真实姓名约束一样。)由于用户身份决定了已连接客户端可用的权限集,在建立多用户环境时仔细配置这一点很重要。