在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数据代理的删除操作中添加一个后工作流,如下所示:

<workflow>
     <delete-row dataset="{$context.commit-dataset-name}"/>
</workflow>

但是,当调用删除操作时,我会遇到一个错误。

此外,在第一次原子提交之后,foo数据集不会保留已删除的行操作,因此我无法确定要从数据集中删除哪些行。

对于这种情况,最简单的解决方案是将标记的已删除行筛选到一个单独的数据集中。不幸的是,当只使用内置命令时,这会有点长。
<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> 

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

我认为在Tristan的回答中,您不一定需要提交"已删除的foo"数据集,因为您没有用任何提交标志标记其行。

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

最新更新