云数据库 PostgreSQL 前置校验不通过处理

这篇主要内容为在控制台进行界面化的数据库账号操作。腾讯云数据库 PostgreSQL 未开放 superuser 角色属性和 pg_execute_server_program、pg_read_server_files、pg_write_server_files 角色供用户使用。但因为部分操作必须由 superuser 进行,所以云数据库 PostgreSQL 提供了 pg_tencentdb_superuser 角。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。

创建账号

控制台账号类型分为两类:pg_tencentdb_superuser 账号和普通账号。一个账号,只要是 pg_tencentdb_superuser 角色的成员,则为 pg_tencentdb_superuser 账号,否则为普通账号。

你可以登录 PostgreSQL 控制台,在实例列表,单击实例 ID 或操作列的管理,进入实例详情页面。单击数据库管理 > 账号管理 > 创建账号来进行新建操作。

注意:说明:

账号展示

注意:说明:

注意:1. 控制台账号列表可以展示数据库实例中所有状态正常和锁定中的账号。这些账号可以是控制台创建,也可以是使用其它客户端连接数据库创建。

注意:2. 控制台只支持 user 的展示,不支持 role 的展示。

注意:3. 只有在控制台创建的账号,管理系统才会记录其创建时间。请知悉。

注意:4. 当一个账号的系统权限包含 nologin 或者 CONNECTION 为0,则该账号的状态为锁定中。

注意:5. 控制台仅能支持符合账号名称要求的数据库账号的展示,请知悉。

注意:6. 修改时间字段包含的操作记录为:创建账号,锁定账号,解锁账号,修改密码,修改备注,修改权限,开启 CAM 验证,关闭 CAM 验证,手动刷新密码。

你通过控制台、其它客户端或者程序创建的数据库账号,均可以展示在账号列表。具体如下:

修改账号

一、重置密码

注意:说明:

注意:密码修改时间字段只记录通过控制台或者 API 操作的密码更新时间。该能力上线时间为2025年11月1日,只能记录2025年11月1日及之后通过控制台或者 API 操作的密码更新时间,否则该字段记录为‘0000-00-00 00:00:00’。

你可以在控制台中重置已存在账号的登录密码。如果该账号当前已经登录数据库,则重置密码后对后续该账号的连接有效。单击操作 > 重置密码,具体如下:

弹框如下:

二、修改备注

你可以在控制台修改账号的备注,单击操作 > 更多 > 修改备注,具体如下:

弹框如下:

三、修改类型

控制台账号类型分为两类:pg_tencentdb_superuser 账号和普通账号。一个账号,只要是 pg_tencentdb_superuser 角色的成员,则为pg_tencentdb_superuser 账号,否则为普通账号。更多 pg_tencentdb_superuser 介绍请参考 用户与权限操作。

你可以在控制台修改账号类型,单击操作 > 更多 > 修改类型,具体如下:

弹框如下:

四、账号对象权限说明

一个账号的对象权限由三部分组成:

·从所属角色继承的权限:在 PostgreSQL 中,一个用户可以属于一个或多个角色,这些角色可以具有特定的权限。例如,一个角色可能有权限访问某个数据库或修改某个表。如果一个用户属于这个角色,那么他将继承这个角色的所有权限。

·从 public 继承的权限:如前面所述,public 是一个特殊的预定义组,所有的用户都自动属于这个组。如果为 public 组授予了某个权限,那么所有用户都将拥有这个权限。如需修改 public 权限,请参考 PUBLIC 权限操作。

·被直接授予的权限:除了从角色和 public 继承的权限外,一个用户还可以直接被授予权限。例如,数据库管理员可以直接授予一个用户权限,让他可以访问某个数据库或修改某个表。

这三个方面的权限可以相互覆盖。要想 REVOKE 掉一个 user 的某个权限,必须三个地方都 REVOKE 掉才行。而对象权限的授予与回收对于 OWNER 不生效,OWNER 对一个对象具备任何权限。

注意:控制台的修改权限能力针对直接授予的权限。如果一个账号在回收权限之后该权限还在,你需要进一步排查下该用户是否是从 public 组继承了权限或者是该对象的 OWNER。

你可以在控制台对一个账号同时赋予或者回收多个对象的多个不同权限,也可以批量对一个账号授予或者回收多个同类对象的多个不同权限。

五、对一个账号赋予或者回收多个对象的多个不同权限

单击操作 > 修改权限,弹框如下:

注意:由于账号的权限可以通过多个客户端或者程序来修改,因此强烈建议你每次在控制台操作权限之前单击刷新按钮,拉取最新的权限。

为了帮助你在错误单击之后能迅速恢复至初始化状态,单击重置按钮,则本次界面操作将全部恢复至当前的账号权限状态,你可以在此基础上重新操作。

单击确定,系统将汇总你本次对当前选择的账号即将发起的所有权限操作,便于你二次确认。具体如下:

如上图所示,本次账号的权限修改操作涉及 normal_1和 db_priv 两个 database,分别如下:

1. normal_1数据库的操作涉及如下三个:

1.1 normal_1数据库进行 REVOKE TEMPORARY 操作。

1.2 sche_priv 模式的 amyttt 表格的 id 字段进行 REVOKE INSERT 操作。

1.3 sche_priv 模式的 am_s 序列进行 REVOKE UPDATE 操作。

2. db_priv 数据库进行 REVOKE CREATE 操作。

六、对一个账号赋予或者回收多个同一类对象的多个不同权限

当你需要对一个账号同时操作同一类对象的多个权限时,你可以使用批量授权/回收功能。弹框如下:

