ユースケース:PostgreSQL:特定の名前でデータベースを作成することができるロールまたはユーザーを作成できますか?
私はテストを実行するたびにテストデータベースを削除して再作成するWebアプリケーションを用意しています。私はスーパーユーザーではなく、データベースを破壊したり作成したりするPGの役割ではなく、foo_testなどの特定のデータベース名を削除して作成することが許可されているPGロールでこれを行うようにしたいと思います。これは可能ですか?
ユースケース:PostgreSQL:特定の名前でデータベースを作成することができるロールまたはユーザーを作成できますか?
私はテストを実行するたびにテストデータベースを削除して再作成するWebアプリケーションを用意しています。私はスーパーユーザーではなく、データベースを破壊したり作成したりするPGの役割ではなく、foo_testなどの特定のデータベース名を削除して作成することが許可されているPGロールでこれを行うようにしたいと思います。これは可能ですか?
"SECURITY DEFINER"オプションを使用してデータベースを作成し、権限を設定する機能を作成できます。制限された役割がもちろん接続できるデータベースに存在する必要があります。
http://www.postgresql.org/docs/9.1/static/sql-createfunction.html
あなたは、SQL関数でそれをすべて行うことができるかもしれないが、それはplpgsqlが持つ些細です。
ニース。面白いアプローチ、それはうまくいくかもしれません。 – Pistos
これは、CREATE DATABASEをトランザクション内で呼び出すことはできず、関数は常にトランザクション内で実行されるため、機能しません。そこには特定のエラーメッセージがあります: 'CREATE DATABASEは関数または複数コマンド文字列から実行できません。 ' –
くそ - それは事を複雑にします。私はかなり多くのDDLがトランザクションでうまくいくのに慣れてきました。つまり、少なくともCREATE DATABASEのためにDBの外に出なければならないということです。あなたはおそらくループアウトしてdblinkを使って戻ったり、スクリプトの形式pl/perluやそのようなものを呼び出すことができますが、それほどエレガントではありません。 –
hmは、PostgreSQL自体ではできないようなものではありません(間違っているとは思っていますが)。アプリケーション層で実行することができます。私はこれを見つけました(http://archives.postgresql.org/pgsql-novice/2003-06/msg00212.php)、データベース名の長さを制限することについては何も知られていませんが、まだ具体的な名前はありません。 – bernie
まあ、私は信じていますPostgreSQLの以前のバージョンでこれを前にしていましたが、それはずっと前から、どうやって完了したのか忘れてしまいました。それは、GRANT文などで何らかの形でグロブやマスクを使用することと関係していました。ユーザーが "prefix_ *"データベースのみを作成できるようにします。 – Pistos
それが唯一の方法であれば、データベース作成をスキーマまたは名前空間に制限することに満足できます。 – Pistos