在aviarc工作流程中,如何从数据库中删除数据集中的行?

时间:2012-09-14 01:40:40

标签: aviarc

这是我正在使用的工作流程。

<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数据集不会保留已删除的行操作,因此我无法识别从数据集中删除的行。

2 个答案:

答案 0 :(得分:3)

针对这种情况的最简单的解决方案是将标记删除的行筛选到单独的数据集中。不幸的是,仅使用内置命令时这有点长。

<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> 

另一种解决方案是在运行插入/更新的同时进行历史记录,例如在操作中运行多个语句,或者设置插入/更新触发器(如果可用的话)。

答案 1 :(得分:1)

我认为在Tristan的答案中,您不一定需要提交“deleted-foo”数据集,因为您没有使用任何提交标记标记其行。

更进一步 - 我个人会将这些操作转移到数据摘录工具的提前和提交后工作流程中。您将捕获预提交工作流中标记为已删除的所有行,然后从foo数据集中删除行并在提交后工作流中填充历史数据集。