【问题标题】:Why can only a superuser CREATE EXTENSION hstore, but not on Heroku?为什么只有超级用户可以创建扩展 hstore,而不能在 Heroku 上?
【发布时间】:2014-01-10 11:10:18
【问题描述】:

当我尝试在我的数据库上启用 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 用户被授予对其数据库的所有非超级用户权限。这些包括SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATE、@9876543@35@、USAGEEXECUTE、@9876 .

但是,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 的比较尤为重要。)

【问题讨论】:

标签: postgresql heroku hstore


【解决方案1】:

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

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

【讨论】:

  • 您能说出使用了哪个外部对象扩展吗?我想这个对象在数据库基础设施中。
【解决方案2】:
ALTER USER myuser WITH SUPERUSER;

如果您从超级用户运行此命令,这将解决您的CREATE EXTENSION 问题。您可以使用\du 检查您的可用用户以查找超级用户。

【讨论】:

  • 投反对票。这是一个关于 Heroku 的问题。作为 Heroku Web 服务的用户,您不能只是成为超级用户,相反,您只能以非超级用户的身份安装选定范围的扩展。这就是为什么这个答案没有回答这个问题。与其他 Web 服务器提供商一样,我从支持人员那里得到答复说:“不支持“不受信任”的语言扩展,因为它们会损害我们保证最高服务水平的能力。'
  • 即使这个答案并不指向 Heroku,我仍然会竖起大拇指,因为它对我自己的情况有所帮助
  • 您可能必须为此向 heoku 提出票证,因为 hstore 是半结构化数据或具有许多很少查询的属性的行的扩展。如果您可以完全控制数据库实例,则此解决方案适用。
【解决方案3】:

这与heroku无关。

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

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

    sudo su postgres

  2. 然后我运行:

    psql -U postgres your_database_name -c '创建扩展 hstore;'

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

  • 连接到您的数据库

    psql -d your_database_name -U your_user_role

alter table your_table_name add your_column_name HSTORE;

虽然可能有很多不同的方法可以做到这一点,但我以这种方式解决它。

希望这对像我这样的新手用户有所帮助。

【讨论】:

  • 投反对票。它与 Heroku(和其他 Web 服务)有关。当您使用仅授予您无超级用户权限的外部方的 Web 服务器时,您无法成为超级用户。
猜你喜欢
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2013-05-07
  • 2018-04-05
  • 2012-03-01
  • 2016-01-21
  • 2016-01-16
  • 1970-01-01
相关资源
最近更新 更多