Changes between Version 2 and Version 3 of Trigger Functions


Ignore:
Timestamp:
05/12/26 02:19:18 (2 weeks ago)
Author:
193284
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Trigger Functions

    v2 v3  
    1717{{collapse(View SQL Code)
    1818<syntaxhighlight lang="sql">
    19 PASTE SQL FROM advanced_triggers.sql
     19CREATE OR REPLACE FUNCTION check_venue_booking_overlap()
     20RETURNS TRIGGER AS $$
     21BEGIN
     22    IF EXISTS (
     23        SELECT 1
     24        FROM venue_booking
     25        WHERE venue_id = NEW.venue_id
     26          AND "date" = NEW."date"
     27          AND booking_id <> COALESCE(NEW.booking_id, -1)
     28          AND (
     29                NEW.start_time < end_time
     30            AND NEW.end_time > start_time
     31          )
     32    ) THEN
     33        RAISE EXCEPTION 'Venue is already booked for this time interval.';
     34    END IF;
     35
     36    RETURN NEW;
     37END;
     38$$ LANGUAGE plpgsql;
     39
     40CREATE TRIGGER trg_venue_booking_overlap
     41BEFORE INSERT OR UPDATE ON venue_booking
     42FOR EACH ROW
     43EXECUTE FUNCTION check_venue_booking_overlap();
    2044</syntaxhighlight>
    2145}}
     
    2751This trigger prevents overlapping photographer bookings.
    2852
     53=== SQL Code ===
     54
     55{{collapse(View SQL Code)
     56<syntaxhighlight lang="sql">
     57CREATE OR REPLACE FUNCTION check_photographer_booking_overlap()
     58RETURNS TRIGGER AS $$
     59BEGIN
     60    IF EXISTS (
     61        SELECT 1
     62        FROM photographer_booking
     63        WHERE photographer_id = NEW.photographer_id
     64          AND "date" = NEW."date"
     65          AND booking_id <> COALESCE(NEW.booking_id, -1)
     66          AND (
     67                NEW.start_time < end_time
     68            AND NEW.end_time > start_time
     69          )
     70    ) THEN
     71        RAISE EXCEPTION 'Photographer is already booked for this time interval.';
     72    END IF;
     73
     74    RETURN NEW;
     75END;
     76$$ LANGUAGE plpgsql;
     77
     78CREATE TRIGGER trg_photographer_booking_overlap
     79BEFORE INSERT OR UPDATE ON photographer_booking
     80FOR EACH ROW
     81EXECUTE FUNCTION check_photographer_booking_overlap();
     82</syntaxhighlight>
     83}}
     84
    2985== 3. Band Booking Conflict Prevention ==
    3086
     
    3389This trigger prevents overlapping band reservations.
    3490
     91=== SQL Code ===
     92
     93{{collapse(View SQL Code)
     94<syntaxhighlight lang="sql">
     95CREATE OR REPLACE FUNCTION check_band_booking_overlap()
     96RETURNS TRIGGER AS $$
     97BEGIN
     98    IF EXISTS (
     99        SELECT 1
     100        FROM band_booking
     101        WHERE band_id = NEW.band_id
     102          AND "date" = NEW."date"
     103          AND booking_id <> COALESCE(NEW.booking_id, -1)
     104          AND (
     105                NEW.start_time < end_time
     106            AND NEW.end_time > start_time
     107          )
     108    ) THEN
     109        RAISE EXCEPTION 'Band is already booked for this time interval.';
     110    END IF;
     111
     112    RETURN NEW;
     113END;
     114$$ LANGUAGE plpgsql;
     115
     116CREATE TRIGGER trg_band_booking_overlap
     117BEFORE INSERT OR UPDATE ON band_booking
     118FOR EACH ROW
     119EXECUTE FUNCTION check_band_booking_overlap();
     120</syntaxhighlight>
     121}}
     122
    35123== 4. Attendance Consistency Validation ==
    36124
     
    38126
    39127This trigger validates attendance records against RSVP responses.
     128
     129=== SQL Code ===
     130
     131{{collapse(View SQL Code)
     132<syntaxhighlight lang="sql">
     133CREATE OR REPLACE FUNCTION validate_attendance_consistency()
     134RETURNS TRIGGER AS $$
     135DECLARE
     136    guest_rsvp VARCHAR(30);
     137BEGIN
     138    SELECT status
     139    INTO guest_rsvp
     140    FROM event_rsvp
     141    WHERE guest_id = NEW.guest_id
     142      AND event_id = NEW.event_id;
     143
     144    IF guest_rsvp = 'declined'
     145       AND NEW.status = 'attending' THEN
     146        RAISE EXCEPTION 'Declined guests cannot be marked as attending.';
     147    END IF;
     148
     149    RETURN NEW;
     150END;
     151$$ LANGUAGE plpgsql;
     152
     153CREATE TRIGGER trg_attendance_consistency
     154BEFORE INSERT OR UPDATE ON attendance
     155FOR EACH ROW
     156EXECUTE FUNCTION validate_attendance_consistency();
     157</syntaxhighlight>
     158}}