Eu também gostaria que essa concessão persistisse para a criação de novas tabelas no futuro também.[...] Eu vasculhei a documentação e não consigo encontrar uma solução adequada.
Porque antes de 9.0 não há nenhum. Tudo o que você pode obter é definir as permissões para existentes mesas. Você tem que fazer um
GRANT
para cada mesa, porque antes de 9.0 não havia modo "bulk". Consulte a gramática SQL para 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 aqui:
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 ]
O novo
ALL TABLES IN SCHEMA
parte é o que está faltando. Além disso:Definir permissões no nível do banco de dados como em sua pergunta não o ajudará:Você "somente" definirá as permissões no banco de dados, mas não em qualquer coisa "contida" como tabelas. A seção relevante:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
O que significa que você só pode definir
CREATE
, CONNECT
e TEMP
permissões no próprio banco de dados, mas não SELECT
, INSERT
etc. Até agora para as coisas ruins. O que você pode fazer são as seguintes coisas:
-
Reduza o número de gerenciamento de permissões concedendo direitos não a usuários, mas a funções. Em seguida, adicione funções a usuários individuais. Quando uma nova tabela é criada, você só precisa ajustar uma ou duas funções, mas não centenas de usuários.
-
Consulte os catálogos do sistema e crieGRANT
apropriado comandos. Salve-os em um arquivo e execute esse arquivo. Isso deve lhe dar uma inicialização mais fácil.
Essa consulta pode ficar assim:
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');