web-dev-qa-db-fra.com

Pourquoi un super-utilisateur ne peut-il pas créer HSTORE, mais pas sur Heroku?

Lorsque j'essaie d'activer hstore sur ma base de données:

=> CREATE EXTENSION IF NOT EXISTS hstore;
ERROR:  permission denied to create extension "hstore"
HINT:  Must be superuser to create this extension.

Mon utilisateur n'est pas un superutilisateur, mais est le propriétaire de la base de données.

Selon les documents CREATE EXTENSION :

Le chargement d'une extension nécessite les mêmes privilèges que ceux qui seraient nécessaires pour créer ses objets composants. Pour la plupart des extensions, cela signifie que les privilèges de superutilisateur ou de propriétaire de base de données sont nécessaires. L'utilisateur qui exécute CREATE EXTENSION devient le propriétaire de l'extension aux fins de vérifications de privilèges ultérieures, ainsi que le propriétaire de tous les objets créés par le script de l'extension.

Que fait hstore qui nécessite des privilèges de superutilisateur? Cela affecte-t-il des parties du cluster en dehors de la base de données à laquelle je l'ajoute?


Plus de confiance:

L'utilisateur de la base de données fourni par Heroku Postgres n'est pas un superutilisateur :

Les utilisateurs de Heroku Postgres bénéficient de toutes les autorisations non-superutilisateur sur leur base de données. Il s'agit notamment de SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER , CREATE, CONNECT, TEMPORARY, EXECUTE et USAGE.

Cependant, cet utilisateur est capable de CRÉER une extension hstore :

Pour créer une extension prise en charge, ouvrez une session avec heroku pg: psql et exécutez la commande appropriée:

$ heroku pg:psql
Pager usage is off.
psql (9.2.4)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

ad27m1eao6kqb1=> CREATE EXTENSION hstore;
CREATE EXTENSION
ad27m1eao6kqb1=>

(Pour le contexte, j'essaie de configurer un déploiement Dokk , donc la comparaison avec Heroku est particulièrement importante.)

32
Peeja

L'extension hstore crée des fonctions qui appellent du code à partir d'un objet dynamique externe, ce qui nécessite des privilèges de superutilisateur. C'est pourquoi la création de l'extension hstore nécessite le privilège de superutilisateur.

Quant à Heroku, je crois comprendre qu'ils fonctionnent avec un module spécial d'extension de liste blanche, qui permet aux utilisateurs de créer certaines extensions même s'ils ne sont pas des superutilisateurs. Je crois qu'il est basé sur ce code: https://github.com/dimitri/pgextwlist . Vous pouvez essayer d'installer ce code vous-même si vous souhaitez la même fonctionnalité dans vos bases de données.

36
Peter Eisentraut