я получаю эти ошибки при обновлении таблицыOracle Mutating таблица - триггер ошибки
ORA-04091: table HAMZA.EXPEDITION is mutating, trigger/function may not see it
ORA-06512: at "HAMZA.LIVRAISONFINIE", line 6
ORA-04088: error during execution of trigger 'HAMZA.LIVRAISONFINIE'
Ниже приведены таблицы, используемые
экспедиция (Id_Expedition, Date_Livraison);
Командир (Numero_Commande, ..);
cmdalivrer (id_cmd, id_etape);
CREATE OR REPLACE TRIGGER livraisonfinie
AFTER UPDATE ON Expedition
FOR EACH ROW
DECLARE
date_liv Expedition.date_livraison%type;
BEGIN
SELECT :NEW.date_livraison INTO date_liv from Expedition;
IF date_liv <> TO_DATE('00/00/00 00:00:00', 'yyyy/mm/dd hh24:mi:ss')
THEN
INSERT INTO Commande (etat) VALUES ('livree');
DELETE FROM cmdalivrer CMD WHERE :NEW.numero_commande=CMD.id_cmd;
DELETE FROM Expedition E WHERE E.date_livraison = date_liv;
END IF ;
END;
/
Спасибо за помощь.
Какова логика, которую вы пытаетесь реализовать? Почему вы выбираете из 'экспедиции' в первую очередь, а не просто присваиваете': new.date_livraison' 'date_liv', если есть причина иметь локальную переменную вообще? Что делает 'delete' из' экспедиции', пытающегося сделать? Триггер не может удалить строку, которая находится в процессе вставки. И сравнение с годом 0 даты кажется маловероятным. Это не похоже на то, что вы хотите выполнить, должно быть сделано с помощью такого триггера. –
Его как база данных delivry. Когда пользователь обновляет атрибут date_livraison, это значит, что он получает delivred, поэтому я хочу удалить строки в cmdalivrer, где numero_livraison строки обновляется = cmdalivrer.id_cmd. затем удалите строку, которая просто загружается в Expedition (вот почему я использовал триггер AFTER. Наконец, если проверка, если атрибут date_livraison содержит 00-00-00 00:00:00 (это означает, что команда еще не получила delvred). (спасибо и извините за мой плохой английский) –
Триггер на столе не сможет удалить строку, которая находится в процессе вставки (которая по-прежнему верна, является ли это триггером до или после строки). чем пользователь вставляет строку в таблицу, которая сразу же удаляется, не было бы более разумным для пользователя вызывать процедуру, которая просто удаляется из таблицы 'cmdaliverer'? –