このトピックでは、Hologres でユーザーを削除する方法と、そのプロセス中に発生する可能性のあるエラーのトラブルシューティング方法について説明します。
背景情報
ビジネス上の理由でユーザーを削除する必要がある場合があります。 Hologres では、データベース (DB)、スキーマ、テーブル、ビューなどのデータベース (DB) オブジェクトを所有するユーザーを削除しようとすると、エラーが発生します。 一般的なエラーは次のとおりです。
-
ユーザーが 1 つ以上のオブジェクトを所有しているため、削除できません。 次のエラーが返されます。
ERROR: role "<uid>" cannot be dropped because some objects depend on it DETAIL: owner of table xxx owner of schema yyy -
他のオブジェクトがそのユーザーに依存しているため、ユーザーを削除できません。 次のエラーが返されます。
ERROR: role "<uid>" cannot be dropped because some objects depend on it DETAIL: 1 object in database xxx -
ユーザーに権限が付与されているため、削除できません。 次のエラーが返されます。
ERROR: role "<uid>" cannot be dropped because some objects depend on it Detail: privileges for table xxx privileges for table yyy
これらのエラーは、ユーザーがインスタンス内にまだ依存オブジェクトまたは権限を持っているために発生します。 そのため、ユーザーを直接削除することはできません。
ユーザー削除理由の特定
ユーザーを削除する前に、その理由を特定してください。 一般的な理由には、次のようなものがあります。
-
理由 1:ユーザーに誤った権限が付与されたため、ユーザーを削除して正しい権限を付与したい。
-
理由 2:従業員の退職やユーザーアカウントが使用されなくなったなど、ビジネス上の理由でユーザーを削除する必要がある。
推奨されるソリューション:
-
アカウント削除の理由は理由 1 です。
この場合、ユーザーを削除する必要はありません。 代わりに、ユーザーの現在の権限を取り消してから、新しい権限を付与することができます。
-
標準 PostgreSQL 権限モデルで権限を取り消して付与する方法については、「標準 PostgreSQL 権限モデル」をご参照ください。
-
簡易権限モデルで権限を取り消して付与する方法については、「簡易権限モデルの使用」および「スキーマレベルの簡易権限モデルの使用」をご参照ください。
-
ユーザーが誤って一般ユーザーとして設定され、スーパーユーザーに変更したい場合は、次の文を実行します。
-- ユーザーが RAM ユーザーの場合、uid を p4_id に変更します。 alter user "<uid>" superuser;uid はユーザー ID を指定します。 詳細については、「ユーザー ID」をご参照ください。
-
ユーザーが誤ってスーパーユーザーとして設定され、一般ユーザーに変更したい場合は、次の文を実行します。
説明スーパーユーザーを一般ユーザーに変更した後、そのユーザーには権限がありません。 必要な権限をユーザーに付与する必要があります。
-- ユーザーが RAM ユーザーの場合、uid を p4_id に変更します。 alter user "<uid>" nosuperuser;uid はユーザー ID を指定します。 詳細については、「ユーザー ID」をご参照ください。
-
-
アカウント削除の理由は理由 2 です。
オブジェクトの所有権を別のユーザーに転送してから元のユーザーを削除することで、ユーザーが所有するオブジェクトを保持できます。 詳細については、「ユーザーが所有するオブジェクトを保持したままユーザーを削除」をご参照ください。
ユーザーが所有するオブジェクトを保持したままユーザーを削除
ユーザーを削除する必要があるが、テーブル、ビュー、関数など、ユーザーが所有するオブジェクトを保持したい場合は、これらのオブジェクトの所有権を別のユーザーに転送してから、元のユーザーを削除します。 コマンド構文は次のとおりです。
-
オブジェクトの所有権を別のユーザーに転送します。
REASSIGN OWNED BY "<uid>" TO "<Another_uid>" ;uid はユーザー ID を指定します。 詳細については、「ユーザー ID」をご参照ください。
-
アカウントを削除します。
DROP USER "<uid>";
ユーザーの依存関係の表示
-
次の文を実行して、ユーザーの依存オブジェクトを表示します。
select 'select * from ' || s.classid::regclass || ' where oid = ' || s.objid || '; (Execute in the ' || d.datname || ' DB)' as "Query for dependent objects", case when deptype = 'a' then 'Permission dependency' when deptype = 'o' then 'Owner dependency' else deptype::text end as "Dependency type"from pg_shdepend s join pg_database d on (s.dbid = d.oid) join pg_roles r on (r.oid = s.refobjid) where datname = current_database() and refclassid = 1260 and r.rolname = '<username>'; -
すべてのテーブル、ビュー、および外部テーブルのオーナーを表示します。
SELECT n.nspname AS "Schema", c.relname AS "Name", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 't' THEN 'TOAST table' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END AS "Type", pg_catalog.pg_get_userbyid(c.relowner) AS "Owner", pg_catalog.obj_description(c.oid,'pg_class') AS "Description" FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('r', 'p', 't', 'v', 'm', 'S', 's', 'f', '') AND pg_catalog.pg_table_is_visible(c.oid); -
特定のユーザーが所有するテーブル、ビュー、および外部テーブルを表示します。
SELECT n.nspname AS "Schema", c.relname AS "Name", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 't' THEN 'TOAST table' WHEN 'f' THEN 'foreign table' WHEN 'p' THEN 'partitioned table' WHEN 'I' THEN 'partitioned index' END AS "Type", pg_catalog.pg_get_userbyid(c.relowner) AS "Owner", pg_catalog.obj_description(c.oid, 'pg_class') AS "Description" FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind IN ('r', 'p', 't', 'v', 'm', 'S', 's', 'f', '') AND pg_catalog.pg_table_is_visible(c.oid) AND pg_catalog.pg_get_userbyid(c.relowner) ='<user_name>';オーナーを変更します。
-- テーブルのオーナーを変更します。 ALTER TABLE schema_name.table_name OWNER TO new_owner; -- 外部テーブルのオーナーを変更します。 ALTER FOREIGN TABLE schema_name.foreign_table_name OWNER TO new_owner; -- ビューのオーナーを変更します。 ALTER VIEW schema_name.view_name OWNER TO new_owner; -
スキーマのオーナーを表示します。
-
すべてのスキーマのオーナーを表示します。
SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner", pg_catalog.array_to_string(n.nspacl, E'\n') AS "Access privileges", pg_catalog.obj_description(n.oid, 'pg_namespace') AS "Description" FROM pg_catalog.pg_namespace n ORDER BY 1; -
特定のユーザーが所有するスキーマを表示します。
SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner", pg_catalog.array_to_string(n.nspacl, E'\n') AS "Access privileges", pg_catalog.obj_description(n.oid, 'pg_namespace') AS "Description" FROM pg_catalog.pg_namespace n WHERE pg_catalog.pg_get_userbyid(n.nspowner) ='<user_name>'; -
オーナーを変更します。
-- スキーマのオーナーを変更します。 ALTER SCHEMA schema_name OWNER TO new_owner;
-
-
サーバーのオーナーを表示します。
-
すべてのサーバーのオーナーを表示します。
SELECT s.srvname AS "Name", pg_catalog.pg_get_userbyid(s.srvowner) AS "Owner", f.fdwname AS "Foreign-data wrapper", pg_catalog.array_to_string(s.srvacl, E'\n') AS "Access privileges", s.srvtype AS "Type", s.srvversion AS "Version", CASE WHEN srvoptions IS NULL THEN '' ELSE '(' || pg_catalog.array_to_string(ARRAY ( SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM pg_catalog.pg_options_to_table(srvoptions)), ', ') || ')' END AS "FDW options", d.description AS "Description" FROM pg_catalog.pg_foreign_server s JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid = s.srvfdw LEFT JOIN pg_catalog.pg_description d ON d.classoid = s.tableoid AND d.objoid = s.oid AND d.objsubid = 0; -
特定のユーザーが所有するサーバーを表示します。
SELECT s.srvname AS "Name", pg_catalog.pg_get_userbyid(s.srvowner) AS "Owner", f.fdwname AS "Foreign-data wrapper", pg_catalog.array_to_string(s.srvacl, E'\n') AS "Access privileges", s.srvtype AS "Type", s.srvversion AS "Version", CASE WHEN srvoptions IS NULL THEN '' ELSE '(' || pg_catalog.array_to_string(ARRAY ( SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM pg_catalog.pg_options_to_table(srvoptions)), ', ') || ')' END AS "FDW options", d.description AS "Description" FROM pg_catalog.pg_foreign_server s JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid = s.srvfdw LEFT JOIN pg_catalog.pg_description d ON d.classoid = s.tableoid AND d.objoid = s.oid AND d.objsubid = 0 WHERE pg_catalog.pg_get_userbyid(s.srvowner) = '<user_name>'; -
オーナーを変更します。
-- サーバーのオーナーを変更します。 ALTER SERVER server_name OWNER TO new_owner;
-
-
ユーザーマッピングのオーナーを表示します。
-
すべてのユーザーマッピングのオーナーを表示します。
SELECT um.srvname AS "Server", um.usename AS "User name", CASE WHEN umoptions IS NULL THEN '' ELSE '(' || pg_catalog.array_to_string(ARRAY ( SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM pg_catalog.pg_options_to_table(umoptions)), ', ') || ')' END AS "FDW options" FROM pg_catalog.pg_user_mappings um; -
特定のユーザーが所有するユーザーマッピングを表示します。
SELECT um.srvname AS "Server", um.usename AS "User name", CASE WHEN umoptions IS NULL THEN '' ELSE '(' || pg_catalog.array_to_string(ARRAY ( SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value) FROM pg_catalog.pg_options_to_table(umoptions)), ', ') || ')' END AS "FDW options" FROM pg_catalog.pg_user_mappings um WHERE um.usename = '<user_name>'; -
ユーザーマッピングを削除します。
-- ユーザーマッピングを削除します。 DROP USER MAPPING FOR user_name SERVER server_name;
-