wiki:Faza4

Фаза 4: Функции, процедури, тригери

Апликациската логика е имплементирана на ниво на база на податоци со користење на PL/pgSQL функции, процедури и тригери.

Во продолжение се издвоени најважните функционалности имплементирани преку процедури и тригери:

1. Ослободување на откажани билети (Тригер функција)

  • Назив: trg_fn_release_cancelled_tickets()
  • Опис: Тригер кој се активира автоматски по бришење или откажување на резервација, враќајќи ги билетите повторно во системот како слободни и ажурирајќи го вкупниот број на достапни места.
    CREATE OR REPLACE FUNCTION trg_fn_release_cancelled_tickets()
    RETURNS TRIGGER AS $$
    BEGIN
        -- Враќање на билетите во системот
        UPDATE events
        SET available_seats = available_seats + OLD.ticket_count
        WHERE event_id = OLD.event_id;
    
        RETURN OLD;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE TRIGGER trg_release_tickets
    AFTER DELETE ON reservations
    FOR EACH ROW
    EXECUTE FUNCTION trg_fn_release_cancelled_tickets();
    

2. Процес на купување билет (Процедура)

  • Назив: sp_buy_ticket(int4, int4)
  • Опис: Процедура која ја менаџира трансакцијата за купување билет. Проверува достапност, креира резервација и го поврзува корисникот со генерираниот билет.
    CREATE OR REPLACE PROCEDURE public.sp_buy_ticket(IN p_user_id integer, IN p_perf_id integer)
     LANGUAGE plpgsql
    AS $procedure$
    DECLARE 
        v_ticket_id INT;
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM users WHERE user_id = p_user_id) THEN 
            RAISE EXCEPTION 'Корисникот со ID % не постои!', p_user_id; 
        END IF;
    
        SELECT ticket_id INTO v_ticket_id FROM ticket 
        WHERE performance_id = p_perf_id AND status = 'available' 
        LIMIT 1;
        
        IF v_ticket_id IS NULL THEN 
            RAISE EXCEPTION 'Нема слободни карти!'; 
        END IF;
    
        UPDATE ticket 
        SET user_id = p_user_id, status = 'sold' 
        WHERE ticket_id = v_ticket_id;
        
    END; $procedure$
    ;
    
    
  • Пример за повик: CALL public.sp_buy_ticket(1, 105);

3. Проверка на достапност (Функција)

  • Назив: fn_check_availability(int4)
  • Опис: Функција која за даден ID на настан или сектор брзо проверува и го враќа преостанатиот број на слободни места, спречувајќи "overbooking".
    CREATE OR REPLACE FUNCTION public.fn_check_availability(p_performance_id integer)
     RETURNS integer
     LANGUAGE plpgsql
    AS $function$
    DECLARE
        v_available_count INT;
    BEGIN
        SELECT COUNT(*) INTO v_available_count
        FROM ticket
        WHERE performance_id = p_performance_id AND status = 'available';
        RETURN v_available_count;
    END; $function$
    ;
    
    
Last modified 4 days ago Last modified on 06/11/26 13:32:35
Note: See TracWiki for help on using the wiki.