スーパーユーザーなしでPostgresqlを有効にする拡張機能


12

ユーザーのロールとデータベースを自動的に作成するスクリプトを備えたPostgreSQL 9.5サーバーがあります。これらのデータベース内では、特定の拡張機能(pgcryptoなど)を有効にすると便利ですが、私が理解しているように、実行するにはスーパーユーザーである必要がありますCREATE EXTENSION。スーパーユーザーアカウントで手動でログインせずに、このような拡張機能を有効にする方法はありますか?


4
それらをに追加してからtemplate1、各ユーザーデータベースをtemplate1like から作成してみましたCREATE DATABASE foo OWNER=userfoo TEMPLATE=template1か?
Kassandry 2017年

1
@Kassandryはそのことを考えていませんでしたが、良い考えです。理想的には、所有者が望むなら拡張機能を追加できるようにしたいのですが、これはまだ許容できる可能性です。
beldaz

回答:


10

拡張機能に関するドキュメントから、

スーパーユーザー(ブール)このパラメーターがtrue(デフォルト)の場合、スーパーユーザーのみが拡張を作成したり、拡張を新しいバージョンに更新したりできます。falseに設定されている場合、インストールまたは更新スクリプトでコマンドを実行するために必要な権限のみが必要です。

値はで設定されていないpgcrypto.controlため、デフォルトでtrueに設定されており、SuperUserが必要です。

これはCREATE EXTENSIONCREATE EXTENSIONのドキュメントがあなたを信じさせているにもかかわらず、データベースの単なる所有者になることはできないことを意味します。

私はハードに設定してみましたがfalse、喜びはありませんでした。Cは信頼できない言語であり、

エラー:言語cの許可が拒否されました

pg_languageのドキュメントから

信頼できない言語で関数を作成できるのはスーパーユーザーだけです。

...もちろん、スーパーユーザーとしてc信頼することができUPDATE pg_language set lanpltrusted = true where lanname = 'c';ます。その後CREATE EXTENSION pgcrypto、非スーパーユーザーとして正常に動作します。しかし、ユーザーがソースを拡張ディレクトリにアップロードし、それをデータベースにインストールすることを心配する必要がある場合、それは悪い考えのように思えます。つまり、私はそれほど遠くに行きません。この猫の皮を剥ぐ別の方法を見つけます。


エヴァンさん、ありがとうございます。私はおそらくこれを回避するために@Kassandryの猫のような提案を選ぶでしょう。CREATE EXTENSIONをストアドプロシージャでラップすることも検討しましたが、dblink認証の煩わしさがなければ、同じデータベースでこれを機能させるためのルートを見つけることができませんでした。
beldaz

それでは、pg_dump拡張機能に関するステートメントをダンプしないようにするためのオプションがないことの意味は何ですか?現在、外部テキスト処理ツールを使用して、によってダンプされたSQLからこれらのステートメントを削除する必要がありますpg_dump
Claudix 2018

@Evan Carroll:psql cliを使用してスーパーユーザーをfalseに設定することは可能ですか?私はamazon aws rdsにインスタンスがあり、pgcrypto.controlにアクセスできません。
リバマー

2
@ribamarいいえ。これは、データベースに接続している誰もが、db postmasterとして文字どおりの任意のコードを実行できることを意味します。それは恐ろしい考えでしょう。
エヴァンキャロル

誰でもない、スーパーユーザー。このようにして、オペレーティングシステムをスーパーユーザーとdbmsスーパーユーザーとで区別していることを理解しましたが、そのような決定を下した場合は、ツールを強化し、さらに強力なユーザーを作成する必要がある場合は、それを実装します。ツール内。
リバマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.