PSQL:当前事务被中止,命令被忽略直到事务块结束

时间:2016-08-05 14:05:50

标签: java postgresql batch-file psql

我想用PostgreSQL中的表编写create database的脚本。 我创建了 deploy_db.bat

@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

但是,为什么?怎么解决呢?

1 个答案:

答案 0 :(得分:1)

您发布了BEGIN启动了一个事务,然后CREATE DATABASE产生了错误消息,因为您在事务中运行了它。

您可以在CREATE DATABASE之前移动BEGIN语句,以消除错误消息。

但是读取你的SQL脚本我怀疑你想在新创建的数据库中创建新的模式和表,这不是你的脚本会发生的事情。相反,模式和表将在数据库postgres中创建。

要更改它,您的脚本应如下所示:

CREATE DATABASE test;

-- connect to that database
\connect test

-- now create your schema and your table
CREATE SCHEMA ...
CREATE TABLE ...