为什么只有超级用户才能CREATE EXTENSION hstore,而在Heroku上不能?

36

当我尝试在我的数据库上启用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命令的用户在稍后进行特权检查时成为扩展的所有者,以及扩展脚本创建的任何对象的所有者。

hstore做了什么需要超级用户权限?它是否影响添加到其中的数据库之外的集群的某些部分?


更进一步混淆:

Heroku Postgres提供的DB用户不是超级用户

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

(为背景信息,我正试图设置一个Dokku 部署,所以与Heroku的比较尤其重要。)


我猜这是因为它需要加载/绑定本地库(dll/so),而只有超级用户才被允许这样做。 - user330315
我和@a_horse_with_no_name一样,认为需要修改服务器进程,所以才需要SU权限。通常我会在引导程序中使用SU加载它,然后切换到数据库所有者,但是找不到支持这种做法的文档。 - Doon
嗯,那很有道理,但请看我的关于Heroku的补充。在设置数据库时,Heroku是否会提前执行某些操作,使得非超级用户可以使用“CREATE EXTENSION hstore”命令? - Peeja
加载扩展需要与创建其组件对象所需的相同特权。对于大多数扩展,这意味着需要超级用户或数据库所有者特权。因此,可以推断出hstore不需要执行任何超级用户操作,或者Heroku已经调整了CREATE EXTENSION的工作方式。 - mu is too short
3个回答

43

关于hstore扩展

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

Heroku的特殊扩展白名单模块

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


1
你能告诉我使用了哪个外部对象扩展吗?我猜想这个对象在数据库基础设施内。 - Slow Harry

9
ALTER USER myuser WITH SUPERUSER;

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


1
踩一下。这是一个关于Heroku的问题。作为Heroku Web服务的用户,您不能成为超级用户,而只能安装一系列选择的扩展作为非超级用户。这就是为什么这个答案没有回答这个问题。其他Web服务器提供商也是如此,我从支持团队得到的回复是:“不受信任的”语言扩展无法得到支持,因为它们会影响我们保证最高可能的服务水平的能力。 - questionto42
1
尽管这个答案并没有指向Heroku,但我还是会点赞,因为它在我的情况下帮了我。 - Onengiye Richard
你可能需要向Heroku提出工单,因为hstore是一种半结构化数据或具有许多很少查询属性的行的扩展。如果您完全控制您的数据库实例,则可以使用此解决方案。 - Arun

0

这与Heroku无关。

这是我在Ubuntu 18.04中解决此问题的方法:

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

    sudo su postgres

  2. 然后运行以下命令:

    psql -U postgres your_database_name -c 'create extension hstore;'

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

  • 连接到您的数据库

    psql -d your_database_name -U your_user_role

alter table your_table_name add your_column_name HSTORE;

虽然可能有几种不同的方法来解决它,但我是用这种方式解决的。

希望这能帮助像我一样的初学者用户。


Downvote。它与Heroku(和其他Web服务)有关。当您使用仅提供nosuperuser权限的外部方的Web服务器时,您无法成为超级用户。 - questionto42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接