Concetto di base in Postgres
I ruoli sono oggetti globali che possono accedere a tutti i database in un cluster di database, dati i privilegi richiesti.
Un cluster contiene molti database , che contengono molti schemi . Gli schemi (anche con lo stesso nome) in DB diversi non sono correlati. La concessione dei privilegi per uno schema si applica solo a questo particolare schema nel DB corrente (il DB corrente al momento della concessione).
Ogni database inizia con uno schema public
per impostazione predefinita. Questa è una convenzione e molte impostazioni iniziano con essa. Oltre a questo, lo schema public
è solo uno schema come un altro.
Venendo da MySQL, potresti voler iniziare con un singolo schema public
, ignorando completamente il livello dello schema. Uso regolarmente dozzine di schemi per database.
Gli schemi sono un po' (ma non completamente) come le directory nel file system.
Dopo aver utilizzato più schemi, assicurati di comprendere search_path
impostazione:
- In che modo il percorso_ricerca influenza la risoluzione dell'identificatore e lo "schema corrente"
Privilegi predefiniti
Per documentazione su GRANT
:
PostgreSQL concede privilegi predefiniti su alcuni tipi di oggetti a PUBLIC
. Nessun privilegio è concesso a PUBLIC
per impostazione predefinita su tabelle, colonne, schemi o tablespace. Per altri tipi, i privilegi predefiniti concessi a PUBLIC
sono i seguenti:CONNECT
e CREATE TEMP TABLE
per banche dati; EXECUTE
privilegio per funzioni; e USAGE
privilegio per le lingue.
Tutte queste impostazioni predefinite possono essere modificate con ALTER DEFAULT PRIVILEGES
:
- Concedi tutto su uno schema specifico nel db a un ruolo di gruppo in PostgreSQL
Ruolo del gruppo
Come ha commentato @Craig, è meglio GRANT
privilegi a un ruolo di gruppo e quindi rendere un utente specifico membro di quel ruolo (GRANT
il ruolo del gruppo al ruolo dell'utente). In questo modo è più semplice distribuire e revocare pacchetti di privilegi necessari per determinate attività.
Un ruolo di gruppo è solo un altro ruolo senza accesso. Aggiungi un login per trasformarlo in un ruolo utente. Altro:
- Perché PostgreSQL ha unito utenti e gruppi in ruoli?
Ruoli predefiniti
Aggiornamento: Postgres 14 o successivo aggiunge i nuovi ruoli predefiniti (formalmente "ruoli predefiniti") pg_read_all_data
e pg_write_all_data
per semplificare alcuni dei seguenti. Vedi:
- Concedi l'accesso a tutte le tabelle di un database
Ricetta
Supponiamo che abbiamo un nuovo database mydb
, un gruppo mygrp
e un utente myusr
...
Durante la connessione al database in questione come superutente (postgres
per esempio):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
Per assegnare "a un utente tutti i privilegi a tutte le tabelle" come hai scritto (potrei essere più restrittivo):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
Per impostare i privilegi predefiniti per gli oggetti futuri, esegui per ogni ruolo che crea oggetti in questo schema:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
Ora, concedi il gruppo all'utente:
GRANT mygrp TO myusr;
Risposta correlata:
- PostgreSQL:l'utente DB dovrebbe essere autorizzato solo a chiamare funzioni
Impostazione alternativa (non standard)
Proveniente da MySQL e poiché desideri mantenere separati i privilegi sui database, potrebbe piacerti questa impostazione non standard db_user_namespace
. Per documentazione:
Questo parametro abilita i nomi utente per database. È disattivato per impostazione predefinita.
Leggere attentamente il manuale. Non uso questa impostazione. Non annulla quanto sopra.