Salta al contenuto

Come posso risolvere l'errore "user cannot be dropped" in Amazon Redshift?

5 minuti di lettura
0

Non riesco a eliminare un utente o un gruppo in Amazon Redshift.

Breve descrizione

Quando cerchi di eliminare un utente in Amazon Redshift, potresti visualizzare uno di questi messaggi di errore:

  • ERROR: user "username" cannot be dropped because some objects depend on it
  • ERROR: user "username" cannot be dropped because the user has a privilege on some object
  • ERROR: user "username" cannot be dropped because the user owns some object

Questi errori possono verificarsi quando tenti di rimuovere i seguenti tipi di utenti:

  • Un proprietario o un utente di destinazione con autorizzazioni predefinite.
  • Un proprietario di qualsiasi oggetto (come database, schemi, tabelle, viste, procedure e librerie).
  • Un utente che ha autorizzazioni per oggetti.

Per risolverli, prima di tutto rimuovi le autorizzazioni dell'utente. Quindi trasferisci la proprietà degli oggetti o rimuovine la proprietà dal gruppo.

Importante: devi revocare le autorizzazioni concesse all'utente e al gruppo da tutti i database del cluster Amazon Redshift. Per visualizzare l'elenco dei database del cluster, esegui il comando SHOW DATABASES. Per visualizzare il nome del database a cui hai effettuato l'accesso, esegui il comando CURRENT_DATABASE.

Risoluzione

Installa gli script per creare viste

Scarica e installa gli script v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql come superutente dal repository di AWS Labs sul sito web GitHub. Le viste per gli script v_generate_user_grant_revoke_ddl.sql e v_find_dropuser_objs.sql utilizzano lo schema admin nella loro definizione. Se non hai uno schema admin nel cluster Amazon Redshift, modifica la definizione in uno schema esistente. Oppure crea uno schema admin.

Se modifichi una colonna nella definizione della vista, elimina la vista esistente prima di creare una nuova vista e una nuova definizione. Quando crei una nuova vista prima di eliminare quella precedente, ricevi un errore not valid table.

Elimina un utente

Completa i seguenti passaggi:

  1. Apri l'editor di query v2. Quindi cerca l'utente che desideri eliminare per visualizzarne le autorizzazioni concesse.

  2. Per concedere nuovamente le autorizzazioni a un altro utente, esegui questo comando:

    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;

    Nota: per concedere nuovamente le autorizzazioni, devi essere un utente con autorizzazioni per l'oggetto. Devi anche avere la facoltà di concedere autorizzazioni a un altro utente. Se non hai la facoltà di concedere autorizzazioni, puoi concederle nuovamente come superutente.

  3. Dopo aver concesso nuovamente le autorizzazioni a un altro utente, esegui questo comando per revocare le autorizzazioni all'utente:

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

    Nota: sostituisci grantor con il nome dell'utente che concede le autorizzazioni. Sostituisci grantee con il nome dell'utente a cui vengono concesse le autorizzazioni.
    Se la query non restituisce alcun record o il comando DROP USER ha esito negativo, esegui questo comando:

    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;

    La query precedente elenca tutte le autorizzazioni aggiuntive che devi revocare dall'utente. Revoca le autorizzazioni.

  4. Per verificare la presenza di liste di controllo degli accessi (ACL) vuote, esegui queste query:

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

    Nota: sostituisci username-to-be-dropped e user-name con i tuoi valori. Per recuperare il nome utente e l'ID dell'utente, individua le voci nelle colonne username e usesysid della tabella PG_USER_INFO. Se nella tabella PG_DEFAULT_ACL sono presenti voci utente, non puoi eliminare l'utente.

  5. Se l'utente ha ancora autorizzazioni per gli oggetti, controlla se ha autorizzazioni assumerole:

    select pg_get_iam_role_by_user('user-name');

    Se l'utente ha autorizzazioni assumerole, prima revoca assumerole dal pubblico. Quindi esegui questo comando per revocare username:

    revoke assumerole on all from public for all;  
    revoke assumerole on all from user-name for all;
  6. (Facoltativo) Se l'utente da rimuovere ha ancora autorizzazioni per alcuni oggetti, controlla se fa parte di un altro gruppo. L'utente potrebbe avere autorizzazioni concesse da quel gruppo. In alternativa, l'utente potrebbe avere autorizzazioni concesse al gruppo PUBLIC.
    Per verificare le autorizzazioni che l'utente ha ancora, esegui queste query:

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

    Nell'output della query pg_group, controlla se sono presenti voci che elencano l'utente nella colonna grolist. Se l'utente appartiene a un altro gruppo, la colonna grolist mostra l'ID dell'utente. Per verificare le autorizzazioni di un gruppo, esegui questo comando:

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

    Nota: sostituisci objname e schemaname con la tua tabella e il tuo schema. Per impostazione predefinita, Amazon Redshift concede le autorizzazioni concesse al gruppo PUBLIC a tutti gli utenti.

  7. Individua tutti gli oggetti di proprietà dell'utente e trasferiscine la proprietà a un altro utente o amministratore:

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

    L'output del comando precedente elenca i comandi da utilizzare per trasferire la proprietà a un nuovo utente.

  8. Ripeti i passaggi da 2 a 7 in ogni database del cluster Amazon Redshift.
    Nota: per elencare i database, esegui il comando SHOW DATABASES.

  9. Per rimuovere l'utente dal database, esegui questo comando:

    drop user username-to-be-dropped;

Elimina un gruppo

Nota: prima di rimuovere un gruppo, devi revocarne le autorizzazioni per gli oggetti.

Completa i seguenti passaggi:

  1. Individua tutte le autorizzazioni concesse all'utente e revocale:

    select ddl from admin.v_generate_user_grant_revoke_ddl where ddltype='revoke' and grantee= 'group group-name';
  2. Ripeti il passaggio 1 in ogni database del cluster Amazon Redshift per revocare le autorizzazioni del gruppo in tutti i database.

  3. Utilizza il comando DROP GROUP per rimuovere il gruppo di utenti.

AWS UFFICIALEAggiornata un anno fa