我有兩個表,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。
如果'tblApplicationHistory'是每一個變化的'tblApplication',爲什麼對行所作的存檔'tblApplicationHistory'上會不會有'UPDATE'? 'tblApplicationHistory'不會被'INSERT'操作完全填充嗎?如果是這樣,'AFTER UPDATE'觸發器永遠不會觸發。 –
非常好的一點。正如你所看到的我是一個初學者。觸發器的其餘部分看起來是否正確? –
好吧,它看起來像有效的語法。在架構上,在修改基錶的歷史表上有一個觸發器(據推測,它會在歷史表中生成許多新行)似乎相當古怪。比如說,一個存儲過程API,這種邏輯通常在觸發器之外更有意義。 –