PostgreSQL-Fehler: role does not exist
FATAL: role "ubuntu" does not exist
Der Benutzername, den die Verbindung vorgelegt hat, hat auf diesem Cluster keine passende Rolle. Wie sein Zwilling (database does not exist) ist dies meist eine Rückfall-Überraschung: führen Sie psql ohne -U aus, und es legt Ihren Betriebssystem-Benutzernamen vor, der auf einer frischen Installation keiner Rolle entspricht.
Was dieser Fehler bedeutet
Rollen (Benutzer und Gruppen sind in PostgreSQL dasselbe) leben auf Cluster-Ebene, geteilt von allen Datenbanken auf diesem Server. Eine frische Installation hat im Wesentlichen eine Login-Rolle: postgres, den Superuser. Nichts, das nach Ihrem OS-Konto benannt ist, existiert, bis es jemand erstellt.
Auf Linux-Paketen verwenden lokale Verbindungen als OS-Benutzer postgres typischerweise peer-Authentifizierung — die OS-Identität ist das Zugangsmittel. Deshalb ist sudo -u postgres psql der Standard-Bootstrap-Weg.
Häufige Ursachen
- psql ohne
-Uauf einer Maschine, deren OS-Benutzername keine Rolle hat — der Lehrbuchfall bei frischen Installationen und CI-Images. - Die Rolle wurde in dieser Umgebung nie erstellt (funktioniert in Produktion, scheitert auf dem neuen Laptop).
- Falscher Cluster: die Rolle existiert auf der Managed-Instanz, aber Ihr Connection-String zeigt auf localhost.
- Groß-/Kleinschreibung: eine als
"Alice"(gequotet) erstellte Rolle ist nichtalice.
So diagnostizieren Sie ihn
# Als lokaler Superuser einloggen (Peer-Auth) und die echten Rollen ansehen:
sudo -u postgres psql -c '\du'
Wenn Sie auf diese Weise nicht hineinkommen, kann derjenige, der die Instanz administriert, SELECT rolname FROM pg_roles; ausführen. Vergleichen Sie dann mit dem genauen Namen (und der Schreibweise) in der Fehlermeldung — und prüfen Sie doppelt, dass Sie auf dem gemeinten Cluster sind.
So beheben Sie ihn
-- Die typische Anwendungsrolle:
CREATE ROLE app_user LOGIN PASSWORD '...';
-- Oder, um lokal bequem zu arbeiten: eine Rolle mit Ihrem OS-Namen
CREATE ROLE gianluca LOGIN SUPERUSER; -- nur auf Entwicklungsmaschinen
- Oder verbinden Sie sich einfach als eine bestehende Rolle:
psql -U postgres. - In Skripten und CI verlassen Sie sich nie auf Standardwerte: geben Sie
-Uund-dexplizit an.
