本文为您介绍在交互式分析Hologres中简单权限模型(Simple Permission Model,SPM)的函数调用说明,您可以通过调用相关函数管理简单权限模型。

spm_enable

  • 函数介绍

    spm_enable()函数用于开启简单权限模型。

    调用spm_enable()函数后,系统将会自动创建<db>_admin、<db>_developer、<db>_writer和<db>_viewer 4个用户组。

  • 命令语法
    CALL spm_enable ();
    说明 仅实例的Superuser可以执行spm_enable()函数。
  • 使用说明
    调用spm_enable ()函数成功开启SPM的使用说明如下:
    • DB的所有权限从PUBLIC用户组收回。因此,不相关的用户将不能连接到目标DB。
    • DB下所有Schema的所有权限从PUBLIC用户组收回。
    • <db>_admin、<db>_developer、<db>_writer和<db>_viewer都具有DB的连接权限。
    • <db>_admin将作为DB的Owner以及DB下所有Schema的Owner。
    • <db>_developer、<db>_writer和<db>_viewer具有所有Schema的USAGE权限,<db>_developer具有所有Schema的CREATE权限。
    • <db>_admin和<db>_developer未来创建的对象,Owner都是<db>_developer。<db>_writer具有读写(readwrite)权限,<db>_viewer具有只读(readonly)权限。

spm_migrate

  • 函数介绍

    spm_migrate()函数用于将已有实例对象(包括表、视图及外表等)迁移至SPM权限模型。

  • 命令语法
    CALL spm_migrate ( [ batch_size ] );
    参数说明如下表所示。
    参数 描述 取值范围
    batch_size 单次批量迁移对象的大小。

    取值为0代表采用当前max_locks_per_transaction作为batch_size。

    [0, max_locks_per_transaction],超出该范围则不合法。

    如果您的实例中有大量的对象(超过数千甚至数万)需要迁移,可能会导致锁溢出,需要您多次执行spm_migrate()函数,直到全部对象迁移完成为止。

    同时,建议您提交工单max_locks_per_transaction参数调大,再执行迁移操作。

  • 使用说明
    • 调用spm_migrate()函数时,当遇到DONE BUT NOT COMPLETED提示,说明全部对象还没有迁移完毕,您需要继续执行spm_migrate()迁移。
    • 当遇到COMPLETED提示,说明全部对象已经迁移完毕。
  • 使用示例
    CALL spm_migrate (); //迁移最多max_locks_per_transaction个对象至SPM管理。
    
    CALL spm_migrate (128); // 迁移128个对象至SPM管理。

spm_create_user

  • 函数介绍
    spm_create_user()函数用于在SPM中创建用户。创建的用户仅具有登录权限,您需要授予其具体的权限才能进行开发。
    说明 仅Superuser和<db>_admin的成员可以调用该函数。
  • 命令语句
    CALL spm_create_user ( user_name [, role_name] );
    参数说明如下表所示。
    参数 描述
    user_name 需要创建的用户名。格式如下:
    • 阿里云云账号ID,例如13432193xxxx或者xx@aliyun.com。
    • RAM子账号ID,例如RAM$mainaccount:subuser或者p4_202338382183xxx。
    role_name 创建的用户默认加入的用户组。可以为<db>_admin、<db>_developer、<db>_writer或<db>_viewer。
  • 使用示例
    CALL spm_create_user ('my_test@aliyun.com');
    CALL spm_create_user ('RAM$my_test:mysubuser', 'mydb_developer');
    CALL spm_create_user ('13532313103042xxx');
    CALL spm_create_user ('p4_23319103042xxx', 'mydb_admin');

spm_grant

  • 函数介绍
    spm_grant()函数用于将某个用户加入到<db>_admin、<db>_developer、<db>_writer或<db>_viewer用户组。
    说明 仅Superuser和<db>_admin可以调用该函数。
  • 命令语法
    CALL spm_grant ( role_name, user_name );
    参数说明如下表所示。
    参数 描述
    user_name 需要创建的用户名。格式如下:
    • 阿里云云账号ID,例如13432193xxxx或者xx@aliyun.com。
    • RAM子账号ID,例如RAM$mainaccount:subuser或者p4_202338382183xxx。
    role_name 创建的用户默认加入的用户组。可以为<db>_admin、<db>_developer、<db>_writer或<db>_viewer。
  • 使用说明
    • 只有开启简单权限模型后才能调用该函数。
    • user_name必须是云账号ID或者云账号。
    • role_name必须是<db>_admin、<db>_developer、<db>_writer或<db>_viewer用户组。
  • 使用示例
    CALL spm_grant ('mydb_developer', 'p4_202338382183xxx');//授予子账号mydb的developer权限。
    CALL spm_grant ('mydb_admin', 'RAM$my_test:xxx');//授予子账号mydb的admin权限。
    CALL spm_grant ('otherdb_admin', '13532313103042xxx'); // 错误,加入其他DB的角色请连接到其他DB执行spm_grant函数。

spm_revoke

  • 函数介绍
    spm_revoke()函数用于将某个用户从<db>_admin、<db>_developer、<db>_writer或<db>_viewer用户组中移除。
    说明 仅Superuser和<db>_admin可以调用该函数。
  • 命令语法
    CALL spm_revoke ( role_name, user_name );
  • 使用说明
    • 只有开启简单权限模型后才能调用该函数。
    • user_name必须是云账号ID或者云账号。
    • role_name必须是<db>_admin、<db>_developer、<db>_writer或<db>_viewer用户组。
  • 使用示例
     CALL spm_revoke ('mydb_developer', 'p4_202338382183xxx');//将子账号从mydb的developer用户组移除。
    CALL spm_revoke ('mydb_admin', 'RAM$my_test:xxx');//将子账号从mydb的admin用户组移除。
    CALL spm_revoke ('otherdb_admin', '13532313103042xxx'); // 错误,移出其他DB的用户组请连接到其他DB执行spm_revoke。

