| | 1 | = Напредна тема: Пропагација на податоци помеѓу централна и локална база = |
| | 2 | |
| | 3 | == Опис на напредната тема == |
| | 4 | |
| | 5 | Како напредна тема во рамки на проектот '''SCS - Smart City Security''' е имплементирана локална симулација на пропагација на податоци помеѓу централна и локална база на податоци. |
| | 6 | |
| | 7 | Идејата на оваа имплементација е да се симулира реален Smart City систем во кој постои една централна база, на ниво на град или институција, и една локална база, која може да припаѓа на полициска станица, локална зона или друг организациски дел од системот. |
| | 8 | |
| | 9 | Поради ограничување да не се прават дополнителни измени на факултетската база, пропагацијата е имплементирана локално преку две PostgreSQL бази: |
| | 10 | |
| | 11 | * '''scs_central''' - централна база |
| | 12 | * '''scs_local''' - локална база |
| | 13 | |
| | 14 | Централната база ги прима новите податоци, додека локалната база ги добива податоците преку механизам за пропагација. |
| | 15 | |
| | 16 | == Користени табели == |
| | 17 | |
| | 18 | За демонстрација на напредната тема е направена мини верзија на проектната база со основните табели потребни за Smart City Security сценариото: |
| | 19 | |
| | 20 | * '''gragjanin''' |
| | 21 | * '''vozilo''' |
| | 22 | * '''kamera''' |
| | 23 | * '''prekrsok''' |
| | 24 | * '''kazna''' |
| | 25 | |
| | 26 | Во централната база дополнително е креирана табелата: |
| | 27 | |
| | 28 | * '''propagation_log''' |
| | 29 | |
| | 30 | Табелата '''propagation_log''' служи за евиденција на сите промени што треба да се префрлат од централната во локалната база. |
| | 31 | |
| | 32 | == Улога на propagation_log табелата == |
| | 33 | |
| | 34 | Табелата '''propagation_log''' претставува меѓутабела во која се запишуваат сите нови записи што треба да се пропагираат. |
| | 35 | |
| | 36 | Секој запис во оваа табела содржи информации за: |
| | 37 | |
| | 38 | * табелата во која е направена промената |
| | 39 | * типот на операција |
| | 40 | * идентификаторот на записот |
| | 41 | * payload со вредностите на записот |
| | 42 | * статус на обработка |
| | 43 | |
| | 44 | Статусот може да биде: |
| | 45 | |
| | 46 | * '''PENDING''' - записот чека да биде префрлен во локалната база |
| | 47 | * '''DONE''' - записот е успешно префрлен |
| | 48 | * '''FAILED''' - настанала грешка при префрлањето |
| | 49 | |
| | 50 | == Trigger-и == |
| | 51 | |
| | 52 | Во централната база се креирани trigger-и за табелите: |
| | 53 | |
| | 54 | * '''gragjanin''' |
| | 55 | * '''vozilo''' |
| | 56 | * '''kamera''' |
| | 57 | * '''prekrsok''' |
| | 58 | * '''kazna''' |
| | 59 | |
| | 60 | Trigger-ите се активираат по секој INSERT во соодветната табела. Тие не ги префрлаат директно податоците во локалната база, туку автоматски додаваат запис во '''propagation_log''' со статус '''PENDING'''. |
| | 61 | |
| | 62 | Со ова се овозможува асинхрона пропагација, бидејќи податоците прво се евидентираат, а потоа се обработуваат со посебна процедура. |
| | 63 | |
| | 64 | == Функција за логирање на промени == |
| | 65 | |
| | 66 | За trigger-ите е креирана функцијата: |
| | 67 | |
| | 68 | {{{ |
| | 69 | fn_log_propagation_insert() |
| | 70 | }}} |
| | 71 | |
| | 72 | Оваа функција го зема новиот внесен ред преку '''NEW''', го претвора во JSONB формат и го запишува во '''propagation_log'''. |
| | 73 | |
| | 74 | Користењето на JSONB овозможува целиот запис да се зачува како payload, без потреба да се креира посебна log табела за секоја табела од системот. |
| | 75 | |
| | 76 | == Процедура за пропагација == |
| | 77 | |
| | 78 | За префрлање на податоците од централната во локалната база е креирана процедурата: |
| | 79 | |
| | 80 | {{{ |
| | 81 | sp_propagiraj_vo_lokalna_baza() |
| | 82 | }}} |
| | 83 | |
| | 84 | Процедурата ги зема сите записи од '''propagation_log''' со статус '''PENDING'''. За секој запис проверува од која табела доаѓа, го чита payload-от и го внесува соодветниот запис во локалната база '''scs_local'''. |
| | 85 | |
| | 86 | Ако внесувањето е успешно, статусот во '''propagation_log''' се менува во '''DONE'''. Ако настане грешка, статусот се менува во '''FAILED''' и се запишува пораката за грешка. |
| | 87 | |
| | 88 | == Користење на dblink == |
| | 89 | |
| | 90 | Бидејќи '''scs_central''' и '''scs_local''' се две различни PostgreSQL бази, за комуникација помеѓу нив е користен PostgreSQL extension: |
| | 91 | |
| | 92 | {{{ |
| | 93 | dblink |
| | 94 | }}} |
| | 95 | |
| | 96 | Со '''dblink''' централната база може да извршува INSERT команди во локалната база. |
| | 97 | |
| | 98 | == Тек на пропагацијата == |
| | 99 | |
| | 100 | Целиот процес се одвива во следните чекори: |
| | 101 | |
| | 102 | 1. Се внесува нов запис во некоја од табелите во '''scs_central'''. |
| | 103 | 2. Trigger автоматски се активира по INSERT операцијата. |
| | 104 | 3. Trigger-от ја повикува функцијата '''fn_log_propagation_insert()'''. |
| | 105 | 4. Во '''propagation_log''' се додава запис со статус '''PENDING'''. |
| | 106 | 5. Се повикува процедурата '''sp_propagiraj_vo_lokalna_baza()'''. |
| | 107 | 6. Процедурата ги префрла податоците во '''scs_local'''. |
| | 108 | 7. Статусот во '''propagation_log''' се менува во '''DONE'''. |
| | 109 | |
| | 110 | == Заклучок == |
| | 111 | |
| | 112 | Со оваа напредна тема е имплементирана симулација на пропагација на податоци помеѓу централна и локална база. Решението користи trigger-и, log табела, stored procedure и dblink extension. |
| | 113 | |
| | 114 | Овој пристап е соодветен за Smart City Security систем бидејќи овозможува централно внесување на податоци и нивна контролирана синхронизација кон локални бази, што е применливо во системи каде различни институции или зони треба да имаат локален пристап до релевантни податоци. |