在oracle过程中删除特定行之前进行备份

eblbsuwk  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(105)

我必须创建一个删除一些行的过程,查询如下:

DELETE Car
 WHERE Vin IN (
               SELECT Vin
                 FROM CarDetails
                WHERE Id IN (JH4KA826000000000, ...)
              )

但在它将被删除之前,我想有这些特定行的备份。我将无法访问数据库,以手动导出它由sql开发人员(插入到)。如果需要的话,我如何通过程序来轻松恢复?
在我的情况下,我不需要整个表的副本。只有这些被删除的行。

ubof19bj

ubof19bj1#

有几个选择。如果你只想备份被特定过程删除的行,但不关心行是否以其他方式删除,那么我只备份过程本身中的行:

INSERT INTO car_backup (vin, column1, column2,...) 
  SELECT vin, column1, column2,...
    FROM car
   WHERE Vin IN (SELECT Vin
              FROM CarDetails
              WHERE Id IN (JH4KA826000000000, ...)
              );
DELETE FROM Car
WHERE Vin IN (SELECT Vin
              FROM CarDetails
              WHERE Id IN (JH4KA826000000000, ...)
              )

但是,如果要备份删除的每一行,请考虑使用BEFORE DELETE触发器:

CREATE OR REPLACE TRIGGER car_bd
BEFORE DELETE
   ON car
   FOR EACH ROW
DECLARE
BEGIN
  INSERT INTO car_backup (vin, column1, column2,...) 
    VALUES (:old.vin, :old.column1, :old.column2,...);
END;

/

另一个非常干净的解决方案是使用"In-Database Archiving",从12.1开始就可以使用了。这将允许您在行上设置一个标志,使该行不可见。因此,对于所有查询,该行似乎已被删除,但它仍保留在表中,并且可以在需要时显示/取消删除。
选择最符合您需求的解决方案。

相关问题