Liquibase表名前缀

时间:2015-03-17 13:01:04

标签: liquibase

我目前正在为基于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>

应使用名称&#34; plugin_fooentity&#34;创建表格。插件本身不应该知道关于前缀的任何信息,因为前缀是由插件/核心系统提供的。

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

2 个答案:

答案 0 :(得分:2)

也许你可以使用modifySql吗?

您必须将此复制到您定义的所有更改集,但应该可以。

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

答案 1 :(得分:0)

对我来说,它像这样工作:

使用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>