【问题标题】:Liquibase table name prefixLiquibase 表名前缀
【发布时间】:2015-05-19 22:07:40
【问题描述】:

我目前正在为基于 Spring 的插件系统开发原型。这个想法是插件可以使用 JPA 实体和 liquibase 更改日志来维护数据库结构。为了将插件创建的表与核心系统的表分开,插件应该被强制使用前缀作为表名。

对于可以通过使用命名策略轻松归档的 JPA/Hibernate。但我找不到为 liquibase 变更集存档的方法。

例如插件定义了如下的变更日志

<changeSet id="2015-03-17-00-01" author="foo">
    <createTable tableName="fooentity">
        <column name="id" type="INT">
            <constraints primaryKey="true" nullable="false" />
        </column>
        <column name="name" type="VARCHAR(100)">
            <constraints nullable="false" />
        </column>
    </createTable>
</changeSet>

应该使用名称“plugin_fooentity”创建表。插件本身不应该知道任何关于前缀的信息,因为前缀是由插件/核心系统给出的。

如果有人能给我一个可能的解决方案的提示,那就太好了。

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    也许您可以为此使用modifySql

    您必须将其复制到您定义的所有变更集中,但这应该是可能的。

    它有一个名为regExpReplace 的子标签,您可以使用它来定义像create table (\w*?) .* 这样的通用术语,并将其替换为create table plugin_$1

    【讨论】:

    • 这不起作用... 写这个……但没有被执行
    【解决方案2】:

    对我来说是这样的:

    使用 modifySql 语句

    我创建了 2 个属性:

    <property name="table.prefix" value="TBL_"/>
    <property name="schema.name" value="PUBLIC"/>
    

    然后添加以下语句:

    <modifySql>
        <regExpReplace replace="CREATE\ TABLE\ ${schema.name}.([\w]*)\ (.*)" with="CREATE TABLE ${schema.name}.${table.prefix}$1 $2"/>
    </modifySql>
    
    <modifySql>
        <regExpReplace replace="CREATE\ UNIQUE\ INDEX\ ${schema.name}.([\w]*)\ ON\ PUBLIC.([\w]*)\((.*)\)" with="CREATE UNIQUE INDEX ${schema.name}.$1 ON ${schema.name}.${table.prefix}$2($3)"/>
    </modifySql>
    
    <modifySql>
        <regExpReplace replace="CREATE\ INDEX\ ${schema.name}.([\w]*)\ ON\ ${schema.name}.([\w]*)\((.*)\)" with="CREATE INDEX ${schema.name}.$1 ON ${schema.name}.${table.prefix}$2($3)"/>
    </modifySql>
    

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 2015-11-21
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多