Changes between Version 63 and Version 64 of DatabaseProgramming
- Timestamp:
- 05/20/26 22:22:26 (6 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
DatabaseProgramming
v63 v64 352 352 === Тригер 1 : auto_set_reservation_status 353 353 354 [[Image("Screenshot 2026-05-20 142512.png", 300px)]] 355 354 {{{ 355 #!sql 356 CREATE FUNCTION auto_set_reservation_status() 357 RETURNS TRIGGER AS $$ 358 BEGIN 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; 366 END; 367 $$ LANGUAGE plpgsql; 368 369 CREATE TRIGGER trg_auto_set_reservation_status 370 BEFORE INSERT OR UPDATE ON Reservation 371 FOR EACH ROW 372 EXECUTE FUNCTION auto_set_reservation_status(); 373 }}} 356 374 Овој trigger автоматски го поставува статусот на резервацијата како "Active" или "Expired" според датумот на истекување. Се користи за автоматско ажурирање на резервациите и одржување точни податоци во системот 357 375 358 376 === Тригер 2 : prevent_duplicate_seat_booking 359 377 360 [[Image("Screenshot 2026-05-20 143034.png", 300px)]] 361 378 {{{ 379 #!sql 380 CREATE FUNCTION prevent_duplicate_seat_booking() 381 RETURNS TRIGGER AS $$ 382 DECLARE 383 seat_exists INT; 384 BEGIN 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; 397 END; 398 $$ LANGUAGE plpgsql; 399 400 CREATE TRIGGER trg_prevent_duplicate_seat_booking 401 BEFORE INSERT ON Ticket 402 FOR EACH ROW 403 EXECUTE FUNCTION prevent_duplicate_seat_booking(); 404 }}} 362 405 Овој trigger спречува дупло резервирање на исто седиште на исто патување со воз. Пред внесување нов билет, системот проверува дали седиштето е веќе резервирано и ако постои, прикажува грешка во спротивно. Се користи за да се избегнат конфликти и да се обезбедат точни резервации на билети. 363 406 364 407 === Тригер 3 : update_trip_status_based_on_delay 365 408 366 [[Image("Screenshot 2026-05-20 143448.png", 300px)]] 367 409 {{{ 410 #!sql 411 CREATE FUNCTION update_trip_status_based_on_delay() 412 RETURNS TRIGGER AS $$ 413 BEGIN 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; 421 END; 422 $$ LANGUAGE plpgsql; 423 424 CREATE TRIGGER trg_update_trip_status 425 BEFORE INSERT OR UPDATE ON "Train Trip" 426 FOR EACH ROW 427 EXECUTE FUNCTION update_trip_status_based_on_delay(); 428 }}} 368 429 Овој trigger автоматски го ажурира статусот на патувањето според доцнењето на возот. Ако бројот на минути за доцнење е поголем од 0, статусот се поставува на "Delayed", а во спротивно на "On Time". Се користи за автоматско следење и прикажување на точниот статус на возовите. 369 430 370 431 === Тригер 4 : auto_set_transaction_date 371 432 372 [[Image("Screenshot 2026-05-20 144202.png", 300px)]] 373 433 {{{ 434 #!sql 435 CREATE FUNCTION auto_set_transaction_date() 436 RETURNS TRIGGER AS $$ 437 BEGIN 438 IF NEW.transaction_date IS NULL THEN 439 NEW.transaction_date := CURRENT_DATE; 440 END IF; 441 442 RETURN NEW; 443 END; 444 $$ LANGUAGE plpgsql; 445 446 CREATE TRIGGER trg_auto_set_transaction_date 447 BEFORE INSERT ON Payment 448 FOR EACH ROW 449 EXECUTE FUNCTION auto_set_transaction_date(); 450 }}} 374 451 Овој trigger автоматски ја поставува датата на трансакцијата ако не е внесена при креирање на плаќање. Ако transaction_date е NULL, системот ја става тековната дата. Се користи за да се осигураме дека секое плаќање има точен датум и за автоматско и конзистентно водење на финансиски записи. 375 452 376 453 === Тригер 5 : prevent_employee_trip_overlap 377 454 378 [[Image("Screenshot 2026-05-20 144545.png", 300px)]] 379 455 {{{ 456 #!sql 457 CREATE FUNCTION prevent_employee_trip_overlap() 458 RETURNS TRIGGER AS $$ 459 DECLARE 460 overlap_count INT; 461 BEGIN 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; 475 END; 476 $$ LANGUAGE plpgsql; 477 478 CREATE TRIGGER trg_prevent_employee_trip_overlap 479 BEFORE INSERT ON "Train Trip" 480 FOR EACH ROW 481 EXECUTE FUNCTION prevent_employee_trip_overlap(); 482 }}} 380 483 Овој trigger спречува еден вработен да биде доделен на две патувања во исто време. Пред внесување нов запис во "Train Trip", системот проверува дали веќе постои ист вработен со исто време на поаѓање и ако да, фрла грешка. Се користи за да се избегнат конфликти во распоредот и за правилно распределување на вработените. 381 484 382 485 === Тригер 6 : check_and_mark_overbooked 383 486 384 [[Image("Screenshot 2026-05-20 145123.png", 300px)]] 385 487 {{{ 488 #!sql 489 CREATE OR REPLACE FUNCTION check_and_mark_overbooked() 490 RETURNS TRIGGER 491 LANGUAGE plpgsql 492 AS $$ 493 DECLARE 494 v_capacity INT; 495 v_sold_tickets INT; 496 BEGIN 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; 519 END; 520 $$; 521 }}} 386 522 Овој trigger проверува дали бројот на продадени билети го надминува капацитетот на возот за дадено патување. Ако има повеќе билети од дозволени места, автоматски го менува статусот на патувањето во "Overbooked" и дава известување. Се користи за автоматско следење на пополнетост и спречување на преголем број резервации. 387 523 388 524 === Тригер 7 : prevent_station_delete_active_trip 389 525 390 [[Image("Screenshot 2026-05-20 145522.png", 300px)]] 391 526 {{{ 527 #!sql 528 CREATE FUNCTION prevent_station_delete_active_trip() 529 RETURNS TRIGGER AS $$ 530 DECLARE 531 trip_count INT; 532 BEGIN 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; 545 END; 546 $$ LANGUAGE plpgsql; 547 548 CREATE TRIGGER trg_prevent_station_delete_active_trip 549 BEFORE DELETE ON Station 550 FOR EACH ROW 551 EXECUTE FUNCTION prevent_station_delete_active_trip(); 552 }}} 392 553 Овој trigger спречува бришење на станица ако таа е веќе користена во билети или патувања. Пред DELETE во табелата Station, системот проверува дали постојат поврзани записи и ако има, фрла грешка. Се користи за заштита на податоците и одржување на интегритет на базата. 393 554
