本文為您介紹在即時數倉Hologres中基於Schema層級的簡單許可權模型(Schema-level Permission Model,SLPM)的函數調用說明,您可以通過調用相關函數管理Schema層級的簡單許可權模型。
函數概述
基於Schema層級的簡單許可權模型的函數及其功能說明如下所示。
slpm_enable:開啟基於Schema層級的簡單許可權模型。
slpm_migrate:將已有執行個體對象(包括表、視圖及外表等)遷移至SLPM許可權模型。
slpm_create_user:在SLPM中建立使用者。
slpm_grant:將某個使用者加入到{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer或{db}.{schema}.viewer使用者組。
slpm_revoke:將某個使用者從{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer或{db}.{schema}.viewer使用者組中移除。
slpm_disable:為當前DB關閉SLPM。
slpm_cleanup:清除DB的SLPM保留使用者組,包括{db}.admin,{db}.{schema}.developer,{db}.{schema}.writer和{db}.{schema}.viewer。
slpm_rename_schema:重新命名Schema。
slpm_enable
函數介紹
slpm_enable()函數用於開啟基於Schema層級的簡單許可權模型。
調用slpm_enable()函數後,系統將會自動建立{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer和{db}.{schema}.viewer 4個使用者組。
命令文法
CALL slpm_enable ();
說明僅執行個體的Superuser可以執行slpm_enable()函數。
使用說明
調用slpm_enable()函數成功開啟SLPM的使用說明如下:
DB的所有許可權從PUBLIC使用者組收回。因此,不相關的使用者將不能串連到目標DB。
DB下所有Schema的所有許可權從PUBLIC使用者組收回。
{db}.admin,{db}.{schema}.developer,{db}.{schema}.writer和{db}.{schema}.viewer都具有DB的串連許可權。
<db>_admin將作為DB的Owner以及DB下所有Schema的Owner。
{db}.{schema}.developer,{db}.{schema}.writer和{db}.{schema}.viewer具有對應Schema的USAGE許可權,{db}.{schema}.developer具有該Schema的CREATE許可權。
{db}.admin和{db}.{schema}.developer未來建立的Schema對象,Owner都是對應Schema的{db}.{schema}.developer。{db}.{schema}.writer具有讀寫(readwrite)許可權,{db}.{schema}.viewer具有隻讀(readonly)許可權。
{db}.admin和{db}.{schema}.developer未來建立的無schema的對象(例如Foreign Server、FDW、Language等),Owner都是對應Schema的{db}.admin。{schema}.developer、{db}.{schema}.writer和{db}.{schema}.viewer具有使用(USAGE)許可權。
slpm_migrate
函數介紹
slpm_migrate()函數用於將已有執行個體對象(包括表、視圖及外表等)遷移至SLPM許可權模型。
命令文法
CALL slpm_migrate ( [ batch_size ] );
參數說明如下表所示。
參數
描述
取值範圍
batch_size
單次批量遷移對象的大小。
取值為0代表採用當前max_locks_per_transaction作為batch_size。
[1, 64],超出該範圍則不合法。
如果您的DB中有較多的對象(數百個)需要遷移,需要您多次執行slpm_migrate()函數,直到全部對象遷移完成為止。
如果您的DB內有大量表對象(超過數千甚至數萬),建議您加入即時數倉Hologres交流群申請將max_locks_per_transaction參數調大,再執行遷移操作,加群方式請參見如何擷取更多的線上支援?。
使用說明
調用slpm_migrate()函數時,如果出現
DONE BUT NOT COMPLETED
提示,說明全部對象還沒有遷移完畢,您需要繼續執行slpm_migrate()遷移。如果出現
COMPLETED
提示,說明全部對象已經遷移完畢。
使用樣本
CALL slpm_migrate (); //遷移最多max_locks_per_transaction個對象至SLPM管理。 CALL slpm_migrate (64); // 遷移64個對象至SLPM管理。
slpm_create_user
函數介紹
slpm_create_user()函數用於在SLPM中建立使用者。建立的使用者僅具有登入許可權,您需要授予其具體的許可權才能進行開發。
說明僅Superuser和{db}.admin的成員可以調用該函數。
命令語句
CALL slpm_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}.{schema}.developer
{db}.{schema}.writer
{db}.{schema}.viewer
關於使用者組的許可權說明,請參見基於Schema層級的簡單許可權模型介紹。
使用樣本
CALL slpm_create_user ('my_test@aliyun.com'); CALL slpm_create_user ('RAM$my_test:mysubuser', 'mydb.public.developer'); CALL slpm_create_user ('13532313103042xxx'); CALL slpm_create_user ('p4_23319103042xxx', 'mydb.admin');
slpm_grant
函數介紹
slpm_grant()函數用於將某個使用者加入到{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer或{db}.{schema}.viewer使用者組。
說明僅Superuser和{db}.admin可以調用該函數。
命令文法
CALL slpm_grant ( role_name, user_name );
參數說明如下表所示。
參數
描述
user_name
需要授權的使用者名稱。格式如下:
阿里雲雲帳號,例如13432193xxxx或者xx@aliyun.com。
RAM使用者帳號,例如RAM$mainaccount:subuser或者p4_202338382183xxx。
role_name
可以根據業務需求選擇加入如下使用者組:
{db}.admin
{db}.{schema}.developer
{db}.{schema}.writer
{db}.{schema}.viewer
關於使用者組的許可權說明,請參見基於Schema層級的簡單許可權模型介紹。
使用說明
只有開啟SLPM後才能調用該函數。
user_name必須是雲帳號ID或者雲帳號。
role_name必須是{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer或{db}.{schema}.viewer使用者組。
使用樣本
CALL slpm_grant ('mydb.public.developer', 'p4_202338382183xxx');//授予RAM使用者mydb的developer許可權。 CALL slpm_grant ('mydb.admin', 'RAM$my_test:xxx');//授予RAM使用者mydb的admin許可權。 CALL slpm_grant ('otherdb.admin', '13532313103042xxx'); // 錯誤,加入其他DB的角色請串連到其他DB執行slpm_grant函數。
slpm_revoke
函數介紹
slpm_revoke()函數用於將某個使用者從{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer或{db}.{schema}.viewer使用者組中移除。
說明僅Superuser和{db}.admin可以調用該函數。
命令文法
CALL slpm_revoke ( role_name, user_name );
使用說明
只有開啟SLPM後才能調用該函數。
user_name必須是雲帳號ID或者雲帳號。
role_name必須是{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer或{db}.{schema}.viewer使用者組。
使用樣本
CALL slpm_revoke ('mydb.public.developer', 'p4_202338382183xxx');//將RAM使用者從mydb的developer使用者組移除。 CALL slpm_revoke ('mydb.admin', 'RAM$my_test:xxx');//將RAM使用者從mydb的admin使用者組移除。 CALL slpm_revoke ('otherdb.admin', '13532313103042xxx'); // 錯誤,移出其他DB的使用者組請串連到其他DB執行slpm_grant。
slpm_disable
函數介紹
slpm_disable()函數用於為當前DB關閉SLPM。
說明僅Superuser可以調用該函數。
命令語句
CALL slpm_disable ();
使用說明
關閉slpm的說明如下:
{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer和{db}.{schema}.viewer使用者組繼續保留,可以使用專家模式授權語句將使用者加入對使用者組來做許可權管理,資料庫物件Owner保持不變(仍然是{db}.{schema}.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 slpm_disable ();
slpm_cleanup
函數介紹
slpm_cleanup()函數用於清除DB的SLPM保留使用者組,包括{db}.admin、{db}.{schema}.developer、{db}.{schema}.writer和{db}.{schema}.viewer。
說明僅Superuser可以調用此函數。
命令語句
CALL slpm_cleanup ( db_name [, batch_size ] );
參數說明如下表所示。
參數
描述
取值範圍
db_name
需要清除使用者組的DB。
如果名稱中包含特殊字元或大寫字母的db_name用雙引號("")引起來。例如
"MYDB"
。batch_size
單次批量遷移對象的大小。
取值為0代表預設採用[0,64]max_locks_per_transaction作為當前batch_size。
[0, 64],超出該範圍則不合法。
如果您的DB中有大量的對象(數百個)需要遷移,可能會導致鎖溢出,需要您多次執行slpm_cleanup()函數,直到全部對象遷移完成為止。
如果您的DB中有大量的對象(超過數千甚至數萬)需要遷移,建議您加入即時數倉Hologres交流群申請將batch_size參數調大,再執行遷移操作,加群方式請參見如何擷取更多的線上支援?。
使用說明
調用slpm_cleanup()函數時,如果出現
DONE BUT NOT COMPLETED
提示,說明全部對象還沒有遷移完畢,並且未刪除保留使用者組,您需要繼續執行slpm_cleanup()函數。如果出現
COMPLETED
提示,說明全部對象已經遷移完畢,並已刪除保留使用者組,無需再調用此函數。
使用樣本
CALL slpm_cleanup ('mydb'); //單次最多將max_locks_per_transaction個對象轉移Owner到current_user。 CALL slpm_cleanup ('mydb', 64);//單次轉移64個對象的Owner到current_user。
情境1:刪除對應DB,再清除使用者組。
drop database mydb; CALL slpm_cleanup ('mydb'); // 無需重試,一次成功。
情境2:在DB仍然存在的情況下,需要串連到對應DB進行清除。
CALL slpm_cleanup ('otherdb'); ERROR: Permission Denied. execute in database otherdb, or drop database before call slpm_cleanup.
slpm_rename_schema
函數介紹
slpm_rename_schema()函數用於重新命名Schema。
開啟SLPM時,重新命名schema需要同步修改4個使用者組的命名。因此,需要調用slpm_rename_schema()函數來重新命名schema。
說明僅Superuser和{db}.admin成員可以調用該函數。
命令文法
CALL slpm_rename_schema ( old_name, new_name );
參數說明如下表所示。
參數
描述
old_name
需要重新命名的目標Schema名。包含特殊字元或大寫字母的schema_name需要使用雙引號("")引起來。例如
“MYDB”
。new_name
將Schema重新命名為new_name。包含特殊字元或大寫字母的schema_name需要使用雙引號("")引起來。例如
“MYDB”
。使用樣本
CALL slpm_rename_schema ('oldschema', 'newschema');