Amazon Redshift の「user cannot be dropped」エラーを解決する方法を教えてください。

最終更新日: 2020 年 9 月 1 日

Amazon Redshift のユーザーまたはグループを削除できません。どうすればこの問題を解決できますか?

簡単な説明

Amazon Redshift でユーザーまたはグループを削除しようとすると、次のいずれかのエラーメッセージが表示されることがあります。

ERROR: user 'username' cannot be dropped because the user has a privilege on some object
ERROR: user 'username' cannot be dropped because the user owns some object

エラーメッセージを解決するには、まずユーザーのアクセス許可を削除してからオブジェクトの所有権を移行する、またはオブジェクトのグループ所有権を削除する必要があります。

注意: Amazon Redshift クラスター内にあるすべてのデータベースからユーザーとグループのアクセス許可を取り消す必要があります。

解決方法

ユーザーの削除

重要: ユーザーを削除する前に、ユーザーのアクセス許可を取り消してください。次に、そのユーザーが所有するデータベースオブジェクトの所有権を移行します。

1.    AWS ラボの GitHub リポジトリから v_generate_user_grant_revoke_ddl.sql スクリプトをダウンロードしてインストールします。v_generate_user_grant_revoke_ddl.sql スクリプトにより、次の 2 つのステップで役立つビューが Amazon Redshift に作成されます。

注意: v_generate_user_grant_revoke_ddl.sql スクリプト、および v_find_dropuser_objs.sql スクリプトのビューは、それぞれの定義で admin スキーマを使用します。Amazon Redshift クラスターで admin スキーマを作成していない場合は、他の既存スキーマでこれらのビューを作成できます。別のスキーマでこれらのビューを作成するには、定義を変更、または admin スキーマを作成してください。

2.    削除されるすべての付与済みユーザーアクセス許可を見つけて、これらのアクセス許可を別のユーザーに付与し直します。

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

注意: アクセス許可を再付与するユーザーは、オブジェクトに対するアクセス許可を持つユーザーである必要があります。このユーザーは、別のユーザーにアクセス許可を付与できる必要もあります。再付与許可を持つユーザーが他にいない場合は、スーパーユーザーとしてそれらを再付与できます。

3.    ユーザーに付与されたすべてのアクセス許可を見つけて、それらを取り消します。

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

4.    次のクエリを実行して、空のアクセスコントロールリスト (ACL) をチェックします。

select * from pg_user where usename = ‘testuser1’;
select * from pg_default_acl where defacluser= 108;

ユーザーを削除するには、pg_default_acl テーブルにユーザーのエントリがないようにする必要があります。

クエリがユーザーのエントリを返す場合は、revoke コマンドを再度実行します。

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

5.    ユーザーが所有するすべてのオブジェクトを見つけて、削除されるユーザーから異なるユーザーまたは admin に所有権を移行します。次の例では、username が現在の所有者で、newuser が新しい所有者です。

select ddl||'<newuser>;' as ddl from v_find_dropuser_objs where objowner = 'testuser1';

6.    Amazon Redshift クラスターの各データベースでステップ 2~5 を繰り返します。

7.    DROP USER コマンドを使用して、データベースからユーザーを削除します。

drop user testuser1;

グループの削除

グループを削除する前に、そのグループがオブジェクトに対して持っているアクセス許可を取り消す必要があります。

1.    AWS ラボの GitHub リポジトリから v_generate_user_grant_revoke_ddl.sql スクリプトと v_find_dropuser_objs.sql スクリプトをダウンロードしてインストールします。これらのスクリプトにより、次のステップに役立つビューが Amazon Redshift に作成されます。

注意: v_generate_user_grant_revoke_ddl.sql スクリプト、および v_find_dropuser_objs.sql スクリプトのビューは、それぞれの定義で admin スキーマを使用します。Amazon Redshift クラスターで admin スキーマを作成していない場合は、他の既存スキーマでこれらのビューを作成できます。別のスキーマでこれらのビューを作成するには、定義を変更、または admin スキーマを作成してください。

2.    次の例にあるように、グループに付与されたすべてのアクセス許可を見つけ、それらを取り消します。

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and username='<groupname>' order by sequence;

3.    Amazon Redshift クラスターにある各データベースでステップ 2 を繰り返し、すべてのデータベースでグループのアクセス許可が取り消されたことを確認します。

4.    ユーザーグループを削除するには、DROP GROUP コマンドを使用します。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?