TL; DR: i nuovi utenti possono creare tabelle nello public
schema 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' public
utente 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' public
utente non possa creare schemi o usare tabelle temporanee.
Personalmente, se stavo progettando questo, darei agli utenti il TEMP
diritto sul database di default, ma non CREATE
(schemi nel database) o CREATE
(tabelle nello public
schema). 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' postgres
utente 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 peer
auth o perché solo psql
dopo aver installato PostgreSQL dice loro che non c'è nessun utente con il nome con cui hanno effettuato l'accesso.
È anche disordinato pg_hba.conf
un 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?