о триггерах - PullRequest
       34

о триггерах

0 голосов
/ 24 октября 2019

предотвратить перекрытие дат. у нас есть 2 даты, то есть начальная дата и конечная дата, нам нужно написать триггер, который предотвращает перекрытие дат. то есть мы не можем иметь новую запись, если уже есть дата начала того, что мы вводим. мы должны рассмотреть обе ситуации, т.е. new_boking_from> old_booking_from и new_booking_to

Код для того же:

set echo on ;

CREATE OR REPLACE TRIGGER check_booking

BEFORE INSERT ON booking

FOR EACH ROW

BEGIN

if (((:new.resort_id,:new.cabin_no)in (select  b.resort_id ,b.cabin_no  from booking b)) 
and 
(:new.booking_from) > (select b.booking from booking where :new.resort_id = b.resort_id and :new.guest_no = b.guest_no)) 
or 
(((:new.resort_id,:new.cabin_no)in (select  b.resort_id ,b.cabin_no  from booking b))
and 
(:new.booking_to)< (select b.booking from booking where :new.resort_id = b.resort_id and :new.guest_no = b.guest_no))

then 

raise_application_error(-20000, 'This is an overlap');

end if;

end;
/

set echo off;

1 Ответ

0 голосов
/ 25 октября 2019

Проблема, с которой вы столкнетесь, - исключение мутирующей таблицы. Вы не можете запросить таблицу, которую вы в настоящее время обновляете (не используйте прагму автономной транзакции, здесь нет необходимости). В зависимости от вашей версии вы можете создать составной триггер. Есть целый ряд ресурсов, которые проведут вас через весь процесс. Вот, с чего можно начать: сообщение в блоге .

...