如何使用 Liquibase 为表和索引使用不同的表空间

How to use different tablespaces for tables and indexes with Liquibase

我正在使用 Liquibase 4.0,并且正在使用 SQL 脚本执行数据库更改。所以我指向主更改日志中的 SQL 文件路径以通过 Liquibase 执行更改。 现在我需要将它们分开,因为我需要为 table 和索引提供不同的 table 空间。 因此,我试图在 Liquibase 中找到参数化选项,但找不到。 我的更改主更改日志如下所示:-

<changeSet author="sanjib" id="01_PR_001">
      <sqlFile dbms="oracle"
               endDelimiter=";"
               path="../scripts/PR_001/PR_001.sql"
               relativeToChangelogFile="true"
               splitStatements="true"
               stripComments="true"/>
      <rollback>
        <dropTable cascadeConstraints="true" tableName="PERSON"/>
      </rollback>
</changeSet>

Liquibase.properties 文件如下所示:-

driver: oracle.jdbc.OracleDriver
classpath: ojdbc6.jar
url: jdbc:oracle:thin:@localhost:1521/xe
databaseChangeLogTablespaceName:DATA
username: sanjib

现在的主要问题是SQL脚本中定义的table没有在用户的table空间下创建。相反,它使用属性文件中的用户名作为 table 空间名称,因此面临由于缺少 table 空间而无法创建 Table 的问题,这是一个明显的错误。因此,要创建 DATABSAECHANGELOG 和 DATABASECHANGELOCKLOCK table,我必须在属性文件中添加 属性 'databaseChangeLogTablespaceName',但未创建 table 和索引。

所以请帮助解决这 2 个问题。 如何通过 Liquibase 指向安装以使用用户的默认 tablespace 而不是使用用户名作为 tablespace。 我们可以使用 XML 文件中定义的上述设置参数化 Table 的 table 空间和索引的 table 空间吗?

我不记得 sql 文件是如何工作的,但如果我没记错的话,替换属性应该也适用于 sql 文件。所以在你的 sql 文件中你可以这样做:

create index somespecificindex tablespace ${indexTablespace} ...

然后你可以定义一些 属性 将是 substituted。所以例如像这样的东西

<property name="indexTablespace" value="indexes" />

当您执行迁移时,一切都应该正常。

要为 table 和索引使用不同的 table 空间,liquibase 属性 替换是实现它的方法。您可以声明 2 个 table 空间名称属性,一个用于 table,另一个用于索引。这些属性可以在 liquibase.properties 文件中或在您的变更日志本身的开头声明。然后,您可以使用语法 ${property_name} 访问它,并在提供 table 空间名称的地方使用它。

根据 this link 上的 liquibase 文档,您可以在创建 table 时指定 table 空间名称。相同的示例如下: (在 liquibase.properties 文件中声明 属性 的示例)

在您的 liquibase.properties 文件中添加 属性 : tablespace: tablespaceQA

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

属性 ${tablespace} 被替换为您的 liquibase.properties 文件中配置的值,或者您在 [= =63=] liquibase 更新命令 (liquibase -Dtablespace='tablespaceQA' update)

(在更新日志开头声明 属性 的示例)

对于索引,您可以在更新日志的开头(或在 liquibase.properties 文件中)声明 属性。

<property name="index_tablespace" value="INDEX" dbms="oracle"/>

现在,使用 createIndex 标签中的 属性 如下:

<createIndex indexName="idx_firstname" tableName="person" tablespace="${index_tablespace}"/>

有关更多详细信息,请访问 上的评论。

干杯!!