在使用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 exsit。

  • 问题原因

    当前RAM用户账号未被创建进实例中。

  • 解决方法

    您可以根据业务情况,为当前RAM用户账号授予实例的相关权限,如Superuser。更详细的授权请参见授予RAM用户实例的开发权限

连接实例时报错:Cloud authentication failed for access id "xxxx"

  • 问题现象

    在连接开发工具时报错提示Cloud authentication failed for access id "xxxx"。

  • 问题原因

    当前账号填写的密码错误。

  • 解决方法

    您需要检查当前连接的密码,需要确保密码为Access key且不包含空格。更多关于Access key的详细内容请参见创建访问密钥

查询表时报错: permission denied for table xxxx

  • 问题现象

    在实例内进行查询等操作时报错提示Execution failed:ERROR: permission denied for table xxxx。

  • 问题原因

    当前账号没有对应表的查看权限。

  • 解决方法

    您可以根据当前授权模式的不同,选择对应的解决方法。

    • 专家权限模式授权:执行如下命令为用户授权,其中p4_UID为RAM用户的账号信息。更多专家权限模式的信息,请参见专家权限模型
      grant select on table tablename to "p4_UID";
    • 简单权限模型:将当前用户加入viewer及以上用户组。具体操作请参见简单权限模型的使用

在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。

  • 问题原因

    当前数据库未开启简单权限模型。

  • 解决方法
    1. 请执行show hg_experimental_enable_spm;命令检查是否关闭了简单权限模型。
    2. 使用如下命令开启当前数据库的简单权限模型。
      -- 开启当前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

  • 问题现象

    在实例内进行操作时报错提示:must be the owner of table xxxx。

  • 问题原因

    当前RAM用户不是表的owner,无法创建分区子表或者执行删除表的操作。

  • 解决方法

    您可以根据当前授权模式的不同,选择对应的解决方法。

    • 专家权限模式授权:执行如下命令将表的owner授予当前账号,其中p4_UID为RAM用户的账号信息。更多专家权限模式的信息,请参见专家权限模型
      alter table tablename owner to "p4_UID";
    • 简单权限模型:将当前用户加入developer及以上用户组。具体操作请参见简单权限模型的使用

跨Schema创建视图时查询报错: permission denied for table xxx

执行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 "云账号/云邮箱";
                                  

执行SQL报错:ALTER TABLE xxx is not supported in Simple Privilege Mode

  • 报错

    执行SQL报错ALTER TABLE xxx is not supported in Simple Privilege Mode。

  • 报错原因

    当前DB开启的是简单权限模型,不支持直接执行ALTER TABLE操作。

  • 解决办法
    • 方法一:可以根据业务需求在简单权限模型下授予相关的权限。
    • 方法二:将DB的简单权限模型切换成专家权限模型,具体操作,请参见权限模型转换
      重要 专家权限模型权限粒度较细,管理难度较高,不建议轻易切换成专家权限模型。