使用表来存储已删除的行

时间:2013-11-22 14:43:38

标签: sql oracle triggers

在我的Oracle DB中,我有一个名为tableA的表,其中一个应用程序写入数据。我的程序从tableA读取,当我处理数据时,我删除它们。问题是我想记录我处理的每个数据,并且我不能将它们保存在tableA中,因为我无法控制应用程序A,如果我将处理后的数据保存在该表上,它可能无效我创建了一个与tableA相同的表,名为tableB,我把这个触发器放在tableA上:

create or replace 
trigger tableA_delete_trigger
BEFORE DELETE ON tableA
FOR EACH ROW 
BEGIN
  INSERT INTO tableB
  ( a,
  b,
  c,
  )
  VALUES
  ( :old.a,
  :old.b,
  :old.c,
  sysdate);
END;

这个系统工作得很好,真正的问题是当我需要改变tableA中的某些内容时,我必须手动复制tableB中的相同修改,如果我添加/删除coloumn,我必须更新触发器。

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

另一种方法可能是重命名TableA并为应用程序A创建名为TableA的视图以供使用。然后,您可以通过任何看似合适的方式逻辑删除行,并仅在视图中显示未删除的行。

如果表格结构发生变化,您仍然需要修改视图,但至少您不必担心触发器。

答案 1 :(得分:0)

改变触发器怎么样:

CREATE OR REPLACE TRIGGER ddl_trigger AFTER ALTER ON schema
DECLARE
    cmd VARCHAR2(32000);
BEGIN
    SELECT
        upper(sql_text)
    INTO
        cmd
    FROM
        v$open_cursor
    WHERE
        upper(sql_text) LIKE 'ALTER TABLE TABLEA%' ;
    SELECT
        REPLACE(cmd, 'TABLEA', 'TABLEB')
    INTO
        cmd
    FROM
        dual;
    EXECUTE IMMEDIATE cmd;
END;

不确定因为递归会起作用。