我有下表:
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 当前在 2019 年 1 月 1 日至 2019 年 1 月 7 日期间预订。如果在 2018 年 12 月 26 日至 2019 年 1 月 3 日期间为房间 5 添加了另一个预订,我希望我的触发器阻止此数据添加到预订中桌子。如果在 2019 年 1 月 3 日至 2019 年 1 月 10 日以及 2019 年 1 月 2 日至 2019 年 1 月 6 日期间进行预订,则同样适用。
基本上预订开始和结束日期不能与同一酒店房间的其他预订开始和结束日期重叠。
这是我到目前为止所尝试的:
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;
我收到一条错误消息,提示“表级触发器中不允许新或旧引用”。我知道如果我把它变成一个行级触发器,可能会抛出一个变异表错误。
谁能指出错误是什么?
干杯!