Tema
/
Interneto svetainių serverio dalies kūrimas GO
📖 Teorija

Namų darbas — sulaužyk trigerį, išbandyk išorinį raktą

Augina programą. Suteik savo programai papildomą-tik pėdsaką, jei ji turi būseną, vertą audito, arba dirbk su SignFlow.

  1. Bandyk perrašyti istoriją. psql UPDATE esamos audito eilutės message ir DELETE vieną. Abu atmeta trigeris su savo tikslia klaida. Dabar, kaip eksperimentą, DROP TRIGGER audit_events_no_update_delete ON audit_events; ir bandyk UPDATE vėl — jis veikia. Grąžink trigerį. Parašyk du sakinius, ką tai įrodo apie garantijos ribą ir ką pridėtų „įrašų siuntimas už dėžės ribų".

  2. Kodėl ne išorinis raktas? Pridėk REFERENCES documents(id) ON DELETE CASCADE prie document_id (juodraštinėje migracijos kopijoje), perseeduok, įkelk ir ištrink juodraštį, ir pažiūrėk į audit_events. Eilutės dingusios. Dabar bandyk ON DELETE RESTRICT — trynimas užblokuotas. Paaiškink savais žodžiais, kodėl be išorinio rakto — vienintelis variantas, išlaikantis ir trynimą, ir įrodymą.

  3. Bendra laiko žyma. Pasirašyk paskutinį pasirašytoją dokumente ir užklausk select seq, created_at, event_type from audit_events where document_id='<id>' order by seq. signed ir completed eilutės neša tą pačią created_at. Paaiškink kodėl (now() transakcijoje) ir kodėl seq — ne created_at — yra ORDER BY.

  4. Užšaldyta prieš gyva. Audito žinutė saugo alice@example.com signed as "Alice" kaip užšaldytą tekstą. Tarkim, vietoj to UI atkurtų tą sakinį atvaizdavimo metu, sujungdama su signers eilute. Įvardyk du būdus, kaip tai vėliau galėtų parodyti kažką kitokio nei iš tikrųjų įvyko — ir kodėl užšaldytas sakinys negali.

Dokumentų fazė baigta: įkėlimas, nuosavybė, kvietimai, pasirašymas ir nekintamas pėdsakas. Toliau — diegimas: viso to perkėlimas į Railway, kur laikinos failų sistemos įspėjimas iš įkėlimo pamokos pagaliau turi būti išspręstas.