在插入触发器后使用新插入的数据更新列

时间:2019-11-12 07:49:27

标签: oracle plsql database-trigger

我有一个“ Employee”表,该表包含名为“ E#”和“ TOTAL_BUDGET”的列。

我有一个“ WorkOn”表,其中显示了员工正在处理的所有P#

我有一个“ Project”表,该表包含名为“ Budget”,“ 'E#'”和“ P#”的列。

我想做的是,每当将一个新项目分配给一名员工(例如,将新数据插入到WorkOn中)时,行触发器将更新 TOTAL_BUDGET 列,其中预算分配给员工的所有项目

例如,如果当前已将员工1 分配给预算分别为 10K,15K和5K 的项目 1,2,3 将预算为 5K 的员工 1 的新项目 4 插入 WorkOn 表中,行触发器将更新员工 1 35K

但是,我的行触发器当前所做的是,在更新TOTAL_BUDGET列之前,它总是排除新分配的项目预算(使用上面的示例, TOTAL_BUDGET 仅为 30K >)。

这是我到目前为止所做的:

CREATE OR REPLACE TRIGGER update_budget
           BEFORE INSERT on WorkOn
            FOR EACH ROW

DECLARE
       budget number;
BEGIN
        SELECT SUM(Project.Budget) INTO budget
        FROM WorkOn 
        INNER JOIN Project 
        ON WorkOn.P# = Project.P# 
        WHERE E# = :NEW.E#;        

        UPDATE Employee
        SET Total_Budget = budget WHERE E# = :NEW.E#;
   END;

我尝试将BEFORE INSERT更改为AFTER INSERT,但是意识到我在修改变异表时无法执行此操作。可以使用行触发器来完成此任务吗?

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

我认为您忘记了在更新员工表之前将新预算添加到当前预算中:

ngOnInit() {
  let that = this;
  setTimeout(() => {
    that.loading = false;
    console.log(that.loading);
  }, 3000);
}

答案 1 :(得分:1)

由于从要插入触发器主体中的表中进行选择,所以您得到了变异表错误。您应该可以使用复合触发器来实现所需的功能。史蒂文·弗伊尔斯坦(Steven feuerstein)写了出色的blog,解释了如何使用触发器解决此类问题。