Триггер, разрешающий аренду автомобиля максимум на 7 дней

#mysql

#mysql

Вопрос:

Я хочу создать триггер, который ограничит время аренды автомобиля 7 днями. Так, например… Вы можете арендовать автомобиль с 01/01/2019 по 06/01/2019, НО вы НЕ МОЖЕТЕ арендовать автомобиль с 01/01/2019 по 10/01/2019. Использовать ли мне BEFORE INSERT? Любая помощь приветствуется.

Я также прилагаю свою таблицу бронирований для некоторой ясности.

 insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (1, '2019/02/26', '2019/02/28', '2019/03/01', 1, 1, 1, 1, 'Yes', 'Be a bit early');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (2, '2019/02/28', '2019/02/28', '2019/03/03', 2, NULL, 2, 2, 'No','Please have some water');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (3, '2019/03/01', '2019/03/02', '2019/03/05', 3, NULL, 3, 3, 'No','Drive slow, children in the car');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (4, '2019/03/04', '2019/03/06', '2019/03/10', 4, 4, 4, 4, 'Yes','Please be silent while driving');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (5, '2019/03/08', '2019/03/09', '2019/03/13', 5, NULL, 5, 5, 'No','Need to be exactly on time');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (6, '2019/04/03', '2019/04/04', '2019/04/06', 6, 6, 6, 6, 'Yes','Children onboard, please drive slow');
insert into bookings (booking_id, booking_date, start_date, end_date, invoice_no, chauffeur_id, vehicle_id, customer_id, chauffeur_req,special_instructions) values (7, '2019/04/05', '2019/04/07', '2019/03/10', 7, NULL, 7, 7, 'No','Arrive 5 minutes early');
  

Комментарии:

1. Я бы подумал о том, чтобы сделать это во внешнем интерфейсе, а не в триггере.

2. Я не занимаюсь этим, поскольку мы не будем этого делать. поэтому мне нужно сделать это в SQL. Это часть проекта.

Ответ №1:

Мы могли бы выполнить эту проверку в BEFORE INSERT триггере и вызвать условие ошибки, чтобы предотвратить выполнение предыдущего оператора. Для полноты картины нам, вероятно, также понадобится BEFORE UPDATE триггер (чтобы предотвратить изменение строки, уже вставленной в bookings , на срок более недели.)

Что-то вроде этого для начала:

 DELIMITER $$

CREATE TRIGGER `trg_bookings_bi` 
BEFORE INSERT ON `bookings`
FOR EACH ROW
BEGIN
   IF ( NEW.end_date > NEW.start_date   INTERVAL 7 DAY ) THEN
      SIGNAL SQLSTATE '45000'
         SET MESSAGE_TEXT = 'error end_date more than seven days after start_date';
   END IF;   
END$$

DELIMITER ;
  

Комментарии:

1. Спасибо за ваш вклад. Говоря «для начала», я бы предположил, что можно расширить этот триггер?

2. Эта версия MySQL пока не поддерживает «несколько триггеров с одинаковым временем действия и событием для одной таблицы» — у меня уже есть триггер ПЕРЕД ВСТАВКОЙ В бронирования. Влияет ли это на это

3. Вы могли бы добавить его к существующему триггеру, просто будьте осторожны с обработкой ошибок, чтобы убедиться, что он выполняет то, что вы хотите.