2016-08-05 18 views
0

PostgreSQLでテーブルを持つデータベースを作成するスクリプトを作成したい。 私は deploy_db.bat を作成しました:PSQL:現在のトランザクションが中断され、トランザクションブロックの終了までコマンドが無視される

@echo off 
"C:\Program Files\PostgreSQL\9.4\bin\psql.exe" -h localhost -p 5433 -U postgres -d postgres -f run_main.sql 
pause 

私run_main.sql:

BEGIN; 
\i create_db.sql 
\i tableA.sql 
COMMIT; 

がcreate_db.sql:

CREATE DATABASE test; 

DROP SCHEMA IF EXISTS test CASCADE; 

CREATE SCHEMA test 
    AUTHORIZATION postgres; 

tableA.sql:

CREATE TABLE test.tableA(
    id serial PRIMARY KEY, 
    name text, 
    age INTEGER 
); 

だから、私は deploy_db.bat を実行し、参照してください。

BEGIN 
psql:create_db.sql:1: ERROR: CREATE DATABASE cannot run inside a transaction block 
psql:create_db.sql:3: ERROR: current transaction is aborted, commands ignored until end of transaction block 
ROLLBACK 

しかし、なぜ?どのように解決できますか?

+2

エラーが間違っている正確に何を説明します。 'BEGIN ... COMMIT'ブロック内で' CREATE DATABASE'を実行することはできません。 –

+0

"CREATE DATABASE"ブロックを設定する必要はありますか?どのように正しくそれを行うのですか? –

+0

SQLスクリプトでデータベースを作成する代わりに、[createdbユーティリティ](https://www.postgresql.org/docs/current/static/app-createdb.html)を参照してください。最初に一括して実行し、新しく作成したDBに接続します。 – Abelisto

答えて

1

トランザクションを開始したBEGINを発行した後、CREATE DATABASEがトランザクション内で実行したためにエラーメッセージを生成しました。

BEGINの前にCREATE DATABASEステートメントを移動するだけで、エラーメッセージが表示されなくなります。

あなたのSQLスクリプトを読んで、新しく作成したデータベースに新しいスキーマとテーブルを作成したいと思っていますが、これはあなたのスクリプトでは起こりません。むしろ、スキーマとテーブルはデータベースpostgresに作成されます。

はそれを変更するには、スクリプトは次のようになります。

CREATE DATABASE test; 

-- connect to that database 
\connect test 

-- now create your schema and your table 
CREATE SCHEMA ... 
CREATE TABLE ... 
関連する問題