5

我是 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存储函数中的语句?

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;

检查 db 是否已存在于本地集群中。如果没有,请继续创建它 - 使用经过清理的标识符。我们不想邀请 SQL 注入。

于 2014-03-13T10:25:06.113 回答
2

我找到了一个棘手的解决方案来解决这个问题,但可能。在几乎所有地方查看和阅读之后,我尝试了一些东西并且它起作用了。

如果错误是“无法从函数或多命令字符串执行 CREATE DATABASE”,我们可以使用 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

您不能在函数内部创建数据库,因为不可能在事务内部创建数据库。

但很可能您不是要创建数据库,而是创建模式,它更类似于 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 回答