2017-01-26 5 views
0

Вопрос: У меня есть следующий триггер, чтобы посмотреть мой конкретный столбец «CHANGED», если он обновлен до 1, я хотел бы, чтобы он обновил ту же строку и столбец «CHANGED_DATE» до текущего SYSDATE. По какой-то причине я продолжаю получать эту ошибку, любая помощь будет очень признательна.Проблема с выпуском Oracle update

Ошибка

UPDATE "SYSADM"."SHIP_CALENDAR" SET CHANGED = '1' WHERE ROWID = 'AABCxCAAEAAAKYEAAB' AND ORA_ROWSCN = '6165377066' 
ORA-04091: table SYSADM.SHIP_CALENDAR is mutating, trigger/function may not see it 
ORA-06512: at "SYSADM.SHIP_CALENDAR_CHANGED", line 5 
ORA-04088: error during execution of trigger 'SYSADM.SHIP_CALENDAR_CHANGED' 

Триггер

create or replace TRIGGER SHIP_CALENDAR_CHANGED 
AFTER UPDATE 
    OF CHANGED 
    ON SHIP_CALENDAR 
    REFERENCING OLD AS o NEW AS n 
    FOR EACH ROW 
DECLARE 
    BEGIN 
    -- UPDATE SHIP CALENDAR SET UPDATE_CHANGE TO SYSDATE IF CHANGED CHANGES 
    IF :n.CHANGED = '1' then 
     UPDATE SHIP_CALENDAR 
     SET CHANGED_DATE = SYSDATE 
     WHERE SHIPMENT_ID = :o.SHIPMENT_ID; 
    END IF; 
END; 

Таблица

ShipCalCols

+0

Вы пробовали поиск? Есть много ответов о проблемах с «мутирующим триггером» – Aleksej

ответ

3

Используйте before update триггера:

create or replace TRIGGER SHIP_CALENDAR_CHANGED 
BEFORE UPDATE 
    OF CHANGED 
    ON SHIP_CALENDAR 
    REFERENCING OLD AS o NEW AS n 
    FOR EACH ROW 
DECLARE 
    BEGIN 
    -- UPDATE SHIP CALENDAR SET UPDATE_CHANGE TO SYSDATE IF CHANGED CHANGES 
    IF :n.CHANGED = '1' then 
     :n.CHANGED_DATE := SYSDATE 
    END IF; 
END; 
+0

Удивительное спасибо! @Gordon Linoff – sNOWsYSTEM

 Смежные вопросы

  • Нет связанных вопросов^_^