使用存储的函数创建数据库

MyS*_*DBA 5 database postgresql transactions stored-functions

我是PostgreSQL的新手,想要使用存储函数创建数据库.
例如:

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

Create Database $1;

Select 1;

$BODY$
  LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

当我尝试执行此函数时,我收到语法错误.

Postgres是否支持CREATE DATABASE存储函数中的语句?

Erw*_*ter 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;
Run Code Online (Sandbox Code Playgroud)

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


Mil*_*dev 2

您无法在函数内部创建数据库,因为无法在事务内部创建数据库。

但很可能您并不是要创建数据库,而是要创建模式,它更类似于 MySQL 的数据库。