Todos os produtos
Search
Central de documentação

Hologres:Excluir um usuário

Última atualização: Jun 28, 2026

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:

    Nota

    Ao 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.

  1. Transfira a propriedade de todos os objetos para outro usuário.

    REASSIGN OWNED BY "<uid>" TO "<Another_uid>" ;
  2. 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;