【问题标题】:how to convert a mutating trigger to a stored procedure如何将变异触发器转换为存储过程
【发布时间】:2023-01-11 16:25:39
【问题描述】:

我有以下触发器:

CREATE OR REPLACE TRIGGER planning_trig BEFORE
    UPDATE OF planned_remediation_date ON evergreen
    FOR EACH ROW
DECLARE
    planned_remediation_date DATE;
BEGIN
    SELECT
         planned_remediation_date
    INTO planned_remediation_date
    FROM
        evergreen
    WHERE
            hostname = :new.hostname
        AND instance_name = :new.instance_name
        AND product_home = :new.product_home
        AND it_service = :new.it_service
        AND sw_name = :new.sw_name;
    IF
        planned_remediation_date IS NOT NULL
        AND planned_remediation_date > trunc(sysdate)
    THEN
        UPDATE evergreen
        SET
            planning_status = 'planned';
    ELSE
        UPDATE evergreen
        SET
            planning_status = 'overdue';
    END IF;
END;
/

更新表中的行后 evergreen 我收到此错误:

ORA-04091: table PTR.EVERGREEN is mutating, trigger/function may not see it

我相信错误来自于我正在尝试更新触发触发器的同一张表。我读到在同一个表中处理更新的最佳方法是存储过程,但我对 oracle 很陌生,不知道如何实现。我听说的另一种可能性是AUTONOMOUS_TRANSACTION Pragma,但不确定这是否适用于我的情况。

更多背景信息,基础表有一个复合唯一键 (hostname,instance_name,product_home,it_service,sw_name),我想根据 planned_remediation_date 的更新值更新此表上名为 planning_status 的现有列。如果该值不为空且大于今天,则更新为 planned else overdue

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    表达式 planned_remediation_date IS NOT NULL 是多余的。当planned_remediation_date 为 NULL 时,planned_remediation_date > trunc(sysdate) 永远不会为 TRUE。

    您的触发器可以写得更短:

    CREATE OR REPLACE TRIGGER planning_trig 
        BEFORE UPDATE OF planned_remediation_date ON evergreen
        FOR EACH ROW
    BEGIN
        IF :new.planned_remediation_date > trunc(sysdate) THEN
           :new.planning_status := 'planned';
        ELSE
           :new.planning_status := 'overdue';
        END IF;
    END;
    /
    

    我猜您想修改更新后的行,而不是该表中的其他行。否则你需要一个程序或一个COMPOUND trigger

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2014-06-10
      • 2015-02-05
      • 1970-01-01
      • 2020-10-12
      • 2020-09-28
      • 2018-01-18
      相关资源
      最近更新 更多