0

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

<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脚本中定义的表不是在用户的表空间下创建的。相反,它使用属性文件中的用户名作为表空间名称,因此面临由于缺少表空间而无法创建表的问题,这是一个明显的错误。因此,要创建 DATABSEACHANGELOG 和 DATABASECHANGELOGLOCK 表,我必须在属性文件中添加属性“databaseChangeLogTablespaceName”,但没有创建表和索引。

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

4

2 回答 2

0

我不记得 sql 文件究竟是如何工作的,但如果我没记错的话,替换属性也应该在 sql 文件中工作。因此,在您的 sqlfile 中,您可以执行以下操作:

create index somespecificindex tablespace ${indexTablespace} ...

然后您可以定义一些将被替换的属性。所以例如像这样的东西

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

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

于 2021-03-13T20:44:24.013 回答
0

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

从此链接上的 liquibase 文档中,您可以在创建表时指定表空间名称。相同的示例如下:(在 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文件中配置的值或运行 liquibase update 命令时传递的值(liquibase -Dtablespace='tablespaceQA' update)

(例如在更改日志开始时声明属性)

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

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

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

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

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

干杯!!

于 2021-03-15T05:16:40.623 回答