本文為您介紹在實時數倉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默認用戶組 | 不可以對保留用戶組 |