PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL 8.4 accorde des privilèges DML sur toutes les tables à un rôle

J'aimerais également que cette subvention persiste pour la création de nouvelles tables à l'avenir.[...] J'ai parcouru la documentation et je n'arrive pas à trouver une solution appropriée.

Parce qu'avant 9.0, il n'y en avait pas. Tout ce que vous pouvez obtenir est de définir les autorisations pour existant les tables. Vous devez faire un GRANT pour chaque table, car avant la 9.0 il n'y avait pas de mode "bulk". Voir la grammaire SQL pour 8.4 et 9.0 :

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

et 9.0 ici :

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 ]

Le nouveau ALL TABLES IN SCHEMA la pièce est celle qui vous manque.

Aussi:Définir des autorisations au niveau de la base de données comme dans votre question ne vous aidera pas:vous définirez "uniquement" les autorisations sur la base de données, mais pas sur des éléments "contenus" comme des tables. La rubrique concernée :

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

Ce qui signifie que vous ne pouvez définir que CREATE , CONNECT et TEMP autorisations sur la base de données elle-même mais pas de SELECT , INSERT etc.

Jusqu'ici pour les mauvaises choses. Ce que vous pouvez faire sont les choses suivantes :

  • Réduisez le nombre de gestion des autorisations en accordant des droits non pas aux utilisateurs mais aux rôles. Ajoutez ensuite des rôles aux utilisateurs individuels. Lorsqu'une nouvelle table est créée, vous n'avez qu'à ajuster un ou deux rôles, mais pas des centaines d'utilisateurs.

  • Interrogez les catalogues système et créez le GRANT approprié commandes. Enregistrez-les dans un fichier et exécutez ce fichier. Cela devrait vous faciliter le démarrage.

Une telle requête pourrait ressembler à ceci :

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