当我try 在数据库上启用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:

加载扩展需要与创建其组件对象相同的权限.对于大多数扩展,这意味着需要超级用户或数据库所有者权限.运行"创建扩展"的用户将成为该扩展的所有者,用于以后的权限判断,以及由该扩展的脚本创建的任何对象的所有者.

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的比较尤其重要.)

推荐答案

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

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

Postgresql相关问答推荐

PostgreSQL散列连接与嵌套循环和散列索引

如何确定要与给定转储文件一起使用的pg_Restore版本?

如何诊断字符编码问题

Postgres 对 WHERE 子句并行使用两个索引

如何在 postgres where 子句中使用 or 对条件进行组合或分组

如何获取在 Go 中完成的 SQL 插入的错误详细信息?

AGE Graph 实际上存储为 postgreSQL 表,对吧?如何检索该表(不是图表)?

如何计算过滤器中的百分比

PostgreSQL 错误:42P01:relation "[Table]" does not exist

DbProviderFactory 与 Npgsql?

PostgreSQL如何连接间隔值'2天'

将主键更改为自动递增

在 postgresql 中,如何在 jsonb 键上返回布尔值而不是字符串?

在同一分区上应用多个窗口函数

仅当 PostgreSQL 表不存在时才添加主键

postgres - 比较两个数组

在 postgres 中插入语句用于没有时区 NOT NULL 的数据类型时间戳,

PG::ConnectionBad FATAL:role "Myname" does not exist

学习 PL/pgSQL 的好资源?

如何在 postgresql 中获取整个表的哈希?