删除账号

当你不再需要某个数据库账号时,控制台支持删除操作,请单击操作 > 更多 > 删除账号,具体如下:

只有在账号没有任何对象权限时,该账号才允许被删除,否则删除账号报错,具体如下:

如果数据库账号删除报错,我们可以查询该账号是否在某些对象上有相应的权限,或者是某些对象的 OWNER,具体参考账号 对象权限说明。如果是,则回收相应的权限或者替换对象的 OWNER 后再进行该账号的删除即可。PostgreSQL 中使用 aclitem 来表示一个具体的数据库对象上的权限。具体解释请参考 数据库权限概述。

七、对象的权限解除

1. 你可以使用如下命令查询某个账号是否具有某些对象的权限方法如下:

(1)查询该账号是否对某些 database 有权限,命令参考如下:

postgres=> select datname,datacl from pg_database; datname | datacl ————–+———————————————————————— test | {=Tc/amy,amy=Tc/amy} template0 | {=c/postgres,postgres=CTc/postgres} template1 | {postgres=CTc/postgres,=c/postgres} postgres | {=Tc/postgres,postgres=CTc/postgres,pg_tencentdb_superuser=C/postgres}(4 rows)

如上所示,datacl 字段清晰地描述了账号对于 database 的相应权限。我们找到对应的账号 amy 的权限,账号 amy 对 test 数据库有对应的 owner 权限,数据库 OWNER 修改具体操作请参考 修改 OWNER。

(2)查询该账号是否对某些 schema 有权限,你可以在每个 database 下查询,命令参考如下:

amy=> select nspname,nspacl from pg_namespace; nspname | nspacl ——————–+—————————————- pg_toast | pg_catalog | {postgres=UC/postgres,=U/postgres} information_schema | {postgres=UC/postgres,=U/postgres} public | {postgres=UC/postgres,=UC/postgres} t_s | {dbadmin=UC/dbadmin,test_am=U/dbadmin}(5 rows)

如上所示,nspacl 字段清晰地描述了账号 test_am 对于 schema t_s 的相应 USAGE 权限。我们回收相应的权限后再删除账号,具体参考 修改权限。

(3)查询该账号是否对某些对象有权限,你可以在每个 database 下查询,命令参考如下:

am=> SELECT n.nspname AS schema,c.relname AS object_name,CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'matview' WHEN 'S' THEN 'sequence' END AS object_type,acl.privilege_type FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace CROSS JOIN LATERAL aclexplode(c.relacl) AS acl JOIN pg_roles r ON r.oid = acl.grantee WHERE r.rolname = 'test_am' AND c.relkind IN ('r', 'v', 'm', 'S') ORDER BY n.nspname, c.relname; schema | object_name | object_type | privilege_type ——–+————-+————-+—————- public | t1 | table | SELECT(1 row)

如上所示,账号 test_am 对 t1 表格有 SELECT 权限,我们在控制台回收这个权限即可,具体参考 修改权限。

八、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('nomal_usr1')); rolname | datdba | database_name ————+——–+————— nomal_usr1 | 16401 | nomal_1

如上所示,账号 nomal_usr1 是 database nomal_1 的 owner,数据库 OWNER 修改具体操作请参考 修改 OWNER。

(2)查询账号是否为某个 schema 的 OWNER,示例如下:

am=> SELECT n.nspname AS schema_name, r.rolname AS schema_owner FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_roles r ON n.nspowner = r.oid WHERE r.rolname = 'dbadmin' ORDER BY schema_name; schema_name | schema_owner ————-+————– t_s | dbadmin

如上所示,账号 dbadmin 是 schema t_s 的 owner,可以使用如下 SQL 来转移 OWNER:ALTER SCHEMA t_s OWNER TO test_am;

(3)查询账号是否为某个对象的 OWNER,示例如下:

am=> 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'); relname | schema_name | reltype | owner ———+————-+———+——— t2 | 2200 | t2 | dbadmin

如上所示,账号 dbadmin 是 table t2 的 owner,可以使用如下 SQL 来转移 OWNER:ALTER TABLE t2 OWNER TO test_am;

另外,你也可以使用如下命令将各类对象的 OWNER 权限转移给其他账号:

— 转移表的 owner 给 new_ownerALTER TABLE schema_name.table_name OWNER TO new_owner;– 转移视图的 owner 给 new_ownerALTER VIEW schema_name.view_name OWNER TO new_owner;– 转移序列的 owner 给 new_ownerALTER SEQUENCE schema_name.sequence_name OWNER TO new_owner;– 转移函数的 owner 给 new_ownerALTER FUNCTION schema_name.function_name(arg_types) OWNER TO new_owner;– 转移 schema 的 owner 给 new_ownerALTER SCHEMA schema_name OWNER TO new_owner;– 转移 database 的 owner 给 new_ownerALTER DATABASE database_name OWNER TO new_owner;

锁定账号

你可以锁定当前已经存在的账号,单击操作 > 锁定账号,具体如下:

弹框如下:

一个账号被锁定之后,其状态会变为锁定中,具体如下:

注意:说明:

当一个账号被锁定之后,可以在控制台执行解锁操作,单击操作 > 更多 > 解锁账号,具体如下:

注意:说明:

注意:当一个账号被执行解锁操作,则管理系统会修改账号的系统权限为 LOGIN,同时修改 CONNECTION 为-1。

导出列表

控制台支持两种账号列表导出,分别为下载当前页数据,下载所有数据。如下:

赞 (0)
上一篇 4天前
下一篇 4天前