跳至內容

如何解決 Amazon Redshift 中的「無法捨棄使用者」錯誤?

2 分的閱讀內容
0

我無法在 Amazon Redshift 中刪除使用者或群組。

簡短描述

當您嘗試在 Amazon Redshift 中捨棄使用者時,可能會看到下列其中一則錯誤訊息:

  • 錯誤:無法捨棄使用者 "username",因為某些物件依賴於它
  • 錯誤:無法捨棄使用者 "username",因為使用者擁有某個物件的權限
  • 錯誤:無法捨棄使用者 "username",因為使用者擁有某個物件

當您嘗試捨棄下列類型的使用者時,可能會發生這些錯誤:

  • 擁有預設權限的擁有者或目標使用者。
  • 任何物件 (例如資料庫、結構描述、資料表、檢視、程序和程式庫) 的擁有者。
  • 對物件具有權限的使用者。

若要解決這些錯誤訊息,請先移除使用者權限。然後,轉移物件擁有權,或移除物件的群組擁有權。

**重要事項:**您必須撤銷 Amazon Redshift 叢集中所有資料庫的使用者和群組權限。若要查看叢集中的資料庫清單,請執行 SHOW DATABASES 命令。若要查看您登入的資料庫的名稱,請執行 CURRENT_DATABASE 命令。

解決方法

安裝指令碼以建立檢視

以超級使用者身分,從 GitHub 網站上的 AWS 實驗室儲存庫下載並安裝 v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 指令碼。v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 指令碼的檢視在其定義中使用 admin 結構描述。如果 Amazon Redshift 叢集上沒有 admin 結構描述,請修改現有結構描述中的定義。或者,建立 admin 結構描述

如果檢視定義中有任何資料欄變更,請先捨棄現有檢視,然後建立新的檢視和定義。如果在捨棄舊檢視之前建立新檢視,則會收到 not valid table (無效的資料表) 錯誤。

捨棄使用者

請完成下列步驟:

  1. 開啟 query editor v2 (查詢編輯器 v2)。然後,搜尋要捨棄的使用者,以查看授予的使用者權限。

  2. 若要將權限重新授予其他使用者,請執行以下命令:

    select regexp_replace(ddl,grantor,'superuser') from v_generate_user_grant_revoke_ddl where grantor='username' and ddltype='grant' and objtype <>'default acl' order by objseq,grantseq;

    注意:若要重新授予權限,您必須是擁有物件權限的使用者。您必須擁有對其他使用者授予權限的權限。如果您沒有授予權限,則可以作為超級使用者重新授予權限。

  3. 將權限重新授予其他使用者後,執行以下命令撤銷該使用者的權限:

    select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='username' or grantor='username') order by objseq, grantseq desc;

    **注意:**將 grantor 替換為授予權限之使用者的名稱。將 grantee 替換為獲得權限之使用者的名稱。
    如果您的查詢未傳回任何記錄或 DROP USER 命令失敗,請執行下列命令:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and ddl ilike '%user-to-be-dropped%' order by objseq, grantseq desc;

    上述查詢列出了您必須從使用者撤銷的所有其他權限。撤銷這些權限。

  4. 若要檢查空存取控制清單 (ACL),請執行下列查詢:

    select * from pg_user where username = 'username-to-be-dropped';   
    select * from pg_default_acl where defacluser= user-id;
    select pg_get_iam_role_by_user('user-name');

    **注意:**將 username-to-be-droppeduser-name 替換為您的值。若要擷取使用者名稱和使用者 ID,請在 PG_USER_INFO 資料表中尋找 usenameusesysid 資料欄項目。如果 PG_DEFAULT_ACL 資料表中有使用者項目,則無法捨棄該使用者。

  5. 如果使用者仍然擁有物件的權限,請檢查該使用者是否具有 assumerole 權限:

    select pg_get_iam_role_by_user('user-name');

    如果使用者具有 assumerole 權限,請先撤銷公眾的 assumerole。然後,執行下列命令以撤銷 username

    revoke assumerole on all from public for all;  
    revoke assumerole on all from user-name for all;
  6. (選用) 如果使用者仍然擁有某些物件的權限,請檢查使用者是否屬於另一個群組。使用者可能擁有該群組授予的權限。或者,使用者可能擁有授予 PUBLIC 群組的權限。
    若要檢查使用者仍擁有的權限,請執行下列查詢:

    select * from pg_user where username = 'username-to-be-dropped';  
    select * from pg_group;

    pg_group 查詢的輸出中,檢查是否具有在 grolist 欄中列出使用者的項目。如果使用者屬於另一個群組,則 grolist 欄會顯示使用者 ID。若要檢查群組的權限,請執行以下命令:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group group-name' ;
    select * from admin.v_generate_user_grant_revoke_ddl where objname='timecards' and schemaname='postgres' and grantee='PUBLIC' and ddltype='revoke';

    **注意:**將 objnameschemaname 替換為您的資料表和結構描述。預設情況下,Amazon Redshift 將授予 PUBLIC 群組的權限授予所有使用者。

  7. 尋找使用者所擁有的所有物件,然後將所有權轉移給不同的使用者或管理員:

    select ddl||'newuser;' as ddl from admin.v_find_dropuser_objs where objowner = 'username-to-be-dropped';

    上述命令的輸出會列出您必須用於將所有權轉移給新使用者的命令。

  8. 在 Amazon Redshift 叢集上的每個資料庫中重複步驟 2-7。
    **注意:**若要列出您的資料庫,請執行 SHOW DATABASES 命令。

  9. 若要從資料庫移除使用者,請執行下列命令:

    drop user username-to-be-dropped;

捨棄群組

**注意:**在捨棄群組之前,您必須先撤銷群組對物件擁有的任何權限。

請完成下列步驟:

  1. 尋找授予該群組的所有權限,然後撤銷這些權限:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group group-name';
  2. 在 Amazon Redshift 叢集上的每個資料庫中重複步驟 1,以撤銷該群組在所有資料庫中的權限。

  3. 若要移除使用者群組,請執行 DROP GROUP 命令。

AWS 官方已更新 6 個月前