本文為您介紹在即時數倉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()函數,直到全部對象切換完成為止。
同時,建議您加入即時數倉Hologres交流群申請將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
需要建立的使用者名稱。格式如下:
阿里雲帳號,例如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()函數,直到全部對象遷移完成為止。
同時,建議您加入即時數倉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.
功能函數調用許可權
使用者組對功能函數調用的許可權如下表所示。
功能函數 | 作用 | Superuser | db_admin | db_developer | db_writer | db_viewer |
spm_enable | 開啟簡單許可權模型。 | 是 | 否 | 否 |
spm_disable | 關閉簡單許可權模型。 | 是 | 否 | 否 |
spm_grant | 將user加入組。 | 是 | 是 | 否 |
spm_revoke | 將user移出組。 | 是 | 是 | 否 |
spm_migrate | 將已有的表或類表對象等遷移至SPM管理。 | 是 | 是 | 否 |
spm_cleanup | 刪除DB所有保留使用者組。 | 是 | 否 | 否 |
spm_create_user | 建立簡單使用者並該使用者僅擁有登入許可權。 | 是 | 是 | 否 |
相關許可權命令限制
開啟簡單許可權模型之後,部分許可權相關命令會受到限制,不能在簡單模型中使用的命令如下表所示。
命令語句 | 說明 |
alter table owner to xx | 所有table owner都自動是對應Schema的developer使用者組,不能更改,無需手動更改。 |
grant | 通過 |
revoke | 通過 |
alter default privileges | 在原許可權模型下,授權只對當前以及過去的表有許可權,未來表還需要重新授權。在簡單模型下,無需考慮建表的時態,只需要加入某個使用者組就能擁有對應的許可權,因此無需再給未來表授權。 |
create role / drop role / alter role / alter role set預設使用者組 | db_admin、db_developer、db_writer及db_viewer為系統預設使用者組,在開啟簡單許可權模型後,會預設產生,不允許使用者(包括Superuser)對預設使用者組進行建立或修改。 |
rename to/from預設使用者組 | 不可以對保留使用者組 |