У меня есть следующая таблица:
CREATE TABLE booking(
booking_id NUMBER(8) NOT NULL;
booking_start DATE NOT NULL;
booking_end DATE NOT NULL;
booking_room NUMBER(3) NOT NULL;
guest_no NUMBER(5) NOT NULL;
);
В этой таблице отслеживаются все бронирования номеров в конкретном отеле. Я хочу написать триггер, чтобы предотвратить добавление бронирований, которые совпадают с датами предыдущих бронирований для определенных номеров в отеле.
Например, предположим, что номер 5 в настоящее время забронирован с 1 января 2019 года по 7 января 2019 года. Если добавится еще одно бронирование для номера 5 с 26 декабря 2018 года по 03 января 2019 года, я хочу, чтобы мой триггер предотвратил эти данные. от добавления в стол заказов. То же самое применимо, если бронирование сделано с 3 января 2019 года по 10 января 2019 года, а также с 2 января 2019 года по 06 января 2019 года.
В основном даты начала и окончания бронирования не могут пересекаться с другими датами начала и окончания бронирования длятот же номер в отеле.
Это то, что я пробовал до сих пор:
CREATE OR REPLACE TRIGGER check_booking_valid
BEFORE INSERT ON booking
BEGIN
SELECT booking_start
FROM booking
WHERE booking_room = :new.booking_room;
SELECT booking_end
FROM booking
WHERE booking_room = :new.booking_room;
IF :new.booking_start > booking_start AND
:new.booking_start < booking_end
THEN raise_application_error(-20000, 'Invalid booking');
IF :new.booking_end > booking_start AND
:new.booking_end < booking_end
THEN raise_application_error(-20000, 'Invalid booking');
IF :new.booking_start > booking_start AND
:new.booking_start < booking_end AND
:new.booking_end > booking_start AND
:new.booking_end < booking_end
THEN raise_application_error(-20000, 'Invalid booking');
END IF;
END;
Я получаю сообщение об ошибке, в котором говорится: «НОВЫЕ или СТАРЫЕ ссылки не разрешены в триггерах уровня таблицы». Я знаю, что если я сделаю это в триггере уровня строки, может произойти ошибка изменяющейся таблицы.
Может кто-нибудь указать, что это за ошибка?
Приветствия!