【发布时间】: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。
【问题讨论】: