Amazon Redshift で発生する「ユーザーを削除できません」というエラーの解決方法を教えてください。

最終更新日: 2021 年 11 月 12 日

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

簡単な説明

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

ERROR: user "username" cannot be dropped because some objects depend on it
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_find_dropuser_objs.sql スクリプトをダウンロードしてインストールします。これらのスクリプトにより、次の 2 つのステップに役立つビューが Amazon Redshift に作成されます。

注: v_generate_user_grant_revoke_ddl.sql スクリプト、および v_find_dropuser_objs.sql スクリプトのビューは、それぞれの定義で admin スキーマを使用します。Amazon Redshift クラスターで admin スキーマを作成していない場合は、他の既存のスキーマを使用して、これらのビューを作成します。別のスキーマでこれらのビューを作成するには、定義を変更するか、admin スキーマを作成してください。ビュー定義に列が変更された場合は、新しいビューと定義を作成する前にビューを削除する必要があることに注意してください。ビューがすでに存在し、古いビューを削除せずに新しいビューを作成しようとすると、無効なテーブル定義エラーが発生します。

2.    削除の対象である、すべての付与済みのユーザーアクセス許可を見つけて、同様のアクセス許可を別のユーザーに付与し直します。

select ddl, grantor, grantee from admin.v_generate_user_grant_revoke_ddl where grantee='<username-to-be-dropped>' and ddltype='grant' and objtype <>'default acl' order by objseq,grantseq;

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

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

select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee='<username-to-be-dropped>' 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 usename = '<username-to-be-dropped>'; 
select * from pg_default_acl where defacluser= <user-id>;

ユーザー名とユーザー ID を取得するには、PG_USER テーブルの usename および usesysid 列のエントリを見つけます。

注: PG_DEFAULT_ACL テーブルにユーザーエントリがない場合、ユーザーを削除することはできません。

5.    (オプション) 削除されるユーザーが一部のオブジェクトに対する許可を引き続き保持している場合は、そのユーザーが別のグループに属しているかどうかを確認します。ユーザーは、そのグループから付与された許可を持っている場合があります。または、ユーザーは、PUBLIC グループ (またはすべてのユーザー) に付与された許可を持っている可能性があります。

ユーザーに引き続き付与されている許可を確認するには、次のクエリを実行します。

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

2 番目のクエリの出力で、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 グループに付与された許可はすべてのユーザーに付与されます。

6.    ユーザーが所有するすべてのオブジェクトを見つけて、削除されるユーザーから異なるユーザーまたは admin に所有権を移行します。

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 コマンドを使用して、データベースからユーザーを削除します。

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

グループの削除

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

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 grantee= 'group <group-name>';

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

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


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


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