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 に答える