Liquibase 可以使用 DB2 的多个表空间吗?

Can Liquibase use DB2's multiple tablespaces?

在 DB2 LUW 中,recommended 表、索引和 "long objects"(即 LOB)应该放在单独的表空间中。我们现有的 SQL 脚本有这样的行:

CREATE TABLE "APPLICATIONTABLE"(
    APPLICATIONID INTEGER NOT NULL,
    APPLICATIONNAME VARCHAR(30) NOT NULL
)IN USERSPACE1 INDEX IN USERSPACE2 LONG IN USERSPACE3;

在变更集中我们可以指定一个表空间:

<createTable tableName="APPLICATIONTABLE" tablespace="${tablespace.data}">
    <column name="APPLICATIONID" type="NUMBER(4, 0)">
        <constraints nullable="false"/>
    </column>
    <column name="APPLICATIONNAME" type="VARCHAR(30)">
        <constraints nullable="false"/>
    </column>
</createTable>

但据我所知,DB2 的多个表空间不是。有什么办法吗?

这是 Liquibase 的 Datical 扩展支持的功能,但 Liquibase 本身不支持。

您可以使用 sql change,liquibase 文档将其描述为:

The ‘sql’ tag allows you to specify whatever sql you want. It is useful for complex changes that aren’t supported through Liquibase’s automated refactoring tags and to work around bugs and limitations of Liquibase. The SQL contained in the sql tag can be multi-line.

看起来像这样(从 liquibase 文档复制):

<changeSet author="liquibase-docs" id="sql-example">
    <sql dbms="h2, oracle"
            endDelimiter="\nGO"
            splitStatements="true"
            stripComments="true">insert into person (name) values ('Bob')
        <comment>What about Bob?</comment>
    </sql>
</changeSet>

编辑:

看完这个 刚看到另一个选项。 您可以使用 modifySql 标签。也许省略表空间信息并像这样附加它(未经测试的代码 - 只是一个建议):

<createTable tableName="APPLICATIONTABLE">
    <column name="APPLICATIONID" type="NUMBER(4, 0)">
        <constraints nullable="false"/>
    </column>
    <column name="APPLICATIONNAME" type="VARCHAR(30)">
        <constraints nullable="false"/>
    </column>
    <modifySql dbms="db2">
        <append value=" IN USERSPACE1 INDEX IN USERSPACE2 LONG IN USERSPACE3"/>
    </modifySql>
</createTable>

我知道这已经有 6 年了,但我认为我会 post 这是另一种可能的解决方案。他们在他们的网站上给出了以下示例

<changeSet id="2" author="liquibase">
   <createTable catalogName="department2"
          remarks="A String"
          schemaName="public"
          tableName="person"
          tablespace="${tablespace}">
        <column name="address" type="varchar(255)"/>
     </createTable>
   </changeSet>

然后在命令行定义表空间名称。如果你有多个,你可以提供多个 -D 选项

liquibase -Dtablespace='tablespaceQA' update