एक इंसर्ट स्टेटमेंट कई पंक्तियों को सम्मिलित कर सकता है। उदा.:
insert into booking(booking_start, booking_end, booking_room, guest_no)
select date '2019-11-01', date '2019-11-10', 4, 10 from dual
union all
select date '2019-11-08', date '2019-11-15', 4, 88 from dual;
ये प्रविष्टियां मनमाने क्रम में होती हैं, इसलिए आप वास्तव में एक पंक्ति को स्वीकार नहीं कर सकते हैं और दूसरी को नहीं। इसके बजाय आपको संपूर्ण सम्मिलन कथन को अस्वीकार करना होगा। निश्चित रूप से अपडेट के लिए भी यही सच है, अगर ऐसा किया जा सकता है।
तदनुसार आप एक आफ्टर स्टेटमेंट ट्रिगर लिखेंगे जहां आप तालिका में नई स्थिति को देखेंगे।
CREATE OR REPLACE TRIGGER trg_reject_invalid_bookings
AFTER INSERT OR UPDATE ON booking
DECLARE
v_count INTEGER;
BEGIN
SELECT count(*)
INTO v_count
FROM booking b1
WHERE EXISTS
(
SELECT *
FROM booking b2
WHERE b2.booking_id <> b1.booking_id
AND b2.booking_room = b1.booking_room
AND b2.booking_start < b1.booking_end
AND b2.booking_end > b1.booking_start
)
AND rownum = 1; -- it suffices to find one overlapping pair
IF v_count > 0 THEN
raise_application_error(-20000, 'Invalid booking');
END IF;
END trg_reject_invalid_bookings;
यदि तालिका बड़ी है और आप इस ट्रिगर को तेजी से चलाने के लिए केवल सम्मिलित/अपडेट की गई पंक्तियों को देखना चाहते हैं, तो आपको इसके बजाय एक कंपाउंड ट्रिगर लिखना होगा जहां आपको पंक्ति स्तर पर एक सरणी में बुकिंग आईडी याद हैं और केवल देखें इन पंक्तियों को कथन स्तर पर।