0

我有两个表,tblapplication 和 tblapplicationhistory。tblapplicationhistory 是对应用程序表中应用程序状态所做的每次更改的存档。申请表中的一个学生可以有许多申请。

当应用程序状态变为“Offer accepted”时,状态 ID 设置为 7。这将反映在 application 和 applicationhistory 表中。此时,给定学生的所有其他申请状态应设置为 8,“Offer denied”。

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,那么会在 application 表上执行更新,将 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 是主键。statusid_fk_nn 使用 applicationid_fk_nn 从 tblapplication 中检索。

4

1 回答 1

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;
于 2012-12-05T12:32:08.563 回答