Postgresql: que fait GRANT ALL PRIVILEGES ON DATABASE?

60

J'essaie d'accorder tous les privilèges sur toutes les tables d'une base de données donnée à un nouvel utilisateur postgres (pas au propriétaire). Il semble que GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;cela ne fait pas ça. Après avoir exécuté cette commande avec succès (en tant qu'utilisateur postgres), j'obtiens ce qui suit en tant que new_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Deux questions:

1) Que fait la commande ci-dessus, alors, si vous n'accordez pas toutes les autorisations sur toutes les tables de my_db?

2) Quelle est la manière appropriée d'octroyer toutes les autorisations sur toutes les tables à un utilisateur? (y compris sur toutes les tables créées dans le futur)

rz.
la source

Réponses:

80

Les réponses à vos questions proviennent de la documentation en ligne PostgreSQL 8.4 .

  1. GRANT ALL PRIVILEGES ON DATABASEaccorde le CREATE, CONNECTet les TEMPORARYprivilèges sur une base de données à un rôle (les utilisateurs sont correctement appelés rôles ). Aucun de ces privilèges ne permet en réalité à un rôle de lire les données d'une table. SELECTle privilège sur la table est requis pour cela.

  2. Je ne suis pas sûr qu'il existe un moyen "approprié" d'accorder tous les privilèges sur toutes les tables à un rôle. Le meilleur moyen de s'assurer qu'un rôle donné dispose de tous les privilèges sur une table est de s'assurer que le rôle est propriétaire de la table. Par défaut, chaque objet nouvellement créé appartient au rôle qui l'a créé. Par conséquent, si vous souhaitez qu'un rôle dispose de tous les privilèges sur une table, utilisez ce rôle pour le créer.

    PostgreSQL 9.0 introduit la syntaxe suivante qui correspond presque à ce que vous voulez:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    Le problème, c'est que si vous créez des tables dans des schémas en dehors du schéma "public" par défaut, cela GRANTne leur sera pas applicable. Si vous utilisez des schémas non publics, vous aurez GRANTles privilèges sur ces schémas séparément.

Steven Monday
la source
1
une base de données peut-elle avoir plusieurs propriétaires? si oui, comment ajouter un autre propriétaire?
rz.
non, je ne pense pas qu'une base de données puisse avoir plus d'un propriétaire, vous pouvez leur donner toutes les écritures d'un propriétaire si
hellomynameisjoel
15
n'oubliez pas que vous devez faire la même chose sur les séquences: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;ou vous ne pouvez pas insérer d'enregistrements.
Même si cela ne fonctionne pas, essayez ceci: = DONNEZ TOUS LES PRIVILÈGES SUR TOUTES LES TABLEAUX DU SCHEMA public TO your_user;
Kaustubh
10

Il est possible de configurer plusieurs connexions pour agir en tant que propriétaire de la base de données:

  • Créez un rôle "nologin" pour agir en tant que propriétaire: create role dbowner nologin
  • Changez le propriétaire de votre base de données en ceci: alter database mydb owner dbowner
  • Accordez toutes vos connexions à ce nouveau rôle: grant dbowner to user1, user2

Désormais, si l'utilisateur 1 ou l'utilisateur 2 se connecte, il dispose de toutes les autorisations sur "mydb" sans qu'aucune autorisation supplémentaire ne soit requise.

Cependant, je considérerais cette solution avec soin. Il est tentant de demander à votre application Web d’utiliser l’une de ces connexions pour éviter de créer des droits supplémentaires chaque fois que le schéma est mis à jour, mais vous supprimez ainsi une forme de protection très utile. Utilisez la solution ci-dessus si vous voulez vraiment plusieurs "administrateurs", mais respectez le modèle "accorder tous les privilèges sur toutes les tables du schéma ..." ci-dessus pour la connexion à votre application "d'utilisation normale".

Chris Cogdon
la source
1
Chris Cogdon, juste une petite solution: changez le propriétaire de la base de données mydb en dbowner
user876743 le