良好做法 - 使用LiquiBase包

时间:2013-09-10 08:24:27

标签: 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 属性,因为如果我们不这样做会失败。

问题是我们正在使用Agile,每隔3周我们会提供新代码,有时我们必须在一个sprint中更改一个包,我们必须在下一个包中更改相同的包。

我的情况是:

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 ),并且我们为包含属性runOnChange的包添加了changeSet,那么每次文件更改时都会运行,但是你知道我们什么时候改变它就没有可见性。

也许最好的解决方案是将文件(包)复制到sprint的文件夹中,但是我希望将文件的历史记录保存在SVN中,并且清楚地了解sprint中的新更改。更改日志。

我的问题:

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

提前致谢,

1 个答案:

答案 0 :(得分:1)

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

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

  

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

您的项目结构很好,您只需要更进一步。制作实际的更改日志以将软件包/ function / trigger / etc安装为这些目录的一部分,因为无论如何它们都可能永远不需要更改:

.
├── 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所做的事情,而不会意外地重新安装您不想要的软件包。