Hologres提供三種權限模型:專家權限模型、簡單權限模型(Simple Permission Model,SPM)和基于Schema的簡單權限模型(Schema-Level Permission Model,SLPM),可以根據(jù)業(yè)務情況選擇合適的權限模型,但是在實例使用中往往會有權限模型切換的需求。本文為您介紹不同的權限模型之間如何快速簡單切換。
查看當前數(shù)據(jù)庫的權限模型
查看當前數(shù)據(jù)庫的權限模型有如下兩種方式。
HoloWeb
在HoloWeb安全中心模塊的DB授權頁面查看當前數(shù)據(jù)庫的權限模型,詳情請參見DB管理。
SQL語句
可以使用以下命令語句查看數(shù)據(jù)庫是否開啟了SPM或者SLPM。
--查看是否開啟SPM SHOW hg_experimental_enable_spm; --查看是否開啟SLPM SHOW hg_enable_slpm;
簡單權限模型(SPM)切換為專家權限模型
注意事項
只能由Superuser執(zhí)行關閉簡單權限模型操作。
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:保留對當前已有對象的權限,但對新建數(shù)據(jù)庫對象不生效。
developer用戶組:保留對當前已有對象的權限,但對新建數(shù)據(jù)庫對象不生效。
writer用戶組:保留對當前已有對象的權限,但對新建數(shù)據(jù)庫對象不生效。
viewer用戶組:保留對當前已有對象的權限,但對新建數(shù)據(jù)庫對象不生效。
切換權限模型
執(zhí)行以下SQL命令關閉簡單權限模型,簡單權限模型關閉后就會變成專家權限模型。
--關閉簡單模型 CALL spm_disable (); --清理用戶組(可選) CALL spm_cleanup ('dbname');
說明關閉簡單權限模型之后,對應用戶組將不會被刪除,通常情況下,為了方便管理不建議刪除用戶組,如需要清理用戶組,請確保該DB上沒有正在運行的SQL語句,否則可能會失敗,并可能對服務產生影響。
專家權限模型切換為簡單權限模型(SPM)
專家權限模型切換成簡單權限模型命令語句如下。
-- 開啟當前DB的簡單權限模型
CALL spm_enable ();
-- 將DB中已有的對象owner更新為developer,使用SPM管理。
CALL spm_migrate ();
如果報錯:ERROR: cannot enable Simple Privilege Model for db=[xxxxxx] because roles conflict
,說明之前已經開啟過SPM,系統(tǒng)角色還在,因此只需以恢復模式開啟SPM,執(zhí)行以下命令語句。
--再次開啟簡單權限模型
CALL spm_enable ('t');
--將DB中已有的對象owner更新為developer,使用SPM管理。
CALL spm_migrate ();
若是切換成SPM后,新的賬號可能會存在即使有權限也會報錯沒有權限的情況,說明之前的對象遷移不夠完整,需要多次執(zhí)行call spm_migrate ();
命令。
簡單權限模型(SPM)切換為Schema級別的權限模型(SLPM)
從SPM切換到SLPM沒有直接的方法,需要先從SPM切換成專家權限模型,再從專家權限模型切換為SLPM,切換命令如下。
-- 關閉SPM,回到專家模型
CALL spm_disable ();
-- 清理SPM系統(tǒng)角色
CALL spm_cleanup ('dbname');
-- 開啟Schema級別的權限
CALL slpm_enable ();
-- 將DB中已有的對象owner更新為developer,使用SLPM管理,必須執(zhí)行
CALL slpm_migrate ();
如果報錯:cannot enable slpm for database xxxxx because roles conflict.
,說明之前已經開啟過SLPM,系統(tǒng)角色還在,因此需要以恢復模式開啟SLPM,執(zhí)行以下命令。
-- 關閉SPM
CALL spm_disable ();
-- 清理SPM系統(tǒng)角色
CALL spm_cleanup ('dbname');
-- 開啟Schema級別的權限(以恢復模式開啟SLPM)
CALL slpm_enable ('t');
-- 將DB中已有的對象owner更新為developer,使用SLPM管理,必須操作
CALL slpm_migrate ();
若是切換成SLPM后,新的賬號可能會存在即使有權限也會報錯沒有權限的情況,說明之前的對象遷移不夠完整,需要多次執(zhí)行call slpm_migrate ();
命令。
Schema級別的權限模型(SLPM)切換為簡單權限模型(SPM)
從SLPM切換到SPM沒有直接的方法,需要先從SLPM切換成專家權限模型,再從專家權限模型切換為SPM,切換命令如下。
-- 關閉SLPM
CALL slpm_disable ();
-- 清理SLPM系統(tǒng)角色
CALL slpm_cleanup ('dbname');
-- 開啟當前DB的簡單權限模型
CALL spm_enable ();
-- 將DB中已有的對象owner更新為develoepr,使用SPM管理。
CALL spm_migrate ();
如果報錯:cannot enable spm for database xxxxx because roles conflict.
,說明之前已經開啟過SPM,系統(tǒng)角色還在,因此需要以恢復模式開啟SPM,執(zhí)行以下命令。
-- 關閉SLPM
CALL slpm_disable ();
-- 清理SLPM系統(tǒng)角色
CALL slpm_cleanup ('dbname');
-- 開啟SPM(以恢復模式開啟SPM)
CALL spm_enable ('t')
-- 將DB中已有的對象owner更新為developer,使用SPM管理。
CALL spm_migrate ();
若是切換成SPM后,新的賬號可能會存在即使有權限也會報錯沒有權限的情況,說明之前的對象遷移不夠完整,需要多次執(zhí)行call spm_migrate ();
命令。