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