ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# ALTER ROLE ## Name ALTER ROLE -- 修改一个数据库角色 ## Synopsis ``` ALTER ROLE _name_ [ [ WITH ] _option_ [ ... ] ] 这里的 `_option_` 可以是: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | CREATEUSER | NOCREATEUSER | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | CONNECTION LIMIT _connlimit_ | [ ENCRYPTED | UNENCRYPTED ] PASSWORD '_password_' | VALID UNTIL '_timestamp_' ALTER ROLE _name_ RENAME TO _new_name_ ALTER ROLE _name_ [ IN DATABASE _database_name_ ] SET _configuration_parameter_ { TO | = } { _value_ | DEFAULT } ALTER ROLE { _name_ | ALL } [ IN DATABASE _database_name_ ] SET _configuration_parameter_ FROM CURRENT ALTER ROLE { _name_ | ALL } [ IN DATABASE _database_name_ ] RESET _configuration_parameter_ ALTER ROLE { _name_ | ALL } [ IN DATABASE _database_name_ ] RESET ALL ``` ## 描述 `ALTER ROLE`修改一个PostgreSQL角色的属性。 这个命令的第一种形式可以修改很多[CREATE ROLE](#calibre_link-10)里面声明的角色属性。 (除了增加和删除成员关系的选项之外,所有可能的属性都有介绍;使用[GRANT](#calibre_link-19)和[REVOKE](#calibre_link-20)可以实现前述两件事。) 没有在命令里提到的属性维持它们以前的设置。数据库超级用户可以给任何角色改变任何设置。 拥有`CREATEROLE`权限的角色可以修改任意这些设置,但是只能给非超级用户和非复制用户角色设置。 普通的角色只能修改它们自己的口令。 第二种形式可以修改角色的名称。数据库超级用户可以修改任何角色的名称。 拥有`CREATEROLE`权限的角色可以给非超级用户角色进行重命名。 当前会话的用户的角色是不能改名的。(如果一定需要这么做,则必须以另外一个用户的身份连接系统。) 因为`MD5`加密的口令使用角色名字作为加密的盐粒,所以, 如果口令是`MD5`加密的,那么给一个角色改名会清空其口令。 其他的形式更改一个角色的会话配置参数默认值,该值要么针对所有的数据库, 要么使用`IN DATABASE`选项,仅针对指定的数据库。 如果是未指定角色名称而是使用了`ALL`选项,则所有角色的相关参数都会更改。 当同时使用`ALL`和`IN DATABASE`选项时,就等同于使用`ALTER DATABASE ... SET ...`。 当角色随后开启一个新会话,指定的值变成了会话的默认值,这些参数值会覆盖任何`postgresql.conf`中的设置或者从`postgres` 命令行接收到的参数值。 这仅在登录时发生;执行[SET ROLE](#calibre_link-21)或者[SET SESSION AUTHORIZATION](#calibre_link-508)不会引起新的配置值设置。 为所有数据库所设定的参数会被附加到一个角色上的特定数据库的参数所覆盖。为指定数据库或指定角色所设定的参数会覆盖为所有角色设定的参数。 超级用户可以更改任何一个会话默认值。有`CREATEROLE`权限的角色可以为非超级用户角色更改默认值。 普通的角色只能为自己设置默认值。 某些配置变量不能这样设置,或者只要超级用户才能执行。 只有超级用户才能为所有数据库中的所有角色更改参数设置。 ## 参数 `_name_` 需要修改属性的角色的名称。 `SUPERUSER``NOSUPERUSER` `CREATEDB` `NOCREATEDB` `CREATEROLE` `NOCREATEROLE` `CREATEUSER` `NOCREATEUSER` `INHERIT` `NOINHERIT` `LOGIN` `NOLOGIN` `REPLICATION` `NOREPLICATION` `CONNECTION LIMIT` `_connlimit_` `PASSWORD` `_password_` `ENCRYPTED` `UNENCRYPTED` `VALID UNTIL` '`_timestamp_`' 这些选项修改由[CREATE ROLE](#calibre_link-10)初始设置的属性。 要获取更多详细信息,请参阅`CREATE ROLE`参考页。 `_new_name_` 角色的新名字。 `_database_name_` 要设置配置变量的数据库的名称。 `_configuration_parameter_` `_value_` 把该角色指定的参数缺省值设置为给定值。如果`_value_`是`DEFAULT`或是相当于使用`RESET`, 指定角色的参数值会被清除,这样该角色将在新的会话里继承系统级的参数缺省值。 使用`RESET ALL`会清除所有角色相关的设置。 使用`SET FROM CURRENT`会将会话的当前参数值保存为特定角色的缺省参数值。 如果使用了`IN DATABASE`选项,则仅仅指定的角色和数据库可以设置或者清除相关参数。 特定角色的参数设置仅仅在登录时起效;[SET ROLE](#calibre_link-21)和[SET SESSION AUTHORIZATION](#calibre_link-508)不能进行特定角色的参数设置。 参阅[SET](#calibre_link-675)和[Chapter 18](#calibre_link-500)获取有关允许的参数名称和数值的更多信息。 ## 注意 使用[CREATE ROLE](#calibre_link-10)增加新角色,使用[DROP ROLE](#calibre_link-18)删除旧角色。 `ALTER ROLE`不能改变角色的成员关系。可以使用[GRANT](#calibre_link-19)和[REVOKE](#calibre_link-20)做这个事情。 使用这个命令指定一个未加密的密码时必须小心,因为密码将以明文方式传送到服务器,并且可能被客户端命令历史记录或者被服务器日志记录。 [psql](#calibre_link-23)包含一个可以用来安全修改角色密码的`\password`命令,这个命令不会暴露明文的密码。 也可以把会话缺省参数值与数据库绑定而不是与角色绑定;参阅[ALTER DATABASE](#calibre_link-1431)。 如果有冲突,那么指定角色加数据库的参数设置将覆盖指定角色的参数设置,而后者又可以覆盖指定数据库的参数设置。 ## 例子 改变一个角色的口令: ``` 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](#calibre_link-1150)参数值: ``` ALTER ROLE worker_bee SET maintenance_work_mem = 100000; ``` 给一个角色设置非缺省的、指定数据库的[client_min_messages](#calibre_link-1448)参数值: ``` ALTER ROLE fred IN DATABASE devel SET client_min_messages = DEBUG; ``` ## 兼容性 `ALTER ROLE`语句是一个PostgreSQL扩展。 ## 参见 [CREATE ROLE](#calibre_link-10), [DROP ROLE](#calibre_link-18), [ALTER DATABASE](#calibre_link-1431), [SET](#calibre_link-675)