【发布时间】:2020-12-21 22:09:28
【问题描述】:
我有 2 个简单的表格:
CREATE TABLE ORDERS
( ORDER_KEY number(10) NOT NULL,
ORDER_NR varchar2(50) NOT NULL,
LAST_UPDATE DATE,
CONSTRAINT ORDERS_PK PRIMARY KEY (ORDER_KEY)
);
CREATE TABLE ORDER_POSITIONS
( ORDER_POS_KEY number(10) NOT NULL,
ORDER_POS_NR number(10),
ORDER_POS_DESCRIPTION varchar2(50),
ORDER_KEY NUMBER(10) NOT NULL,
CONSTRAINT ORDER_POSITIONS_PK PRIMARY KEY (ORDER_POS_KEY),
CONSTRAINT ORDERS_FK
FOREIGN KEY (ORDER_KEY)
REFERENCES ORDERS(ORDER_KEY)
ON DELETE CASCADE
);
在 ORDER_POSITIONS 表上,我创建了一个触发器,该触发器应在删除位置时更新 LAST_UPDATE 列。
CREATE OR REPLACE TRIGGER TGAUDIT_ORDER_POS
AFTER DELETE
ON ORDER_POSITIONS
FOR EACH ROW
DECLARE
BEGIN
UPDATE ORDERS O SET O.LAST_UPDATE = SYSDATE WHERE O.ORDER_KEY = :OLD.ORDER_KEY;
END;
如果我从表 ORDER_POSITION 中删除一个位置,一切正常(LAST_UPDATE 列已更新)。
但是,如果我想删除一个订单,它的所有仓位也会被删除(通过 CASCADE DELETE)。此时,表 ORDER_POSITIONS 上的触发器也被引发,它想要更新当前正在删除的表的列 - ORDERS。显然我得到了错误:ORA-04091 Table ORDERS is mutating.
有办法解决吗?
【问题讨论】:
-
向外键添加 DEFERRABLE 子句有帮助吗?
-
不,我遇到了同样的错误。