Bħala komplement għal
Il-parti teoretika hija deskritta sew fid-dokumentazzjoni
M'hemm xejn ġdid fl-artiklu, m'hemm l-ebda tifsira moħbija jew għarfien sigriet. Biss skizz dwar l-implimentazzjoni prattika ta 'idea teoretika. Jekk xi ħadd hu interessat, aqrah. Jekk m'intix interessat, taħlix il-ħin tiegħek.
Dikjarazzjoni tal-problema
Mingħajr ma tgħaddas fil-fond fil-qasam tas-suġġett, fil-qosor, il-problema tista 'tiġi fformulata kif ġej: Hemm tabella li timplimenta ċerta entità kummerċjali. Ir-ringieli fit-tabella jistgħu jitħassru, iżda r-ringieli ma jistgħux jitħassru fiżikament; iridu jkunu moħbija.
Għax jingħad: “Tħassar xejn, semmieha biss. L-Internet jaħżen KOLLOX"
Tul it-triq, huwa rakkomandabbli li ma terġax tikteb funzjonijiet maħżuna eżistenti li jaħdmu ma 'din l-entità.
Biex timplimenta dan il-kunċett, it-tabella għandha l-attribut is_deleted. Imbagħad kollox huwa sempliċi - għandek bżonn tiżgura li l-klijent jista 'jara biss il-linji li fihom l-attribut is_deleted falza Għal xiex jintuża l-mekkaniżmu? Sigurtà fil-Livell tar-Ringiela.
Реализация
Oħloq rwol u skema separati
CREATE ROLE repos;
CREATE SCHEMA repos;
Oħloq it-tabella fil-mira
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Ixgħel Sigurtà tal-Livell tar-Ringiela
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 ;
Funzjoni tas-servizz — it-tħassir ta' ringiela fit-tabella
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;
Funzjoni tan-negozju — it-tħassir ta' dokument
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Sejbiet
Il-klijent iħassar id-dokument
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Wara t-tħassir, il-klijent ma jarax id-dokument
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Iżda fid-database id-dokument ma jitħassarx, l-attribut biss jinbidel is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Li huwa dak li kien meħtieġ fid-dikjarazzjoni tal-problema.
Total
Jekk is-suġġett huwa interessanti, fl-istudju li jmiss tista’ turi eżempju ta’ implimentazzjoni ta’ mudell ibbażat fuq ir-rwoli għas-separazzjoni tal-aċċess għad-dejta bl-użu ta’ Row Level Security.
Sors: www.habr.com