本文為您介紹在Hologres中簡單許可權模型(Simple Permission Model,SPM)的使用方法。
使用簡單許可權模型進行授權
在Hologres中,使用簡單許可權模型對單個執行個體進行授權可以使用如下方式:
使用SQL語句進行授權
在Hologres執行個體串連開發工具後,可以使用SQL語句通過簡單模式對使用者進行授權,使該使用者具有執行個體的相關許可權。具體步驟如下所示:
開啟函數調用。
開啟SPM前,您需要執行如下命令,開啟調用函數的開關。
create extension spm;
開啟簡單許可權模型。
簡單許可權模型預設不開啟,Superuser需要在目標DB裡執行如下語句,開啟簡單許可權模型。更多關於函數的說明請參見spm_enable。
call spm_enable(); // 開啟當前DB的簡單許可權模型。
說明開啟簡單許可權模型之後,developer使用者組擁有DB中所有schema的所有表、類表的許可權預設。
可選:專家許可權模型遷移。
如果您的DB使用的是專家許可權模型,並且DB中包含一定數量的表、視圖或外表等對象。此時,您必須將原對象遷移至簡單許可權模型,否則會出現表許可權缺失的情況,從而影響業務運行。在該DB中執行如下語句遷移專家許可權模型。
call spm_migrate(); // 將DB中已有的對象change owner到developer,使用SPM管理。
如果您是新建立的DB,DB內無任何對象,則不需要執行此步驟。
說明在開啟簡單許可權模型時,需要確保當前DB沒有正在啟動並執行SQL,否則可能導致開啟失敗,並對服務產生影響。
由於migrate可能涉及到將大量表進行Alter Owner操作,觸發PostgreSQL對此操作的限制,則spm_migrate每次僅對不超過max_locks_per_transaction的對象進行Change Owner操作。您可能需要多次執行spm_migrate,直到所有對象完成遷移為止。更多關於函數的說明請參見spm_migrate。
建立使用者。
在為新使用者授權之前,您需要將新使用者建立至當前執行個體中。如果新使用者已經被建立進執行個體,可忽略此步驟。
阿里雲帳號、RAM使用者:
call spm_create_user ('雲帳號UID/雲郵箱/RAM帳號'); // 建立使用者,使用雲郵箱時還需要加雙引號 call spm_create_user ('雲帳號UID/雲郵箱/RAM帳號', '<dbname>_[admin|developer|writer|viewer]'); // 建立使用者的同時把使用者加入對應的使用者組
其中
dbname
為當前Hologres執行個體的資料庫名稱。樣本:將RAM使用者
xxx.onaliyun.com
加入testdb
資料庫的developer
使用者組中。call spm_create_user ('xxx.onaliyun.com', 'testdb_developer');
自訂使用者:
create user "BASIC$<user_name>" with password '<password>';
說明如果是RAM使用者,執行
spm_create_user
時需要在帳號UID前加p4_,即“p4_UID”。如果是自訂帳號,暫不支援使用者名稱稱以
admin
、developer
、writer
、viewer
、all_users
結尾。
授權新使用者。
成功將新使用者建立至執行個體後,必須在對應的DB內將新使用者加入相應的使用者組,以完成授權操作。授權後,RAM使用者就能使用開發工具串連當前DB並在許可權範圍內進行開發。如果是在建立使用者的同時已經加入對應的使用者組則不需要再次授權。更多關於函數的說明請參見spm_grant。
如下命令中,{dbname}_[admin|developer|writer|viewer]是將使用者加入當前DB中可供選擇的使用者組名稱,更多描述請參見使用者組說明。
call spm_grant('{dbname}_[admin|developer|writer|viewer]', '雲帳號id/雲郵箱/RAM帳號'); // 將某個使用者加入某個使用者組。
您可以參照如下樣本,將使用者加入不同許可權的使用者組。
// 加入某個DB的admin使用者組。 call spm_grant('mydb_admin', 'p4_564306222995xxx'); // 將564306222995xxx(RAM使用者)加入資料庫mydb的admin使用者組。 call spm_grant('mydb_admin', '197006222995xxx'); // 將197006222995xxx(雲帳號)加入資料庫mydb的admin使用者組。 call spm_grant('mydb_admin', 'ALIYUN$xxx'); // 將xxx@aliyun.com加入資料庫mydb的admin使用者組。 // 加入某個DB的developer使用者組。 call spm_grant('mydb_developer', 'p4_564306222995xxx'); // 將564306222995xxx(RAM使用者)加入資料庫mydb的developer使用者組。 call spm_grant('mydb_developer', '197006222995xxx'); // 將197006222995xxx(雲帳號)加入資料庫mydb的developer使用者組。 call spm_grant('mydb_developer', 'RAM$mainaccount:subuser');// 將雲帳號mainaccount的RAM使用者subuser加入資料庫mydb的developer使用者組。 // 加入某個DB的viewer使用者組。 call spm_grant('"MYDB_viewer"', 'p4_564306222995xxx'); // 將564306222995xxx(RAM使用者)加入資料庫"MYDB"的viewer使用者組。 call spm_grant('"MYDB_viewer"', '197006222995xxx'); // 將197006222995xxx(雲帳號)加入資料庫"MYDB"的viewer使用者組。 call spm_grant('mydb_viewer', '"xxx@aliyun.com"'); // 將帳號xxx@aliyun.com加入資料庫mydb的viewer使用者組。
移除使用者組
在Hologres中,如果您需要將某個使用者從某個DB的某個使用者組中移除,使用簡單許可權模型可以使用如下方式:
使用SQL語句移除使用者組
如果您需要將某個使用者從某個DB的某個使用者組中移除,可以執行如下命令。更多關於函數的說明請參見spm_revoke。
call spm_revoke('<dbname>_[admin|developer|writer|viewer]', '雲帳號id/雲郵箱/RAM帳號'); // 移除某使用者的許可權。 // 樣本: // 將使用者從某DB的admin使用者組移除。 call spm_revoke('dbname_admin', 'p4_564306222995xxx');// 將564306222995xxx(RAM使用者)移除admin使用者組。 call spm_revoke('dbname_admin', '197006222995xxx');// 將197006222995xxx(雲帳號)移除admin使用者組。 call spm_revoke('dbname_admin', 'xxx@aliyun.com');// 將帳號xxx@aliyun.com移除admin使用者組。 // 將使用者從某DB的developer使用者組移除。 call spm_revoke('mydb_developer', 'RAM$mainaccount:subuser'); // 將RAM使用者subuser移出資料庫mydb的developer使用者組。 call spm_revoke('mydb_developer', 'p4_564306222995xxx');//將564306222995xxx(RAM使用者)移除developer使用者組。 // 將使用者從某個DB的viewer使用者組移除。 call spm_revoke('"MYDB_viewer"', 'p4_564306222995xxx'); // 將564306222995xxx(RAM使用者)移出資料庫"MYDB"的viewer使用者組。
刪除使用者
如果您需要從執行個體中刪除某個使用者,可以執行如下語句。
成功刪除使用者後,該使用者將會從當前執行個體刪除,使用者將無執行個體任何許可權,請謹慎執行該操作。
DROP ROLE "雲帳號ID/雲郵箱/RAM帳號"; // 直接將該使用者從執行個體中刪除。
(可選)切換專家模型至簡單許可權模型
如果您的DB使用的是專家許可權模型,並且DB中包含一定數量的表、視圖或外表等對象,您可以開啟簡單許可權模型更好的系統管理權限。您可以通過調用spm_migrate函數將已有對象遷移至簡單許可權模型,在該DB中執行如下語句。
call spm_migrate(); // 將DB已有的對象,change owner到developer,通過SPM管理。
在開啟簡單許可權模型時,需要確保當前DB沒有正在啟動並執行SQL,否則可能導致開啟失敗,並對服務產生影響。
切換時可能涉及到將大量表進行Alter Owner的操作,但spm_migrate語句每次僅對不超過max_locks_per_transaction的對象進行Change Owner,您可能需要多次執行spm_migrate,直到所有對象切換完成為止。
關閉簡單許可權模型
關閉簡單許可權模型。
Superuser可以根據業務需求,在該DB中執行如下語句關閉簡單許可權模型。更多關於函數的說明請參見spm_disable。
call spm_disable();
關閉簡單許可權模型之後,對應使用者組將不會被刪除,使用者組內的使用者擁有的許可權請參見簡單許可權模型函數說明。
清除使用者組。
關閉簡單許可權模型後,您可以根據業務需求,通過調用spm_cleanup函數清除使用者組。情境如下:
說明通常情況下,為了方便管理不建議刪除使用者組。
情境1:刪除使用者組保留DB。
如果您需要刪除DB內的使用者組,但同時又希望當前DB可以繼續使用,Superuser可以執行如下語句。更多關於函數的說明請參見spm_cleanup。
call spm_cleanup('{dbname}');
說明調用spm_cleanup時,請確保該DB上沒有正在啟動並執行SQL語句,否則可能會失敗,並可能對服務產生影響。
由於可能涉及對大量業務表進行Alter Owner操作,spm_cleanup每次僅對不超過
max_locks_per_transaction
的對象進行Alter Owner。因此,您可能需要多次執行spm_cleanup,直到所有對象完成遷移,並刪除四個使用者組為止。情境2:先刪除DB再刪除使用者組。
如果您已經將原有DB刪除,但使用者組並未刪除,Superuser可以在其他的DB(例如postgres)執行如下語句刪除對應使用者組。
call spm_cleanup('mydb');
關閉簡單許可權模型的注意事項:
只能由Superuser執行關閉操作。
Public擁有Public Schema的USAGE及CREATE許可權。
Public擁有DB的CONNECT及TEMPORARY許可權。
Public擁有functions及procedures的EXECUTE許可權。
Public擁有
language, data types (include domains)
的USAGE許可權。Public不擁有其他對象如table、view、materialized view、table column、sequence、foreign data wrapper、foreign server及schema(除public schema)等的許可權。
關閉簡單許可權模型之後,使用者組的許可權如下:
admin:保留對當前已有對象的許可權,但對建立資料庫物件不生效。
developer使用者組:保留對當前已有對象的許可權,但對建立資料庫物件不生效。
writer使用者組:保留對當前已有對象的許可權,但對建立資料庫物件不生效。
viewer使用者組:保留對當前已有對象的許可權,但對建立資料庫物件不生效。
再次開啟簡單許可權模型
如果您的DB已經開啟過簡單許可權模型,後來關閉並使用了專家許可權模型。當您因為業務需求,需要再次開啟簡單許可權模型時,您可以通過執行如下語句再次開啟
call spm_enable('t'); // 開啟當前DB的簡單許可權模型。
call spm_migrate(); // 將DB中已有的對象,change owner到developer,使用SPM管理。
在開啟簡單許可權模型時,需要確保當前DB沒有正在啟動並執行SQL,否則可能導致開啟失敗,並對服務產生影響。
切換時可能涉及到將大量表進行Alter Owner的操作,但spm_migrate語句每次僅對不超過max_locks_per_transaction的對象進行Change Owner,您可能需要多次執行spm_migrate,直到所有對象切換完成為止。