本文为您介绍在实时数仓Hologres中简单权限模型(Simple Permission Model,SPM)的函数调用说明,您可以通过调用相关函数管理简单权限模型。
函数概述
简单权限模型的函数及其功能说明如下所示。
- spm_enable:开启简单权限模型。
- spm_migrate:将已有实例对象(包括表、视图及外表等)切换至SPM权限模型。
- spm_create_user:创建仅具有登录权限的用户,您需要授予其具体的权限才能进行开发。
- spm_grant:将某个用户加入到某个用户组。
- spm_revoke:将某个用户从某个用户组中移除。
- spm_disable:关闭当前DB简单权限模型。
- spm_cleanup:清除DB的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],超出该范围则不合法。其中 max_locks_per_transaction
最大取值为64.如果您的实例中有大量的对象(超过数千甚至数万)需要切换至简单权限模型,需要您多次执行spm_migrate()函数,直到全部对象切换完成为止。
同时,建议您搜索(钉钉群号:32314975)加入实时数仓Hologres交流群申请将max_locks_per_transaction参数调大,再执行操作。
- 使用说明
- 调用spm_migrate()函数时,当遇到
DONE BUT NOT COMPLETED
提示,说明全部对象还没有迁移完毕,您需要继续执行spm_migrate()迁移。 - 当遇到
COMPLETED
提示,说明全部对象已经迁移完毕。
- 调用spm_migrate()函数时,当遇到
- 使用示例
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 需要创建的用户名。格式如下: - 阿里云账号,例如13432193xxxx或者xx@aliyun.com。
- RAM用户账号,例如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 );
参数 描述 role_name 可以根据业务需求选择将用户加入如下用户组: - {db}_admin
- {db}_developer
- {db}_writer
- {db}_viewer
user_name 需要被添加进用户组的用户名。格式如下: - 阿里云账号,例如13432193xxxx或者xx@aliyun.com。
- RAM用户账号,例如RAM$mainaccount:subuser或者p4_202338382183xxx。
- 使用说明
- 只有开启简单权限模型后才能调用该函数。
- user_name必须是云账号ID或者云账号。
- role_name必须是{db}_admin、{db}_developer、{db}_writer或{db}_viewer用户组。
- 使用示例
CALL spm_grant('mydb_developer', 'p4_202338382183xxx');//授予RAM用户mydb的developer权限。 CALL spm_grant('mydb_admin', 'RAM$my_test:xxx');//授予RAM用户mydb的admin权限。 CALL spm_gran('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');//将RAM用户从mydb的developer用户组移除。 CALL spm_revoke('mydb_admin', 'RAM$my_test:xxx');//将RAM用户从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}_developer)。
- 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_cleanup()函数用于清除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()函数,直到全部对象迁移完成为止。
同时,建议您搜索(钉钉群号:32314975)加入实时数仓Hologres交流群申请将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.
- 场景1:删除对应DB,再清除用户组。
功能函数调用权限
用户组对功能函数调用的权限如下表所示。
功能函数 | 作用 | 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) 进行更名。 |