2012-07-22 24 views
10

Come faccio per concedere DML (SELECT, INSERT, UPDATE, DELETE) su tutte le tabelle in uno schema in PostgreSQL 8.4? Mi piacerebbe anche che questa concessione continuasse anche per la creazione di nuove tabelle in futuro.PostgreSQL 8.4 concede i privilegi DML su tutte le tabelle a un ruolo

Ho visto soluzioni per 9.0 ma sono bloccato con 8.4 come viene fornito con Debian stable.

Ho provato quanto segue come una linea di base, ma non funziona, con conseguente inevitabile "l'accesso ai relazione X negato":

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser; 

ho dragato attraverso la documentazione e non posso sembra trovare una soluzione adeguata.

+0

Perché non è possibile eseguire l'aggiornamento? Deve esserci sicuramente un modo per aggiornare PostgreSQL. Le versioni attuali possono essere scaricate dal sito Web di Postgres. –

+0

Ci sono sicuramente dei modi per eseguire l'aggiornamento, ma non desidero poiché i pacchetti forniti dal fornitore sono ben integrati, testati e compresi. Il nostro piano è fino a 9.1 allo stesso tempo Debian wheezy è dichiarato stabile. – pointyhat

+0

Non capirò mai perché alcuni sistemi operativi proteggano molto l'utente. –

risposta

21

Mi piacerebbe anche che questa concessione continui anche per la creazione di nuove tabelle in futuro. [...] Ho trascinato la documentazione e non riesco a trovare una soluzione adeguata.

Perché prima del 9.0 non ce n'è. Tutto quello che puoi ottenere è impostare le autorizzazioni per tabelle esistenti. Devi fare uno GRANT per ogni tabella, perché prima del 9.0 non c'era la modalità "bulk". Vedere la grammatica SQL per 8.4 e 9.0:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] } 
    ON [ TABLE ] tablename [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

e 9.0 qui:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] } 
    ON { [ TABLE ] table_name [, ...] 
     | ALL TABLES IN SCHEMA schema_name [, ...] } 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

Il nuovo ALL TABLES IN SCHEMA parte è quello che si sta perdendo.

Inoltre: l'impostazione delle autorizzazioni a livello di database come nella domanda non ti aiuterà: "imposterai" solo "le autorizzazioni sul database, ma non su qualsiasi contenuto" contenuto "come le tabelle. La sezione pertinente:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } 
    ON DATABASE dbname [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

che significa che è possibile impostare solo CREATE, CONNECT e TEMP autorizzazioni sul database stesso, ma non SELECT, INSERT ecc


Finora per le cose cattive. Che cosa si può fare sono le seguenti cose:

  • ridurre il numero di gestione dei permessi per la concessione di diritti, non per gli utenti, ma a ruoli. Quindi aggiungi ruoli ai singoli utenti. Quando viene creata una nuova tabella, devi solo regolare uno o due ruoli, ma non centinaia di utenti.

  • Cercare i cataloghi di sistema e creare i comandi appropriati GRANT. Salvali in un file ed esegui quel file. Questo dovrebbe darti un avvio più facile.

Tale richiesta potrebbe assomigliare a questo:

select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;' 
from information_schema.tables 
where 
    table_type = 'BASE TABLE' and 
    table_schema not in ('pg_catalog', 'information_schema'); 
+0

Grazie per la risposta - questo lo spiega perfettamente! – pointyhat

+0

Molto più chiaro e completo della mia risposta, grazie. –

+0

Sfortunatamente non concede autorizzazioni alle sequenze - e quelle sono spesso permessi utili da avere. – Calimo

2

sovvenzioni a PostgreSQL non sono ricorsivi; un GRANT sul database imposta diritti per l'oggetto di database ma non influenza gli schemi contenuti o le loro tabelle, viste, funzioni, ecc

concessione ALL PRIVELEGES sulle borse di database CREATE, CONNECT e TEMPORARY diritti.

Vedi \h GRANT in psql, o the documentation for GRANT in 8.4, per vedere che cosa ALL PRIVILEGES significa per DATABASE:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } 
    ON DATABASE database_name [, ...] 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

Ci sono funzioni plpgsql e vari script 3 ° parti disponibili che utilizzano pg_catalog o information_schema per creare dinamicamente GRANT s e impostare in modo ricorsivo diritti. Cerca "sovvenzione ricorsiva postgresql".

Questi non consentono di impostare i diritti di accesso predefiniti per nuove tabelle. PostgreSQL ha ALTER DEFAULT PRIVILEGES per consentire di impostare i diritti di tabella predefiniti per le nuove tabelle, ma è supportato solo in Pg 9.1 e successivi. Sono richiesti espliciti GRANT s per ogni tabella nelle versioni precedenti o quando è necessario impostare le autorizzazioni dopo la creazione della tabella.

Le versioni più recenti, come è stato notato, dispongono di strutture per più concessioni tramite GRANT ... ALL TABLES, ma la domanda è specifica per 8.4.

0

Aggiungi tutti i privilegi su tutti i tavoli:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username]; 
+2

non funziona con Postgres <9 –

1

Se si dispone di un altro utente che dispone dei privilegi di DML, funziona in PostgreSQL 8.x/9.x:

grant <userWithDMLPrivileges> to testuser; 

Spero che aiuti.