Assegnare tutte le autorizzazioni a un utente su un DB


206

Vorrei dare a un utente tutte le autorizzazioni su un database senza renderlo un amministratore. Il motivo per cui voglio farlo è che al momento DEV e PROD sono DB diversi sullo stesso cluster, quindi non voglio che un utente sia in grado di cambiare oggetti di produzione, ma deve essere in grado di cambiare oggetti su DEV.

Provai:

grant ALL on database MY_DB to group MY_GROUP;

ma non sembra dare alcun permesso.

Poi ho provato:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

e sembra darmi il permesso di creare oggetti ma non di interrogare \ eliminare oggetti su quello schema che appartengono ad altri utenti

Potrei continuare dando l'autorizzazione USAGE all'utente su MY_SCHEMA ma poi si lamenterebbe di non avere autorizzazioni sul tavolo ...

Quindi suppongo che la mia domanda sia: esiste un modo semplice per dare tutte le autorizzazioni a un utente su un DB?

Sto lavorando su PostgreSQL 8.1.23.

Risposte:


271

L'utente ha bisogno di accedere al database , ovviamente:

GRANT CONNECT ON DATABASE my_db TO my_user;

E (almeno) il USAGEprivilegio sullo schema :

GRANT USAGE ON SCHEMA public TO my_user;

O concedi USAGEsu tutti gli 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 presenti):

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Per le versioni precedenti è possibile utilizzare la "Procedura guidata di concessione" di pgAdmin III (la GUI predefinita).

Ci sono altri oggetti, il manuale perGRANT ha l'elenco completo di Postgres 12:

privilegi su un oggetto 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. Più dettagli:

Prendi in considerazione l' aggiornamento a una versione corrente .


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

24
Concedere tutti i privilegi ON DATABASEsembra potente, ma non fa molto. È solo un inizio Non concede alcun privilegio su oggetti contenuti.
Erwin Brandstetter,

50

In PostgreSQL 9.0+ devi fare quanto segue:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

Se si desidera abilitare questo anche per le relazioni appena create, impostare le autorizzazioni predefinite:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

Tuttavia, visto che usi 8.1 devi codificarlo tu stesso:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

Questo imposterà i privilegi su tutte le relazioni: tabelle, viste, indici, sequenze, ecc. Se vuoi limitarlo, filtra pg_class.relkind. Vedi i documenti pg_class per i dettagli.

È necessario eseguire questa funzione come superutente e regolarmente come richiede l'applicazione. Un'opzione sarebbe quella di impacchettarlo in un cron job che viene eseguito ogni giorno o ogni ora.


Ciao Patrick, "TUTTE LE TAVOLI" non è disponibile su 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) So che potrei scorrere le tabelle e dare le autorizzazioni individualmente, ma questo è quello che sono cercando di evitare. ma grazie per l'aiuto
Diego

@Diego: aggiunta soluzione per 8.1
Patrick

grazie patrick, ho finito per usare qualcosa come te ma non usando "GRANT ALL". Per qualche motivo non sembra fare nulla. Per esempio, ho eseguito: concedi TUTTO sul test dello schema a userA; ma dopo quell'utenteA non ha ancora accesso alla lettura dalle tabelle sul test dello schema
Diego

2
Dovresti concedere USAGE su uno schema. Quindi su tutte le relazioni all'interno di quello schema (tabelle, viste, sequenze, indici, ecc.) Devi GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE separatamente. Gli schemi sono spazi dei nomi, le relazioni sono dove si trovano i tuoi dati.
Patrick,

28

Ho fatto quanto segue per aggiungere un ruolo 'eSumit' sul database PostgreSQL 9.4.15 e fornire tutte le autorizzazioni per questo ruolo:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

Controllato anche le inserzioni pg_table tramite:

seleziona * da pg_roles; inserisci qui la descrizione dell'immagine

Istantanea delle query del database: inserisci qui la descrizione dell'immagine


Ho Postgres versione 10.3 e genera un errore di sintassi quando uso virgolette attorno al nome del database.
sajid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.