本文主要内容为在控制台进行界面化的数据库账号操作。
创建账号
腾讯云数据库 PostgreSQL 未开放 superuser 角色属性和 pg_execute_server_program、pg_read_server_files、pg_write_server_files 角色供用户使用。但因为部分操作必须要求 superuser 进行,所以云数据库 PostgreSQL 提供了 pg_tencentdb_superuser 角色用以替代 superuser。更多 pg_tencentdb_superuser 介绍请参考 用户与权限操作。 控制台账号类型分为两类:pg_tencentdb_superuser 账号和普通账号。一个账号,只要是 pg_tencentdb_superuser 角色的成员,则为 pg_tencentdb_superuser 账号,否则为普通账号。
您可以登录 PostgreSQL 控制台,在实例列表,单击实例 ID 或操作列的管理,进入实例详情页面。单击账号管理 > 创建账号来进行新建操作。具体如下: 说明:
在控制台创建账号时,其账号名称需满足如下条件:1-16个字符,只能由字母、数字或下划线组成;不能为 postgres;不能由数字、pg_ 或 tencentdb_ 开头;所有规则均不区分大小写。
控制台只支持大版本为9.5及以上的实例的账号的创建。低于该版本的实例请先升级实例大版本。
账号展示
说明:
1. 控制台账号列表可以展示数据库实例中所有状态正常和锁定中的账号。这些账号可以是控制台创建,也可以是使用其它客户端连上数据库创建。
2. 控制台只支持 user 的展示,不支持 role 的展示。
3. 只有在控制台创建的账号,管理系统才会记录其创建时间。请知悉。
4. 当一个账号的系统权限有 nologin 或者 CONNECTION 为0,则该账号的状态为锁定中。
5. 控制台仅能支持符合账号名称要求的数据库账号的展示,请知悉。
您通过控制台、其它客户端或者程序创建的数据库账号,均可以展示在账号列表。具体如下图所示:
修改账号
重置密码
您可以在控制台中重置已存在账号的登录密码。如果该账号当前已经登录数据库,则重置密码后对后续该账号的链接有效。单击操作 > 重置密码,具体如下图所示:
弹框如下所示:
修改备注
您可以在控制台修改账号的备注,单击操作 > 更多 > 修改备注,具体如下图所示:
弹框如下所示:
修改类型
控制台账号类型分为两类:pg_tencentdb_superuser 账号和普通账号。一个账号,只要是 pg_tencentdb_superuser 角色的成员,则为pg_tencentdb_superuser 账号,否则为普通账号。更多 pg_tencentdb_superuser 介绍请参考 用户与权限操作。 您可以在控制台修改账号类型,单击操作 > 更多 > 修改类型,具体如下图所示:
弹框如下图所示:
修改权限
账号对象权限说明
一个账号的对象权限由三部分组成:
从所属角色继承的权限:在 PostgreSQL 中,一个用户可以属于一个或多个角色,这些角色可以具有特定的权限。例如,一个角色可能有权限访问某个数据库或修改某个表。如果一个用户属于这个角色,那么他将继承这个角色的所有权限。
从 PUBLIC 继承的权限:如前面所述,PUBLIC 是一个特殊的预定义组,所有的用户都自动属于这个组。如果为 PUBLIC 组授予了某个权限,那么所有用户都将拥有这个权限。
被直接授予的权限:除了从角色和 PUBLIC 继承的权限外,一个用户还可以直接被授予权限。例如,数据库管理员可以直接授予一个用户权限,让他可以访问某个数据库或修改某个表。
这三个方面的权限可以相互覆盖。要想 revoke 掉一个 user 的某个权限,必须三个地方都必须 revoke 掉才行。而对象权限的授予与回收对于 OWNER 不生效,OWNER 对一个对象具备任何权限。
注意:
控制台的修改权限能力针对直接授予的权限。如果一个账号在回收权限之后该权限还在,您需要进一步排查下该用户是否是从 PUBLIC 组继承了权限或者是该对象的 OWNER。
您可以在控制台对一个账号同时赋予或者回收多个对象的多个不同权限,也可以批量对一个账号授予或者回收多个同类对象的多个不同权限。
对一个账号赋予或者回收多个对象的多个不同权限
单击操作 > 修改权限,弹框如下:
弹框如下:
注意:
由于账号的权限可以通过多个客户端或者程序来修改,因强烈建议您每次在控制台操作权限之前单击刷新按钮,拉取最新的权限。
注意:
PUBLIC 是一个特殊的预定义组,所有的用户都自动属于这个组。当为 PUBLIC 组授予权限时,实际上是为所有用户授予了权限,包括现有的和将来创建的用户。
如果某种对象的某种权限已经被 PUBLIC 组所拥有,要想 REVOKE 该权限,只有从 PUBLIC 组中去除该权限才能真正生效。
一旦某权限从 PUBLIC 组中 REVOKE ,则所有用户都将失去该权限,请谨慎操作。
为了帮助您在错误单击之后能迅速恢复至初始化状态,单击重置按钮,则本次界面操作将全部恢复至当前的账号权限状态,您可以在此基础上重新操作。
单击确定,系统将汇总您本次对当前选择的账号的即将发起的所有权限操作的汇总,便于您二次确认。具体如下图所示:
如上图所示,本次账号的权限修改操作涉及 nomal_1和 db_priv 两个 database,分别如下:
1. nomal_1数据库的操作涉及如下三个:
1.1 nomal_1数据库进行 REVOKE TEMPORARY 操作。
1.2 sche_priv 模式的 amyttt 表格的 id 字段进行 REVOKE INSERT 操作。
1.3 sche_priv 模式的 am_s 序列进行 REVOKE UPDATE 操作。
2. db_priv 数据库进行 REVOKE CREATE 操作。
对一个账号赋予或者回收多个同一类对象的多个不同权限
当您需要对一个账号同时操作同一类对象的多个权限时,您可以使用批量授权/回收功能。弹框如下:
注意:
批量授权/回收功能针对一个账号对于同一类对象的批量操作。不支持某个批量操作及操作了 database,又操作了 schema。
在批量模式下,因为权限可能各不一致,因此不支持已授权状态的展示。请谨慎操作。
删除账号
当您不再需要某个数据库账号时,控制台支持删除操作,请单击操作 > 更多 > 删除账号,具体如下图所示:
只有在账号没有任何对象权限时,该账号才允许被删除,否则删除账号报错,具体如下图所示:
如果数据库账号删除报错,我们可以查询该账号是否在某些对象上有相应的权限,或者是某些对象的 OWNER。如果是,则回收相应的权限或者替换对象的 OWNER 后再进行该账号的授权即可。PostgreSQL 中使用 aclitem 来表示一个具体的数据库对象上的权限。具体解释请参考 数据库权限概述。 查询某个账号是否具有某些对象的权限方法如下:
(1)查询该账号是否对某些 database 有权限,命令参考如下:
nomal_1=> select datname,datacl from pg_database;
datname | datacl
-----------+------------------------------------------------------------------------
template1 | {=c/postgres,postgres=CTc/postgres}
template0 | {=c/postgres,postgres=CTc/postgres}
postgres | {=Tc/postgres,postgres=CTc/postgres,pg_tencentdb_superuser=C/postgres}
nomal_1 | {=Tc/nomal_usr1,nomal_usr1=CTc/nomal_usr1}
db_priv | {=Tc/dbadmin,dbadmin=Tc/dbadmin}
(5 rows)
如上图所示,datacl 字段清晰的描述了账号对于 database 的相应权限。我们找到对应的账号的权限,然后回收相应的权限后再删除账号。
(2)查询该账号是否对某些 schema 有权限,您可以在每个 database 下查询,命令参考如下:
nomal_1=> select nspname,nspacl from pg_namespace;
nspname | nspacl
--------------------+----------------------------------------------------------
pg_toast |
pg_temp_1 |
pg_toast_temp_1 |
pg_catalog | {postgres=UC/postgres,=U/postgres}
public | {postgres=UC/postgres,=UC/postgres}
information_schema | {postgres=UC/postgres,=U/postgres,nomal_usr1=C/postgres}
sche_priv | {dbadmin=UC/dbadmin}
(7 rows)
如上图所示,datacl 字段清晰的描述了账号对于 schema 的相应权限。我们找到对应的账号的权限,然后回收相应的权限后再删除账号。
(3)查询该账号是否对某些对象有权限,您可以在每个 database 下查询,命令参考如下:
nomal_1=> select relname,a.typname as reltype ,relacl from pg_class join pg_type a on pg_class.reltype=a.oid ;
查询某个账号是否是某个对象的 OWNER,示例如下:
(1)查询账号是否为某个 database 的 OWNER,示例如下:
nomal_1=> SELECT r.rolname,d.datdba,datname AS database_name FROM pg_database d left JOIN pg_catalog.pg_roles r on d.datdba=r.oid WHERE d.datdba in (SELECT usesysid FROM pg_user WHERE usename in('dbadmin','nomal_usr1','nomal_usr2'));
rolname | datdba | database_name
------------+--------+---------------
dbadmin | 16398 | db_priv
nomal_usr1 | 16401 | nomal_1
(2)查询账号是否为某个 schema 的 OWNER,示例如下:
nomal_1=> SELECT n.nspname as schema_name, pg_catalog.pg_get_userbyid(n.nspowner) as schema_owner FROM pg_catalog.pg_namespace n ORDER BY schema_name;
schema_name | schema_owner
--------------------+--------------
information_schema | postgres
pg_catalog | postgres
pg_temp_1 | postgres
pg_toast | postgres
pg_toast_temp_1 | postgres
public | postgres
sche_priv | dbadmin
(3)查询账号是否为某个对象的 OWNER,示例如下:
nomal_1=> select * from (select relname,relnamespace as schema_name ,a.typname as reltype,pg_catalog.pg_get_userbyid(relowner )as owner from pg_class join pg_type a on pg_class.reltype=a.oid ) d where owner in('dbadmin','nomal_1');
relname | schema_name | reltype | owner
----------------+-------------+----------------+---------
pg_toast_16488 | 99 | pg_toast_16488 | dbadmin
amyttt | 16480 | amyttt | dbadmin
am | 2200 | am | dbadmin
am_s | 16480 | am_s | dbadmin
bug_id_seq | 2200 | bug_id_seq | dbadmin
bug | 2200 | bug | dbadmin
pg_toast_16507 | 99 | pg_toast_16507 | dbadmin
锁定账号
说明:
一个账号被执行锁定操作,管理系统会修改系统权限为 NOLOGIN,同时修改 CONNECTION 为0。
一个账号被执行锁定操作,则当前已经登录的链接会立即生效。
您可以锁定当前已经存在的账号,单击操作 > 锁定账号,具体如下图所示:
弹框如下所示:
一个账号被锁定之后,其状态会变为锁定中,具体如下图所示:
当一个账号被锁定之后,可以在控制台执行解锁操作,单击操作 > 更多 > 解锁账号,具体如下图所示:
说明:
当一个账号被执行解锁操作,则管理系统会修改账号的系统权限为 LOGIN,同时修改 CONNECTION 为-1。
导出列表
控制台支持两种账号列表导出,分别为下载当前页数据,下载所有数据。如下图所示:
本页内容是否解决了您的问题?