2010-12-08 8 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 데이터베이스를 만들 수 없으므로 함수 내부에서 데이터베이스를 만들 수 없습니다.

하지만 아마도 데이터베이스를 만드는 것이 아니라 schemas인데, 이는 MySQL의 데이터베이스와 매우 유사합니다.

+0

스키마를 만들고 싶지 않습니다. 나는 오직 데이터베이스를 만들고 싶다. 네, MyQL에서 맞습니다. MySQL에서 구현 한 것처럼 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

아니요 나는 포스트 그레스를 바꾸고 싶지 않다. 현재 하나의 테이블에 모든 데이터를 보유하고있는 데이터베이스가 있습니다. 어디로 나는 서로 다른 데이터에 액세스하지 않는 여러 사용자가 있으므로 성능을 향상시키기 위해 개별적으로 저장하려고하므로 각 사용자에 대해 독립적 인 데이터베이스를 만들고 싶습니다. –

2

이 문제에 대한 까다로운 해결책을 찾았지만 가능합니다. 보고 있고 거의 모든 곳에서 읽은 후 나는 무언가를 시도했고 그것은 효과가 있었다.

"CREATE DATABASE는 함수 또는 다중 명령 문자열에서 실행할 수 없습니다."우리는 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'); 

에서 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를 이미 로컬 클러스터에 존재합니다. 그렇지 않은 경우 위생 ID로 작성하십시오. SQL 인젝션을 초대하고 싶지는 않습니다.

관련 문제