Почему может только суперпользователь 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 особенно важно.)
Ответы
Ответ 1
Расширение hstore создает функции, вызывающие код из внешнего динамического объекта, для которого требуется привилегия суперпользователя. Поэтому для создания расширения hstore требуется привилегия суперпользователя.
Что касается Heroku, я понимаю, что они работают со специальным модулем "белый список", который позволяет пользователям создавать определенные расширения, даже если они не являются суперпользователями. Я полагаю, что он основан на этом коде: https://github.com/dimitri/pgextwlist. Вы можете попробовать установить этот код самостоятельно, если хотите, чтобы в ваших базах были одинаковые функциональные возможности.