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 modifySQL 子句没有被触发?
如何使用 JHipster 和 Liquibase 更新现有数据库? [复制]