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