web-dev-qa-db-ja.com

スーパーユーザーのみが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 docs によると:

拡張機能をロードするには、そのコンポーネントオブジェクトを作成するのに必要な権限と同じ権限が必要です。ほとんどの拡張機能では、これはスーパーユーザーまたはデータベース所有者の特権が必要であることを意味します。 CREATE EXTENSIONを実行するユーザーは、後の特権チェックのために拡張機能の所有者になり、拡張機能のスクリプトによって作成されたオブジェクトの所有者にもなります。

スーパーユーザー特権を必要とするhstoreは何をしていますか?追加するデータベース外のクラスターの一部に影響しますか?


さらなる混乱:

Heroku Postgresが提供するDBユーザーはスーパーユーザーではありません

Heroku Postgresユーザーには、データベースに対するすべての非スーパーユーザー権限が付与されます。これらには、SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERが含まれます。 、CREATECONNECTTEMPORARYEXECUTE、およびUSAGE

ただし、 そのユーザーは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=>

(コンテキストでは、 Dokk デプロイメントを設定しようとしているため、Herokuとの比較は特に重要です。)

32
Peeja

Hstore拡張機能は、スーパーユーザー特権が必要な外部動的オブジェクトからコードを呼び出す関数を作成します。そのため、hstore拡張機能を作成するにはスーパーユーザー権限が必要です。

Herokuに関しては、特別な拡張ホワイトリストモジュールを使用して実行されていることを理解しています。これにより、ユーザーはスーパーユーザーではなくても特定の拡張を作成できます。このコードに基づいていると思います: https://github.com/dimitri/pgextwlist 。データベースで同じ機能が必要な場合は、自分でそのコードをインストールしてみてください。

36