Ошибка SQL: ORA-04091: таблица изменяется, триггер / функция может ее не видеть - PullRequest
0 голосов
/ 05 мая 2018

Я получаю сообщение «Ошибка SQL: ORA-04091: таблица мутирует, триггер / функция может ее не видеть», когда я обновляю данные в таблице.

DDL:

CREATE TABLE STUDENT_DIM (STUD_ID NUMBER,CURR_STUD_NAME VARCHAR2(30),PREV_STUD_NAME VARCHAR2(30), CURR_DOJ DATE, PREV_DOJ DATE, CURRR_DEPT_NAME VARCHAR2(30),PREV_DEPT_NAME VARCHAR2(30));
INSERT INTO STUDENT_DIM(STUD_ID,CURR_STUD_NAME,CURR_DOJ,CURRR_DEPT_NAME) VALUES(1,'VINOTH','01-AUG-2017','CSE');
INSERT INTO STUDENT_DIM(STUD_ID,CURR_STUD_NAME,CURR_DOJ,CURRR_DEPT_NAME) VALUES(2,'SURESH','11-SEP-2017','ECE');
INSERT INTO STUDENT_DIM(STUD_ID,CURR_STUD_NAME,CURR_DOJ,CURRR_DEPT_NAME) VALUES(3,'RAM','01-MAY-2018','IT');

Trigger:

CREATE OR REPLACE TRIGGER STUDENT_DIM_HIST BEFORE UPDATE ON STUDENT_DIM FOR EACH ROW
BEGIN
CASE WHEN UPDATING('CURR_STUD_NAME') THEN UPDATE STUDENT_DIM SET PREV_STUD_NAME = :OLD.CURR_STUD_NAME WHERE STUD_ID = :OLD.STUD_ID;
     WHEN UPDATING('CURR_DOJ')       THEN UPDATE STUDENT_DIM SET PREV_DOJ = :OLD.CURR_DOJ WHERE STUD_ID = :OLD.STUD_ID;
     WHEN UPDATING('CURRR_DEPT_NAME') THEN UPDATE STUDENT_DIM SET PREV_DEPT_NAME = :OLD.CURRR_DEPT_NAME WHERE STUD_ID = :OLD.STUD_ID;
END CASE;
END;

Обновление:

UPDATE STUDENT_DIM SET CURR_STUD_NAME = 'RAM KUMAR' WHERE STUD_ID = 3;

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Ваш триггер пытается сослаться на таблицу , которой принадлежит триггер, во время манипуляции (обновления) той же таблицей , и проблема возникает из-за этого.

Используйте вместо этого некоторые назначения, как показано ниже:

CREATE OR REPLACE TRIGGER STUDENT_DIM_HIST BEFORE UPDATE ON STUDENT_DIM FOR EACH ROW
BEGIN
CASE WHEN UPDATING('CURR_STUD_NAME')  THEN :NEW.PREV_STUD_NAME := :OLD.CURR_STUD_NAME;
     WHEN UPDATING('CURR_DOJ')        THEN :NEW.PREV_DOJ       := :OLD.CURR_DOJ;
     WHEN UPDATING('CURRR_DEPT_NAME') THEN :NEW.PREV_DEPT_NAME := :OLD.CURRR_DEPT_NAME;
END CASE;
END;
0 голосов
/ 05 мая 2018

Ошибка триггерного триггера Oracle возникает, когда триггер ссылается на таблицу, которой принадлежит триггер, в результате чего «ORA-04091: имя таблицы мутирует, триггер / функция может его не видеть». сообщение.

  1. Не использовать триггеры. Лучший способ избежать ошибки таблицы мутаций - не использовать триггеры. В то время как объектно-ориентированный Oracle предоставляет «методы», связанные с таблицами, большинство опытных разработчиков PL / SQL избегают триггеров, за исключением случаев, когда это абсолютно необходимо.

  2. Использовать триггер «после» или «вместо» - если вам необходимо использовать триггер, лучше избегать ошибки таблицы мутаций, используя триггер «после», чтобы избежать проблем с валютой, связанных с мутацией Таблица. Например, при использовании триггера «: после обновления в xxx» исходное обновление завершено, и таблица не будет изменяться.

  3. Переработать синтаксис триггера - Избегайте мутирующих таблиц с комбинацией триггеров уровня строки и уровня оператора.

  4. Использовать автономные транзакции - вы можете избежать ошибки таблицы мутаций, пометив триггер как автономную транзакцию, сделав его независимым от таблицы, которая вызывает процедуру.

...