Liquibase:关系“databasechangeloglock”已经存在,使用 grails 插件和非默认模式

Posted

技术标签:

【中文标题】Liquibase:关系“databasechangeloglock”已经存在,使用 grails 插件和非默认模式【英文标题】:Liquibase: relation "databasechangeloglock" already exists, using grails plugin and non-default schema 【发布时间】:2012-09-22 21:55:00 【问题描述】:

我正在使用 grails 2.0.3、数据库迁移 (liquibase) 插件 1.1 和 postgres 9.1。

我认为这些其他用户描述的问题与我认为的相同,但有皱纹:

problem running liquibase with maven and postgres-db https://liquibase.jira.com/browse/CORE-183 [其他参考被删除,没有足够的声誉:(]

皱纹是:

    我正在使用 grails 和数据库迁移插件。 生产数据库不使用默认架构。 我必须在启动时使用自动数据库迁移 (grails.plugin.databasemigration.updateOnStart = true),因为没有开发人员可以访问实际的生产数据库。

我对这个问题的理解是,liquibase 正在检查默认架构是否存在其维护表,然后尝试在正确的位置(非默认架构)创建表。但当然,它们在第一次执行后就已经存在。通过指定命令行选项似乎有一种解决方法,但我没有该选项,因为需要在部署后的 grails 应用程序中自动运行。

有没有办法让数据库迁移插件做我需要的?告诉 DBA 以不同方式组织架构不是一种选择。

提前致谢, 雷·A·康纳

【问题讨论】:

【参考方案1】:

前置条件和重构命令采用属性 schemaName。

<tableExists schemaName="myschema" tableName="..."/>
<createTable schemaName="myschema" tableName="..."/>

你也可以参数化它:

<databaseChangeLog ..>
  <property name="schema.name" value="myschema"/>
  ....
  <changeset ...>
    <createTable schemaName="$schema.name]" tableName="..."/>
  </changeset>
</databaseChangeLog>

对于 Liquibase 本身,您可以设置 defaultSchemaName,在您的情况下(Grails)应该是:

grails.plugin.databasemigration.updateOnStartDefaultSchema

【讨论】:

那是为了重构我的应用架构中的表。这个问题与 liquibase 为自己创建的表有关,用于保存变更集和内部锁定。 我已经离开了这个有问题的工作,我还没有能够设置一个环境来验证你的编辑。希望不久之后我就能做到这一点。【参考方案2】:

对我来说,这是缺少的所有者权利。这样登录的用户就无法找到该表,但也无法创建它,因为它在那里。

我的解决方法是将所有者更改为正确的人。

【讨论】:

以上是关于Liquibase:关系“databasechangeloglock”已经存在,使用 grails 插件和非默认模式的主要内容,如果未能解决你的问题,请参考以下文章

在Spring Boot 2下激活后启动liquibase。

异步执行长时间运行的 liquibase 数据库更新

为啥我的 liquibase modifySQL 子句没有被触发?

如何使用 JHipster 和 Liquibase 更新现有数据库? [复制]

liquibase:你能用 liquibase addColumn 指定“列后”吗?

是否存在 liquibase 锁定超时?