【问题标题】:PSQL: current transaction is aborted, commands ignored until end of transaction blockPSQL:当前事务被中止,命令被忽略,直到事务块结束
【发布时间】:2016-12-11 23:42:02
【问题描述】:

我想为在 PostgreSQL 中创建包含表的数据库编写脚本。 我创建了 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

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

【问题讨论】:

  • 错误告诉你究竟出了什么问题。您不能在 BEGIN ... COMMIT 块内运行 CREATE DATABASE
  • 哪里需要设置块“CREATE DATABASE”?怎么正确呢?
  • 不要在 SQL 脚本中创建数据库,而是查看 createdb utility。首先在您的批处理中执行它,然后连接到新创建的数据库。
  • @Abelisto 或者只运行CREATE DATABASE BEGIN之前。然后你可能想\c 到创建的数据库。
  • @CraigRinger 是的,它是在您上面的评论和下面的答案中提出的。然而,在我自己的看来,创建数据库和用对象/数据填充它有点不同(比如格式化软盘并将文件复制到它:) 此外,虽然在 Q 中提到了 @987654332 @,并非所有客户端都支持在同一脚本中“即时”连接到另一个数据库。最后,分离这些操作允许在不同名称的数据库中创建数据模式,而无需编辑 SQL 脚本。简而言之,这就是我建议单独创建数据库的原因。

标签: java postgresql batch-file psql


【解决方案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 ...

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 2013-08-04
    • 2012-05-11
    • 1970-01-01
    • 2011-12-06
    • 2013-10-25
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多