我正在删除一个表中的记录(基于条件),如:
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表相同。那么如何在那里保存这些删除的记录呢?
答案 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 again(transaction)中,这样如果某些内容失败,INSERT
和DELETE
都可以撤消。 (例如,如果INSERT
将行放在LOG_ARCHIVE
文件中,但DELETE
由于某种原因失败,则无法删除插入到归档中的行可以在执行INSERT
之前启动事务,如果它(或DELETE
失败或提交,如果它们都成功则回滚。)