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

问题描述

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

function getrating(watchList){
  // Add your code below this line
  var count = 0;
  var sum = 0;
  var averagerating = watchList.reduce(function (obj)  {
    if (obj.Director === "Christopher Nolan") {
      count++;
      
      sum =  sum + parseFloat(obj.imdbrating);
      
    }
    
    return sum;
  },0) / count;
  // Add your code above this line
  return averagerating;
}

Liquibase.properties 文件如下所示:-

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

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

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

解决方法

我不记得 sql 文件究竟是如何工作的,但如果我没有记错,那么替换属性也应该在 sql 文件中起作用。所以在你的 sqlfile 你可以做这样的事情:

create index somespecificindex tablespace ${indexTablespace} ...

然后您可以定义一些属性为 substituted。所以例如这样的事情

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

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

,

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

this link 上的 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 更新命令时传递的值 (liquibase -Dtablespace='tablespaceQA' update)

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

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

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

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

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

有关详细信息,请访问 this post 上的评论。

干杯!!