2

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

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

4

2 回答 2

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> 

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

于 2012-09-14T04:49:08.443 回答
1

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

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

于 2012-09-14T04:57:18.560 回答