Триггер, чтобы разрешить только 1 автомобиль - PullRequest
0 голосов
/ 13 марта 2019

Я сейчас пытаюсь сделать триггер, который установит ограничение, что человек может арендовать только одну машину.

DELIMITER //
CREATE TRIGGER Carperperson
BEFORE INSERT ON bookings
FOR EACH ROW 
BEGIN
IF NEW.vehicle_id = ?THEN
SIGNAL SQLSTATE '45000' set message_text='You can only book one car per single customer a day!';


DELIMITER;

Вот куда я дошел, и, если честно, я как бы застрял, как это структурировать.

Таблицы:

Bookings, Customers, Vehicles, 
Chauffeurs, Vehicle_Collections, 
Payments, Mechanics, Invoice

1 Ответ

0 голосов
/ 14 марта 2019

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

Что касается логики, аренда автомобиля может длиться в течение нескольких дней, поэтому у вас есть два сценария: у клиента уже есть аренда, которая не возвращается до вставки начала аренды, или она планирует начать новая аренда до того, как будет введена арендная плата, должна быть возвращена. Допустимый случай, который может конфликтовать с ними, - это если пользователь в один и тот же день бросает машину в одном месте и забирает автомобиль в другом месте, поэтому мы должны принять это во внимание.

Не зная структуры вашей таблицы, довольно сложно дать точный код T-SQL, как с ними справляться. В демонстрационных целях я предполагаю, что у вас есть таблица с UserID, CarID, pickupdate и dropoffdate, и что новые строки вставляются со всеми четырьмя из этих значений.

DELIMITER //
CREATE TRIGGER Carperperson
BEFORE INSERT ON bookings
FOR EACH ROW 
BEGIN
IF NEW.User_ID = bookings.User_ID
    and ((new.Pickupdate >= bookings.pickupdate and new.Pickupdate < bookings.dropoffdate)
        or (new.dropoffdate > bookings.pickupdate and new.dropoffdate < bookings.dropoffdate))
THEN
SIGNAL SQLSTATE '45000' set message_text='You can only book one car per single customer a day!';


DELIMITER;

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

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