2010-12-08 16 views
4

私は、PostgreSQLに新しいですし、保存された機能を使用してデータベースを作成するを使用してデータベースを作成します。元の場合
保存機能

CREATE OR REPLACE FUNCTION mt_test(dbname character varying) 
    RETURNS integer AS 
$BODY$ 

Create Database $1; 

Select 1; 

$BODY$ 
    LANGUAGE sql; 

私は構文エラーを取得し、この機能を実行しようとしています。

んPostgresは保存された機能でCREATE DATABASE文をサポートしていますか?

+0

なぜこれをやりたいですか? – eevar

答えて

1

それがデータベースinside a transactionを作成することはできませんので、あなたは、関数の内部でデータベースを作成することはできません。

しかし、おそらくあなたはより密接にMySQLのデータベースに似ている、データベースが、schemasを作成することを意味するものではありません。

+0

私はスキーマを作成したくありません。データベースのみを作成したいはい、あなたはMyQLに似ています。私はそれを実装しました.SySQLと同じように、SchemaとDatabaseの間に違いはありません。 –

1
postgres=> create or replace function mt_test(dbname text) 
             returns void language plpgsql as $$ 
postgres$> begin 
postgres$> execute 'create database '||$1; 
postgres$> end;$$; 
CREATE FUNCTION 
postgres=> select work.mt_test('dummy_db'); 
ERROR: CREATE DATABASE cannot be executed from a function or multi-command string 
CONTEXT: SQL statement "create database dummy_db" 
PL/pgSQL function "mt_test" line 2 at EXECUTE statement 
postgres=> 

ノートエラーメッセージ:CREATE DATABASE cannot be executed from a function or multi-command string

ので、質問への答え:

は、保存された関数内のステートメントを作成するのPostgreSQLをサポートしてい

"ノー"(です8.4の最小 - あなたはあなたのバージョンを指定していない)

+0

私はそれを実装する方法はありますか? –

+0

あなたはPostgresを変更できますか?もちろん、あなたがしたい場合はできます。私は疑問ですが、これはあなたが意味するものです。なぜ複数のデータベースを使用したいのか*あなたが達成しようとしていることを正確に説明すると、役立つかもしれないと思いますか? –

+0

いいえ私はポストグルを変更したいと言っているわけではありません。私は現在、1つのテーブルにすべてのデータを保持しているデータベースを持っています。私は別々のデータにアクセスしない複数のユーザーがいるので、パフォーマンスを向上させるためにそれらを別々に保管したいので、ユーザーごとに独立したデータベースを作成する必要があります。 –

2

私はこの問題には微妙な解決策を見つけましたが、可能です。見たり読んだりするとどこかでほとんど何かを試してみると、うまくいきました。

エラーがある場合、我々はデータベース・リンクを使用して、単一のコマンド文字列を強制することができる「データベースのCREATEは、機能またはマルチコマンド文字列から実行することができません」。それを自分自身に接続させる。テンプレートの種類を使用して、私の場合はdblink

PERFORM replication.dblink_connect('myconn','host=127.0.0.1 port=5432 dbname=mydb user=username password=secret'); 
PERFORM replication.dblink_exec('myconn', 'CREATE DATABASE "DBFROMUSER'||id||'" TEMPLATE "TEMPL'||type||'";',false); 
PERFORM replication.dblink_disconnect('myconn'); 

でdblinkをインストール手順について

チェック。

挨拶

8

この質問は古いですが、完全を期すために...

他の回答で指摘したように(per documentation)ので、それは単に不可能です。

CREATE DATABASEトランザクションブロック内では実行できません。

制限は、dblinkをバイパスすることができることも報告されている。これまで欠けていた何
How to use (install) dblink in PostgreSQL?

は、実際にそれをやって適切な機能である:

CREATE OR REPLACE FUNCTION f_create_db(dbname text) 
    RETURNS integer AS 
$func$ 
BEGIN 

IF EXISTS (SELECT 1 FROM pg_database WHERE datname = dbname) THEN 
    RAISE NOTICE 'Database already exists'; 
ELSE 
    PERFORM dblink_exec('dbname=' || current_database() -- current db 
        , 'CREATE DATABASE ' || quote_ident(dbname)); 
END IF; 

END 
$func$ LANGUAGE plpgsql; 

小切手DBは、すでにローカルクラスタに存在する場合。そうでない場合は、墨塗りされた識別子でそれを作成します。私たちはSQLインジェクションを招待したくありません。

関連する問題