Hologres提供三种权限模型:专家权限模型、简单权限模型(Simple Permission Model,SPM)和基于Schema的简单权限模型(Schema-Level Permission Model,SLPM),可以根据业务情况选择合适的权限模型,但是在实例使用中往往会有权限模型切换的需求。本文为您介绍不同的权限模型之间如何快速简单切换。

查看当前数据库的权限模型

查看当前数据库的权限模型有如下两种方式。
  • HoloWeb

    在HoloWeb安全中心模块的DB授权页面查看当前数据库的权限模型,详情请参见DB管理

  • SQL语句
    可以使用以下命令语句查看数据库是否开启了SPM或者SLPM。
    --查看是否开启SPM
    show hg_experimental_enable_spm;
    
    --查看是否开启SLPM
    show hg_enable_slpm;

简单权限模型(SPM)切换为专家权限模型

  • 注意事项
    • 只能由Superuser执行关闭简单权限模型操作。
    • Public拥有Public Schema的USAGE及CREATE权限。
    • Public拥有DB的CONNECT及TEMPORARY权限。
    • Public拥有functions及procedures的EXECUTE权限。
    • Public拥有language, data types (include domains)的USAGE权限。
    • Public不拥有其他对象如table、view、materialized view、table column、sequence、foreign data wrapper、foreign server及schema(除public schema)等的权限。
    • 关闭简单权限模型之后,用户组的权限如下。
      • admin:保留对当前已有对象的权限,但对新建数据库对象不生效。
      • developer用户组:保留对当前已有对象的权限,但对新建数据库对象不生效。
      • writer用户组:保留对当前已有对象的权限,但对新建数据库对象不生效。
      • viewer用户组:保留对当前已有对象的权限,但对新建数据库对象不生效。
  • 切换权限模型
    执行以下SQL命令关闭简单权限模型,简单权限模型关闭后就会变成专家权限模型。
    --关闭简单模型
    call spm_disable ();
    --清理用户组(可选)
    call spm_cleanup ('dbname');
    说明 关闭简单权限模型之后,对应用户组将不会被删除,通常情况下,为了方便管理不建议删除用户组,如需要清理用户组,请确保该DB上没有正在运行的SQL语句,否则可能会失败,并可能对服务产生影响。

专家权限模型切换为简单权限模型(SPM)

专家权限模型切换成简单权限模型命令语句如下。
-- 开启当前DB的简单权限模型
call spm_enable ();
-- 将DB中已有的对象owner更新为developer,使用SPM管理。
call spm_migrate ();
如果报错:ERROR: cannot enable Simple Privilege Model for db=[xxxxxx] because roles conflict,说明之前已经开启过SPM,系统角色还在,因此只需以恢复模式开启SPM,执行以下命令语句。
--再次开启简单权限模型
call spm_enable ('t');

--将DB中已有的对象owner更新为developer,使用SPM管理。
call spm_migrate ();
说明 若是切换成SPM后,新的账号可能会存在即使有权限也会报错没有权限的情况,说明之前的对象迁移不够完整,需要多次执行call spm_migrate ();命令。

简单权限模型(SPM)切换为Schema级别的权限模型(SLPM)

从SPM切换到SLPM没有直接的方法,需要先从SPM切换成专家权限模型,再从专家权限模型切换为SLPM,切换命令如下。
-- 关闭SPM,回到专家模型
call spm_disable ();
-- 清理SPM系统角色
call spm_cleanup ('dbname');
-- 开启Schema级别的权限
call slpm_enable ();
-- 将DB中已有的对象owner更新为developer,使用SLPM管理,必须执行
call slpm_migrate ();
如果报错:cannot enable slpm for database xxxxx because roles conflict.,说明之前已经开启过SLPM,系统角色还在,因此需要以恢复模式开启SLPM,执行以下命令。
-- 关闭SPM
call spm_disable ();
-- 清理SPM系统角色
call spm_cleanup ('dbname');
-- 开启Schema级别的权限(以恢复模式开启SLPM)
call slpm_enable ('t');
-- 将DB中已有的对象owner更新为developer,使用SLPM管理,必须操作
call slpm_migrate ();
说明 若是切换成SLPM后,新的账号可能会存在即使有权限也会报错没有权限的情况,说明之前的对象迁移不够完整,需要多次执行call slpm_migrate ();命令。

Schema级别的权限模型(SLPM)切换为简单权限模型(SPM)

从SLPM切换到SPM没有直接的方法,需要先从SLPM切换成专家权限模型,再从专家权限模型切换为SPM,切换命令如下。
-- 关闭SLPM
call slpm_disable ();
-- 清理SLPM系统角色
call slpm_cleanup ('dbname');
-- 开启当前DB的简单权限模型
call spm_enable ();
-- 将DB中已有的对象owner更新为develoepr,使用SPM管理。
call spm_migrate ();
如果报错:cannot enable spm for database xxxxx because roles conflict.,说明之前已经开启过SPM,系统角色还在,因此需要以恢复模式开启SPM,执行以下命令。
-- 关闭SLPM
call slpm_disable ();
-- 清理SLPM系统角色
call slpm_cleanup ('dbname');
-- 开启SPM(以恢复模式开启SPM)
call spm_enable ('t')
-- 将DB中已有的对象owner更新为developer,使用SPM管理。
call spm_migrate ();
说明 若是切换成SPM后,新的账号可能会存在即使有权限也会报错没有权限的情况,说明之前的对象迁移不够完整,需要多次执行call spm_migrate ();命令。