0

次のような(条件に基づいて)1つのテーブルからレコードを削除しています:

procedure TForm3.AdvGlowButton1Click(Sender: TObject);
begin
 if MessageDlg('Are you sure???' , mtConfirmation, [mbYes, mbNo], 0) = mrNo then
    Abort else
Case cxRadioGroup1.ItemIndex of
0: begin
with Form1.ABSQuery1 do begin
Form1.ABSQuery1.Close;
Form1.ABSQuery1.SQL.Clear;
Form1.ABSQuery1.SQL.Text :='delete from LOG where status="YES" ';
Form1.ABSQuery1.ExecSQL;
Form1.ABSTable1.Refresh;
end;
end;
End;
end;

ただし、これらの削除されたレコードを、LOG テーブルと同じ目的 (LOG_ARCHIVE) のために作成した別のテーブルに保存したいと考えています。では、これらの削除されたレコードをそこに保存するにはどうすればよいですか?

4

1 に答える 1

3

それをサポートするデータベースを使用している場合は、BEFORE DELETEトリガーを使用できます。ただし、Absolute Databaseのドキュメントでの検索によると、サポートはなく、同じサイトでCREATE TRIGGER検索しても、それらについては何も返されません。triggers

トリガーのサポートがないため、テーブルからINSERT実行する前に、最初に他のテーブルに対して実行する必要があります。再びドキュメントによると、クエリはのデータのソースとして使用できます(リンクされたページの2番目の例を参照してください)。これは、次のようなことができることを意味します。DELETELOGINSERT

ABSQuery1.SQL.Text := 'insert into LOG_ARCHIVE'#13 +
                           '(select * from LOG where status = ''Yes'')';
ABSQuery1.SQL.ExecSQL;
ABSQuery1.Close;

{ 
  No need to use SQL.Clear here. Setting the SQL.Text replaces
  what was there before with new text.
}
ABSQuery1.SQL.Text :='delete from LOG where status=''YES''';
ABSQuery1.ExecSQL;

実際には、この操作全体をトランザクションでラップする必要があります(ここではDelphiの例)。これにより、何かが失敗した場合に、INSERTDELETEを元に戻すことができます。(たとえば、ファイルにINSERT行を配置する作業が、何らかの理由で失敗した場合、アーカイブファイルに挿入した行を削除する方法はありません。)実行する前にトランザクションを開始して、ロールバックすることができます。それが成功した場合(または、両方が成功した場合は失敗またはコミットされます。LOG_ARCHIVEDELETEINSERTDELETE

于 2013-03-24T02:07:09.647 に答える