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

Delphi 将删除的记录保存到另一个表,delphi,delphi-2010,delphi-xe,Delphi,Delphi 2010,Delphi Xe,我正在从一个表中删除记录(基于条件),如下所示: 但是,我想将这些已删除的记录保存在另一个表中,该表是我为此目的创建的(LOG_ARCHIVE),它与LOG表相同。那么我该如何保存这些被删除的记录呢 如果您使用的是支持它的数据库,则可以在DELETE触发器之前使用。但是,根据上的搜索,不支持CREATE TRIGGER,在同一站点上搜索triggers也不会返回任何关于它们的信息 缺少触发器支持可能只会让您先在另一个表中执行插入,然后再从日志表中执行删除。根据,查询可以用作插入的数据源(参见链接

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


但是,我想将这些已删除的记录保存在另一个表中,该表是我为此目的创建的(LOG_ARCHIVE),它与LOG表相同。那么我该如何保存这些被删除的记录呢

如果您使用的是支持它的数据库,则可以在DELETE触发器之前使用
。但是,根据上的搜索,不支持
CREATE TRIGGER
,在同一站点上搜索
triggers
也不会返回任何关于它们的信息

缺少触发器支持可能只会让您先在另一个表中执行
插入
,然后再从
日志
表中执行
删除
。根据,查询可以用作
插入的数据源(参见链接页面上的第二个示例)。这意味着您可以执行以下操作:

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;

您确实应该将整个操作包装在一个()中,以便在某些操作失败时,
INSERT
DELETE
都可以撤消。(例如,如果
插入
可以将行放入
日志存档
文件中,但是
删除
由于某种原因失败,则无法删除插入存档文件的行。)可以在执行
插入
之前启动事务,如果执行该操作,则回滚(或者,
DELETE
失败或提交,如果两者都成功。

如果您使用的是支持它的数据库,则可以在DELETE
触发器之前使用
。但是,根据上的搜索,不支持
CREATE trigger
,在同一站点上搜索
triggers
,不会返回任何关于我也是

由于缺少触发器支持,您可能需要先在另一个表中执行
INSERT
,然后再从
LOG
表中执行
DELETE
。根据,可以将查询用作
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;

您确实应该将整个操作包装在一个()中,以便在某些操作失败时,
INSERT
DELETE
都可以撤消。(例如,如果
插入
可以将行放入
日志存档
文件中,但是
删除
由于某种原因失败,则无法删除插入存档文件的行。)可以在执行
插入
之前启动事务,如果执行该操作,则回滚(或者
DELETE
失败或提交,如果两者都成功。

使用触发器,Luke。@Abelisto:根据绝对数据库,没有触发器支持(至少搜索
triggers
create trigger
都不会返回任何关于它们的信息)@KenWhite:对不起,这是因为我的粗心。我读的不是“ABSQuery”,而是“ADOQuery”:|使用触发器,卢克。@Abelisto:根据绝对数据库,没有触发器支持(至少搜索
触发器
创建触发器
都不会返回任何关于它们的信息)@KenWhite:对不起,这是因为我的粗心。我读的不是“ABSQuery”,而是“ADOQuery”:|+1可能是投票人不同意(status=“YES”是无效的SQL语法)。如果设计不好,status as as varchar可能会起作用。@bummi:谢谢.-)我想删除它,但我不认为这是错误的;我想不出任何SQL DB会允许这样做,即使是设计糟糕的VARCHAR。@KenWhite尝试使用MySQL进行一个简单的测试(作为任何测试之一)…使用“”是错误的valid@SirRufo:好的。这是一个例外(MySQL,这是不符合标准的一个很好的例子)。:-)我在他们的文档中没有看到任何迹象表明ABS支持这一点。不过,我将从我的问题中删除这一点,因为您确实向我展示了一个支持它的DBMS:-)在真实的DBs中,“YES”将为
SELECT
返回一个常量值,就像在MYTable中的'SELECT“Y”作为已婚,“愚蠢”作为智能一样“。例如,在SQL Server中,甚至在更小的Advantage数据库服务器中,它都不允许作为where语句的条件。MySQL是一个糟糕的示例。您确实删除了问题中的
SQL。Clear
)我仍然认为这项任务值得一提,因为如果
delete
语句失败,否则可能会导致数据损坏。+1可能是downvoter不同意(status=“YES”是无效的SQL语法)。如果设计不好,status as as varchar可能会起作用。@bummi:谢谢。-)我会删除它,但我不认为这是错的;我想不出任何SQL DB会允许这样做,即使是设计糟糕的VARCHAR。@KenWhite尝试使用MySQL进行一个简单的测试(作为任何一个测试之一)。。。使用“”是valid@SirRufo:好的。这是一个例外(MySQL,这是不符合标准的一个很好的例子)。:-)我看不到ABS在其文档中支持这一点的任何迹象。不过,我将从我的问题中删除这一点,因为您确实向我展示了一个支持它的DBMS。:-)在实际数据库中,“YES”将为
SELECT
返回一个常量值,如`选择“Y”表示已婚,“愚蠢”表示MYTable中的智能。例如,在SQL Server中,甚至在更小的Advantage数据库服务器中,它都不允许作为where语句的条件。MySQL是一个糟糕的例子。您确实删除了问题中最初的
SQL.Clear
),我仍然认为对于这个特定任务值得一提,因为如果
delete
语句失败,它可能会导致数据损坏。