在我的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,我必须更新触发器。
有更好的方法吗?
答案 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;
不确定因为递归会起作用。