Exclua um usuário de uma instância do Hologres ao resolver erros de dependência, transferir a propriedade dos objetos e remover a função.
Pré-requisitos
Possua privilégios de superusuário ou acesso administrativo equivalente à instância do Hologres.
Para usuários RAM, utilize o p4_id do usuário em vez do uid. Para mais informações, consulte User ID.
A exclusão do usuário é necessária?
Antes de excluir um usuário, verifique se a exclusão é realmente necessária. Muitas vezes, ajustar as permissões resolve o problema.
Permissões incorretas (exclusão desnecessária)
Se o objetivo for apenas corrigir as permissões de um usuário, não o exclua. Revogue as permissões atuais e conceda novas.
Para gerenciar permissões no modelo de autorização padrão do PostgreSQL, consulte Standard PostgreSQL authorization model.
Para gerenciar permissões no modelo de permissão simples, consulte Use the simple permission model e Use the schema-level simple permission model.
-
Para alterar um usuário comum para superusuário:
-- If the user is a RAM user, change uid to p4_id. alter user "<uid>" superuser; -
Para alterar um superusuário para usuário comum:
NotaAo alterar um superusuário para usuário comum, ele perde todas as permissões. Conceda as permissões necessárias separadamente.
-- If the user is a RAM user, change uid to p4_id. alter user "<uid>" nosuperuser;
Nessas instruções, uid especifica o ID do usuário. Para mais informações, consulte User ID.
Motivos de negócios (exclusão necessária)
Caso a exclusão seja obrigatória por motivos de negócios, como desligamento de funcionário ou conta inativa, siga os procedimentos abaixo para transferir a propriedade e excluir o usuário.
Erros comuns ao excluir um usuário
Ao tentar excluir um usuário proprietário de objetos de banco de dados ou com permissões concedidas, o Hologres retorna um dos seguintes erros:
-
O usuário possui objetos:
ERROR: role "<uid>" cannot be dropped because some objects depend on it DETAIL: owner of table xxx owner of schema yyy -
Objetos em um banco de dados dependem do usuário:
ERROR: role "<uid>" cannot be dropped because some objects depend on it DETAIL: 1 object in database xxx -
O usuário tem permissões sobre objetos:
ERROR: role "<uid>" cannot be dropped because some objects depend on it Detail: privileges for table xxx privileges for table yyy
Esses erros ocorrem porque o usuário ainda possui objetos dependentes ou permissões ativas. Resolva todas as dependências antes de excluir o usuário.
Excluir um usuário mantendo os objetos
Para excluir um usuário preservando os objetos de sua propriedade (tabelas, visualizações, funções e outros), transfira primeiro a propriedade para outro usuário.
-
Transfira a propriedade de todos os objetos para outro usuário.
REASSIGN OWNED BY "<uid>" TO "<Another_uid>" ; -
Exclua o usuário.
DROP USER "<uid>";
Nessas instruções, uid especifica o ID do usuário. Para mais informações, consulte User ID.
Se a instrução REASSIGN OWNED BY não resolver todas as dependências, utilize as consultas a seguir para identificar e transferir objetos específicos.
Visualizar e resolver dependências do usuário
Execute as consultas abaixo para identificar quais objetos pertencem ao usuário e quais permissões dependem dele. Resolva todas as dependências antes de prosseguir com a exclusão.
Visualizar todos os objetos dependentes
Execute a seguinte instrução para listar todos os objetos dependentes de um usuário. A consulta retorna o tipo de dependência para cada objeto: "Permission dependency" ou "Owner dependency".
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>';
Verificar e transferir propriedade de tabelas, visualizações e tabelas externas
Visualize os proprietários de todas as tabelas, visualizações e tabelas externas:
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);
Visualize as tabelas, visualizações e tabelas externas pertencentes a um usuário específico:
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>';
Transfira a propriedade para um novo proprietário:
-- Change the owner of a table.
ALTER TABLE schema_name.table_name OWNER TO new_owner;
-- Change the owner of a foreign table.
ALTER FOREIGN TABLE schema_name.foreign_table_name OWNER TO new_owner;
-- Change the owner of a view.
ALTER VIEW schema_name.view_name OWNER TO new_owner;
Verificar e transferir propriedade de schemas
Visualize os proprietários de todos os schemas:
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;
Visualize os schemas pertencentes a um usuário específico:
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>';
Transfira a propriedade para um novo proprietário:
-- Change the owner of a schema.
ALTER SCHEMA schema_name OWNER TO new_owner;
Verificar e transferir propriedade de servidores
Visualize os proprietários de todos os servidores:
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;
Visualize os servidores pertencentes a um usuário específico:
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>';
Transfira a propriedade para um novo proprietário:
-- Change the owner of a server.
ALTER SERVER server_name OWNER TO new_owner;
Verificar e remover mapeamentos de usuário
Visualize os proprietários de todos os mapeamentos de usuário:
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;
Visualize os mapeamentos de usuário pertencentes a um usuário específico:
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>';
Exclua o mapeamento de usuário:
-- Delete the user mapping.
DROP USER MAPPING FOR user_name SERVER server_name;