0

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

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 表相同。那么如何将这些已删除的记录保存在那里呢?

4

1 回答 1

3

如果您使用的是支持它的数据库,则可以使用BEFORE DELETE触发器。但是,根据对Absolute Database 文档的搜索,不支持CREATE TRIGGER并且triggers在同一站点上进行搜索也不会返回任何关于它们的信息。

缺乏触发器支持可能只会让您INSERT先执行另一个表,然后再DELETE从您的LOG表中执行。再次根据文档,查询可以用作 an 的数据源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;

您确实应该将整个操作包装在事务中(此处为 Delphi 示例),以便万一出现故障,INSERT并且DELETE可以撤消。(例如,如果INSERT将行放入LOG_ARCHIVE文件中,但由于DELETE某种原因失败,则无法删除插入到存档文件中的行。)可以在执行INSERT回滚之前启动事务如果它(或者DELETE如果它们都成功则失败或提交。

于 2013-03-24T02:07:09.647 回答