Changes between Initial Version and Version 1 of DatabaseProgramming


Ignore:
Timestamp:
05/30/26 17:50:34 (12 days ago)
Author:
231018
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DatabaseProgramming

    v1 v1  
     1= Функции, Процедури и Тригери =
     2
     3Во оваа фаза беа имплементирани функции, процедури и тригери кои ја поддржуваат основната бизнис логика на системот Safe City Security. Тие овозможуваат автоматизација на процеси како проверка на статус на казна, пресметка на износ, евидентирање плаќање, поднесување жалба, архивирање снимки и автоматско ажурирање на податоци преку тригери.
     4
     5[[Image(faza4.sql)]]
     6
     7== Функции ==
     8
     9Функциите се користат за пресметување и враќање на вредности кои се потребни во повеќе делови од системот.
     10
     11=== 1. fn_status_kazna ===
     12
     13{{{
     14CREATE OR REPLACE FUNCTION fn_status_kazna(p_kazna_id INTEGER)
     15RETURNS VARCHAR
     16AS $$
     17DECLARE
     18    v_status INTEGER;
     19BEGIN
     20    SELECT status
     21    INTO v_status
     22    FROM Kazna
     23    WHERE kazna_id = p_kazna_id;
     24
     25    IF v_status = 1 THEN
     26        RETURN 'platena';
     27    ELSIF v_status = 0 THEN
     28        RETURN 'neplatena';
     29    ELSE
     30        RETURN 'ponishtena';
     31    END IF;
     32END;
     33$$
     34LANGUAGE plpgsql;
     35}}}
     36
     37Функцијата `fn_status_kazna` го враќа статусот на одредена казна според нејзиниот идентификатор. Како влезен параметар прима `kazna_id`, а потоа од табелата `Kazna` го зема статусот на казната. Ако статусот е 1, функцијата враќа `platena`. Ако статусот е 0, враќа `neplatena`, а во останатите случаи враќа `ponishtena`.
     38
     39Оваа функција е корисна кога системот треба брзо да прикаже дали одредена казна е платена или не, без секогаш рачно да се проверува бројчестата вредност на статусот.
     40
     41=== 2. fn_presmetaj_iznos_kazna ===
     42
     43{{{
     44CREATE OR REPLACE FUNCTION fn_presmetaj_iznos_kazna(p_tip_prekrsok_id INTEGER)
     45RETURNS INTEGER
     46AS $$
     47DECLARE
     48    v_iznos INTEGER;
     49BEGIN
     50    SELECT iznos
     51    INTO v_iznos
     52    FROM TipPrekrsok
     53    WHERE tip_prekrsok_id = p_tip_prekrsok_id;
     54
     55    RETURN v_iznos;
     56END;
     57$$
     58LANGUAGE plpgsql;
     59}}}
     60
     61Функцијата `fn_presmetaj_iznos_kazna` се користи за пресметување на износот на казната според типот на прекршок. Како параметар прима `tip_prekrsok_id`, а потоа од табелата `TipPrekrsok` го зема соодветниот износ.
     62
     63Оваа функција се користи во процедурата за креирање прекршок со казна, каде што прво се пресметува износот, а потоа автоматски се креира запис во табелата `Kazna`.
     64
     65== Процедури ==
     66
     67Процедурите се користат за извршување операции врз базата, како внесување, ажурирање и архивирање податоци.
     68
     69=== 1. sp_evidentiraj_plakanje ===
     70
     71{{{
     72CREATE OR REPLACE PROCEDURE sp_evidentiraj_plakanje(
     73    p_kazna_id INTEGER,
     74    p_metod INTEGER
     75)
     76AS $$
     77BEGIN
     78    INSERT INTO Plakanje(metod, datum, kazna_id)
     79    VALUES(p_metod, CURRENT_DATE, p_kazna_id);
     80END;
     81$$
     82LANGUAGE plpgsql;
     83}}}
     84
     85Процедурата `sp_evidentiraj_plakanje` служи за евидентирање плаќање на казна. Како параметри прима `kazna_id` и метод на плаќање. При повик на процедурата се внесува нов запис во табелата `Plakanje`, со тековен датум и поврзаната казна.
     86
     87Оваа процедура ја автоматизира операцијата за плаќање казна и овозможува плаќањата да се внесуваат на стандарден начин.
     88
     89=== 2. sp_podnesi_zalba ===
     90
     91{{{
     92CREATE OR REPLACE PROCEDURE sp_podnesi_zalba(
     93    p_sodrzina VARCHAR,
     94    p_korisnik_id INTEGER,
     95    p_prekrsok_id INTEGER
     96)
     97AS
     98$$
     99BEGIN
     100    INSERT INTO Zalba(
     101        sodrzina,
     102        datum_na_podnesuvanje,
     103        status,
     104        korisnik_id,
     105        prekrsok_id
     106    )
     107    VALUES(
     108        p_sodrzina,
     109        CURRENT_DATE,
     110        'podnesena',
     111        p_korisnik_id,
     112        p_prekrsok_id
     113    );
     114END;
     115$$
     116LANGUAGE plpgsql;
     117}}}
     118
     119Процедурата `sp_podnesi_zalba` се користи за поднесување жалба од страна на корисник. Како параметри прима содржина на жалбата, идентификатор на корисник и идентификатор на прекршок. При внесување, статусот автоматски се поставува на `podnesena`.
     120
     121Ова овозможува секоја нова жалба да започне со почетен статус и да биде поврзана со конкретен корисник и конкретен прекршок.
     122
     123=== 3. sp_razgledaj_zalba ===
     124
     125{{{
     126CREATE OR REPLACE PROCEDURE sp_razgledaj_zalba(
     127    p_zalba_id INTEGER,
     128    p_administrator_id INTEGER,
     129    p_status VARCHAR
     130)
     131AS $$
     132BEGIN
     133    UPDATE Zalba
     134    SET administrator_id = p_administrator_id,
     135        status = p_status
     136    WHERE zalba_id = p_zalba_id;
     137END;
     138$$
     139LANGUAGE plpgsql;
     140}}}
     141
     142Процедурата `sp_razgledaj_zalba` се користи кога администратор разгледува жалба. Таа го ажурира администраторот кој ја обработува жалбата и го менува нејзиниот статус.
     143
     144Оваа процедура ја претставува логиката за управување со жалби во системот, односно премин од поднесена жалба кон понатамошна обработка.
     145
     146=== 4. sp_arhiviraj_stari_snimki ===
     147
     148{{{
     149CREATE OR REPLACE PROCEDURE sp_arhiviraj_stari_snimki()
     150AS $$
     151BEGIN
     152    UPDATE Snimka
     153    SET arhivirana = TRUE,
     154        datum_arhiviranje = CURRENT_DATE
     155    WHERE datum < CURRENT_DATE - INTERVAL '365 days'
     156      AND arhivirana = FALSE;
     157END;
     158$$
     159LANGUAGE plpgsql;
     160}}}
     161
     162Процедурата `sp_arhiviraj_stari_snimki` ги архивира старите снимки кои се постари од една година. Таа ги ажурира записите во табелата `Snimka`, поставува `arhivirana = TRUE` и внесува датум на архивирање.
     163
     164Оваа процедура е корисна за одржување на базата, бидејќи старите снимки не мора постојано да се третираат како активни податоци.
     165
     166=== 5. sp_kreiraj_prekrsok_so_kazna ===
     167
     168{{{
     169CREATE OR REPLACE PROCEDURE sp_kreiraj_prekrsok_so_kazna(
     170    p_opis VARCHAR,
     171    p_vreme TIME,
     172    p_datum DATE,
     173    p_detektirana_brzina INTEGER,
     174    p_tip_prekrsok_id INTEGER,
     175    p_kamera_id INTEGER
     176)
     177AS $$
     178DECLARE
     179    v_kazna_id INTEGER;
     180    v_iznos INTEGER;
     181BEGIN
     182    v_iznos := fn_presmetaj_iznos_kazna(p_tip_prekrsok_id);
     183
     184    INSERT INTO Kazna(datum, status, iznos_za_plakanje)
     185    VALUES(CURRENT_DATE, 0, v_iznos)
     186    RETURNING kazna_id INTO v_kazna_id;
     187
     188    INSERT INTO Prekrsok(
     189        opis,
     190        vreme,
     191        status,
     192        datum,
     193        detektirana_brzina,
     194        tip_prekrsok_id,
     195        kamera_id,
     196        kazna_id
     197    )
     198    VALUES(
     199        p_opis,
     200        p_vreme,
     201        0,
     202        p_datum,
     203        p_detektirana_brzina,
     204        p_tip_prekrsok_id,
     205        p_kamera_id,
     206        v_kazna_id
     207    );
     208END;
     209$$
     210LANGUAGE plpgsql;
     211}}}
     212
     213Процедурата `sp_kreiraj_prekrsok_so_kazna` автоматски креира прекршок заедно со соодветна казна. Најпрво се повикува функцијата `fn_presmetaj_iznos_kazna`, со која се пресметува износот на казната според типот на прекршок. Потоа се внесува нов запис во табелата `Kazna`, а добиениот `kazna_id` се користи при внесување на нов прекршок во табелата `Prekrsok`.
     214
     215Оваа процедура е важна бидејќи поврзува две операции во една целина: креирање казна и креирање прекршок.
     216
     217== Тригери ==
     218
     219Тригерите се користат за автоматско извршување логика при внесување или промена на податоци во табелите.
     220
     221=== 1. trg_auto_rok_kazna ===
     222
     223{{{
     224CREATE OR REPLACE FUNCTION trg_fn_auto_rok_kazna()
     225RETURNS TRIGGER
     226AS $$
     227BEGIN
     228    IF NEW.datum IS NULL THEN
     229        NEW.datum := CURRENT_DATE;
     230    END IF;
     231
     232    IF NEW.rok_na_plakanje IS NULL THEN
     233        NEW.rok_na_plakanje := NEW.datum + INTERVAL '30 days';
     234    END IF;
     235
     236    RETURN NEW;
     237END;
     238$$
     239LANGUAGE plpgsql;
     240}}}
     241
     242Тригерот `trg_auto_rok_kazna` се активира пред внесување нова казна во табелата `Kazna`. Ако не е внесен датум, автоматски се поставува тековниот датум. Ако не е внесен рок за плаќање, тој автоматски се пресметува како 30 дена по датумот на казната.
     243
     244Со ова се избегнува рачно внесување на рок за секоја казна и се обезбедува конзистентност во системот.
     245
     246=== 2. trg_kazna_platena ===
     247
     248{{{
     249CREATE OR REPLACE FUNCTION trg_fn_kazna_platena()
     250RETURNS TRIGGER
     251AS $$
     252BEGIN
     253    UPDATE Kazna
     254    SET status = 1
     255    WHERE kazna_id = NEW.kazna_id;
     256
     257    RETURN NEW;
     258END;
     259$$
     260LANGUAGE plpgsql;
     261}}}
     262
     263Тригерот `trg_kazna_platena` се активира по внесување запис во табелата `Plakanje`. Кога ќе се евидентира плаќање, тригерот автоматски го ажурира статусот на соодветната казна во табелата `Kazna` и го поставува на 1, што означува дека казната е платена.
     264
     265Ова овозможува автоматско поврзување меѓу плаќањето и статусот на казната.
     266
     267=== 3. trg_validacija_zalba ===
     268
     269{{{
     270CREATE OR REPLACE FUNCTION trg_fn_validacija_zalba()
     271RETURNS TRIGGER
     272AS $$
     273BEGIN
     274    IF NEW.sodrzina IS NULL OR LENGTH(TRIM(NEW.sodrzina)) = 0 THEN
     275        RAISE EXCEPTION 'Zalbata mora da ima sodrzina';
     276    END IF;
     277
     278    RETURN NEW;
     279END;
     280$$
     281LANGUAGE plpgsql;
     282}}}
     283
     284Тригерот `trg_validacija_zalba` се активира пред внесување нова жалба во табелата `Zalba`. Тој проверува дали содржината на жалбата е празна или NULL. Ако нема содржина, тригерот фрла грешка и не дозволува внесување на невалидна жалба.
     285
     286Овој тригер служи како дополнителна заштита за квалитетот на податоците во базата.
     287