Topik ini menjelaskan cara menghapus pengguna di Hologres dan cara mengatasi error yang mungkin terjadi selama proses tersebut.
Informasi latar belakang
Anda mungkin perlu menghapus pengguna karena alasan bisnis. Di Hologres, error terjadi jika Anda mencoba menghapus pengguna yang memiliki objek database (DB) apa pun, seperti database, schema, tabel, atau view. Error umum meliputi hal berikut:
-
Pengguna tidak dapat dihapus karena mereka memiliki satu atau beberapa objek. Error berikut dikembalikan:
ERROR: role "<uid>" cannot be dropped because some objects depend on it DETAIL: owner of table xxx owner of schema yyy -
Pengguna tidak dapat dihapus karena objek lain bergantung padanya. Error berikut dikembalikan:
ERROR: role "<uid>" cannot be dropped because some objects depend on it DETAIL: 1 object in database xxx -
Pengguna tidak dapat dihapus karena mereka telah diberikan izin. Error berikut dikembalikan:
ERROR: role "<uid>" cannot be dropped because some objects depend on it Detail: privileges for table xxx privileges for table yyy
Error-error ini terjadi karena pengguna masih memiliki objek dependen atau izin dalam instans tersebut. Oleh karena itu, Anda tidak dapat langsung menghapus pengguna tersebut.
Identifikasi alasan penghapusan pengguna
Sebelum menghapus pengguna, identifikasi alasannya. Alasan umum meliputi hal berikut:
-
Alasan 1: Pengguna diberikan izin yang salah, dan Anda ingin menghapus pengguna tersebut untuk memberikan izin yang benar.
-
Alasan 2: Pengguna harus dihapus karena alasan bisnis, misalnya ketika karyawan meninggalkan perusahaan atau akun pengguna tersebut tidak lagi digunakan.
Solusi yang direkomendasikan:
-
Alasan penghapusan akun adalah Alasan 1.
Dalam kasus ini, Anda tidak perlu menghapus pengguna. Sebagai gantinya, Anda dapat mencabut izin pengguna saat ini lalu memberikan izin baru.
-
Untuk mencabut dan memberikan izin dalam model otorisasi PostgreSQL standar, lihat Standard PostgreSQL authorization model.
-
Untuk mencabut dan memberikan izin dalam model izin sederhana, lihat Use the simple permission model dan Use the schema-level simple permission model.
-
Jika pengguna secara tidak sengaja ditetapkan sebagai pengguna biasa dan Anda ingin mengubahnya menjadi Superuser, jalankan pernyataan berikut:
-- Jika pengguna adalah RAM user, ubah uid menjadi p4_id. alter user "<uid>" superuser;uid menentukan ID pengguna. Untuk informasi selengkapnya, lihat User ID.
-
Jika pengguna secara tidak sengaja ditetapkan sebagai Superuser dan Anda ingin mengubahnya menjadi pengguna biasa, jalankan pernyataan berikut:
CatatanSetelah Anda mengubah Superuser menjadi pengguna biasa, pengguna tersebut tidak memiliki izin apa pun. Anda harus memberikan izin yang diperlukan kepada pengguna tersebut.
-- Jika pengguna adalah RAM user, ubah uid menjadi p4_id. alter user "<uid>" nosuperuser;uid menentukan ID pengguna. Untuk informasi selengkapnya, lihat User ID.
-
-
Alasan penghapusan akun adalah Alasan 2.
Anda dapat menyimpan objek yang dimiliki pengguna dengan mentransfer kepemilikan objek tersebut ke pengguna lain, lalu menghapus pengguna aslinya. Untuk informasi selengkapnya, lihat Delete a user but keep the objects owned by the user.
Hapus pengguna tetapi simpan objek yang dimilikinya
Jika Anda harus menghapus pengguna tetapi ingin menyimpan objek yang mereka miliki, seperti tabel, view, dan fungsi, Anda dapat mentransfer kepemilikan objek tersebut ke pengguna lain lalu menghapus pengguna aslinya. Sintaks perintahnya adalah sebagai berikut:
-
Transfer kepemilikan objek ke pengguna lain.
REASSIGN OWNED BY "<uid>" TO "<Another_uid>" ;uid menentukan ID pengguna. Untuk informasi selengkapnya, lihat User ID.
-
Hapus akun.
DROP USER "<uid>";
Lihat dependensi pengguna
-
Jalankan pernyataan berikut untuk melihat objek dependen dari suatu pengguna.
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>'; -
Lihat pemilik semua tabel, view, dan foreign table.
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); -
Lihat tabel, view, dan foreign table yang dimiliki oleh pengguna tertentu.
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>';Ubah pemilik.
-- Ubah pemilik tabel. ALTER TABLE schema_name.table_name OWNER TO new_owner; -- Ubah pemilik foreign table. ALTER FOREIGN TABLE schema_name.foreign_table_name OWNER TO new_owner; -- Ubah pemilik view. ALTER VIEW schema_name.view_name OWNER TO new_owner; -
Lihat pemilik schema.
-
Lihat pemilik semua schema.
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; -
Lihat schema yang dimiliki oleh pengguna tertentu.
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>'; -
Ubah pemilik.
-- Ubah pemilik schema. ALTER SCHEMA schema_name OWNER TO new_owner;
-
-
Lihat pemilik server.
-
Lihat pemilik semua server.
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; -
Lihat server yang dimiliki oleh pengguna tertentu.
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>'; -
Ubah pemilik.
-- Ubah pemilik server. ALTER SERVER server_name OWNER TO new_owner;
-
-
Lihat pemilik user mapping.
-
Lihat pemilik semua user mapping.
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; -
Lihat user mapping yang dimiliki oleh pengguna tertentu.
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>'; -
Hapus user mapping.
-- Hapus user mapping. DROP USER MAPPING FOR user_name SERVER server_name;
-