2012-09-14 106 views
2

以下是我正在使用的工作流程。在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中。 我試着到後期製作工作流程添加到富databroker的刪除操作是這樣的:

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

但是我得到的時候刪除操作被稱爲一個錯誤。

此外,在第一次原子提交後,foo數據集不會保留已刪除的行操作,因此我無法確定從數據集中刪除哪些行。

+0

您在執行atomic-commit之前要執行哪些操作來刪除行? – savs

+0

我使用作爲屏幕上的操作。然後稍後在提交屏幕時保存數據集。刪除行時運行的查詢實際上並未從數據庫中刪除該行,它實際上會執行更新查詢並設置is-deleted標誌。 – Jim

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

一種替代的解決方案是通過運行在這些操作中的多個語句或通過具有插入/更新的同時做歷史記錄作爲插入/更新被運行,例如觸發設置,如果這些是可用。

+0

謝謝,我重新組織了工作流以利用觸發器。 – Jim

1

我認爲在Tristan的回答中,您不一定需要提交「deleted-foo」數據集,因爲您不用任何提交標記標記其行。

稍微進一步 - 我會親自將這些操作轉移到databroker的提交前和提交後工作流程中。您可以捕獲預提交工作流中標記爲已刪除的所有行,然後從foo數據集中刪除行並在提交後工作流中填充歷史數據集。

+0

+1用於工作流程之前/之後。此外,deleted-foo標記爲提交操作,請參閱第一個迭代器:'。 –

+0

嗯,好點。我確實忽略了它。然後在這種情況下,我沒有看到提交「foo」和「deleted-foo」數據集的要點。那個電話會不會嘗試進行完全相同的操作? – Vlad

+0

不,因爲這就是第二個數據集迭代器傳遞的用途:在複製出標記爲刪除的行之後,現在將它們從'foo'中刪除(由於無法在第一次傳遞時將其刪除刪除要迭代的數據集中的行)。結果是提交'deleted-foo'執行刪除操作,然後現在提交'foo'只執行創建/更新操作。 –