Como resolvo o erro “o usuário não pode ser descartado” no Amazon Redshift?
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:
-
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.
-
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.
-
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. -
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;
-
(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.
-
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.
-
Repita as etapas de 2 a 7 em cada banco de dados no cluster do Amazon Redshift.
-
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:
-
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>';
-
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.
-
Use o comando DROP GROUP para remover o grupo de usuários.
Conteúdo relevante
- feita há 19 diaslg...
- Resposta aceitafeita há 17 diaslg...
- feita há 3 diaslg...
- feita há 19 diaslg...
- feita há um mêslg...
- AWS OFICIALAtualizada há 3 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há um ano