KÄ papildinÄjumu un galvenokÄrt detalizÄtai atbildei uz .
TeorÄtiskÄ daļa ir lieliski aprakstÄ«ta dokumentÄcijÄ ā . ZemÄk tiks aplÅ«kota praktiskÄ maza konkrÄtÄ biznesa uzdevuma ā dzÄsto datu slÄpÅ”anas. Studija, kas veltÄ«ta ir atseviŔķi izklÄstÄ«ta.

RakstÄ nav nekas jauns, nav slÄpta jÄga vai noslÄpumu. TÄ ir vienkÄrÅ”a piezÄ«me par praktiskÄs realizÄcijas teorÄtisko ideju. Ja kÄdu interesÄ ā lasiet. Kam neinteresÄ ā netÄrÄjiet savu laiku velti.
Uzdevuma formulÄÅ”ana
Nedziļinoties dziļi tÄmÄ, Ä«si, uzdevumu var formulÄt Å”Ädi: ir tabula, kas realizÄ noteiktu biznesa entÄ«tiju. Rindas tabulÄ var tikt dzÄstas, bet fiziski dzÄst rindas nav atļauts, tÄs ir jÄslÄpj.
Jo ir teikts ā āNeko nemÄcÄ«ties, tikai pÄrdÄvÄt. Internets saglabÄ VISUā
IdeÄli vÄlams nebÅ«t pÄrrakstÄ«t jau esoÅ”Äs glabÄÅ”anas funkcijas, kas strÄdÄ ar Å”o entÄ«tiju.
Å Ä«s koncepcijas Ä«stenoÅ”anai tabulai ir atribÅ«ts is_deleted. TÄlÄk viss ir vienkÄrÅ”i ā ir jÄpanÄk, lai klients redzÄtu tikai rindas, kurÄs atribÅ«ts is_deleted ir nepatiesi. TÄpÄc tiek izmantots mehÄnisms Rindu lÄ«meÅa droŔība.
RealizÄcija
Izveidojam atseviŔķu lomu un shÄmu
CREATE ROLE repos;
CREATE SCHEMA repos;Izveidojam mÄrÄ·a tabulu
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA reposIeslÄdzam Rindu lÄ«meÅa droŔību
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;Servisa funkcija ā rinda dzÄÅ”ana tabulÄ
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;Biznesa funkcija ā dokumenta dzÄÅ”ana
CREATE OR REPLACE business_functions.deleteDoc(doc_for_delete JSON)
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete(doc_id);
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;RezultÄti
Klients dzÄÅ” dokumentu
SELECT business_functions.delCFile((SELECT json_build_object('CId', 3)));PÄc dzÄÅ”anas klients dokumentu neredz
SELECT business_functions.getCFile((SELECT json_build_object('CId', 3)));
-----------------
(0 rows)Bet datu bÄzÄ dokuments netika dzÄsts, tikai atribÅ«ts mainÄ«ts is_del
psql -d my_db
SELECT id, name, is_del FROM repos.file;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)Kas arÄ« bija prasÄ«tajÄ uzdevumÄ.
RezultÄts
Ja, ja ir interesanta tÄma, nÄkamajÄ etÅ«dÄ varam parÄdÄ«t piekļuves datiem sadalīŔanas lomu modeļa Ä«stenoÅ”anas piemÄru, izmantojot Rindu lÄ«meÅa droŔību.
Avots: habr.com
