Si një shtesë për dhe pjesën kryesore të përgjigjes së zgjeruar në .
Pjesa teorike Ă«shtĂ« pĂ«rshkruar shkĂ«lqyeshĂ«m nĂ« dokumentacion â . MĂ« poshtĂ« Ă«shtĂ« shqyrtuar njĂ« zbatim praktik tĂ« njĂ« problemi tĂ« caktuar biznesi â fshehja e tĂ« dhĂ«nave tĂ« fshira. Studimi i kushtohet realizimit Ă«shtĂ« paraqitur veçmas.

NĂ« artikull nuk ka asgjĂ« tĂ« re, nuk ka kuptim tĂ« fshehur dhe njohuri sekrete. VetĂ«m njĂ« skicĂ« mbi realizimin praktik tĂ« njĂ« ideje teorike. NĂ«se dikujt i intereson â lexoni. AtĂ«herĂ« shihni, mos e humbni kohĂ«n tuaj kot.
Formulimi i detyrës
Pa u thelluar shumë në fushën temore, shkurt, detyra mund të formulohet kështu: kemi një tabelë që realizon një entitet biznesi. Rreshtat në tabelë mund të fshihen, por nuk lejohet të fshihen fizikisht rreshtat, duhet t'i fshehim ata.
Sepse Ă«shtĂ« thĂ«nĂ« â "Mos fshij asgjĂ«, vetĂ«m riemĂ«rto. Interneti ruan GJITHĂKA"
Për më tepër, është gjithashtu e dëshirueshme të mos ri-shkruhen funksionet e ruajtura ekzistuese që punojnë me këtë entitet.
PĂ«r tĂ« realizuar kĂ«tĂ« koncept, tabela ka njĂ« atribut is_deleted. Pastaj gjithçka Ă«shtĂ« e thjeshtĂ« â duhet tĂ« bĂ«het nĂ« mĂ«nyrĂ« qĂ« klienti tĂ« mund tĂ« shohĂ« vetĂ«m rreshtat nĂ« tĂ« cilat atributi is_deleted Ă«shtĂ« i pavĂ«rtetĂ«. PĂ«r kĂ«tĂ«, pĂ«rdoret mekanizmi Row Level Security.
Implementimi
Krijojmë një rol të veçantë dhe një skemë
CREATE ROLE repos;
CREATE SCHEMA repos;Krijojmë tabelën e synuar
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA reposAktivizoni Row Level Security
ALTER TABLE repos.file ENABLE ROW LEVEL SECURITY ;
CREATE POLICY file_invisible_deleted ON repos.file FOR ALL TO dba_role USING ( NOT is_deleted );
GRANT ALL ON TABLE repos.file to dba_role ;
GRANT USAGE ON SCHEMA repos TO dba_role ;Funksioni shĂ«rbimit â fshirja e rreshtit nĂ« tabelĂ«
CREATE OR REPLACE repos.delete( curr_id repos.file.id%TYPE)
RETURNS integer AS $$
BEGIN
...
UPDATE repos.file
SET is_del = TRUE
WHERE id = curr_id ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;Funksioni biznesor â fshirja e dokumentit
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;Rezultatet
Klienti fshin dokumentin
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );Pas fshirjes, klienti i dokumentit nuk e sheh
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)Por në DB dokumenti nuk është fshirë, vetëm është ndryshuar atributi is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)Ăka kĂ«rkonte nĂ« formulimin e detyrĂ«s.
Përfundimi
Nëse tema do të jetë interesante, në studimin e ardhshëm mund të tregohet një shembull realizimi të modelit të rolit të ndarjes së qasjes në të dhëna duke përdorur Row Level Security.
Burimi: habr.com
