【问题标题】:Liquibase: ERROR: CREATE DATABASE cannot run inside a transaction blockLiquibase:错误:CREATE DATABASE 不能在事务块内运行
【发布时间】:2020-12-03 05:31:52
【问题描述】:

我正在尝试使用 liquibase 在 PostgreSQL 上创建一个数据库。这是我的 dbchangelog 文件

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
  <changeSet  author="testuser"  id="3">
    <sql  dbms="postgresql"
            endDelimiter=";">
            CREATE DATABASE testdb;
    </sql>
  </changeSet>
</databaseChangeLog

当我尝试从我的项目目录运行 liquibase update 时,我得到了

Unexpected error running Liquibase: ERROR: CREATE DATABASE cannot run inside a transaction block [Failed SQL: (0) CREATE DATABASE testdb] 

我看到在 PostgreSQL 中设置 AUTOCOMMIT = ON 可以解决这个问题。但是这种方法只适用于 PostgreSQL 9.4 及以下版本。但我使用的是 AWS RDS PostgreSQL 9.6.8

【问题讨论】:

  • 你不应该以超级用户的身份开始创建表

标签: postgresql liquibase liquibase-sql


【解决方案1】:

短: 将runInTransaction="false" 添加到您的changeSet

解释:

Liquibase 打开一个事务块以保证changeSets 完全执行或根本不执行。

PostgreSQL 文档说:CREATE DATABASE cannot be executed inside a transaction block.(见PostgreSQL Doc on Create Database!)

因此显然存在冲突行为,只能通过不使用事务块来避免。

请注意,使用多个命令停用事务行为可能会导致 changeSet 仅部分执行的问题。

【讨论】:

    【解决方案2】:

    Liquibase 不适用于创建数据库。您应该准备好您的数据库架构,并且 liquibase 将使用您的表/索引/...

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 2014-12-16
      • 1970-01-01
      • 2019-04-08
      • 2020-02-18
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多