Changes between Version 63 and Version 64 of DatabaseProgramming


Ignore:
Timestamp:
05/20/26 22:22:26 (6 days ago)
Author:
231109
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v63 v64  
    352352=== Тригер 1 : auto_set_reservation_status
    353353
    354 [[Image("Screenshot 2026-05-20 142512.png", 300px)]]
    355 
     354{{{
     355#!sql
     356CREATE FUNCTION auto_set_reservation_status()
     357RETURNS TRIGGER AS $$
     358BEGIN
     359    IF NEW.expiry_time < CURRENT_DATE THEN
     360        NEW.status := 'Expired';
     361    ELSE
     362        NEW.status := 'Active';
     363    END IF;
     364
     365    RETURN NEW;
     366END;
     367$$ LANGUAGE plpgsql;
     368
     369CREATE TRIGGER trg_auto_set_reservation_status
     370BEFORE INSERT OR UPDATE ON Reservation
     371FOR EACH ROW
     372EXECUTE FUNCTION auto_set_reservation_status();
     373}}}
    356374Овој trigger автоматски го поставува статусот на резервацијата како "Active" или "Expired" според датумот на истекување. Се користи за автоматско ажурирање на резервациите и одржување точни податоци во системот
    357375
    358376=== Тригер 2 : prevent_duplicate_seat_booking
    359377
    360 [[Image("Screenshot 2026-05-20 143034.png", 300px)]]
    361 
     378{{{
     379#!sql
     380CREATE  FUNCTION prevent_duplicate_seat_booking()
     381RETURNS TRIGGER AS $$
     382DECLARE
     383    seat_exists INT;
     384BEGIN
     385    SELECT COUNT(*)
     386    INTO seat_exists
     387    FROM Ticket
     388    WHERE seat_number = NEW.seat_number
     389      AND carriage_number = NEW.carriage_number
     390      AND "Train Triptrip_id" = NEW."Train Triptrip_id";
     391
     392    IF seat_exists > 0 THEN
     393        RAISE EXCEPTION 'Seat already booked for this train trip!';
     394    END IF;
     395
     396    RETURN NEW;
     397END;
     398$$ LANGUAGE plpgsql;
     399
     400CREATE TRIGGER trg_prevent_duplicate_seat_booking
     401BEFORE INSERT ON Ticket
     402FOR EACH ROW
     403EXECUTE FUNCTION prevent_duplicate_seat_booking();
     404}}}
    362405Овој trigger спречува дупло резервирање на исто седиште на исто патување со воз. Пред внесување нов билет, системот проверува дали седиштето е веќе резервирано и ако постои, прикажува грешка во спротивно. Се користи за да се избегнат конфликти и да се обезбедат точни резервации на билети.
    363406
    364407=== Тригер 3 : update_trip_status_based_on_delay
    365408
    366 [[Image("Screenshot 2026-05-20 143448.png", 300px)]]
    367 
     409{{{
     410#!sql
     411CREATE FUNCTION update_trip_status_based_on_delay()
     412RETURNS TRIGGER AS $$
     413BEGIN
     414    IF NEW.delay_minutes > 0 THEN
     415        NEW.trip_status := 'Delayed';
     416    ELSE
     417        NEW.trip_status := 'On Time';
     418    END IF;
     419
     420    RETURN NEW;
     421END;
     422$$ LANGUAGE plpgsql;
     423
     424CREATE TRIGGER trg_update_trip_status
     425BEFORE INSERT OR UPDATE ON "Train Trip"
     426FOR EACH ROW
     427EXECUTE FUNCTION update_trip_status_based_on_delay();
     428}}}
    368429Овој trigger автоматски го ажурира статусот на патувањето според доцнењето на возот. Ако бројот на минути за доцнење е поголем од 0, статусот се поставува на "Delayed", а во спротивно на "On Time". Се користи за автоматско следење и прикажување на точниот статус на возовите.
    369430
    370431=== Тригер 4 : auto_set_transaction_date
    371432
    372 [[Image("Screenshot 2026-05-20 144202.png", 300px)]]
    373 
     433{{{
     434#!sql
     435CREATE FUNCTION auto_set_transaction_date()
     436RETURNS TRIGGER AS $$
     437BEGIN
     438    IF NEW.transaction_date IS NULL THEN
     439        NEW.transaction_date := CURRENT_DATE;
     440    END IF;
     441
     442    RETURN NEW;
     443END;
     444$$ LANGUAGE plpgsql;
     445
     446CREATE TRIGGER trg_auto_set_transaction_date
     447BEFORE INSERT ON Payment
     448FOR EACH ROW
     449EXECUTE FUNCTION auto_set_transaction_date();
     450}}}
    374451Овој trigger автоматски ја поставува датата на трансакцијата ако не е внесена при креирање на плаќање. Ако transaction_date е NULL, системот ја става тековната дата. Се користи за да се осигураме дека секое плаќање има точен датум и за автоматско и конзистентно водење на финансиски записи.
    375452
    376453=== Тригер 5 : prevent_employee_trip_overlap
    377454
    378 [[Image("Screenshot 2026-05-20 144545.png", 300px)]]
    379 
     455{{{
     456#!sql
     457CREATE FUNCTION prevent_employee_trip_overlap()
     458RETURNS TRIGGER AS $$
     459DECLARE
     460    overlap_count INT;
     461BEGIN
     462    SELECT COUNT(*)
     463    INTO overlap_count
     464    FROM "Train Trip"
     465    WHERE Employeeemployee_id = NEW.Employeeemployee_id
     466      AND EmployeePersonEMBG2 = NEW.EmployeePersonEMBG2
     467      AND departure_time = NEW.departure_time;
     468
     469    IF overlap_count > 0 THEN
     470        RAISE EXCEPTION
     471        'Employee already assigned to another trip at this time!';
     472    END IF;
     473
     474    RETURN NEW;
     475END;
     476$$ LANGUAGE plpgsql;
     477
     478CREATE TRIGGER trg_prevent_employee_trip_overlap
     479BEFORE INSERT ON "Train Trip"
     480FOR EACH ROW
     481EXECUTE FUNCTION prevent_employee_trip_overlap();
     482}}}
    380483Овој trigger спречува еден вработен да биде доделен на две патувања во исто време. Пред внесување нов запис во "Train Trip", системот проверува дали веќе постои ист вработен со исто време на поаѓање и ако да, фрла грешка. Се користи за да се избегнат конфликти во распоредот и за правилно распределување на вработените.
    381484
    382485=== Тригер 6 : check_and_mark_overbooked
    383486
    384 [[Image("Screenshot 2026-05-20 145123.png", 300px)]]
    385 
     487{{{
     488#!sql
     489CREATE OR REPLACE FUNCTION check_and_mark_overbooked()
     490RETURNS TRIGGER
     491LANGUAGE plpgsql
     492AS $$
     493DECLARE
     494    v_capacity INT;
     495    v_sold_tickets INT;
     496BEGIN
     497    SELECT t.capacity
     498    INTO v_capacity
     499    FROM "Train Trip" tt
     500    JOIN Train t ON tt.Traintrain_id = t.train_id
     501    WHERE tt.trip_id = NEW."Train Triptrip_id";
     502
     503    SELECT COUNT(*)
     504    INTO v_sold_tickets
     505    FROM Ticket
     506    WHERE "Train Triptrip_id" = NEW."Train Triptrip_id"
     507      AND ticket_status = 'Active';
     508
     509    IF v_sold_tickets > v_capacity THEN
     510        UPDATE "Train Trip"
     511        SET trip_status = 'Overbooked'
     512        WHERE trip_id = NEW."Train Triptrip_id";
     513
     514        RAISE NOTICE 'Trip % is OVERBOOKED automatically via Trigger. Capacity: %, Sold: %.',
     515                     NEW."Train Triptrip_id", v_capacity, v_sold_tickets;
     516    END IF;
     517
     518    RETURN NEW;
     519END;
     520$$;
     521}}}
    386522Овој trigger проверува дали бројот на продадени билети го надминува капацитетот на возот за дадено патување. Ако има повеќе билети од дозволени места, автоматски го менува статусот на патувањето во "Overbooked" и дава известување. Се користи за автоматско следење на пополнетост и спречување на преголем број резервации.
    387523
    388524=== Тригер 7 : prevent_station_delete_active_trip
    389525
    390 [[Image("Screenshot 2026-05-20 145522.png", 300px)]]
    391 
     526{{{
     527#!sql
     528CREATE FUNCTION prevent_station_delete_active_trip()
     529RETURNS TRIGGER AS $$
     530DECLARE
     531    trip_count INT;
     532BEGIN
     533    SELECT COUNT(*)
     534    INTO trip_count
     535    FROM Ticket
     536    WHERE Stationstation_id = OLD.station_id
     537       OR Stationstation_id2 = OLD.station_id;
     538
     539    IF trip_count > 0 THEN
     540        RAISE EXCEPTION
     541        'Cannot delete station because tickets/trips reference it!';
     542    END IF;
     543
     544    RETURN OLD;
     545END;
     546$$ LANGUAGE plpgsql;
     547
     548CREATE TRIGGER trg_prevent_station_delete_active_trip
     549BEFORE DELETE ON Station
     550FOR EACH ROW
     551EXECUTE FUNCTION prevent_station_delete_active_trip();
     552}}}
    392553Овој trigger спречува бришење на станица ако таа е веќе користена во билети или патувања. Пред DELETE во табелата Station, системот проверува дали постојат поврзани записи и ако има, фрла грешка. Се користи за заштита на податоците и одржување на интегритет на базата.
    393554