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

所要時間2分
0

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.sqlv_find_dropuser_objs.sql スクリプトをダウンロードしてインストールします。これらのスクリプトにより、次の 2 つのステップに役立つビューが Amazon Redshift に作成されます。

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

2.    削除する必要があるユーザーごとに付与されたすべてのユーザー権限を見つけます。次に、それらの権限を別のユーザーとして再付与します。これには superuser が推奨されます。

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;

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

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は、権限を付与および受け取ることができるユーザーのユーザー名にそれぞれ置き換えてください。

クエリがレコードを返されない場合、または 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 テーブルの [username] および [usesysid] 列のエントリを見つけます。
注: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;

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 グループに付与された権限はすべてのユーザーに付与されます。

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

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

関連情報

DROP ユーザーの使用に関する注意事項

DROP GROUP の例

AWS公式
AWS公式更新しました 9ヶ月前
コメントはありません

関連するコンテンツ