5

私は PostgreSQL を初めて使用し、ストアド関数を使用してデータベースを作成したいと考えています。
例:

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

Create Database $1;

Select 1;

$BODY$
  LANGUAGE sql;

この関数を実行しようとすると、構文エラーが発生します。

PostgresCREATE DATABASEはストアド関数のステートメントをサポートしていますか?

4

4 に答える 4

10

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

他の回答で指摘されているように、(ドキュメントごとに)次の理由で単純に可能ではありません:

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

で制限を回避できることも報告されていdblinkます。
PostgreSQL で dblink を使用 (インストール) するには?

これまでに欠けていたのは、実際にそれを行う適切な関数です:

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;

データベースがローカル クラスターに既に存在するかどうかを確認します。そうでない場合は、サニタイズされた識別子を使用して作成に進みます。SQL インジェクションを招きたくありません。

于 2014-03-13T10:25:06.113 に答える
2

私はこの問題に対するトリッキーな解決策を見つけましたが、可能です。ほとんどどこでも見て読んだ後、私は何かを試しましたが、うまくいきました。

エラーが「関数またはマルチコマンド文字列からCREATEDATABASEを実行できません」の場合、dblinkを使用して単一のコマンド文字列を強制できます。そして、それ自体に接続するようにします。

dblinkで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');

私の場合、さまざまな種類のテンプレートを使用しています。

ご挨拶

于 2012-09-04T17:20:37.050 に答える
2

transaction 内でデータベースを作成することはできないため、関数内でデータベースを作成することはできません。

しかし、ほとんどの場合、データベースを作成するつもりではなく、MySQL のデータベースによりよく似たスキーマを作成するつもりです。

于 2010-12-08T10:02:26.403 に答える
0
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では-バージョンを指定しません)

于 2010-12-08T10:14:19.927 に答える