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 ();
命令。