这是我正在使用的工作流程。
<atomic-commit>
<dataset name="foo"/>
</atomic-commit>
<dataset-iterator dataset="foo">
<create-row dataset="hist-foo"/>
<mark-row-created dataset="hist-foo"/>
</dataset-iterator>因此,基本上,在更新数据集foo之后,我希望在另一个历史表中记录剩余的foo条目。但是,当我从foo表中删除行时,这些行仍然保留在数据集中,因此会被添加到hist-foo中。我尝试将后期工作流添加到foo databroker的删除操作中,如下所示:
<workflow>
<delete-row dataset="{$context.commit-dataset-name}"/>
</workflow>然而,当调用删除操作时,我得到了一个错误。
此外,在第一次原子提交之后,foo数据集不会保留已删除的行操作,因此我无法确定要从数据集中删除哪些行。
发布于 2012-09-14 12:49:08
对于这种情况,最简单的解决方案是将标记为已删除的行筛选到一个单独的数据集中。不幸的是,当只使用内置命令时,这有点长。
<dataset name="deleted-foo" databroker="..."/>
<dataset-iterator dataset="foo">
<if test="row-marked-deleted" value1="foo">
<then>
<create-row dataset="deleted-foo"/>
<copy-row from-dataset="foo" to-dataset="deleted-foo"/>
<mark-row-deleted dataset="deleted-foo"/>
</then>
</if>
</dataset-iterator>
<!-- Keeping in mind that you can't delete rows from a dataset
which is being iterated over. -->
<dataset-iterator dataset="deleted-foo">
<dataset-reset dataset="foo" no-current-row="y"/>
<!-- Assuming rows have a field 'id' which uniquely IDs them -->
<set-current-row-by-field dataset="foo" field="id" value="{$deleted-foo.id}"/>
<if test="dataset-has-current-row" value1="foo">
<then>
<delete-row dataset="foo"/>
</then>
</if>
</dataset-iterator>
<atomic-commit>
<dataset name="deleted-foo"/>
<dataset name="foo"/>
</atomic-commit>
<dataset-iterator dataset="foo">
<create-row dataset="hist-foo"/>
<mark-row-created dataset="hist-foo"/>
</dataset-iterator> 另一种解决方案是在运行插入/更新的同时记录历史记录,例如,通过在操作中运行多个语句,或者通过设置插入/更新触发器(如果这些触发器可用)。
发布于 2012-09-14 12:57:19
我认为在特里斯坦的回答中,你不一定需要提交"deleted-foo“数据集,因为你没有用任何commit标志来标记它的行。
更进一步-我个人会将这些操作移动到数据库记录器的提交前和提交后工作流中。您将捕获在预提交工作流中标记为已删除的所有行,然后从foo数据集中删除行,并在提交后工作流中填充历史数据集。
https://stackoverflow.com/questions/12417069
复制相似问题