In dieser Anleitung wird gezeigt, wie man in PostgreSQL einen neuen Benutzer, in der Regel für eine Web-Anwendung, und eine Datenbank erstellt. Der Benutzer wird als Inhaber der Datenbank zugewiesen.
1 - In PostgreSQL anmelden.
Man soll sich mit einem Benutzer mit ausreichend Rechten anmelden. In der Regel ist es der Root-Benutzer oder ein anderer Benutzer mit entsprechenden Berechtigungen.
$ psql -U postgresFalls man einen eigenen Root-Benutzer erstellt hat und eine Authentifizierung mit einem Passwort aktiviert hat, dann entsprechend mit dieser Methode anmelden.
$ psql -U myrootuser -D databaseMeistens erfolgt die Anmeldung mit einem Root-Benutzer gegen die postgres Datenbank.
$ psql -U root -D postgres
2 - Benutzer erstellen
Nun wird ein neuer Benutzer erstellt.
CREATE USER mynewuser WITH PASSWORD 'mypass';Hinweis: Man sollte darauf achten, einfache Anführungszeichen '' zu verwenden.

3 - Datenbank erstellen
Nun kann die Datenbank erstellt werden. Die Reihenfolge ist nicht maßgeblich — man kann auch zuerst die Datenbank erstellen, bevor man einen Benutzer anlegt. Ich erstelle immer zuerst den Benutzer und dann die Datenbank, da ich im nächsten Schritt bereits den Benutzernamen habe und diesen als Besitzer für die neue Datenbank setzen kann.
CREATE DATABASE mydb OWNER mynewuser;
FAQ
Was ist der Unterschied zwischen CREATE USER und CREATE ROLE?
Postgres kennt intern nur Rollen — CREATE USER ist ein Alias für CREATE ROLE … LOGIN. Ein “Benutzer” ist also schlicht eine Rolle mit Login-Recht. CREATE GROUP ist analog ein Alias für CREATE ROLE … NOLOGIN. Mehr Details in der offiziellen Doku zu CREATE ROLE.
Reicht OWNER, oder muss ich noch GRANT setzen?
Der Owner darf in seiner Datenbank alles. Für eine Web-Anwendung, die ihre eigene Datenbank exklusiv nutzt, ist das ausreichend. Sobald mehrere Rollen sich eine Datenbank teilen oder du das Least-Privilege-Prinzip durchziehen willst, kommen GRANT auf Schemas und Tabellen sowie die Default-Privileges (ALTER DEFAULT PRIVILEGES) ins Spiel.
Landet das Passwort nicht im Server-Log?
Doch — wenn log_statement auf ddl oder all steht, schreibt Postgres CREATE USER … PASSWORD 'xxx' in die Logs. Sicherer ist \password <user> in psql: das Passwort wird interaktiv abgefragt und vor dem Senden lokal mit SCRAM gehasht.
Welches Encoding bekommt die neue Datenbank?
CREATE DATABASE übernimmt die Defaults aus template1 — das ist üblicherweise UTF8. Wenn du das Encoding oder die Collation explizit kontrollieren willst, nutze die ausführliche Form: CREATE DATABASE mydb WITH OWNER mynewuser ENCODING 'UTF8' LC_COLLATE 'C.UTF-8' TEMPLATE template0.
Einfache vs. doppelte Anführungszeichen.
In SQL sind '…' (einfache Quotes) für Werte und "…" (doppelte Quotes) für Identifier (Tabellen-, Spalten-, Rollennamen). 'mypass' ist also der Passwort-String; "MyTable" wäre ein case-sensitiver Identifier. Doppelte Quotes um den Wert herum führen zu einem Identifier-Fehler.
Weiterführende Ressourcen
Externe Quellen
- CREATE ROLE – PostgreSQL Documentation
- CREATE USER – PostgreSQL Documentation
- CREATE DATABASE – PostgreSQL Documentation
- ALTER ROLE – PostgreSQL Documentation
- Database Roles – PostgreSQL Documentation