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

PostgreSQL 8.4 concede privilegi DML su tutte le tabelle a un ruolo

Vorrei anche che questa concessione persistesse anche per la creazione di nuove tabelle in futuro.[...] Ho esaminato la documentazione e non riesco a trovare una soluzione adatta.

Perché prima della 9.0 non c'è. Tutto ciò che puoi ottenere è impostare le autorizzazioni per esistente tavoli. Devi fare un GRANT per ogni tavolo, perché prima della 9.0 non esisteva la modalità "bulk". Vedi il grammaticale 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 è quella che ti manca.

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

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

Ciò significa che puoi solo impostare CREATE , CONNECT e TEMP autorizzazioni sul database stesso ma nessun SELECT , INSERT ecc.

Fin qui per le cose brutte. Cosa puoi fare sono le seguenti cose:

  • Riduci il numero di gestione delle autorizzazioni concedendo diritti non agli utenti ma ai ruoli. Quindi aggiungi ruoli ai singoli utenti. Quando viene creata una nuova tabella, devi solo modificare uno o due ruoli, ma non centinaia di utenti.

  • Interroga i cataloghi di sistema e crea il GRANT appropriato comandi. Salvali in un file ed esegui quel file. Questo dovrebbe darti un avvio più semplice.

Tale query potrebbe assomigliare a questa:

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');