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