PostgreSQL 教程: ALTER ROLE 更改角色

九月 12, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的ALTER ROLE语句修改角色的属性、重命名角色以及更改配置变量的角色会话默认值。

使用 ALTER ROLE 修改角色属性

要更改角色的属性,请使用以下形式的ALTER ROLE语句:

ALTER ROLE role_name [WITH] option;

该选项可以是:

  • SUPERUSER | NOSUPERUSER – 确定该角色是否为superuser
  • CREATEDB | NOCREATEDB – 允许角色创建新数据库。
  • CREATEROLE | NOCREATEROLE – 允许角色创建或更改角色。
  • INHERIT | NOINHERIT – 确定角色是否继承其所属角色的特权。
  • LOGIN | NOLOGIN – 允许角色登录。
  • REPLICATION | NOREPLICATION – 确定该角色是否是复制角色。
  • BYPASSRLS | NOBYPASSRLS – 确定角色是否要绕过行级安全 (RLS) 策略。
  • CONNECTION LIMIT limit – 指定角色可以建立的并发连接数,-1 表示无限制。
  • PASSWORD 'password' | PASSWORD NULL – 更改角色的密码。
  • VALID UNTIL 'timestamp' – 设置角色密码不再有效的日期和时间。

应用以下规则:

  • 超级用户可以更改任何角色的任何这些属性。
  • 具有CREATEROLE属性的角色只能更改非超级用户和非复制角色的任何这些属性。
  • 普通角色只能更改其密码。

首先,使用postgres角色登录 PostgreSQL。

其次,使用CREATE ROLE语句,创建一个新角色,名为calf

create role calf login password 'securePwd1';

calf角色可以使用密码登录。

因为postgres是超级用户,所以可以将角色calf更改为超级用户:

alter role calf superuser;

要在psql交互程序中查看角色calf,可以使用以下的\du命令:

\du calf

输出:

        List of roles
Role name | Attributes | Member of
-----------+------------+-----------
calf      | Superuser  | {}

以下语句将角色calf的密码设置为,直到2050年过期:

alter role calf
valid until '2050-01-01';

使用\du命令查看效果:

\du calf

输出:

                            List of roles
Role name |                 Attributes                  | Member of
-----------+---------------------------------------------+-----------
calf      | Superuser                                  +| {}
          | Password valid until 2050-01-01 00:00:00-08 |

使用 ALTER ROLE 重命名角色

要更改角色的名称,请使用以下形式的ALTER ROLE语句:

ALTER ROLE role_name
TO new_name;

在此语法中,您可以在ALTER ROLE关键字后指定角色的名称,并在TO关键字后指定角色的新名称。

超级用户可以重命名任何角色。具有CREATEROLE权限的角色可以重命名非超级用户角色。

如果使用角色登录 PostgreSQL 数据库服务器并在当前会话中重命名当前角色,则会报错:

ERROR:  session user cannot be renamed

在这种情况下,您需要使用不同的角色连接到 PostgreSQL 数据库服务器来重命名该角色。

您从postgres的会话中执行以下语句,以将角色calf重命名为elephant

ALTER ROLE calf
RENAME TO elephant;

使用 ALTER ROLE 更改配置变量的角色会话默认值

以下ALTER ROLE语句更改配置变量的角色会话默认值:

ALTER ROLE role_name | CURRENT_USER | SESSION_USER | ALL
[IN DATABASE database_name]
SET configuration_param = { value | DEFAULT }

在这个语法中:

  • 首先,指定要修改角色会话默认值的角色名称,或者使用CURRENT_USERSESSION_USER。您可以使用ALL选项更改所有角色的设置。
  • 其次,在IN DATABASE关键字后指定数据库名称,以便仅针对指定数据库中的会话进行更改。如果省略IN DATABASE子句,更改将应用于所有数据库。
  • 第三,在SET子句中指定配置参数和新值。

超级用户可以更改任何角色的会话默认值。具有CREATEROLE属性的角色可以设置非超级用户角色的默认值。普通角色只能为自己设置默认值。只有超级用户才能更改所有数据库中所有角色的设置。

以下示例使用ALTER ROLE语句为角色elephant提供非默认的、特定于数据库的client_min_messages参数设置:

ALTER ROLE elephant 
IN DATABASE dvdrental 
SET client_min_messages = NOTICE;

概括

  • 使用ALTER ROLE role_name option修改角色的属性。

  • 使用ALTER ROLE role_name RENAME TO new_role语句重命名角色。

  • 使用ALTER ROLE role_name SET param=value语句更改配置变量的角色会话默认值。