Tutti i comandi devono essere eseguiti durante la connessione al cluster di database corretto. Assicurati di farlo.
I ruoli sono oggetti del cluster del database . Tutti i database dello stesso cluster condividono l'insieme di ruoli definiti. I privilegi sono concessi/revocati per database/schema/tabella ecc.
Un ruolo deve accedere al database , ovviamente. Questo è concesso a PUBLIC
per impostazione predefinita. Altro:
GRANT CONNECT ON DATABASE my_db TO my_user;
Privilegi di base per Postgres 14 o successivo
Postgres 14 aggiunge i ruoli predefiniti non di accesso pg_read_all_data
/ pg_write_all_data
.
Hanno SELECT
/ INSERT
, UPDATE
, DELETE
privilegi per tutti tabelle, viste e sequenze. Più USAGE
su schemi. Possiamo GRANT
appartenenza a questi ruoli:
GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;
Questo copre tutti i comandi DML di base (ma non DDL e non alcuni comandi speciali come TRUNCATE
o il EXECUTE
privilegio per le funzioni!). Il manuale:
pg_read_all_data
Leggi tutti i dati (tabelle, viste, sequenze), come se avessi SELECT
diritto su quegli oggetti e USAGE
diritti su tutti gli schemi, anche senza averlo esplicitamente. Questo ruolo non ha l'attributo roleBYPASSRLS
impostare. Se viene utilizzato RLS, un amministratore potrebbe voler impostare BYPASSRLS
sui ruoli il cui ruolo è GRANT
ed a.
pg_write_all_data
Scrivi tutti i dati (tabelle, viste, sequenze), come se avessi INSERT
,UPDATE
e DELETE
diritti su quegli oggetti e USAGE
diritti su tutti gli schemi, anche senza averlo esplicitamente. Questo ruolo non ha l'attributo role BYPASSRLS
impostare. Se viene utilizzato RLS, un amministratore potrebbe voler impostare BYPASSRLS
sui ruoli in cui questo ruolo èGRANT
ed a.
Tutti i privilegi senza utilizzare ruoli predefiniti (qualsiasi versione di Postgres)
I comandi devono essere eseguiti durante la connessione al database corretto. Assicurati di farlo.
Il ruolo necessita (almeno) di USAGE
privilegio sullo schema . Di nuovo, se è concesso a PUBLIC
, sei coperto. Altro:
GRANT USAGE ON SCHEMA public TO my_user;
Oppure concedi USAGE
su tutti schemi personalizzati:
DO
$$
BEGIN
-- RAISE NOTICE '%', ( -- use instead of EXECUTE to see generated commands
EXECUTE (
SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
FROM pg_namespace
WHERE nspname <> 'information_schema' -- exclude information schema and ...
AND nspname NOT LIKE 'pg\_%' -- ... system schemas
);
END
$$;
Quindi, tutte le autorizzazioni per tutte le tabelle (richiede Postgres 9.0 o successivo).
E non dimenticare le sequenze (se presente):
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;
In alternativa, puoi utilizzare il "Grant Wizard" di pgAdmin 4 per lavorare con una GUI.
Ci sono altri oggetti, il manuale per GRANT
ha l'elenco completo. A partire da Postgres 12:
privilegi su un oggetto di database (tabella, colonna, vista, tabella esterna, sequenza, database, wrapper di dati esterni, server esterno, funzione, procedura, linguaggio procedurale, schema o tablespace)
Ma il resto è raramente necessario. Maggiori dettagli:
- Come gestire i PRIVILEGI PREDEFINITI per gli UTENTI su un DATABASE vs SCHEMA?
- Concedi i privilegi per un particolare database in PostgreSQL
- Come concedere tutti i privilegi sulle viste a utenti arbitrari
Prendi in considerazione l'aggiornamento a una versione corrente.