spm_disable

  • 函数介绍
    spm_disable()函数用于为当前DB关闭简单权限模型。
    说明 仅Superuser可以调用该函数。
  • 命令语句
    CALL spm_disable ();
  • 使用说明
    关闭SPM的说明如下:
    • <db>_admin、<db>_developer、<db>_writer和<db>_viewer用户组继续保留,可以使用专家模式授权语句将用户加入对用户组来做权限管理,数据库对象Owner保持不变(仍然是<db>_devleoper)。
    • DB的CONNECT,TEMPORARY权限向PUBLIC开放。
    • DB中public schema的USAGE,CREATE权限向PUBLIC开放。
    • DB中public schema中function,procedure的EXECUTE权限向PUBLIC开放。
    • 用户定义的LANGUAGE的USAGE权限向PUBLIC开放。
    • 用户定义的TYPE的USAGE权限向PUBLIC开放。
  • 使用示例
    CALL spm_disable ();

spm_cleanup

  • 函数介绍
    spm_disable()函数用于清除DB的SPM保留用户组,包括<db>_admin、<db>_developer、<db>_writer和<db>_viewer。
    说明 仅Superuser可以调用此函数。
  • 命令语句
    CALL spm_cleanup ( db_name [, batch_size ] );
    参数说明如下表所示。
    参数 描述 取值范围
    db_name 需要清除用户组的DB。包含特殊字符或大写字母的db_name用双引号引起来。例如“MYDB”
    batch_size 单次批量迁移对象的大小。

    取值为0代表采用当前max_locks_per_transaction作为batch_size。

    [0, max_locks_per_transaction],超出该范围则不合法。

    如果您的实例中有大量的对象(超过数千甚至数万)需要迁移,可能会导致锁溢出,需要您多次执行spm_migrate()函数,直到全部对象迁移完成为止。

    同时,建议您提交工单max_locks_per_transaction参数调大,再执行迁移操作。

  • 使用说明
    • 当遇到DONE BUT NOT COMPLETED提示,说明全部对象还没有迁移完毕,并且未删除保留用户组,您需要继续执行spm_cleanup()函数。
    • 当遇到COMPLETED提示,说明全部对象已经迁移完毕,并已删除保留用户组,无需再调用此函数。
  • 使用示例
    CALL spm_cleanup ('mydb'); //单次最多将max_locks_per_transaction个对象转移Owner到current_user。
    CALL spm_cleanup ('mydb', 128);//单次转移128个对象的Owner到current_user。
    • 场景1:删除对应DB,再清除用户组。
      drop database mydb;
      CALL spm_cleanup ('mydb');  // 无需重试,一次成功。
    • 场景2:在DB仍然存在的情况下,需要连接到对应DB进行清除。
       CALL spm_cleanup ('otherdb');
      ERROR:  Permission Denied. execute in database otherdb, or drop database before call spm_cleanup.

spm_alter_database_rename

  • 函数介绍

    spm_alter_database_rename()函数用于重命名DB。

    开启SPM时,重命名DB需要同步修改4个用户组的命名。因此,需要调用spm_alter_database_rename函数来重命名DB。
    说明 仅Superuser和<db>_admin成员可以调用该函数。
  • 命令语法
    CALL spm_alter_database_rename ( old_name, new_name );
    参数说明如下表所示。
    参数 描述
    old_name 需要重命名的目标DB名。包含特殊字符或大写字母的db_name需要使用双引号引起来。例如“MYDB”
    new_name 将DB重命名为new_name。包含特殊字符或大写字母的db_name需要使用双引号引起来。例如“MYDB”
  • 使用示例
    CALL spm_alter_database_rename ('olddb', 'newdb');  

功能函数调用权限

用户组对功能函数调用的权限如下表所示。

功能函数 作用 Superuser db_admin db_developer | db_writer | db_viewer
spm_enable 开启简单权限模型。
spm_disable 关闭简单权限模型。
spm_grant 将user加入组。
spm_revoke 将user移出组。
spm_alter_database_rename 修改DB名称,并修改所有Schema的保留用户组名称。
spm_migrate 将已有的表或类表对象等迁移至SPM管理。
spm_cleanup 删除DB所有保留用户组。
spm_create_user 创建简单用户并该用户仅拥有登录权限。

相关权限命令限制

开启简单权限模型之后,部分权限相关命令会受到限制,不能在简单模型中使用的命令如下表所示。

命令语句 说明
alter table owner to xx 所有table owner都自动是对应Schema的developer用户组,不能更改,无需手动更改。
grant 通过spm_grant将用户加入某个用户组后,无需再执行grant语句。
revoke 通过spm_revoke将用户加入某个用户组后,无需再执行revoke语句。
alter default privileges 在原权限模型下,授权只对当前以及过去的表有权限,未来表还需要重新授权。在简单模型下,无需考虑建表的时态,只需要加入某个用户组就能拥有对应的权限,因此无需再给未来表授权。
create role / drop role / alter role / alter role set 默认用户组 db_admin、db_developer及db_viewer为系统默认用户组,在开启简单权限模型后,会默认生成,不允许用户(包括Superuser)对默认用户组进行创建或修改。
rename to/from 默认用户组 不可以对保留用户组(*_admin, *_developer, *_writer, *_viewer)进行更名。
rename database 不可以直接使用alter database rename修改DB名称,需要调用spm_alter_database_rename函数实现该功能。