Подтвердить что ты не робот

Почему может только суперпользователь CREATE EXTENSION hstore, но не на Heroku?

Когда я пытаюсь включить hstore в моей базе данных:

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

Мой пользователь не является суперпользователем, но является владельцем базы данных.

В соответствии с документами CREATE EXTENSION:

Загрузка расширения требует тех же привилегий, которые необходимы для создания его объектов-компонентов. Для большинства расширений это означает, что необходимы привилегии суперпользователя или владельца базы данных. Пользователь, который запускает CREATE EXTENSION, становится владельцем расширения для целей более поздних проверок привилегий, а также владельцем любых объектов, созданных расширением script.

Что такое hstore, который требует привилегий суперпользователя? Это влияет на части кластера за пределами базы данных, к которой я добавляю?


Дальше:

Пользователь базы данных Heroku Postgres не является суперпользователем:

Пользователям Heroku Postgres предоставляются все права, отличные от суперпользователя, в их базе данных. К ним относятся SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CREATE, CONNECT, TEMPORARY, EXECUTE и USAGE.

Однако этот пользователь может создать CREATE EXTENSION hstore:

Чтобы создать любое поддерживаемое расширение, откройте сеанс с помощью heroku pg: psql и запустите соответствующую команду:

$ 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=>

(Для контекста я пытаюсь настроить Dokku, поэтому сравнение с Heroku особенно важно.)

4b9b3361

Ответ 1

Расширение hstore создает функции, вызывающие код из внешнего динамического объекта, для которого требуется привилегия суперпользователя. Поэтому для создания расширения hstore требуется привилегия суперпользователя.

Что касается Heroku, я понимаю, что они работают со специальным модулем "белый список", который позволяет пользователям создавать определенные расширения, даже если они не являются суперпользователями. Я полагаю, что он основан на этом коде: https://github.com/dimitri/pgextwlist. Вы можете попробовать установить этот код самостоятельно, если хотите, чтобы в ваших базах были одинаковые функциональные возможности.