【问题标题】:Updating a column with newly inserted data after insert trigger插入触发器后使用新插入的数据更新列
【发布时间】:2019-11-12 18:12:34
【问题描述】:

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

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

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

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

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

但是,我的行触发器目前所做的是它总是在更新 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 但意识到我无法做到这一点,因为我正在修改一个变异表。是否可以使用行触发器来完成此任务?

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

【问题讨论】:

    标签: oracle plsql database-trigger


    【解决方案1】:

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

    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;
    

    【讨论】:

      【解决方案2】:

      您收到 mutating table 错误,因为您是从要插入到触发器正文中的表中选择的。您应该可以使用复合触发器来实现您想要的。 Steven feuerstein 写了一篇出色的 blog 解释如何使用触发器解决此类问题。

      【讨论】:

        猜你喜欢
        • 2015-11-06
        • 1970-01-01
        • 2017-09-19
        • 2016-10-13
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        • 2014-07-02
        相关资源
        最近更新 更多