Changes between Version 4 and Version 5 of DatabaseProgramming


Ignore:
Timestamp:
04/30/26 13:02:53 (2 days ago)
Author:
231027
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v4 v5  
    117117
    118118== Тригери
     119
     120=== `trg_buy_age`
     121
     122Овој тригер се активира при секој обид за купување билет за да ја заштити старосната граница на настанот. Спречува малолетни лица да купуваат билети за настани за кои не ја исполнуваат минималната возраст пропишана од организаторот.
     123
     124{{{
     125
     126CREATE OR REPLACE FUNCTION func_age_gate() RETURNS TRIGGER AS $$
     127BEGIN
     128    IF (SELECT EXTRACT(YEAR FROM AGE(date_of_birth)) FROM "User" WHERE user_id = NEW.user_id) <
     129       (SELECT e.min_age FROM "Event" e JOIN "Event_Happening" eh ON e.event_id = eh.event_id JOIN "Ticket" t ON eh.event_happening_id = t.event_happening_id WHERE t.ticket_id = NEW.ticket_id)
     130    THEN RAISE EXCEPTION 'Access Denied: User age is below the minimum required for this event'; END IF;
     131    RETURN NEW;
     132END; $$ LANGUAGE plpgsql;
     133CREATE TRIGGER trg_buy_age BEFORE INSERT ON "Ticket_Purchase" FOR EACH ROW EXECUTE FUNCTION func_age_gate();
     134
     135}}}
     136
     137=== `trg_rate_check`
     138
     139Овој тригер обезбедува кредибилитет на рејтингот на настаните преку строга контрола на корисниците. Дозволува оставање на оценка само доколку корисникот има купено билет и истиот не е рефундиран.
     140
     141{{{
     142
     143CREATE OR REPLACE FUNCTION func_rating_logic() RETURNS TRIGGER AS $$
     144BEGIN
     145    IF NOT EXISTS (SELECT 1 FROM "Ticket_Purchase" tp JOIN "Ticket" t ON tp.ticket_id = t.ticket_id
     146       WHERE tp.user_id = NEW.user_id AND t.event_happening_id = NEW.event_happening_id
     147       AND NOT EXISTS (SELECT 1 FROM "Ticket_Refund" tr WHERE tr.purchase_id = tp.purchase_id))
     148    THEN RAISE EXCEPTION 'You must have a valid ticket and have attended the event to rate it'; END IF;
     149    RETURN NEW;
     150END; $$ LANGUAGE plpgsql;
     151CREATE TRIGGER trg_rate_check BEFORE INSERT ON "Event_Happening_Rating" FOR EACH ROW EXECUTE FUNCTION func_rating_logic();
     152
     153}}}
     154
     155=== `trg_period_check`
     156
     157Овој тригер спречува логички грешки при дефинирањето на промотивните периоди. Оневозможува поставување на датуми за попуст кои траат откако самиот настан веќе завршил.
     158
     159{{{
     160
     161CREATE OR REPLACE FUNCTION func_period_val() RETURNS TRIGGER AS $$
     162BEGIN
     163    IF NEW.end_date > (SELECT event_time::DATE FROM "Event_Happening" WHERE event_happening_id = NEW.event_happening_id)
     164    THEN RAISE EXCEPTION 'Invalid Period: End date cannot be after the event occurrence date'; END IF;
     165    RETURN NEW;
     166END; $$ LANGUAGE plpgsql;
     167CREATE TRIGGER trg_period_check BEFORE INSERT OR UPDATE ON "Event_Period" FOR EACH ROW EXECUTE FUNCTION func_period_val();
     168
     169}}}
     170
     171=== `trg_venue_sync`
     172
     173Овој тригер ја одржува синхронизацијата на капацитетите преку повикување на хиерархиската функција. Ги блокира обидите за создавање секции кои би го надминале вкупниот број на седишта планиран за целиот објект.
     174
     175{{{
     176
     177CREATE OR REPLACE FUNCTION func_sync_cap() RETURNS TRIGGER AS $$
     178BEGIN
     179    IF NOT fn_validate_hierarchy_capacity(NEW.venue_id, NEW.number_of_seats, 'VENUE_LIMIT')
     180    THEN RAISE EXCEPTION 'Capacity Error: New section exceeds total venue seat limit'; END IF;
     181    RETURN NEW;
     182END; $$ LANGUAGE plpgsql;
     183CREATE TRIGGER trg_venue_sync BEFORE INSERT OR UPDATE ON "Section" FOR EACH ROW EXECUTE FUNCTION func_sync_cap();
     184
     185}}}
     186
     187=== `trg_ticket_gate`
     188
     189Ова е тригер кој претставува бариера која спречува „overbooking“ на настаните. Оневозможува генерирање на повеќе билети од вкупниот физички капацитет на салата за секој поединечен термин.
     190
     191{{{
     192
     193CREATE OR REPLACE FUNCTION func_ticket_cap() RETURNS TRIGGER AS $$
     194BEGIN
     195    IF (SELECT COUNT(*) FROM "Ticket" WHERE event_happening_id = NEW.event_happening_id) >=
     196       (SELECT number_of_seats FROM "Venue" v JOIN "Event_Happening" eh ON v.venue_id = eh.venue_id WHERE eh.event_happening_id = NEW.event_happening_id)
     197    THEN RAISE EXCEPTION 'Sold Out: Number of tickets cannot exceed the venue seat capacity'; END IF;
     198    RETURN NEW;
     199END; $$ LANGUAGE plpgsql;
     200CREATE TRIGGER trg_ticket_gate BEFORE INSERT ON "Ticket" FOR EACH ROW EXECUTE FUNCTION func_ticket_cap();
     201
     202}}}