web-dev-qa-db-fra.com

Comment accorder des privilèges de table / fonction de dépôt à un rôle dans PostgreSQL?

Je veux accorder des privilèges drop sur toutes les tables et fonctions (pas seulement celles appartenant à l'utilisateur) dans certains schémas d'une base de données spécifique à un rôle spécifique. Cependant, GRANT ALL PRIVILEGES ne suffit pas et je n'ai pas trouvé comment faire sans faire du rôle un superutilisateur - le superutilisateur a des droits sur d'autres bases de données sur le même serveur, ce qui n'est pas ce que je veux. Cela ne me dérangerait pas des privilèges de superutilisateur limités à une base de données spécifique, mais je ne sais pas comment le faire.

Mon code:

CREATE USER _administrator PASSWORD 'pwd12345';
CREATE ROLE administrator NOLOGIN ADMIN _administrator;

GRANT ALL PRIVILEGES ON DATABASE "myDB" TO administrator;
GRANT ALL PRIVILEGES ON SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO administrator;

administrator est le groupe des administrateurs de base de données myDB, _administrator est le rôle le plus puissant auquel mon application client pourra se connecter.

Qu'est-ce que j'ai raté ou fait de mal?

9
Pavel V.

Seul le propriétaire (et les superutilisateurs) peuvent déposer des objets. Par documentation:

Le droit de déposer un objet ou de modifier sa définition de quelque manière que ce soit n'est pas traité comme un privilège accordable; il est inhérent au propriétaire et ne peut être accordé ou révoqué. (Cependant, un effet similaire peut être obtenu en accordant ou en révoquant l'appartenance au rôle propriétaire de l'objet; voir ci-dessous.) Le propriétaire dispose implicitement de toutes les options d'octroi pour l'objet également.

Donc, faites administrator propre de tels objets que les utilisateurs devraient pouvoir supprimer.

ALTER FUNCTION foo() OWNER TO administrator;
ALTER TABLE foo      OWNER TO administrator;

Et vous vous êtes souvenu d'accorder réellement l'adhésion à un groupe, non?

GRANT administrator TO _administrator;
10
Erwin Brandstetter