Como resolvo o erro “o usuário não pode ser descartado” no Amazon Redshift?

5 minuto de leitura
0

Não consigo deixar um usuário ou grupo no Amazon Redshift.

Breve descrição

Ao tentar descartar um usuário no Amazon Redshift, você pode ver uma destas mensagens de erro:

  • ERRO: o usuário "username" não pode ser descartado porque alguns objetos dependem dele
  • ERRO: o usuário "username" não pode ser descartado porque o usuário tem um privilégio em algum objeto
  • ERRO: o usuário "username" não pode ser descartado porque o usuário possui algum objeto

Esses erros podem ocorrer quando você tenta descartar os seguintes tipos de usuários:

  • Um proprietário ou usuário alvo que tem permissões padrão.
  • Proprietário de qualquer objeto, como bancos de dados, esquemas, tabelas, visualizações, procedimentos e bibliotecas.
  • Um usuário que tem permissões em objetos.

Para resolver essas mensagens de erro, primeiro remova todas as permissões de usuário. Em seguida, transfira a propriedade do objeto ou remova a propriedade de grupo dos objetos.

Importante: você deve revogar as permissões de usuário e grupo de todos os bancos de dados no cluster do Amazon Redshift.

Resolução

Instale scripts para criar visualizações

Baixe e instale os scripts v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql do repositório do GitHub do AWS Labs. As visualizações dos scripts v_generate_user_grant_revoke_ddl.sql and v_find_dropuser_objs.sql usam o esquema admin em sua definição. Se você não tiver um esquema de admin no cluster do Amazon Redshift, modifique a definição em um esquema existente. Ou crie um esquema de admin.

Se houver alguma alteração na coluna em sua definição de visualização, descarte-a antes de criar uma nova visualização e definição. Se você tentar criar uma nova exibição antes de eliminar a exibição antiga, receberá um erro de tabela inválida.

Descartar um usuário

Conclua as seguintes etapas:

  1. Pesquise por usuário para encontrar todas as permissões de usuário concedidas que você deseja eliminar. Em seguida, volte a conceder essas permissões como outro usuário. É uma prática recomendada que esse usuário seja um superusuário:

    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;

    Observação: para reconceder as permissões, você deve ser um usuário com permissões no objeto. Ele deve conceder direitos de permissão a outro usuário. Se você não tiver permissões de concessão, poderá reconceder as permissões como superusuário.

  2. Encontre todas as permissões concedidas ao usuário e, em seguida, revogue-as:

    select ddl from v_generate_user_grant_revoke_ddl where ddltype='revoke' and (grantee='<username>' or grantor='<username>') order by objseq, grantseq desc;

    Observação: substitua o grantor pelo nome do usuário que concede as permissões. Substitua o grantee pelo nome do usuário que recebe as permissões.
    Se sua consulta não retornar nenhum registro ou se o comando DROP USER falhar, execute a seguinte consulta:

    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;

    A consulta anterior lista as permissões que você deve revogar do usuário antes de eliminá-lo. Revogue essas permissões antes de passar para a próxima etapa.

  3. Para verificar se há listas de controle de acesso (ACLs) vazias, execute as seguintes consultas:

    select * from pg_user where usename = '<username-to-be-dropped>';
    select * from pg_default_acl where defacluser= <user-id>;
    select pg_get_iam_role_by_user('<user-name>');

    Para recuperar o nome e o ID do usuário, localize as entradas das colunas usename e usesysid na tabela PG_USER_INFO.
    Observação: se houver entradas de usuário na tabela PG_DEFAULT_ACL, você não poderá descartar o usuário.

  4. Se o usuário ainda tiver permissões em alguns objetos, verifique se ele recebeu permissões assumerole:

    select pg_get_iam_role_by_user('<user-name>');

    Se o usuário tiver permissões assumerole, primeiro revogue assumerole do público. Em seguida, execute o seguinte comando para revogar username:

    revoke assumerole on all from public for all;
    revoke assumerole on all from <user-name> for all;
  5. (Opcional) Se o usuário a ser descartado ainda tiver permissões em alguns objetos, verifique se ele faz parte de outro grupo. O usuário pode ter permissões concedidas por esse grupo. Ou o usuário pode ter permissões concedidas ao grupo PUBLIC.
    Para verificar as permissões que ainda são concedidas ao usuário, execute as seguintes consultas:

    select * from pg_user where usename = '<username-to-be-dropped>';
    select * from pg_group;

    Na saída da consulta pg_group, verifique se há entradas que listam o usuário na coluna grolist. Se o usuário pertencer a outro grupo, seu ID de usuário será listado. Verifique as permissões concedidas a esse grupo:

    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';

    Observação: substitua objname e schemaname por sua tabela e esquema. Por padrão, as permissões concedidas ao grupo PUBLIC são concedidas a todos os usuários.

  6. Encontre todos os objetos que o usuário possui e transfira a propriedade para um usuário ou administrador diferente:

    select ddl||'<newuser>;' as ddl from admin.v_find_dropuser_objs where objowner = '<username-to-be-dropped>';

    A saída do comando anterior lista os comandos que você deve usar para transferir a propriedade para um novo usuário.

  7. Repita as etapas de 2 a 7 em cada banco de dados no cluster do Amazon Redshift.

  8. Para remover o usuário do banco de dados, execute o seguinte comando:

    drop user <username-to-be-dropped>;

Descartar um grupo

Observação: antes de descartar um grupo, você deve revogar todas as permissões que ele tem para objetos.

Conclua as seguintes etapas:

  1. Encontre todas as permissões concedidas ao usuário e, em seguida, revogue-as:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group <group-name>';
  2. Repita a etapa 2 em cada banco de dados no cluster do Amazon Redshift. Confirme se as permissões do grupo foram revogadas em todos os bancos de dados.

  3. Use o comando DROP GROUP para remover o grupo de usuários.

AWS OFICIAL
AWS OFICIALAtualizada há 7 meses