2012-12-04 31 views
0

我有兩個表,tblapplication和tblapplicationhistory。 tblapplicationhistory是對應用程序表中的應用程序狀態進行的每個更改的歸檔。應用程序表中的學生可以有許多應用程序。Oracle更新後觸發不正確執行

當應用程序狀態變爲「提供接受」時,狀態ID被設置爲7.然後這反映在應用程序和應用程序歷史表中。此時,給定學生的所有其他申請狀態應設置爲8,「拒絕優惠」。

create or replace 
TRIGGER trg_declineapplications AFTER UPDATE ON tblapplicationhistory FOR EACH ROW 

BEGIN 
    IF :NEW.statusid_fk_nn = 7 THEN 
     UPDATE tblapplication 
     SET statusid_fk_nn = 8 
     WHERE studentrecordnumber_fk_nn = (SELECT studentrecordnumber_fk_nn 
              FROM tblapplication 
              WHERE applicationid_pk_nn = :NEW.applicationid_fk_nn 
             ) 
     AND applicationid_pk_nn != :NEW.applicationid_fk_nn; 
    END IF; 
END; 

觸發編譯沒有錯誤,並觸發激活不返回任何SQL錯誤,但對在申請表中的任何行不計算。在這種情況下,觸發器的邏輯必須存在錯誤,但我沒有看到它。

我的想法是,如果tblapplicationhistory中更新的行包含statusID 7,則應用程序表上執行更新,爲屬於除接受的應用程序之外的同一學生的每個應用程序將statusID設置爲8。

如果需要,可以提供更多信息。

表定義:

tblapplication: 
applicationid_pk_nn 
studentrecordnumber_fk_nn 
jobid_fk_nn 
statusid_fk_nn 

tblapplicationhistory: 
applicationid_fk_nn 
statusid_fk_nn 
datechanged_nn 
applicationhistoryid_pk_nn 

在tblapplication,主鍵是applicationid_pk_nn和所有其他領域外鍵。

在tblapplicationhistory中,applicationhistoryid_pk_nn是主鍵。使用applicationid_fk_nn從tblapplication中獲取statusid_fk_nn。

+3

如果'tblApplicationHistory'是每一個變化的'tblApplication',爲什麼對行所作的存檔'tblApplicationHistory'上會不會有'UPDATE'? 'tblApplicationHistory'不會被'INSERT'操作完全填充嗎?如果是這樣,'AFTER UPDATE'觸發器永遠不會觸發。 –

+0

非常好的一點。正如你所看到的我是一個初學者。觸發器的其餘部分看起來是否正確? –

+0

好吧,它看起來像有效的語法。在架構上,在修改基錶的歷史表上有一個觸發器(據推測,它會在歷史表中生成許多新行)似乎相當古怪。比如說,一個存儲過程API,這種邏輯通常在觸發器之外更有意義。 –

回答

1

觸發器方法看起來不太健壯。

怎麼樣,當你更新記錄設置應用程序接受/拒絕你做這樣的事情:

update my_table 
set status_id = case my_table.application_id 
         when application_id_for_accepted_offer then 7 
         else 8 
        end 
where student_id = student_id_to_update; 
+0

謝謝你,我完全忘記了使用案例。我會upvote,如果我可以:) –