我们将部署脚本更改为使用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)如果我们为每个冲刺添加新的changeSet,指向包文件夹中的文件,例如使用runOnchange,这将执行指向这些文件的所有changeSet,因为内容是不同的,并且是runOnchange(不是我想要的)。但是是了解冲刺中的变化并跟踪这一点的唯一方法。
xxx-s1311-更新日志.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-更新日志.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,则每次文件更改时都会运行,但是您不知道我们何时更改它。
也许最好的解决方案是将文件(包)复制到冲刺的文件夹中,但我想将文件的历史记录保留在 SVN 中,并在更改日志中清楚地了解冲刺的新更改。
我的问题:
那么你们知道是否有某种方法可以在liquibase中禁用哈希图吗? 然后我将能够在每个冲刺中添加它并有一个轨道.. 如果 id 已经在数据库中,应该不会再次执行,对吗?
提前感谢,
这很旧,为将来遇到它的人负责。
不,校验和在Liquibase的工作方式中根深蒂固,runOnChange是执行此操作的正确方法。问题是您应该更精细地处理更改日志。请记住:更改日志可以包括其他更改日志。
如果我们为每个冲刺添加新的变更集,则指向 包文件夹,例如使用 runOnchange,这将执行所有 指向这些文件的更改集,因为内容是 不同,并且是运行更改(不是我想要的)。但是唯一的方法 了解冲刺中的变化,并跟踪这一点。
你的项目结构很好,你只需要更进一步。使安装包/函数/触发器/等的实际更改日志成为这些目录的一部分,因为它们在写入后可能永远不需要更改:
.
├── 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) 所执行的操作,而不会意外重新安装您不想安装的包。