我正在開發一個系統來跟蹤項目的歷史。有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