我有两个表,tblapplication和tblapplicationhistory。 tblapplicationhistory是对应用程序表中应用程序状态所做的每个更改的归档。应用程序表中的学生可以有很多应用程序。
当应用程序状态变为“Offer accepted”时,状态ID将设置为7.然后,这将反映在application和applicationhistory表中。此时,给定学生的所有其他申请状态应设置为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。
答案 0 :(得分: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;