3

我们将部署脚本更改为使用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 周我们交付新代码,有时我们必须在一个 sprint 中更改一个包,并且我们必须在下一个 sprint 中更改相同的包。

我的情况是:

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

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)创建一个文件,并且我们使用属性runOnChange为包添加changeSet,每次文件更改时都会运行,但是你不知道什么时候我们改变它。

也许最好的解决方案是将文件(包)复制到 sprint 的文件夹中,但我想在 SVN 中保留文件的历史记录,并且在更改日志中对 sprint 的新更改有一个清晰的认识.

我的问题:

那么您知道伙计们是否有某种方法可以禁用 liquibase 中的哈希图?那么我将能够在每个 sprint 中添加它并有一个跟踪.. 如果 id 已经在数据库中,则不应再次执行,对吗?

提前致谢,

4

1 回答 1

1

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

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

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

你的项目结构很好,你只需要更进一步。将安装包/功能/触发器/等的实际更改日志作为这些目录的一部分,因为它们可能永远不需要在编写后进行更改:

.
├── 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" />

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

于 2015-05-04T12:41:14.490 回答