| | 3 | <syntaxhighlight lang="sql"> |
| | 4 | CREATE OR REPLACE FUNCTION trg_prevent_double_booking() |
| | 5 | RETURNS TRIGGER |
| | 6 | AS $$ |
| | 7 | BEGIN |
| | 8 | IF NEW.booking_status IN ('PENDING','CONFIRMED') THEN |
| | 9 | IF EXISTS ( |
| | 10 | SELECT 1 |
| | 11 | FROM bookings b |
| | 12 | WHERE b.room_id = NEW.room_id |
| | 13 | AND b.booking_status IN ('PENDING','CONFIRMED') |
| | 14 | AND daterange(b.check_in_date, b.check_out_date, '[)') |
| | 15 | && daterange(NEW.check_in_date, NEW.check_out_date, '[)') |
| | 16 | ) THEN |
| | 17 | RAISE EXCEPTION 'Room % is already booked', NEW.room_id; |
| | 18 | END IF; |
| | 19 | END IF; |
| | 20 | |
| | 21 | RETURN NEW; |
| | 22 | END; |
| | 23 | $$ LANGUAGE plpgsql; |
| | 24 | |
| | 25 | CREATE OR REPLACE TRIGGER prevent_double_booking |
| | 26 | BEFORE INSERT ON bookings |
| | 27 | FOR EACH ROW |
| | 28 | EXECUTE FUNCTION trg_prevent_double_booking(); |
| | 29 | </syntaxhighlight> |