为什么只有超级用户CREATE EXTENSION hstore,而不是Heroku?

时间:2013-12-21 20:12:27

标签: postgresql heroku hstore

当我尝试在我的数据库上启用hstore时:

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

我的用户不是超级用户,但 是数据库的所有者。

根据the CREATE EXTENSION docs

  

加载扩展程序需要具有创建其组件对象所需的相同权限。对于大多数扩展,这意味着需要超级用户或数据库所有者权限。运行CREATE EXTENSION的用户将成为扩展的所有者,以便以后进行权限检查,以及扩展程序脚本创建的任何对象的所有者。

hstore正在做什么需要超级用户权限?它是否会影响我将数据库添加到数据库之外的群集部分?


进一步的混乱:

The DB user Heroku Postgres provides is not a superuser

  

Heroku Postgres用户被授予其数据库的所有非超级用户权限。其中包括SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGE

然而,that user is able to 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的比较尤其重要。)

3 个答案:

答案 0 :(得分:36)

hstore扩展创建从外部动态对象调用代码的函数,这需要超级用户权限。这就是为什么创建hstore扩展需要超级用户权限。

至于Heroku,我的理解是他们运行了一个特殊的扩展白名单模块,它允许用户创建某些扩展名,即使他们不是超级用户。我相信它基于以下代码:https://github.com/dimitri/pgextwlist。如果您希望在数据库中使用相同的功能,可以尝试自己安装该代码。

答案 1 :(得分:0)

ALTER USER与SUPERUSER的postgres; 这样可以解决您的创建扩展问题。

答案 2 :(得分:0)

这与heroku无关。

这就是我在ubuntu 18.04中解决此问题的方式。

  1. 提供postgres超级用户访问权限。

    sudo su postgres

  2. 然后我运行:

    psql -U postgres 您的数据库名称 -c'创建扩展名hstore;'

现在,我可以更改表your_database_name并在其中添加hstore类型的列。

  • 连接到数据库

    psql -d 您的数据库名称 -U 您的用户角色

alter table your_table_name add your_column_name HSTORE;

尽管可能有不同的保存方式,但是我以这种方式解决了。

希望这会帮助像我这样的新手。