Почему возникает ошибка таблицы мутаций? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь создать триггер, который перед удалением строки в таблице CLUBS проверяет, является ли столбец END_DATE пустым, если строка пустая, вместо удаления строки она заменяет значение sysdate, а если строка не нулевая, то строка не удаляется.

CREATE OR REPLACE TRIGGER TRANSFER_DATA 
BEFORE DELETE ON CLUBS
FOR EACH ROW 
  BEGIN
  IF :old.END_DATE IS NULL
  THEN UPDATE CLUBS SET END_DATE = SYSDATE;  
  ELSE
  RAISE_APPLICATION_ERROR(-20033, 'No se puede borrar');
  END IF;
END;

Я пробовал этот код, но возникает ошибка:

"таблица% s.% s мутирует, триггер / функция может его не видеть "

Как я могу заставить это работать? Кстати, я работаю над Oracle sqldeveloper

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вам необходимо создать представление и триггер INSTEAD OF:

create or replace view v_CLUBS as
SELECT * FROM CLUBS; -- perhaps add 'WHERE END_DATE IS NULL'

CREATE OR REPLACE TRIGGER TRANSFER_DATA 
   INSTEAD OF DELETE ON V_CLUBS
   FOR EACH ROW 
BEGIN
  IF :old.END_DATE IS NULL THEN 
     :new.end_date := sysdate;
  ELSE
     RAISE_APPLICATION_ERROR(-20033, 'No se puede borrar');
  END IF;
END;
0 голосов
/ 11 апреля 2020

Обработка через представление и триггер вместо - это эффективный способ go. Кажется, ваша предыдущая попытка неверно подошла к задаче. Простой вид полностью обновляемый (как правило). Но в этом случае вы хотите перехватить удаление и применить действие к базовой таблице. Предполагая, что CLUBS - это представление, с которым вы обрабатываете, а CLUBS_TBL - это фактическая таблица, триггер которой вы хотите:

-- create trigger to process deletes on the view
create or replace trigger del_clubs_isd
  instead of delete on clubs
begin 
  update clubs_tbl
     set end_date = sysdate
   where id = :old.id;
end del_clubs_isd; 

См. Полный сценарий на fiddle . Далее, как представлено, пользователю никогда не нужно знать, что клуб на самом деле не удален, а просто помечен, чтобы выглядеть таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...