好吧,我有兩個表 - ORDERS和ORDERLINES - 它們基本上都有相同的問題,每個表都有觸發器來解決問題。問題在於,除了具有表級唯一性的PK之外,在名爲RECID的字段中,還有另一個字段RECNO,它需要與另一個字段相關而是唯一的。ORACLE在一次觸發中出現突變表錯誤,但不是另一次;爲什麼?
的表FK關係如下:
ORDERS.WAREHOUSEID > WAREHOUSES.CUSTOMERID > CUSTOMERS
和
ORDERSLINES.ORDERID > ORDERS
在ORDERS
和ORDERSLINES
我有BEFORE INSERT
觸發分配特定的領域唯一RECNO。
在ORDERS
,RECNO需要在CUSTOMERS
記錄的範圍內是唯一的。
在ORDERLINES
,RECNO需要在ORDERS
記錄的範圍內是唯一的。
ORDERS
上的觸發器工作得很好。當插入新訂單時,會爲其所屬的客戶分配下一個唯一RECNO。
在另一方面上ORDERLINES
觸發,這應該它屬於訂單中指定的下一個唯一RECNO,拋出可怕{ORA-04091:表ORDERLINES被突變,觸發/功能可能無法看到它}異常。
這裏是工作的觸發器:
CREATE OR REPLACE TRIGGER ORDERS_BI
BEFORE INSERT ON ORDERS
FOR EACH ROW
DECLARE
CUSTID WAREHOUSES.CUSTOMERID%TYPE;
BEGIN
SELECT MIN(CUSTOMERID) INTO CUSTID FROM WAREHOUSES
WHERE NVL(WARE_ID, '-') = NVL(:NEW.WAREHOUSEID, '-');
SELECT NVL(MAX(RECNO), 0) + 1
INTO :NEW.RECNO
FROM deploy.ORDERS O
LEFT JOIN deploy.WAREHOUSES W
ON NVL(W.REC, '-') = NVL(O.WAREHOUSEID, '-')
WHERE NVL(W.CUSTOMERID, '-') = NVL(CUSTID, '-');
END;
這裏是不會觸發不工作:
CREATE OR REPLACE TRIGGER ORDERLINES_BI
BEFORE INSERT ON ORDERLINES
FOR EACH ROW
DECLARE
nORDERID ORDERLINES.ORDERID%TYPE;
BEGIN
SELECT MIN(ORDERID) INTO nORDERID FROM REVORDERS
WHERE ORDERID = :NEW.ORDERID;
SELECT NVL(MAX(RECNO), 0) + 1
INTO :NEW.RECNO
FROM deploy.ORDERLINES L
LEFT JOIN deploy.ORDERS O
ON O.ORDERID = L.ORDERID
WHERE O.ORDERID = nORDERID;
END;
有人可以解釋爲什麼第一個作品,並第二個不? 有沒有什麼方法可以重新寫第二個讓它工作?
可能重複的[ORACLE更新後觸發器:解決ORA-04091突變表錯誤](http://stackoverflow.com/questions/6915325/oracle-after-update-trigger-solving-ora-04091-mutating-table -error),[Oracle觸發器 - 突變表的問題](http://stackoverflow.com/q/2138363) – Sathya
觸發表ORDERS上的ORDERS_BI不會從表ORDERS中讀取。表ORDERLINES上的ORDERLINES_BI觸發器從表ORDERLINES中讀取。 –
不重複。這個問題是關於什麼是基本的突變錯誤。我做了一個更正。請注意,IS工作的觸發器實際上是從目標表中選擇的。 ***這是我的困惑來自哪裏。 – eidylon