PostgreSQL 教程: CREATE ROLE 创建角色

九月 12, 2023

摘要:在本教程中,您将了解 PostgreSQL 角色以及如何使用CREATE ROLE语句创建新角色。

PostgreSQL Roles

PostgreSQL 使用角色来表示用户帐户。它不像其他数据库系统那样使用用户概念。

通常,可以登录的角色称为登录角色。他们相当于其他数据库系统中的用户。

当角色包含其他角色时,它们被称为组角色。

请注意,从 8.1 版本开始,PostgreSQL 将用户和组合并为角色。

PostgreSQL CREATE ROLE 语句

要创建新角色,请使用CREATE ROLE语句,如下:

CREATE ROLE role_name;

创建角色后,该角色在数据库服务器(或实例)中的所有数据库中都有效。

以下语句使用CREATE ROLE语句创建一个名为bob的新角色:

CREATE ROLE bob;

要获取当前 PostgreSQL 数据库服务器中的所有角色,可以从pg_roles系统视图中查询,如下所示:

SELECT rolname FROM pg_roles;

输出:

          rolname
---------------------------
 pg_monitor
 pg_read_all_settings
 pg_read_all_stats
 pg_stat_scan_tables
 pg_read_server_files
 pg_write_server_files
 pg_execute_server_program
 pg_signal_backend
 postgres
 bob

请注意,以pg_开头的角色是系统角色。

如果您使用psql工具,则可以使用\du命令列出当前 PostgreSQL 数据库服务器中的所有现有角色。

\du

输出:

                                  List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 bob       | Cannot login                                               | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

从输出中可以清楚地看到,角色bob无法登录。

为了允许角色bob登录 PostgreSQL 数据库服务器,需要为其添加LOGIN属性。

角色属性

角色的属性定义了该角色的权限,包括登录、超级用户、数据库创建、角色创建、密码等:

CREATE ROLE name WITH option;

在此语法中,WITH关键字是可选的。option可以是SUPERCREATEDBCREATEROLE等一个或多个属性。

1) 创建登录角色

例如,以下语句创建一个名为alice的角色,该角色具有登录权限和初始密码:

CREATE ROLE alice 
LOGIN 
PASSWORD 'securePass1';

请注意,您将密码放在单引号 (') 中。

现在,您可以使用角色alice通过psql客户端工具登录 PostgreSQL 数据库服务器:

psql -U alice -W postgres

它会提示您输入密码。您需要输入您在CREATE ROLE语句中输入的密码。

2) 创建超级用户角色

以下语句创建一个名为john的角色,该角色具有超级用户属性。

CREATE ROLE john 
SUPERUSER 
LOGIN 
PASSWORD 'securePass1';

超级用户可以突破数据库内的所有访问限制,因此您应该仅在需要时创建此角色。

请注意,您必须是超级用户才能创建另一个超级用户角色。

3) 创建可以创建数据库的角色

如果要创建具有数据库创建权限的角色,可以使用CREATEDB属性:

CREATE ROLE dba 
CREATEDB 
LOGIN 
PASSWORD 'Abcd1234';

4) 创建有密码有效期的角色

要设置角色密码在某日期和时间后不再有效,请使用密码有效期属性:

VALID UNTIL 'timestamp'

例如,以下语句创建一个密码有效期至 2029 年底的dev_api角色:

CREATE ROLE dev_api WITH
LOGIN
PASSWORD 'securePass1'
VALID UNTIL '2030-01-01';

2030 年一秒后,dev_api的密码不再有效。

5) 创建有连接数限制的角色

要指定角色可以建立的并发连接数,可以使用CONNECTION LIMIT属性:

CONNECTION LIMIT connection_count

下面创建了一个名为api的新角色,可以建立 1000 个并发连接:

CREATE ROLE api
LOGIN
PASSWORD 'securePass1'
CONNECTION LIMIT 1000;

以下psql命令显示了我们迄今为止创建的所有角色:

\du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 alice     |                                                            | {}
 api       | 1000 connections                                           | {}
 bob       | Cannot login                                               | {}
 dba       | Create DB                                                  | {}
 john      | Superuser                                                  | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

概括

  • PostgreSQL 使用角色来表示用户帐户。可以登录的角色相当于其他数据库系统中的用户帐户。

  • 使用角色属性来指定角色的权限,例如LOGIN允许角色登录、CREATEDB允许角色创建新数据库、SUPERUSER允许角色拥有所有权限。