MogDB-openGauss default privileges 使用方法

奔跑的数据库發表於2024-03-14

MogDB/openGauss default privileges 使用方法

許可權是使用者訪問資料庫物件的首要條件,每個新增使用者預設屬於 PUBLIC 角色組成員,也就是具有 PUBLIC 角色組的許可權,但在日常業務使用中,僅僅具有 PUBLIC 許可權是遠遠不夠的,還需要具有額外的許可權,在 MogDB/openGauss 資料庫支援的業務中經常需要一種具有隻讀許可權的使用者,這個使用者不僅僅可以需要對已經存在的資料庫物件具有隻讀許可權,對未來的資料庫也需要同樣的許可權,如果每新增一個資料庫都要執行一遍 grant 賦權操作,這顯然不是使用者希望的,所以這裡需要藉助 alter default privileges 語法。

語法語義

目前支援表(包括檢視)、 序列、函式、型別、密態資料庫客戶端主金鑰和列加密金鑰的許可權更改。

AlterDafaultPrivileges ::= ALTER DEFAULT PRIVILEGES
    [ FOR { ROLE | USER } target_role [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    abbreviated_grant_or_revoke;

  abbreviated_grant_or_revoke ::= grant_on_tables_clause
        | grant_on_sequences_clause
        | grant_on_functions_clause
        | grant_on_types_clause
        | grant_on_client_master_keys_clause
        | grant_on_column_encryption_keys_clause
        | revoke_on_tables_clause
        | revoke_on_sequences_clause
        | revoke_on_functions_clause
        | revoke_on_types_clause
        | revoke_on_client_master_keys_clause
        | revoke_on_column_encryption_keys_clause

但是在日常使用中,我們經常會遇到一種情況,就是我們已經執行了 alter default privileges 命令,而且已經執行成功了,但是隻讀使用者去查詢新增的資料庫物件時依然提示 Permission denied,這是需要仔細看一下報錯內容:

ERROR: permission denied for schema xxx
這代表沒有 schema 的使用許可權,需要給使用者 schema 賦權
grant usage on schema xxx to xxx;

ERROR: permission denied for relation xxx
這代表沒有這個表的訪問許可權

對於 schema 我們應該很好理解,在 MogDB/openGauss 中每個邏輯層級的物件都有自己的許可權,且都需要單獨給許可權。

但是第二個報錯是什麼原因呢?明明已經給了 default privileges 許可權了呀?

我們現在有三個使用者分別是 omm、u1 和 ur,其中 omm 是超戶,u1 是讀寫使用者,ur 是隻讀使用者,s 是我們的 schema,u1 是 s 的 owner,我們想要使用者 ur 可以訪問 s 下所有的表,包括未來的表。

如果我們使用 u1 登陸資料庫,並給 ur 賦權,我們需要執行

alter default privileges in schema s grant select on tables to ur;

如果我們使用 omm 登陸資料庫,並給 ur 賦權,我們需要執行

alter default privileges for user u1 in schema s grant select on tables to ur;

我們發現執行 alter default privileges 許可權生效與否,與執行的使用者及其語法有關係了,主要是要不要新增for user/role username語法,如果是 schema owner 來執行不需要新增,而其他使用者執行則需要新增此語法。

PS:PG14 新增了全域性只讀角色

相關文章