问题描述
我正在使用 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 上的评论。
干杯!!