在使用Hologres开发时,可能会因为权限问题产生报错。本文内容将为您介绍几个Hologres实例开发常见权限问题的解决方法。
问题汇总
在使用Hologres开发时,需要有实例的具体开发权限,才能在实例内进行操作。与实例权限相关的常见问题,请单击如下链接查看解决方法。
如何选择合适的Hologres权限模型?
Hologres具有专家权限模型、简单权限模型和基于Schema级别的简单权限模型(简称SLPM),那么该如何选择合适的Hologres权限模型,具体操作场景说明如下:
专家权限模型指的是Postgres原生的权限模型,若您对Postgres及其权限管理已经比较熟悉,可以零学习成本使用专家权限模型实现授权操作。如果您需要细粒度到表级别的权限管理,并且有充足的时间、精力和必要性对每个表、每个用户进行权限赋予、回收等操作可以使用专家权限模型。
简单权限模型(简称SPM)指的是DB级别的简单权限管理模型,所有需要访问DB的用户都需要加入到某个用户组中,每个用户组都有DB中任意Schema下对象特定的访问权限。如果您很少采用Schema进行开发,或者只是像使用目录一样采用Schema对表对象进行分类,而无需Schema级别的权限隔离,推荐您使用简单权限模型SPM。
基于Schema级别的简单权限模型(简称SLPM),每个Schema都有自己的developer、writer、viewer用户组。若您强依赖Schema级别的用户隔离,表权限隔离,推荐您使用SLPM。
在Hologres实例内操作报错:role “RAM$xxx” doesn't not exsit
问题现象
连接开发工具之后,在实例内进行查询等操作时报错提示:role “RAM$xxx” doesn't not exist。
问题原因
当前RAM用户账号未被创建进实例中。
解决方法
您可以根据业务情况,为当前RAM用户账号授予实例的相关权限,如Superuser。更详细的授权请参见授予RAM用户实例的开发权限。
连接实例时报错:password authentication failed for user “xxx”
问题现象
在连接开发工具时报错提示password authentication failed for user “xxx”。
问题原因
如果是使用AccessKey登录的实例,该报错代表Hologres实例内不存在当前正在登录的用户,或者登录使用的AccessKey错误或已被禁用。
如果是使用自定义账号(BASIC账号)登录的实例,该报错代表Hologres实例内不存在当前正在登录的自定义账号,或者登录时使用的密码错误。
解决方法
查询表时报错: permission denied for table xxxx
在Hologres实例内操作报错:permission denied for database“xxx” detail:user does not have CONNECT privilege
问题现象
连接开发工具之后,在实例内进行查询等操作时报错提示FATAL:permission denied for database“xxx” detail:user does not have CONNECT privilege。
问题原因
当前账号只被创建进了实例中,但是没有对应实例的开发权限。
解决方法
您可以根据业务情况,为当前用户账号授予实例的相关权限,如Superuser。更详细的授权请参见授予RAM用户实例的开发权限。
使用call spm_enable()
命令时,提示:because roles conflict
问题现象
在专家模式下,执行
call spm_enable()
会提示:because roles conflict类似报错。问题原因
是因为当前数据库之前开启过简单模式,存在残留信息。
解决方法
您需要执行
call spm_enable ('t');
开启。
授权时报错:current database is NOT in simple privilege mode
问题现象
进行授权操作时,报错:current database is NOT in simple privilege mode。
问题原因
当前数据库未开启简单权限模型。
解决方法
请执行
show hg_experimental_enable_spm;
命令检查是否关闭了简单权限模型。使用如下命令开启当前数据库的简单权限模型。
-- 开启当前DB的简单权限模型 call spm_enable ('t'); -- 将DB中已有的对象change owner到develoepr,使用SPM管理 call spm_migrate ();
call spm_enable ('t');
括号里't'的含义:将call spm_disable
关掉后,原系统角色不会删除,会继续保留这些角色和权限。如果下次使用spm_enable()
不带t,就会显示角色冲突,而无法开启。spm_enable ('t')
就是忽略这个冲突,继续重用这些系统角色。
操作表时报错:must be the owner of table xxxx
跨Schema创建视图时查询报错: permission denied for table xxx
问题原因
实例开启了Schema级别的简单权限模型(SLPM),当前SLPM不支持跨Schema创建视图。
解决方法
您需要检查是否在SLPM模型下跨Schema创建视图。
执行SQL时报错:permission denied for Schema xxx
报错原因
当前用户没有Schema的权限,导致查询报错。
解决方法
您需要确认当前用户的权限模型,选择对应的解决方法。
若是SPM或者SLPM权限模型,查询时需要将用户加入到Viewer及以上的用户组,建表时报错需要将用户加入到Developer及以上的用户组,详情请参见SPM授权、SLPM授权。
若是专家权限模型,需要显示给用户授予Schema的查询权限,可以根据业务需求为用户授予相关的权限,详情请参见专家权限模型。使用如下命令授予Schema的查询权限:
-- 授予SCHEMA使用权限(展示SCHEMA的所有表) GRANT USAGE ON SCHEMA <schema_name> TO "云账号/云邮箱"; -- 授予在SCHEMA上创建表的权限 GRANT CREATE ON SCHEMA <schema_name> TO "云账号/云邮箱";