PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:assegna tutte le autorizzazioni a un utente su un database PostgreSQL

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.