将删除的记录保存到另一个表

时间:2013-03-24 01:44:15

标签: delphi delphi-2010 delphi-xe

我正在删除一个表中的记录(基于条件),如:

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_ARCHIVE)中,该表与LOG表相同。那么如何在那里保存这些删除的记录呢?

1 个答案:

答案 0 :(得分:3)

如果您使用的是支持它的数据库,则可以使用BEFORE DELETE触发器。但是,根据对Absolute Database documentation的搜索,不支持CREATE TRIGGER,并且在同一网站上对triggers的搜索也不会返回任何内容。

缺少触发器支持可能只会让您在从INSERT表执行DELETE之前先在另一个表中执行LOG。根据{{​​3}},查询可以用作INSERT的数据源(请参阅链接页面上的第二个示例)。这意味着您可以执行以下操作:

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;

你真的应该将整个操作包装在documentation againtransaction)中,这样如果某些内容失败,INSERTDELETE都可以撤消。 (例如,如果INSERT将行放在LOG_ARCHIVE文件中,但DELETE由于某种原因失败,则无法删除插入到归档中的行可以在执行INSERT之前启动事务,如果它(或DELETE失败或提交,如果它们都成功则回滚。)

相关问题