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

2 分的閱讀內容
0

我無法捨棄 Amazon Redshift 中的使用者或群組。

簡短說明

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

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

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

  • 先前授予預設權限的擁有者或目標使用者。
  • 任何物件 (例如資料庫、結構描述、資料表、視圖、程序和程式庫) 的擁有者。
  • 擁有先前所提到物件之權限的使用者。

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

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

解決方法

捨棄使用者

重要事項: 在您捨棄使用者之前,請撤銷所有使用者許可。然後,轉移使用者擁有的任何資料庫物件的擁有權。

1.    從 AWS 實驗室 GitHub 儲存庫下載並安裝 v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 指令碼。上述指令碼會在 Amazon Redshift 中建立視圖,在接下來的兩個步驟中會使用這些視圖。

**注意:**v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 指令碼的視圖在其定義中使用 admin 結構描述。如果您並未在 Amazon Redshift 叢集上建立 admin 結構描述,請在任何其他現有結構描述中建立這些視圖。若要在其他結構描述中建立這些視圖,請修改定義或建立 admin 結構描述。如果視圖定義中有任何資料欄變更,請先捨棄視圖,然後建立新的視圖和定義。如果視圖已存在,且您嘗試在捨棄舊視圖之前建立新視圖,則會收到「無效資料表」錯誤。

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;

注意:grantorgrantee 分別取代為可授予許可和獲得許可的使用者名稱。

如果您的查詢沒有傳回任何記錄或捨棄使用者命令失敗,請執行以下查詢:

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 usename = '<username-to-be-dropped>'; select \* from pg\_default\_acl where defacluser= <user-id>;

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

5.    如果使用者仍然擁有某些物件的許可,請檢查該使用者是否獲授予 assume-role 許可。若要進行此檢查,請執行下列查詢:

select pg\_get\_iam\_role\_by\_user('<user-name>');

如果您看到要捨棄的使用者擁有 assumerole 許可,請使用以下命令撤銷這些許可:

revoke assumerole on all from <user-name> for all;

6.    (選用) 如果要捨棄的使用者仍然擁有某些物件的許可,請檢查使用者是否屬於另一個群組。使用者可能擁有該群組授予的許可。或者,使用者可能擁有授予 PUBLIC 群組或所有使用者的許可。

若要確認仍授予使用者的許可,請執行下列查詢:

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

在第二個查詢的輸出中,檢查 grolist 資料欄。驗證是否有任何項目列出要捨棄的使用者。如果要捨棄的使用者屬於另一個群組,則會列出該使用者 ID。

如果您的 grolist 資料欄指出使用者屬於某個群組,請檢查授予該群組的許可:

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 群組的許可會授予所有使用者。

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

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

此輸出會列出您可用來將擁有權轉移給新使用者的命令。請務必執行列出的命令。

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

9.    使用 DROP USER 命令從資料庫中移除使用者:

drop user <username-to-be-dropped>;

捨棄群組

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

1.     從 AWS 實驗室 GitHub 儲存庫下載並安裝 v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 指令碼。上述指令碼會在 Amazon Redshift 中建立視圖,這些視圖對於接下來的步驟非常實用。

**注意:**v_generate_user_grant_revoke_ddl.sqlv_find_dropuser_objs.sql 指令碼的視圖在其定義中使用 admin 結構描述。如果您並未在 Amazon Redshift 叢集上建立 admin 結構描述,則可以在任何其他現有結構描述中建立這些視圖。若要在其他結構描述中建立這些視圖,請修改定義或建立 admin 結構描述

2.    尋找授予該群組的所有許可,然後撤銷這些許可,如下列範例所示:

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';

3.    在 Amazon Redshift 叢集上的每個資料庫中重複步驟 2。確認已撤銷所有資料庫中群組的許可。

4.    使用 DROP GROUP 命令移除使用者群組。

相關資訊

DROP USER 使用注意事項

DROP GROUP 範例

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