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

10

Je veux accorder des dropprivilèges 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, cela GRANT ALL PRIVILEGESne 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;

administratorest le groupe d' myDBadministrateurs de base de données, _administratorest le rôle le plus puissant auquel mon application client pourra se connecter.

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

Pavel V.
la source

Réponses:

11

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.

Alors, faites administrator propres tels objets que les utilisateurs devraient être en mesure de déposer.

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;
Erwin Brandstetter
la source