oracle - 良好做法 - 使用 LiquiBase 包

标签 oracle liquibase

我们更改了我们的部署脚本以使用 liquibase 但现在我开始遇到一些问题,我想发表其他意见或者可能知道一个合适的解决方案。

我们使用的是 Oracle,我们有很多遗留代码:包、函数、过程、触发器..(如您所见,数据库中有很多逻辑)。

我们使用以下结构:

.
..
packages
functions
triggers
baseline 
S1301
S1302
S1312
xxx-changelog.xml

xx-changelog.xml 如下所示:

<include file="baseline/xxx-baseline-changelog.xml" relativeToChangelogFile="true" />

<!- Sprint change logs -->
<include file="S1304/xxx-s1304-changelog.xml" relativeToChangelogFile="true" />
<include file="S1308/xxx-s1308-changelog.xml" relativeToChangelogFile="true"/>
<include file="S1309/xxx-s1309-changelog.xml" relativeToChangelogFile="true"/>  
<include file="S1310/xxx-s1310-changelog.xml" relativeToChangelogFile="true"/>
<include file="S1311/xxx-s1311-changelog.xml" relativeToChangelogFile="true"/>

因为我们不想每次都在新文件夹中复制文件,我们指向同一个文件,并且因为我们正在更改内容,所以我们必须设置 runOnChange 属性,因为如果我们不这样做,它将失败。

问题是我们在敏捷中工作,每 3 周我们交付新代码,有时我们必须在一个冲刺中更改一个包,而我们必须在下一个冲刺中更改相同的包。

我的情况是:

1) 如果我们为每个 sprint 添加一个新的 changeSet,指向 packages 文件夹中的文件,例如使用 runOnchange,这将执行所有指向这些文件的 changeSet,因为内容不同,并且是 runOnchange (这不是我想要的)。但这是了解冲刺中的变化并对此进行跟踪的唯一方法。

xxx-s1311-changelog.xml

<changeSet id="XXX_SEND_TO_PP_PCK_S1311" author="e-ballo" runOnChange="true">
     <sqlFile path="../packages/XXX_SEND_TO_PP_PCK.pkb" splitStatements="false" relativeToChangelogFile="true"/>
</changeSet>

xxx-s1312-changelog.xml

<changeSet id="XXX_SEND_TO_PP_PCK_S1312" author="e-ballo" runOnChange="true">
     <sqlFile path="../packages/XXX_SEND_TO_PP_PCK.pkb" splitStatements="false" relativeToChangelogFile="true"/>
</changeSet>

2) 如果我们只为包创建一个文件 (packages-changelog.xml) 并且我们为包添加 changeSet 属性为 runOnChange,每次文件更改时都会运行,但您无法了解我们何时更改它。

也许最好的解决方案是将文件(包)复制到 sprint 的文件夹中,但我想在 SVN 中保留文件的历史记录,同时也清楚地了解 sprint 中的新变化更改日志。

我的问题:

如果有什么方法可以禁用 liquibase 中的 hashmap,你们知道吗?然后我将能够在每个 sprint 中添加它并有一个跟踪..如果 id 已经在数据库中不应该再次执行,对吗?

提前致谢

最佳答案

我知道这是旧的,为将来遇到它的任何人回答。

不,校验和在 Liquibase 的工作方式中根深蒂固,runOnChange 是执行此操作的正确方法。问题是你应该更细化你的变更日志。请记住:变更日志可以包含其他变更日志。

if we add a new changeSet for each sprint, pointing to the file in packages folder, for example with runOnchange, this will execute all the changeSet that are pointing to these file because the content is diferent, and is runOnchange (is not what i want). But is the only way to know the changes in the sprint, and have track of this.

你的项目结构很好,你只需要更进一步。制作实际的变更日志以安装包/函数/触发器/等这些目录的一部分,因为一旦写入它们可能永远不需要更改:

.
├── functions
│   ├── my_function_changelog.xml
│   └── sql
│       └── my_function.sql
├── packages
│   ├── my_package_changelog.xml
│   └── sql
│       └── my_package.sql
└── triggers
    ├── my_trigger_changelog.xml
    └── sql
        └── my_trigger.sql

然后,当您需要在您的发布中包含一个时,您可以包含该静态变更日志,而不是每次都定义一个新的变更集(正如您所发现的,这会使 Liquibase 感到困惑):

<include file="../packages/my_package_changelog.xml" relativeToChangelogFile="true" />

现在您可以跟踪每个冲刺中所做的事情,而不会意外地重新安装您不想安装的包。

关于oracle - 良好做法 - 使用 LiquiBase 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713971/

相关文章:

sql - 根据日期范围将数据填充到表中

java - 是否有类似于 .NET Microsoft Enterprise Library 的 Java 框架/程序集?

java - 在Dropwizard的数据库迁移包装器中,是否可以基于上下文进行迁移?

sql - 总是运行带有 failOnError ="false"的 Liquibase changeSet?

liquibase - Liquibase 或 Flyway 可以处理多个非线性版本控制场景吗?

c# - 将 nlog 与 Entity Framework 一起使用时,值不在预期范围内

mysql - 选择具有一个最大日期的两个不同列

oracle - 与 Number 相比,Pls_integer 值需要 "less"存储空间。如何验证?

liquibase - 如何在 Liquibase 中创建具有外键约束的表?

mysql - Liquibase 数据库重构