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

Updating a column with newly inserted data after insert trigger

我有一个“Employee”table,其中包含名为“E#”和“TOTAL_BUDGET”的列。

我有一个“WorkOn”table,它显示员工正在处理的所有 P#

我有一个“Project”table,其中包含名为“Budget”、'E#' 和“P#”的列。

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

例如,如果 员工 1 当前分配给预算 10K 的项目 1,2,3,分别为 15K 和 5K,在为员工 1[= 插入预算为 5K 的新项目 4 之后56=] 进入 WorkOn table,行触发器将为员工 1[= 更新 TOTAL_BUDGET 56=] 到 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,但意识到我无法执行此操作,因为我正在修改变异 table。是否可以使用行触发器来完成此任务?

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

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

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

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

        SELECT Project.Budget INTO project_budget
        FROM Project
        WHERE P# = :NEW.P#;

        current_total_budget := current_total_budget + project_budget;

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

您收到变异 table 错误,因为您是 select 来自要插入到触发器体内的 table。您应该可以使用复合触发器实现您想要的。 Steven feuerstein 写了一篇很棒的文章 blog 解释了如何使用触发器解决此类问题。