Täienduseks ja peamiselt põhjaliku vastuse jaoks . Tundub, et .
Teoreetiline osa on dokumentatsioonis suurepäraselt kirjeldatud — . Allpool käsitletakse väikese konkreetse äriprobleemi — kustutatud andmete peitmine. Etüüd on pühendatud rakendamisele on esitatud eraldi.

Artiklis ei ole midagi uut, pole peidetud tähendust ega saladusi. Lihtsalt visand teoreetilise idee praktilisest rakendamisest. Kui see huvitab, lugege. Kui ei, siis ärge raisake oma aega.
Ülesande seadmine
Mitte süvenedes sügavale teemasse, on ülesanne lühidalt järgmine: on tabel, mis rakendab mingit äriüksust. Tabelist saavad read kustutatud, kuid füüsiliselt ei tohi ridu kustutada, neid tuleb peita.
Nagu öeldud — 'Ära kustuta midagi, lihtsalt nimetage ümber. Internet hoiab KÕIKE'
Samas on soovitav mitte kirjutada ümber juba olemasolevaid salvestatud funktsioone, mis töötavad selle üksusega.
Selle kontseptsiooni rakendamiseks on tabelil atribuut is_deleted. Edasi on kõik lihtne — tuleb teha nii, et klient näeb ainult ridu, kus atribuut is_deleted on vale. Selleks kasutatakse Ridade taseme turvalisust.
Rakendamine
Loome eraldi rolli ja skeemi
LOODE ROLLI repos;
LOODE SKEEM repos;Loome sihtotstarbelise tabeli
LOODE TABEL repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
LOODE SKEEM reposLülitame sisse Rea taseme turvalisuse
MUUDA TABEL repos.file LUBA REA TASEME TURVALISUS ;
LOODE POLIITIKA file_invisible_deleted ON repos.file KÕIK DBA_ROLLILE KASUTAMINE (MITTE is_deleted );
ANNE KÕIK TABELILE repos.file dba_rollile ;
ANNE KASUTUS SKEEMILE repos dba_rollile ;Teenindusfunktsioon — rida kustutamine tabelis
LOODE VÕI ASENDA repo.delete( curr_id repos.file.id%TÜÜP)
NAJAL integer KUI $$
ALUSTAGE
...
UUENDAGE repos.file
SEADKE is_del = TÕENE
KUS id = curr_id ;
...
LÕPP
$$ KEEL plpgsql TURVALINE DEFINIATOR;Ärifunktsioon — dokumentide kustutamine
LOODE VÕI ASENDA business_functions.deleteDoc( doc_for_delete JSON )
NAJAL JSON KUI $$
ALUSTAGE
...
SOORITUSTA repos.delete( doc_id ) ;
...
LÕPP
$$ KEEL plpgsql TURVALINE DEFINIATOR;tulemused näitasid ainult nelja ebaolulise koodibloki kattuvust, mis olid tingitud POSIX ja ANSI C nõuetest.
Klient kustutab dokumendi
VALI business_functions.delCFile( (VALI json_build_object( 'CId', 3 )) );Pärast kustutamist ei näe dokumendi klient
VALI business_functions.getCFile"( (VALI json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rida)Kuid andmebaasis ei ole dokument kustutatud, vaid ainult atribuudi is_del
psql -d my_db
VALI id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 rida)Just seda nõuti ülesande määramisel.
Kokkuvõte
Kui teema tundub huvitav, siis järgmises etüüdis saab näidata näidet rollimudeli rakendamisest andmete juurdepääsu jagamiseks, kasutades Row Level Security't.
Allikas: habr.com
