CONSEGNA UTILIZZO su tutti gli schemi in un database?


12

Voglio GRANT USAGEun utente / ruolo per un determinato database. Il database ha molti schemi.

So che c'è un ON ALL TABLES IN SCHEMA, ma voglio "tutti gli schemi". Ci ho provato GRANT USAGE .. ON DATABASE, ma ovviamente è sbagliato (in realtà non esiste ).

Questo è per Postgres 9.3 o 9.4, sembra essere un server su AWS RDS.

Risposte:


17

Hai almeno due opzioni.

Il primo utilizza una piccola query e un editor di testo. Dobbiamo raccogliere gli schemi del nostro interesse:

SELECT nspname
  FROM pg_namespace;

È possibile aggiungere una WHEREclausola se si desidera limitare l'ambito. Copia l'output e modificalo, in modo da ottenere un numero di GRANT USAGE ON SCHEMA ... TO your_role;comandi. Quindi alimentalo psql, ad esempio:

psql -f multigrant.sql

Una variante normale di questo potrebbe essere uno script di shell che psqlpassa in rassegna i nomi e le chiamate raccolti , passando l' GRANTistruzione costruita -call'opzione.

L'altra soluzione fa sostanzialmente la stessa cosa in un blocco pl / pgsql, creando una query dinamica. Il nucleo è lo stesso: dobbiamo raccogliere gli schemi. Quindi eseguiamo il ciclo su tutti, concedendo lo schema delle autorizzazioni per schema:

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;

Note :

  • a differenza di tabelle, sequenze, funzioni e tipi, non è possibile impostare i privilegi di default per gli schemi (a partire da 9.4). Dovrai concedere questo privilegio per qualsiasi schema appena aggiunto manualmente.
  • qui sto usando le quotazioni in dollari per la creazione della query dinamica. Questo mi permette di usare la sintassi "normale", invece di moltiplicare virgolette singole, per esempio (non presente in questo esempio). In questo modo la maggior parte degli editor evidenzierà bene le dichiarazioni.
  • Uso anche format()con l' %Iidentificatore di formato per avere il nome dell'oggetto correttamente citato, se necessario. Questo approccio è molto più leggibile rispetto alla creazione della query con concatenazione di costanti di stringa e alcune quote_ident()chiamate.
  • pg_namespacepuò essere trovato nello pg_catalogschema. Dai un'occhiata agli altri oggetti lì dentro: memorizzano ogni aspetto dei tuoi schemi, tabelle e così via.

1
Mi chiedo se è possibile simulare i privilegi predefiniti per gli schemi appena creati utilizzando un trigger di evento che esegue automaticamente il grant usageper il nuovo schema.
a_horse_with_no_name il

@a_horse_with_no_name ci sta pensando, al momento non vedo alcun motivo per cui non si possa fare.
dezso

0

Puoi anche usare.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
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.