全部產品
Search
文件中心

Hologres:許可權模型轉換

更新時間:Jul 27, 2024

Hologres提供三種許可權模型:專家許可權模型、簡單許可權模型(Simple Permission Model,SPM)和基於Schema的簡單許可權模型(Schema-Level Permission Model,SLPM),可以根據業務情況選擇合適的許可權模型,但是在執行個體使用中往往會有許可權模型切換的需求。本文為您介紹不同的許可權模型之間如何快速簡單切換。

查看當前資料庫的許可權模型

查看當前資料庫的許可權模型有如下兩種方式。

  • HoloWeb

    在HoloWeb資訊安全中心模組的DB授權頁面查看當前資料庫的許可權模型,詳情請參見DB管理

  • SQL語句

    可以使用以下命令語句查看資料庫是否開啟了SPM或者SLPM。

    --查看是否開啟SPM
    SHOW hg_experimental_enable_spm;
    
    --查看是否開啟SLPM
    SHOW hg_enable_slpm;

簡單許可權模型(SPM)切換為專家許可權模型

  • 注意事項

    • 只能由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使用者組:保留對當前已有對象的許可權,但對建立資料庫物件不生效。

  • 切換許可權模型

    執行以下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,系統角色還在,因此只需以復原模式開啟SPM,執行以下命令語句。

--再次開啟簡單許可權模型
CALL spm_enable ('t');

--將DB中已有的對象owner更新為developer,使用SPM管理。
CALL spm_migrate ();
說明

若是切換成SPM後,新的帳號可能會存在即使有許可權也會報錯沒有許可權的情況,說明之前的對象遷移不夠完整,需要多次執行call spm_migrate ();命令。

簡單許可權模型(SPM)切換為Schema層級的許可權模型(SLPM)

從SPM切換到SLPM沒有直接的方法,需要先從SPM切換成專家許可權模型,再從專家許可權模型切換為SLPM,切換命令如下。

-- 關閉SPM,回到專家模型
CALL spm_disable ();
-- 清理SPM系統角色
CALL spm_cleanup ('dbname');
-- 開啟Schema層級的許可權
CALL slpm_enable ();
-- 將DB中已有的對象owner更新為developer,使用SLPM管理,必須執行
CALL slpm_migrate ();

如果報錯:cannot enable slpm for database xxxxx because roles conflict.,說明之前已經開啟過SLPM,系統角色還在,因此需要以復原模式開啟SLPM,執行以下命令。

-- 關閉SPM
CALL spm_disable ();
-- 清理SPM系統角色
CALL spm_cleanup ('dbname');
-- 開啟Schema層級的許可權(以復原模式開啟SLPM)
CALL slpm_enable ('t');
-- 將DB中已有的對象owner更新為developer,使用SLPM管理,必須操作
CALL slpm_migrate ();
說明

若是切換成SLPM後,新的帳號可能會存在即使有許可權也會報錯沒有許可權的情況,說明之前的對象遷移不夠完整,需要多次執行call slpm_migrate ();命令。

Schema層級的許可權模型(SLPM)切換為簡單許可權模型(SPM)

從SLPM切換到SPM沒有直接的方法,需要先從SLPM切換成專家許可權模型,再從專家許可權模型切換為SPM,切換命令如下。

-- 關閉SLPM
CALL slpm_disable ();
-- 清理SLPM系統角色
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,系統角色還在,因此需要以復原模式開啟SPM,執行以下命令。

-- 關閉SLPM
CALL slpm_disable ();
-- 清理SLPM系統角色
CALL slpm_cleanup ('dbname');
-- 開啟SPM(以復原模式開啟SPM)
CALL spm_enable ('t')
-- 將DB中已有的對象owner更新為developer,使用SPM管理。
CALL spm_migrate ();
說明

若是切換成SPM後,新的帳號可能會存在即使有許可權也會報錯沒有許可權的情況,說明之前的對象遷移不夠完整,需要多次執行call spm_migrate ();命令。