Amazon Redshift で発生する、"user cannot be dropped" エラーの解決方法を教えてください。

最終更新日: 2020 年 10 月 16

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 コマンドを使用します。


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


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