Я делаю небольшой проект для своего предмета в университете, и у меня возникла проблема с проектированием триггера в Oracle SQL Developer для моей небольшой базы данных.Oracle SQL Developer Мутирующие таблицы и триггеры
У меня есть следующие таблицы:
create table ASSIGNED_TO(
ASSIGNMENT_ID int not null primary key,
ROOM_ID int not null,
foreign key (ROOM_ID) references ROOM(ROOM_ID),
NURSE_ID int not null,
foreign key (NURSE_ID) references NURSE(PERSON_ID)
);
create table MESSAGE_LOG(
ID int not null,
MESSAGE varchar2(100) null
);
Каждый раз, когда строка из таблицы ASSIGNED_TO
изменяется INSERT
или UPDATE
операции и есть 2 строки с тем же ROOM_ID
Я хочу триггер, чтобы написать простое сообщение в стол MESSAGE_LOG
.
Что вызывает у меня проблемы - это «мутация» таблицы ASSIGNED_TO
. Мое текущее решение:
create or replace TRIGGER TRIG3
AFTER INSERT OR UPDATE
ON ASSIGNED_TO
FOR EACH ROW
DECLARE
nr_nurses INTEGER;
BEGIN
SELECT COUNT(*) INTO nr_nurses
FROM ASSIGNED_TO
WHERE ROOM_ID = :NEW.ROOM_ID;
IF nr_nurses >= 2 THEN
INSERT INTO MESSAGE_LOG values (3, '2 or more nurses per room detected');
DBMS_OUTPUT.PUT_LINE('3| 2 or more nurses per room detected');
END IF;
END;
Этот триггер дает мне ошибку «мутирует Table» и до сих пор я не смог это исправить. Использование :OLD.ROOM_ID
вместо ROOM_ID
не работает, поскольку :OLD.ROOM_ID
не существует в случае UPDATE
операции. Любые советы по выполнению этой работы приветствуются.
Да, хотя это просто вызывает новые проблемы, например, в этом случае все предыдущие вставки, вызвавшие это условие, были бы повторно найдены и перезаписаны на каждую вставку или обновление в таблицу, поэтому вам нужно будет добавить проверку против message_log, чтобы вы не повторяли повтор одной и той же проблемы снова и снова. И использование триггера уровня инструкций для операций на уровне строк просто неэффективно, как черт! Не сказать, что это не сработает. Но плохой стиль программирования для начала, если его можно избежать. –
Моя цель - использовать триггер, и я понимаю плюсы и минусы этого решения. Этот код работает для моей цели. Благодаря! – Quass1m