Errore PostgreSQL: role does not exist
FATAL: role "ubuntu" does not exist
Il nome utente presentato dalla connessione non ha un ruolo corrispondente su questo cluster. Come il suo gemello (database does not exist), di solito è una sorpresa dovuta ai default: esegui psql senza -U e presenta il tuo username del sistema operativo, che su un'installazione nuova non corrisponde ad alcun ruolo.
Cosa significa questo errore
I ruoli (in PostgreSQL utenti e gruppi sono la stessa cosa) vivono a livello di cluster, condivisi da tutti i database su quel server. Un'installazione nuova ha essenzialmente un solo login role: postgres, il superuser. Niente che porti il nome del tuo account OS esiste finché qualcuno non lo crea.
Sui pacchetti Linux, le connessioni locali come utente OS postgres usano tipicamente l'autenticazione peer — l'identità OS è la credenziale. Ecco perché sudo -u postgres psql è il percorso di bootstrap standard.
Cause comuni
- psql senza
-Usu una macchina il cui username OS non ha un ruolo — il caso da manuale su installazioni nuove e immagini CI. - Il ruolo non è mai stato creato in questo ambiente (funziona in prod, fallisce sul nuovo laptop).
- Cluster sbagliato: il ruolo esiste sull'istanza gestita, ma la tua stringa di connessione punta a localhost.
- Case sensitivity: un ruolo creato come
"Alice"(quotato) non èalice.
Come diagnosticarlo
# Entra come superuser locale (peer auth) e guarda i ruoli reali:
sudo -u postgres psql -c '\du'
Se non riesci a entrare in quel modo, chi amministra l'istanza può eseguire SELECT rolname FROM pg_roles;. Poi confronta con il nome esatto (e il case) nel messaggio di errore — e ricontrolla di essere sul cluster che intendevi.
Come risolverlo
-- Il ruolo applicativo tipico:
CREATE ROLE app_user LOGIN PASSWORD '...';
-- Oppure, per lavorare comodo in locale: un ruolo col tuo nome OS
CREATE ROLE gianluca LOGIN SUPERUSER; -- solo su macchine di sviluppo
- Oppure connettiti semplicemente come un ruolo esistente:
psql -U postgres. - Negli script e in CI, non affidarti mai ai default: passa
-Ue-desplicitamente.
