【问题标题】:Oracle after update trigger not performing correctly更新触发器后的 Oracle 无法正确执行
【发布时间】:2012-12-05 20:32:08
【问题描述】:

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

当应用程序状态变为“已接受报价”时,状态 ID 设置为 7。这会反映在应用程序和 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 中获取的。

【问题讨论】:

  • 如果tblApplicationHistory 是对tblApplication 中的行所做的每个更改的存档,为什么tblApplicationHistory 上会有UPDATEtblApplicationHistory 不会仅由 INSERT 操作填充吗?如果是这样,AFTER UPDATE 触发器将永远不会触发。
  • 非常好。如您所见,我是初学者。触发器的其余部分看起来正确吗?
  • 好吧,它看起来像有效的语法。在历史表上设置一个触发器来修改基表(大概会在历史表中生成许多新行),这在架构上似乎相当奇怪。在存储过程 API 等触发器之外,这种逻辑通常更有意义。
  • 除非这是一些家庭作业,否则您应该查看闪回档案来存储数据的历史记录。效率更高,人工工作更少。
  • 这是一个课程作业,所以我会研究这些想法,谢谢。

标签: oracle plsql triggers


【解决方案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;

【讨论】:

  • 谢谢你,我完全忘记了使用案例。如果可以的话,我会投票赞成:)
猜你喜欢
  • 2015-10-29
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2018-04-30
  • 1970-01-01
  • 2022-11-12
  • 2015-06-06
相关资源
最近更新 更多