我正在开发一个系统来跟踪项目的历史。有3个主表:项目,任务和客户,然后是3个历史表。我在项目表上有以下触发器。oracle和创建历史
CREATE OR REPLACE TRIGGER mySchema.trg_projectHistory
BEFORE UPDATE OR DELETE
ON mySchema.projects REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
declare tmpVersion number;
BEGIN
select myPackage.GETPROJECTVERSION(:OLD.project_ID) into tmpVersion from dual;
INSERT INTO mySchema.projectHistiry
(project_ID, ..., version)
VALUES
(:OLD.project_ID,
...
tmpVersion
);
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END ;
/
我有三个触发器为我的每个表(项目,任务,客户端)。
以下是挑战:并非所有事情都在同一时间发生变化。例如,有人可以更新某个任务的成本。在这种情况下,只有一个触发器触发,并且我有一个插入。即使在项目和客户表中没有任何更改,我想一次将一条记录插入到3个历史记录表中。
另外,如果有人更改项目的end_date,成本,并说选择另一个客户端会怎么样。现在,我有三个触发器同时触发。只有在这种情况下,我才会在我的三张历史记录表中插入一条记录。 (我想要的)
如果我修改触发器插入到第一个示例的3个表中,那么当第二个示例发生时,我将有9个插入。
不太清楚如何解决这个问题。任何帮助?
是真实的,但是我面临的另一个挑战是现在有任务历史记录,但没有项目/客户历史记录。我必须找出一个连接:如果x_history中没有任何内容,请从x获取它。 – CFNinja 2010-08-09 19:10:56
那么,在这种情况下,你可以尝试在历史表中同时使用活动版本和非活动版本吗?这种方法的缺点是,在每次更新操作表中的当前记录后,您需要更新历史记录中的最新记录,然后插入新记录。 – 2010-08-09 19:41:03
历史记录表仅包含非活动版本。对任何主表的任何更新/删除都将创建不活动的历史版本。 我如何做后者? 如果x_history中没有任何内容,请从x获取它。 – CFNinja 2010-08-09 20:45:56