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?
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;