使用 AWS re:Post 即表示您同意 AWS re:Post 使用條款

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

2 分的閱讀內容
0

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

簡短描述

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

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

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

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

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

重要事項: 您必須撤銷 Amazon Redshift 叢集中所有資料庫的使用者和群組許可。

解決方法

安裝指令碼以建立檢視

從 AWS 實驗室 GitHub 儲存庫下載並安裝 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. 依使用者搜尋,尋找您要捨棄的所有已授予的使用者許可。然後,以其他使用者身分重新授予這些許可。最佳實務是讓此使用者成為超級使用者

    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;

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

  2. 尋找授予使用者的所有許可,然後撤銷這些許可:

    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;

    前面的查詢列出了您在捨棄使用者之前必須從使用者撤銷的許可。先撤銷這些許可,然後再移至下一個步驟。

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

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

    若要擷取使用者名稱和使用者 ID,請在 PG_USER_INFO 資料表中尋找 usenameusesysid 資料欄項目。
    **注意:**如果 PG_DEFAULT_ACL 資料表中有使用者項目,則無法捨棄該使用者。

  4. 如果使用者仍然擁有某些物件的許可,請檢查該使用者是否具有 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;
  5. (選用) 如果使用者仍然擁有某些物件的許可,請檢查使用者是否屬於另一個群組。使用者可能擁有該群組授予的許可。或者,使用者可能擁有授予 PUBLIC 群組的許可。
    若要檢查仍被授予給使用者的許可,請執行下列查詢:

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

    pg_group 查詢的輸出中,檢查是否具有在 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。根據預設,授予 PUBLIC 群組的許可會授予所有使用者。

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

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

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

  7. 在 Amazon Redshift 叢集上的每個資料庫中重複步驟 2-7。

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

    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 叢集上的每個資料庫中重複步驟 2。確認已撤銷所有資料庫中群組的許可。

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

AWS 官方
AWS 官方已更新 5 個月前