TL; DR: i nuovi utenti possono creare tabelle nello publicschema perché le persone si sono lamentate del fatto che era troppo difficile quando non potevano.
Se non ti piacciono i valori predefiniti, dovresti probabilmente creare un nuovo database di modelli con la configurazione iniziale che desideri. Ad esempio, potresti:
DROP SCHEMA public;
o
REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;
nel tuo modello.
Se si desidera che l' publicutente non abbia diritti su un database, è necessario inoltre:
REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;
in modo che l' publicutente non possa creare schemi o usare tabelle temporanee.
Personalmente, se stavo progettando questo, darei agli utenti il TEMPdiritto sul database di default, ma non CREATE(schemi nel database) o CREATE(tabelle nello publicschema). Li riserverei per il proprietario.
Sono scelte fatte molto tempo fa, però, ed è abbastanza difficile cambiarle ora.
Allo stato attuale, ci sono lamentele regolari che è troppo difficile iniziare con PostgreSQL perché devi creare un account utente e spesso vuoi creare anche un database. Perché non li creiamo solo automaticamente e per impostazione predefinita ci affidiamo alla modalità di autenticazione per semplificare? Perché l' postgresutente non ha la password predefinita postgres? Perché non creiamo automaticamente gli utenti se sono presenti nel sistema operativo? eccetera.
Ci sono alcuni veri problemi di usabilità per i nuovi utenti - in particolare, la maggior parte delle persone non ha idea di cosa sia peerauth o perché solo psqldopo aver installato PostgreSQL dice loro che non c'è nessun utente con il nome con cui hanno effettuato l'accesso.
È anche disordinato pg_hba.confun file di configurazione, ma gli utenti vengono creati a livello SQL. Questa divisione confonde gli utenti.
Molte cose, tuttavia, sono compromessi tra impostazioni predefinite sicure e impostazioni predefinite facili in cui il progetto non renderà mai tutti felici.
revoke create on database [databasename] from [username];e il DB ora è veramente letto solo per [nome utente]. Giusto?