PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

ALTER ROLE

ALTER ROLE — 更改一个数据库角色

Synopsis

ALTER ROLE role_specification [ WITH ] option [ ... ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'

ALTER ROLE name RENAME TO new_name

ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter FROM CURRENT
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET configuration_parameter
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL

where role_specification can be:

    role_name
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

描述

ALTER ROLE 更改一个 PostgreSQL 角色的属性。

此命令在概要中列出的第一种变体可以更改 CREATE ROLE 中能够指定的许多角色属性。(所有可能的属性都被涵盖,只是没有用于添加或移除成员关系的选项;这方面请使用 GRANT 和 REVOKE。)命令中未提及的属性将保持其原有设置。数据库超级用户可以为任何角色更改这些设置中的任意一项,但 SUPERUSER 属性除外,即不能为 引导超级用户 更改该属性。具有 CREATEROLE 特权的非超级用户角色可以更改其中大部分属性,但只能针对已被授予 ADMIN OPTION 的非超级用户且非复制角色。非超级用户不能更改 SUPERUSER 属性,并且只有在自己也拥有相应属性时才能更改 CREATEDB、REPLICATION 和 BYPASSRLS 属性。普通角色只能更改自己的密码。

第二种变体更改角色的名称。数据库超级用户可以重命名任何角色。具有 CREATEROLE 特权的角色可以重命名那些已被授予 ADMIN OPTION 的非超级用户角色。当前的会话用户不能被重命名。(如果需要这样做,请以另一个用户连接。)由于 MD5 加密的密码使用角色名作为加密盐值,重命名角色会清空其密码(如果该密码是 MD5 加密的)。

其余的变体会更改某个角色针对一个配置变量的会话默认值,要么针对所有数据库,要么(在指定了 IN DATABASE 子句时)仅针对指定数据库中的会话。如果指定 ALL 而不是角色名,则会更改所有角色的设置。将 ALL 与 IN DATABASE 一起使用实际上等同于使用命令 ALTER DATABASE ... SET ...。

此后每当该角色开始一个新会话时,指定的值都会成为会话默认值,并覆盖 postgresql.conf 中存在的或从 postgres 命令行接收到的任何设置。这只会在登录时发生;执行 SET ROLE 或 SET SESSION AUTHORIZATION 不会导致新的配置值被设置。针对所有数据库设置的值会被附加到角色上的针对特定数据库的设置所覆盖。针对特定数据库或特定角色的设置会覆盖针对所有角色的设置。

超级用户可以更改任何人的会话默认值。具有 CREATEROLE 特权的角色可以更改那些已被授予 ADMIN OPTION 的非超级用户角色的默认值。普通角色只能为自己设置默认值。某些配置变量无法以这种方式设置,或者只有在超级用户发出该命令时才能设置。只有超级用户才能更改所有数据库中所有角色的设置。

参数

name #

要修改其属性的角色名称。

CURRENT_ROLE
CURRENT_USER #

修改当前用户,而不是显式指定的角色。

SESSION_USER #

修改当前会话用户,而不是显式指定的角色。

SUPERUSER
NOSUPERUSER
CREATEDB
NOCREATEDB
CREATEROLE
NOCREATEROLE
INHERIT
NOINHERIT
LOGIN
NOLOGIN
REPLICATION
NOREPLICATION
BYPASSRLS
NOBYPASSRLS
CONNECTION LIMIT connlimit
[ ENCRYPTED ] PASSWORD 'password'
PASSWORD NULL
VALID UNTIL 'timestamp' #

这些子句会修改最初由 CREATE ROLE 设置的属性。更多信息请参见 CREATE ROLE 参考页。

new_name #

该角色的新名称。

database_name #

要在其中设置该配置变量的数据库名称。

configuration_parameter
value #

把该角色针对指定配置参数的会话默认值设置为给定值。如果 value 为 DEFAULT,或者等价地使用了 RESET,则会移除角色专属的变量设置,这样该角色在新会话中将继承系统范围的默认设置。使用 RESET ALL 可以清除所有角色专属的设置。SET FROM CURRENT 会把该会话中该参数的当前值保存为角色专属的值。如果指定了 IN DATABASE,则只会为给定的角色和数据库设置或移除该配置参数。

角色专属的变量设置只在登录时生效;SET ROLE 和 SET SESSION AUTHORIZATION 不会处理角色专属的变量设置。

有关允许的参数名称和值的更多信息,请参见 SET 和 Chapter 19。

注记

使用 CREATE ROLE 添加新角色,使用 DROP ROLE 移除一个角色。

ALTER ROLE 不能更改角色的成员关系。要完成这种操作,请使用 GRANT 和 REVOKE。

在此命令中指定未加密的密码时必须谨慎。密码将以明文形式传送到服务器,并且还可能被记录到客户端的命令历史或服务器日志中。psql 中包含一个命令 \password,可用于更改角色的密码而不暴露明文密码。

也可以把会话默认值绑定到一个特定的数据库而不是一个角色上;参见 ALTER DATABASE。如果存在冲突,数据库-角色专属的设置会覆盖角色专属的设置,而后者又会覆盖数据库专属的设置。

示例

更改一个角色的密码:

ALTER ROLE davide WITH PASSWORD 'hu8jmn3';

移除一个角色的密码:

ALTER ROLE davide WITH PASSWORD NULL;

更改一个密码的过期日期,指定该密码应在 2015 年 5 月 4 日中午过期,所使用的时区比 UTC 快一个小时:

ALTER ROLE chris VALID UNTIL 'May 4 12:00:00 2015 +1';

让一个密码永久有效:

ALTER ROLE fred VALID UNTIL 'infinity';

赋予一个角色管理其他角色和创建新数据库的能力:

ALTER ROLE miriam CREATEROLE CREATEDB;

为一个角色指定 maintenance_work_mem 参数的一个非默认设置:

ALTER ROLE worker_bee SET maintenance_work_mem = 100000;

为一个角色指定 client_min_messages 参数的一个非默认的、针对特定数据库的设置:

ALTER ROLE fred IN DATABASE devel SET client_min_messages = DEBUG;

兼容性

ALTER ROLE 语句是 PostgreSQL 的一个扩展。

另请参阅

CREATE ROLE, DROP ROLE, ALTER DATABASE, SET