PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL 8.4 concede privilégios DML em todas as tabelas para uma função


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